Commit cb35a9eb295f8c940328c7b666cd10f0ae86cda6
Exists in
master
and in
28 other branches
Merge branch '0.37-rc2' into AI1826
Conflicts: test/unit/article_test.rb
Showing
86 changed files
with
1631 additions
and
771 deletions
Show diff stats
app/controllers/public/profile_controller.rb
... | ... | @@ -3,17 +3,15 @@ class ProfileController < PublicController |
3 | 3 | needs_profile |
4 | 4 | before_filter :check_access_to_profile, :except => [:join, :join_not_logged, :index, :add] |
5 | 5 | before_filter :store_location, :only => [:join, :join_not_logged, :report_abuse] |
6 | - before_filter :login_required, :only => [:add, :join, :join_not_logged, :leave, :unblock, :leave_scrap, :remove_scrap, :remove_activity, :view_more_scraps, :view_more_activities, :view_more_network_activities, :report_abuse, :register_report] | |
6 | + before_filter :login_required, :only => [:add, :join, :join_not_logged, :leave, :unblock, :leave_scrap, :remove_scrap, :remove_activity, :view_more_activities, :view_more_network_activities, :report_abuse, :register_report, :leave_comment_on_activity] | |
7 | 7 | |
8 | 8 | helper TagsHelper |
9 | 9 | |
10 | 10 | def index |
11 | - @activities = @profile.tracked_actions.paginate(:per_page => 30, :page => params[:page]) | |
12 | - @wall_items = [] | |
13 | - @network_activities = !@profile.is_a?(Person) ? @profile.tracked_notifications.paginate(:per_page => 30, :page => params[:page]) : [] | |
11 | + @network_activities = !@profile.is_a?(Person) ? @profile.tracked_notifications.visible.paginate(:per_page => 15, :page => params[:page]) : [] | |
14 | 12 | if logged_in? && current_person.follows?(@profile) |
15 | - @network_activities = @profile.tracked_notifications.paginate(:per_page => 30, :page => params[:page]) if @network_activities.empty? | |
16 | - @wall_items = @profile.scraps_received.not_replies.paginate(:per_page => 30, :page => params[:page]) | |
13 | + @network_activities = @profile.tracked_notifications.visible.paginate(:per_page => 15, :page => params[:page]) if @network_activities.empty? | |
14 | + @activities = @profile.activities.paginate(:per_page => 15, :page => params[:page]) | |
17 | 15 | end |
18 | 16 | @tags = profile.article_tags |
19 | 17 | unless profile.display_info_to?(user) |
... | ... | @@ -180,22 +178,33 @@ class ProfileController < PublicController |
180 | 178 | @scrap.receiver= receiver |
181 | 179 | @tab_action = params[:tab_action] |
182 | 180 | @message = @scrap.save ? _("Message successfully sent.") : _("You can't leave an empty message.") |
183 | - @scraps = @profile.scraps_received.not_replies.paginate(:per_page => 30, :page => params[:page]) if params[:not_load_scraps].nil? | |
184 | - render :partial => 'leave_scrap' | |
181 | + activities = @profile.activities.paginate(:per_page => 15, :page => params[:page]) if params[:not_load_scraps].nil? | |
182 | + render :partial => 'profile_activities_list', :locals => {:activities => activities} | |
185 | 183 | end |
186 | 184 | |
187 | - def view_more_scraps | |
188 | - @scraps = @profile.scraps_received.not_replies.paginate(:per_page => 30, :page => params[:page]) | |
189 | - render :partial => 'profile_scraps', :locals => {:scraps => @scraps} | |
185 | + def leave_comment_on_activity | |
186 | + @comment = Comment.new(params[:comment]) | |
187 | + @comment.author = user | |
188 | + @activity = ActionTracker::Record.find(params[:source_id]) | |
189 | + @comment.source_type, @comment.source_id = (@activity.target_type == 'Article' ? ['Article', @activity.target_id] : [@activity.class.to_s, @activity.id]) | |
190 | + @tab_action = params[:tab_action] | |
191 | + @message = @comment.save ? _("Comment successfully added.") : _("You can't leave an empty comment.") | |
192 | + if @tab_action == 'wall' | |
193 | + activities = @profile.activities.paginate(:per_page => 15, :page => params[:page]) if params[:not_load_scraps].nil? | |
194 | + render :partial => 'profile_activities_list', :locals => {:activities => activities} | |
195 | + else | |
196 | + network_activities = @profile.tracked_notifications.visible.paginate(:per_page => 15, :page => params[:page]) | |
197 | + render :partial => 'profile_network_activities', :locals => {:network_activities => network_activities} | |
198 | + end | |
190 | 199 | end |
191 | 200 | |
192 | 201 | def view_more_activities |
193 | - @activities = @profile.tracked_actions.paginate(:per_page => 30, :page => params[:page]) | |
194 | - render :partial => 'profile_activities', :locals => {:activities => @activities} | |
202 | + @activities = @profile.activities.paginate(:per_page => 10, :page => params[:page]) | |
203 | + render :partial => 'profile_activities_list', :locals => {:activities => @activities} | |
195 | 204 | end |
196 | 205 | |
197 | 206 | def view_more_network_activities |
198 | - @activities = @profile.tracked_notifications.paginate(:per_page => 30, :page => params[:page]) | |
207 | + @activities = @profile.tracked_notifications.paginate(:per_page => 10, :page => params[:page]) | |
199 | 208 | render :partial => 'profile_network_activities', :locals => {:network_activities => @activities} |
200 | 209 | end |
201 | 210 | |
... | ... | @@ -213,7 +222,11 @@ class ProfileController < PublicController |
213 | 222 | begin |
214 | 223 | raise if !can_edit_profile |
215 | 224 | activity = ActionTracker::Record.find(params[:activity_id]) |
216 | - activity.destroy | |
225 | + if params[:only_hide] | |
226 | + activity.update_attribute(:visible, false) | |
227 | + else | |
228 | + activity.destroy | |
229 | + end | |
217 | 230 | render :text => _('Activity successfully removed.') |
218 | 231 | rescue |
219 | 232 | render :text => _('You could not remove this activity') |
... | ... | @@ -285,6 +298,16 @@ class ProfileController < PublicController |
285 | 298 | end |
286 | 299 | end |
287 | 300 | |
301 | + def remove_comment | |
302 | + #FIXME Check whether these permissions are enough | |
303 | + @comment = Comment.find(params[:comment_id]) | |
304 | + if (user == @comment.author || user == profile || user.has_permission?(:moderate_comments, profile)) | |
305 | + @comment.destroy | |
306 | + session[:notice] = _('Comment successfully deleted') | |
307 | + end | |
308 | + redirect_to :action => :index | |
309 | + end | |
310 | + | |
288 | 311 | protected |
289 | 312 | |
290 | 313 | def check_access_to_profile | ... | ... |
app/helpers/application_helper.rb
... | ... | @@ -1217,15 +1217,12 @@ module ApplicationHelper |
1217 | 1217 | else _('1 minute') |
1218 | 1218 | end |
1219 | 1219 | |
1220 | - when 2..44 then _('%{distance} minutes') % { :distance => distance_in_minutes } | |
1221 | - when 45..89 then _('about 1 hour') | |
1222 | - when 90..1439 then _('about %{distance} hours') % { :distance => (distance_in_minutes.to_f / 60.0).round } | |
1223 | - when 1440..2879 then _('1 day') | |
1224 | - when 2880..43199 then _('%{distance} days') % { :distance => (distance_in_minutes / 1440).round } | |
1225 | - when 43200..86399 then _('about 1 month') | |
1226 | - when 86400..525599 then _('%{distance} months') % { :distance => (distance_in_minutes / 43200).round } | |
1227 | - when 525600..1051199 then _('about 1 year') | |
1228 | - else _('over %{distance} years') % { :distance => (distance_in_minutes / 525600).round } | |
1220 | + when 2..44 then _('%{distance} minutes ago') % { :distance => distance_in_minutes } | |
1221 | + when 45..89 then _('about 1 hour ago') | |
1222 | + when 90..1439 then _('about %{distance} hours ago') % { :distance => (distance_in_minutes.to_f / 60.0).round } | |
1223 | + when 1440..2879 then _('1 day ago') | |
1224 | + when 2880..10079 then _('%{distance} days ago') % { :distance => (distance_in_minutes / 1440).round } | |
1225 | + else show_time(from_time) | |
1229 | 1226 | end |
1230 | 1227 | end |
1231 | 1228 | ... | ... |
app/helpers/forum_helper.rb
... | ... | @@ -42,9 +42,9 @@ module ForumHelper |
42 | 42 | def last_topic_update(article) |
43 | 43 | info = article.info_from_last_update |
44 | 44 | if info[:author_url] |
45 | - time_ago_as_sentence(info[:date]) + ' ' + _('ago') + ' ' + _('by') + ' ' + link_to(info[:author_name], info[:author_url]) | |
45 | + time_ago_as_sentence(info[:date]) + ' ' + _('by') + ' ' + link_to(info[:author_name], info[:author_url]) | |
46 | 46 | else |
47 | - time_ago_as_sentence(info[:date]) + ' ' + _('ago') + ' ' + _('by') + ' ' + info[:author_name] | |
47 | + time_ago_as_sentence(info[:date]) + ' ' + _('by') + ' ' + info[:author_name] | |
48 | 48 | end |
49 | 49 | end |
50 | 50 | ... | ... |
app/models/action_tracker_notification.rb
... | ... | @@ -3,6 +3,8 @@ class ActionTrackerNotification < ActiveRecord::Base |
3 | 3 | belongs_to :profile |
4 | 4 | belongs_to :action_tracker, :class_name => 'ActionTracker::Record', :foreign_key => 'action_tracker_id' |
5 | 5 | |
6 | + has_many :comments, :through => :action_tracker, :class_name => 'Comment', :foreign_key => 'source_id' | |
7 | + | |
6 | 8 | validates_presence_of :profile_id, :action_tracker_id |
7 | 9 | validates_uniqueness_of :action_tracker_id, :scope => :profile_id |
8 | 10 | ... | ... |
app/models/article.rb
... | ... | @@ -2,9 +2,7 @@ require 'hpricot' |
2 | 2 | |
3 | 3 | class Article < ActiveRecord::Base |
4 | 4 | |
5 | - track_actions :create_article, :after_create, :keep_params => [:name, :url], :if => Proc.new { |a| a.is_trackable? && !a.image? }, :custom_target => :action_tracker_target | |
6 | - track_actions :update_article, :before_update, :keep_params => [:name, :url], :if => Proc.new { |a| a.is_trackable? && (a.body_changed? || a.name_changed?) }, :custom_target => :action_tracker_target | |
7 | - track_actions :remove_article, :before_destroy, :keep_params => [:name], :if => Proc.new { |a| a.is_trackable? }, :custom_target => :action_tracker_target | |
5 | + track_actions :create_article, :after_create, :keep_params => [:name, :url, :lead, :first_image], :if => Proc.new { |a| a.is_trackable? && !a.image? } | |
8 | 6 | |
9 | 7 | # xss_terminate plugin can't sanitize array fields |
10 | 8 | before_save :sanitize_tag_list |
... | ... | @@ -17,7 +15,7 @@ class Article < ActiveRecord::Base |
17 | 15 | |
18 | 16 | belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id' |
19 | 17 | |
20 | - has_many :comments, :dependent => :destroy, :order => 'created_at asc' | |
18 | + has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc' | |
21 | 19 | |
22 | 20 | has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ] |
23 | 21 | has_many :categories, :through => :article_categorizations |
... | ... | @@ -65,7 +63,7 @@ class Article < ActiveRecord::Base |
65 | 63 | validate :translation_must_have_language |
66 | 64 | |
67 | 65 | def is_trackable? |
68 | - self.published? && self.notifiable? && self.advertise? | |
66 | + self.published? && self.notifiable? && self.advertise? && self.profile.public_profile | |
69 | 67 | end |
70 | 68 | |
71 | 69 | def external_link=(link) |
... | ... | @@ -135,7 +133,7 @@ class Article < ActiveRecord::Base |
135 | 133 | before_update do |article| |
136 | 134 | article.advertise = true |
137 | 135 | end |
138 | - | |
136 | + | |
139 | 137 | # retrieves all articles belonging to the given +profile+ that are not |
140 | 138 | # sub-articles of any other article. |
141 | 139 | named_scope :top_level_for, lambda { |profile| |
... | ... | @@ -571,6 +569,21 @@ class Article < ActiveRecord::Base |
571 | 569 | _('Created at: ') |
572 | 570 | end |
573 | 571 | |
572 | + def activity | |
573 | + ActionTracker::Record.find_by_target_type_and_target_id 'Article', self.id | |
574 | + end | |
575 | + | |
576 | + def create_activity | |
577 | + if is_trackable? && !image? | |
578 | + save_action_for_verb 'create_article', [:name, :url, :lead, :first_image], Proc.new{}, :author | |
579 | + end | |
580 | + end | |
581 | + | |
582 | + def first_image | |
583 | + img = Hpricot(self.lead.to_s).search('img[@src]').first || Hpricot(self.body.to_s).search('img').first | |
584 | + img.nil? ? '' : img.attributes['src'] | |
585 | + end | |
586 | + | |
574 | 587 | private |
575 | 588 | |
576 | 589 | def sanitize_tag_list | ... | ... |
app/models/comment.rb
1 | 1 | class Comment < ActiveRecord::Base |
2 | 2 | |
3 | - track_actions :leave_comment, :after_create, :keep_params => ["article.title", "article.url", "title", "url", "body"], :custom_target => :action_tracker_target | |
4 | - | |
5 | 3 | validates_presence_of :body |
6 | - belongs_to :article, :counter_cache => true | |
4 | + | |
5 | + belongs_to :source, :counter_cache => true, :polymorphic => true | |
6 | + alias :article :source | |
7 | + alias :article= :source= | |
8 | + | |
7 | 9 | belongs_to :author, :class_name => 'Person', :foreign_key => 'author_id' |
8 | 10 | has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy |
9 | 11 | belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id' |
... | ... | @@ -70,13 +72,25 @@ class Comment < ActiveRecord::Base |
70 | 72 | after_save :notify_article |
71 | 73 | after_destroy :notify_article |
72 | 74 | def notify_article |
73 | - article.comments_updated | |
75 | + article.comments_updated if article.kind_of?(Article) | |
74 | 76 | end |
75 | 77 | |
76 | 78 | after_create do |comment| |
77 | - if comment.article.notify_comments? && !comment.article.profile.notification_emails.empty? | |
79 | + if comment.source.kind_of?(Article) && comment.article.notify_comments? && !comment.article.profile.notification_emails.empty? | |
78 | 80 | Comment::Notifier.deliver_mail(comment) |
79 | 81 | end |
82 | + | |
83 | + if comment.source.kind_of?(Article) | |
84 | + comment.article.create_activity if comment.article.activity.nil? | |
85 | + if comment.article.activity | |
86 | + comment.article.activity.increment!(:comments_count) | |
87 | + comment.article.activity.update_attribute(:visible, true) | |
88 | + end | |
89 | + end | |
90 | + end | |
91 | + | |
92 | + after_destroy do |comment| | |
93 | + comment.article.activity.decrement!(:comments_count) if comment.source.kind_of?(Article) && comment.article.activity | |
80 | 94 | end |
81 | 95 | |
82 | 96 | def replies | ... | ... |
app/models/community.rb
... | ... | @@ -79,4 +79,8 @@ class Community < Organization |
79 | 79 | {:title => __('Community Info and settings'), :icon => 'edit-profile-group'} |
80 | 80 | end |
81 | 81 | |
82 | + def activities | |
83 | + Scrap.find_by_sql("SELECT id, updated_at, 'Scrap' AS klass FROM scraps WHERE scraps.receiver_id = #{self.id} AND scraps.scrap_id IS NULL UNION SELECT id, updated_at, 'ActionTracker::Record' AS klass FROM action_tracker WHERE action_tracker.target_id = #{self.id} UNION SELECT action_tracker.id, action_tracker.updated_at, 'ActionTracker::Record' AS klass FROM action_tracker INNER JOIN articles ON action_tracker.target_id = articles.id WHERE articles.profile_id = #{self.id} AND action_tracker.target_type = 'Article' ORDER BY action_tracker.updated_at DESC") | |
84 | + end | |
85 | + | |
82 | 86 | end | ... | ... |
app/models/enterprise.rb
... | ... | @@ -181,4 +181,8 @@ class Enterprise < Organization |
181 | 181 | true |
182 | 182 | end |
183 | 183 | |
184 | + def activities | |
185 | + Scrap.find_by_sql("SELECT id, updated_at, 'Scrap' AS klass FROM scraps WHERE scraps.receiver_id = #{self.id} AND scraps.scrap_id IS NULL UNION SELECT id, updated_at, 'ActionTracker::Record' AS klass FROM action_tracker WHERE action_tracker.target_id = #{self.id} UNION SELECT action_tracker.id, action_tracker.updated_at, 'ActionTracker::Record' AS klass FROM action_tracker INNER JOIN articles ON action_tracker.target_id = articles.id WHERE articles.profile_id = #{self.id} AND action_tracker.target_type = 'Article' ORDER BY action_tracker.updated_at DESC") | |
186 | + end | |
187 | + | |
184 | 188 | end | ... | ... |
app/models/event.rb
app/models/external_feed.rb
... | ... | @@ -14,6 +14,7 @@ class ExternalFeed < ActiveRecord::Base |
14 | 14 | article = TinyMceArticle.new(:name => title, :profile => blog.profile, :body => content, :published_at => date, :source => link, :profile => blog.profile, :parent => blog) |
15 | 15 | unless blog.children.exists?(:slug => article.slug) |
16 | 16 | article.save! |
17 | + article.delay.create_activity | |
17 | 18 | end |
18 | 19 | end |
19 | 20 | ... | ... |
app/models/forum.rb
... | ... | @@ -24,4 +24,14 @@ class Forum < Folder |
24 | 24 | def self.icon_name(article = nil) |
25 | 25 | 'forum' |
26 | 26 | end |
27 | + | |
28 | + def notifiable? | |
29 | + true | |
30 | + end | |
31 | + | |
32 | + def first_paragraph | |
33 | + return '' if body.blank? | |
34 | + paragraphs = Hpricot(body).search('p') | |
35 | + paragraphs.empty? ? '' : paragraphs.first.to_html | |
36 | + end | |
27 | 37 | end | ... | ... |
app/models/person.rb
... | ... | @@ -435,6 +435,10 @@ class Person < Profile |
435 | 435 | user.save! |
436 | 436 | end |
437 | 437 | |
438 | + def activities | |
439 | + Scrap.find_by_sql("SELECT id, updated_at, '#{Scrap.to_s}' AS klass FROM #{Scrap.table_name} WHERE scraps.receiver_id = #{self.id} AND scraps.scrap_id IS NULL UNION SELECT id, updated_at, '#{ActionTracker::Record.to_s}' AS klass FROM #{ActionTracker::Record.table_name} WHERE action_tracker.user_id = #{self.id} ORDER BY updated_at DESC") | |
440 | + end | |
441 | + | |
438 | 442 | protected |
439 | 443 | |
440 | 444 | def followed_by?(profile) | ... | ... |
app/models/profile.rb
app/models/scrap.rb
... | ... | @@ -12,6 +12,7 @@ class Scrap < ActiveRecord::Base |
12 | 12 | named_scope :not_replies, :conditions => {:scrap_id => nil} |
13 | 13 | |
14 | 14 | track_actions :leave_scrap, :after_create, :keep_params => ['sender.name', 'content', 'receiver.name', 'receiver.url'], :if => Proc.new{|s| s.receiver != s.sender}, :custom_target => :action_tracker_target |
15 | + | |
15 | 16 | track_actions :leave_scrap_to_self, :after_create, :keep_params => ['sender.name', 'content'], :if => Proc.new{|s| s.receiver == s.sender} |
16 | 17 | |
17 | 18 | after_create do |scrap| | ... | ... |
app/models/uploaded_file.rb
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | # of the file itself is kept. (FIXME?) |
5 | 5 | class UploadedFile < Article |
6 | 6 | |
7 | - track_actions :upload_image, :after_create, :keep_params => ["view_url", "thumbnail_path", "parent.url", "parent.name"], :if => Proc.new { |a| a.published? && a.image? && !a.parent.nil? && a.parent.gallery? } | |
7 | + track_actions :upload_image, :after_create, :keep_params => ["view_url", "thumbnail_path", "parent.url", "parent.name"], :if => Proc.new { |a| a.published? && a.image? && !a.parent.nil? && a.parent.gallery? }, :custom_target => :action_tracker_target | |
8 | 8 | |
9 | 9 | include ShortFilename |
10 | 10 | |
... | ... | @@ -25,7 +25,7 @@ class UploadedFile < Article |
25 | 25 | end |
26 | 26 | |
27 | 27 | def thumbnail_path |
28 | - self.image? ? self.full_filename(:thumb).gsub(File.join(RAILS_ROOT, 'public'), '') : nil | |
28 | + self.image? ? self.full_filename(:display).gsub(File.join(RAILS_ROOT, 'public'), '') : nil | |
29 | 29 | end |
30 | 30 | |
31 | 31 | def display_title |
... | ... | @@ -140,4 +140,9 @@ class UploadedFile < Article |
140 | 140 | def uploaded_file? |
141 | 141 | true |
142 | 142 | end |
143 | + | |
144 | + def action_tracker_target | |
145 | + self | |
146 | + end | |
147 | + | |
143 | 148 | end | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +<%= render :partial => 'default_activity', :locals => { :activity => activity, :tab_action => tab_action } %> | ... | ... |
... | ... | @@ -0,0 +1,63 @@ |
1 | +<% Comment %> | |
2 | +<% Profile %> | |
3 | +<% Person %> | |
4 | + | |
5 | +<li class="article-comment" style='border-bottom:none;'> | |
6 | + <div class="article-comment-inner"> | |
7 | + | |
8 | + <div class="comment-content comment-logged-in"> | |
9 | + | |
10 | + <% if comment.author %> | |
11 | + <%= link_to image_tag(profile_icon(comment.author, :minor)), | |
12 | + Person.find(comment.author_id).url, | |
13 | + :class => 'comment-picture', | |
14 | + :title => comment.author_name | |
15 | + %> | |
16 | + <% end %> | |
17 | + | |
18 | + <div class="comment-details"> | |
19 | + <div class="comment-text"> | |
20 | + <%= link_to(comment.author_name, comment.author.url) %> <%= txt2html comment.body %> | |
21 | + </div> | |
22 | + <div class="profile-activity-time"> | |
23 | + <%= time_ago_as_sentence(comment.created_at) %> | |
24 | + </div> | |
25 | + </div> | |
26 | + | |
27 | + <% if logged_in? && (user == profile || user == comment.author || user.has_permission?(:moderate_comments, profile)) %> | |
28 | + <% button_bar(:style => 'float: right; margin-top: 0px;') do %> | |
29 | + <%= icon_button(:delete, _('Remove'), { :action => :remove_comment, :comment_id => comment.id }, :method => :get, :confirm => _('Are you sure you want to remove this comment and all its replies?')) %> | |
30 | + <% end %> | |
31 | + <% end %> | |
32 | + <br style="clear: both;" /> | |
33 | + | |
34 | + <div class="comment_reply post_comment_box closed"> | |
35 | + <% if @comment && @comment.errors.any? && @comment.reply_of_id.to_i == comment.id %> | |
36 | + <%= error_messages_for :comment %> | |
37 | + <script type="text/javascript"> | |
38 | + jQuery(function() { | |
39 | + document.location.href = '#<%= comment.anchor %>'; | |
40 | + add_comment_reply_form('#comment-reply-to-<%= comment.id %>', <%= comment.id %>); | |
41 | + }); | |
42 | + </script> | |
43 | + <% end %> | |
44 | + <%= report_abuse(comment.author, :comment_link, comment) if comment.author %> | |
45 | + <%= link_to_function _('Reply'), | |
46 | + "var f = add_comment_reply_form(this, %s); f.find('input[name=comment[title]], textarea').val(''); return false" % comment.id, | |
47 | + :class => 'comment-footer comment-footer-link comment-footer-hide', | |
48 | + :id => 'comment-reply-to-' + comment.id.to_s | |
49 | + %> | |
50 | + </div> | |
51 | + | |
52 | + </div> | |
53 | + | |
54 | + <% unless comment.replies.blank? %> | |
55 | + <ul class="comment-replies"> | |
56 | + <% comment.replies.each do |reply| %> | |
57 | + <%= render :partial => 'comment', :locals => { :comment => reply } %> | |
58 | + <% end %> | |
59 | + </ul> | |
60 | + <% end %> | |
61 | + | |
62 | + </div> | |
63 | +</li> | ... | ... |
... | ... | @@ -0,0 +1,22 @@ |
1 | +<div class='profile-activity-image'> | |
2 | + <%= link_to(profile_image(activity.user, :minor), activity.user.url) %> | |
3 | +</div> | |
4 | +<div class='profile-activity-description profile-activity-article-<%= activity.target.class.icon_name %>'> | |
5 | + <p class='profile-activity-text'> | |
6 | + <%= link_to activity.user.short_name(20), activity.user.url %> | |
7 | + <%= _("on community %s") % link_to(activity.target.profile.short_name(20), activity.target.profile.url) if activity.target.profile.is_a?(Community) %> | |
8 | + </p> | |
9 | + <div class='profile-activity-lead'> | |
10 | + <b><%= link_to(activity.params['name'], activity.params['url']) %></b> | |
11 | + <span title='<%= activity.target.class.short_description %>' class='profile-activity-icon icon-new icon-new<%= activity.target.class.icon_name %>'></span><br /> | |
12 | + <%= image_tag(activity.params['first_image']) unless activity.params['first_image'].blank? %><%= strip_tags(activity.params['lead']).gsub(/(\xA0|\xC2|\s)+/, ' ').gsub(/^\s+/, '') %> <small><%= link_to(_('See more'), activity.params['url']) unless activity.get_lead.blank? %></small> | |
13 | + </div> | |
14 | + <%= content_tag(:p, link_to(_('See complete forum'), activity.get_url), :class => 'see-forum') if activity.target.is_a?(Forum) %> | |
15 | + <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
16 | + <div class='profile-wall-actions'> | |
17 | + <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %> | |
18 | + <%= link_to_remote(content_tag(:span, _('Remove')), :url =>{:action => 'remove_activity', :activity_id => activity.id, :only_hide => true}, :confirm => _('Are you sure?'), :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> | |
19 | + </div> | |
20 | +</div> | |
21 | + | |
22 | +<%= render :partial => 'profile_comments', :locals => { :activity => activity, :tab_action => tab_action } %> | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +<div class='profile-activity-image'> | |
2 | + <%= link_to(profile_image(activity.user, :minor), activity.user.url) %> | |
3 | +</div> | |
4 | +<div class='profile-activity-description'> | |
5 | + <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> | |
6 | + <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
7 | + <div class='profile-wall-actions'> | |
8 | + <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %> | |
9 | + <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> | |
10 | + </div> | |
11 | +</div> | |
12 | + | |
13 | +<%= render :partial => 'profile_comments', :locals => { :activity => activity, :tab_action => tab_action } %> | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +NÃO É PRA APARECER | ... | ... |
app/views/profile/_leave_scrap.rhtml
1 | -<%= @message %> | |
2 | -<% unless @scraps.nil? %> | |
3 | - <%= render :partial => 'profile_scraps', :locals => {:scraps => @scraps} %> | |
4 | -<% end %> | |
1 | +<div class='profile-activity-image'> | |
2 | + <%= link_to(profile_image(activity.user, :minor), activity.user.url) %> | |
3 | +</div> | |
4 | +<div class='profile-activity-description'> | |
5 | + <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> | |
6 | + <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
7 | + <div class='profile-wall-actions'> | |
8 | + <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> | |
9 | + </div> | |
10 | +</div> | |
11 | + | |
12 | +<br/> | ... | ... |
app/views/profile/_profile.rhtml
1 | -<tr> | |
2 | - <td colspan='2'> | |
1 | +NÃO DEVE APARECER | |
3 | 2 | |
4 | - <% plugins_tabs = @plugins.dispatch(:profile_tabs). | |
5 | - map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content]), :start => tab[:title]} }%> | |
6 | - | |
7 | - <% tabs = plugins_tabs.select { |tab| tab[:start] } %> | |
8 | - | |
9 | - <% if logged_in? && current_person.follows?(@profile) %> | |
10 | - <% tabs << {:title => _('Wall'), :id => 'profile-wall', :content => (render :partial => 'profile_wall')} %> | |
11 | - <% end %> | |
12 | - | |
13 | - <% if @profile.organization? %> | |
14 | - <% tabs << {:title => _('What\'s new'), :id => 'profile-network', :content => (render :partial => 'profile_network')} %> | |
15 | - <% tabs << {:title => _('Profile'), :id => 'organization-profile', :content => (render :partial => 'organization_profile')} %> | |
16 | - <% elsif @profile.person? %> | |
17 | - <% if logged_in? && current_person.follows?(@profile) %> | |
18 | - <% tabs << {:title => _('Network'), :id => 'profile-network', :content => (render :partial => 'profile_network')} %> | |
19 | - <% end %> | |
20 | - | |
21 | - <% tabs << {:title => _('Activity'), :id => 'profile-activity', :content => (render :partial => 'profile_activity')} %> | |
22 | - <% tabs << {:title => _('Profile'), :id => 'person-profile', :content => (render :partial => 'person_profile')} %> | |
23 | - <% end %> | |
24 | - | |
25 | - <% tabs += plugins_tabs.select { |tab| !tab[:start] } %> | |
26 | - | |
27 | - <%= render_tabs(tabs) %> | |
28 | - | |
29 | - </td> | |
30 | -</tr> | ... | ... |
app/views/profile/_profile_activities.rhtml
... | ... | @@ -1,18 +0,0 @@ |
1 | -<% activities.each do |activity| %> | |
2 | - <li class='profile-activity-item <%= activity.verb %>' id='profile-activity-item-<%= activity.id %>'> | |
3 | - <div class='profile-activity-image'> | |
4 | - <%= link_to(profile_image(activity.user, :minor), activity.user.url) %> | |
5 | - </div> | |
6 | - <div class='profile-activity-description'> | |
7 | - <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) + ' ' + _('ago') %></p> | |
8 | - <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> | |
9 | - <%= button_to_remote(:delete, content_tag(:span, _('Remove')), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if can_edit_profile %> | |
10 | - </div> | |
11 | - <hr /> | |
12 | - </li> | |
13 | -<% end %> | |
14 | -<% if activities.current_page < activities.total_pages %> | |
15 | - <div id='profile_activities_page_<%= activities.current_page %>'> | |
16 | - <%= button_to_remote :add, _('View more'), :url => {:action => 'view_more_activities', :page => (activities.current_page + 1)}, :update => "profile_activities_page_#{activities.current_page}" %> | |
17 | - </div> | |
18 | -<% end %> |
... | ... | @@ -0,0 +1,16 @@ |
1 | +<% unless activities.nil? %> | |
2 | + <% activities.each do |a| %> | |
3 | + <% activity = a.klass.constantize.find(a.id) %> | |
4 | + <% if activity.kind_of?(ActionTracker::Record) %> | |
5 | + <%= render :partial => 'profile_activity', :locals => { :activity => activity, :tab_action => 'wall' } if activity.visible? %> | |
6 | + <% else %> | |
7 | + <%= render :partial => 'profile_scrap', :locals => {:scrap => activity } %> | |
8 | + <% end %> | |
9 | + <% end %> | |
10 | +<% end %> | |
11 | + | |
12 | +<% if activities.current_page < activities.total_pages %> | |
13 | + <div id='profile_activities_page_<%= activities.current_page %>'> | |
14 | + <%= button_to_remote :add, _('View more'), :url => {:action => 'view_more_activities', :page => (activities.current_page + 1)}, :update => "profile_activities_page_#{activities.current_page}" %> | |
15 | + </div> | |
16 | +<% end %> | ... | ... |
app/views/profile/_profile_activity.rhtml
1 | -<div id='profile-activity'> | |
2 | - <h3><%= _("%s's activity") % @profile.name %></h3> | |
3 | - <ul> | |
4 | - <%= render :partial => 'profile_activities', :locals => {:activities => @activities} %> | |
5 | - </ul> | |
6 | -</div> | |
1 | +<li class='profile-activity-item <%= activity.verb %>' id='profile-activity-item-<%= activity.id %>'> | |
2 | + <%= render :partial => activity.verb, :locals => { :activity => activity, :tab_action => tab_action }%> | |
3 | + <hr /> | |
4 | +</li> | ... | ... |
... | ... | @@ -0,0 +1,20 @@ |
1 | +<div id='profile-wall-reply-<%= activity.id%>'> | |
2 | + <div id='profile-wall-reply-form-<%= activity.id%>'> | |
3 | + <p class='profile-wall-reply'> | |
4 | + <% update_area = tab_action == 'wall' ? 'profile_activities' : 'network-activities' %> | |
5 | + <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_comment_on_activity', :tab_action => tab_action}, :html => { :class => 'profile-wall-reply-form', 'data-update' => update_area } do %> | |
6 | + <%= text_area :comment, :body, {:id => "reply_content_#{activity.id}", | |
7 | + :cols => 50, | |
8 | + :rows => 1, | |
9 | + :class => 'submit-with-keypress', | |
10 | + :title => _('Leave your comment'), | |
11 | + :onfocus => ('if(this.value==this.title){this.value="";this.style.color="#000"};this.style.backgroundImage="url(' + profile_icon(current_person, :icon, false) + ')"' if logged_in?), | |
12 | + :onblur => ('if(this.value==""){this.value=this.title;this.style.color="#ccc"};this.style.backgroundImage="none"' if logged_in?), | |
13 | + :value => _('Leave your comment'), | |
14 | + :style => 'color: #ccc' } %> | |
15 | + <%= hidden_field_tag :source_id, activity.id, :id => "activity_id_#{activity.id}" %> | |
16 | + <% end %> | |
17 | + </p> | |
18 | + </div> | |
19 | + <div id='profile-wall-message-response-<%=activity.id%>' class='profile-wall-message-response'></div> | |
20 | +</div> | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +<hr /> | |
2 | + | |
3 | +<% if activity.comments_count > 2 %> | |
4 | + <div class='view-all-comments icon-chat'> | |
5 | + <%= link_to(_("View all %s comments") % activity.comments_count, '#') %> | |
6 | + </div> | |
7 | +<% end %> | |
8 | + | |
9 | +<ul class="profile-wall-activities-comments" style="<%= 'display:none;' if (activity.comments_count > 2) %>" > | |
10 | + <%= render :partial => 'comment', :collection => activity.comments %> | |
11 | +</ul> | |
12 | + | |
13 | +<%= render :partial => 'profile_comment_form', :locals => { :activity => activity, :tab_action => tab_action } %> | ... | ... |
app/views/profile/_profile_network.rhtml
app/views/profile/_profile_network_activities.rhtml
1 | - <% network_activities.each do |activity| %> | |
2 | - <li class='profile-network-item <%= activity.verb %>' id='profile-network-item-<%= activity.id %>'> | |
3 | - <div class='profile-network-image'> | |
4 | - <%= link_to(profile_image(activity.user, :minor), activity.user.url) %> | |
5 | - <% if logged_in? && current_person.follows?(activity.user) && current_person != activity.user %> | |
6 | - <p class='profile-network-send-message'><%= link_to_function _('Scrap'), "hide_and_show(['#profile-network-message-response-#{activity.id}'],['#profile-network-message-#{activity.id}', '#profile-network-form-#{activity.id}']);$('content_#{activity.id}').value='';return false", :class => "profile-send-message", :title => _("Send a message to %s") % activity.user.name %></p> | |
7 | - <% end %> | |
8 | - </div> | |
9 | - <div class='profile-network-description'> | |
10 | - <p class='profile-network-time'><%= time_ago_as_sentence(activity.created_at) + ' ' + _('ago') %></p> | |
11 | - <p class='profile-network-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> | |
12 | - <%= button_to_remote(:delete, content_tag(:span, _('Remove')), :url =>{:action => 'remove_notification', :activity_id => activity.id}, :update => "profile-network-item-#{activity.id}") if can_edit_profile %> | |
13 | - <p class='profile-network-where'><%= _('In community %s') % link_to(activity.target.name, activity.target.url) if !profile.is_a?(Community) && activity.target.is_a?(Community) %></p> | |
14 | - </div> | |
15 | - <div id='profile-network-message-<%= activity.id%>' style='display:none;'> | |
16 | - <div id='profile-network-form-<%= activity.id%>' style='display:none;'> | |
17 | - <p class='profile-network-message'> | |
18 | - <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_scrap', :not_load_scraps => true}, :update => "profile-network-message-response-#{activity.id}", :success =>"hide_and_show(['#profile-network-form-#{activity.id}'],['#profile-network-message-response-#{activity.id}'])" do %> | |
19 | - <%= limited_text_area :scrap, :content, 420, "content_#{activity.id}", :cols => 50, :rows => 2 %> | |
20 | - <%= hidden_field_tag 'receiver_id', activity.user.id %> | |
21 | - <%= submit_button :add, _('Leave a message') %> | |
22 | - <%= button_to_function :cancel, _('Cancel'), "hide_and_show(['#profile-network-message-#{activity.id}'],[]);return false" %> | |
23 | - <% end %> | |
24 | - </p> | |
25 | - </div> | |
26 | - <div id='profile-network-message-response-<%=activity.id%>' class='profile-network-message-response'></div> | |
27 | - </div> | |
28 | - <hr /> | |
29 | - </li> | |
30 | - <% end %> | |
1 | +<% network_activities.each do |activity| %> | |
2 | + <%= render :partial => 'profile_activity', :locals => { :activity => activity, :tab_action => 'network' } if activity.visible? %> | |
3 | +<% end %> | |
31 | 4 | <% if network_activities.current_page < network_activities.total_pages %> |
32 | 5 | <div id='profile_network_activities_page_<%= network_activities.current_page %>'> |
33 | 6 | <%= button_to_remote :add, _('View more'), :url => {:action => 'view_more_network_activities', :page => (network_activities.current_page + 1)}, :update => "profile_network_activities_page_#{network_activities.current_page}" %> | ... | ... |
app/views/profile/_profile_scrap.rhtml
1 | -<li class='profile-wall-item' id='profile-wall-item-<%= scrap.id %>'> | |
2 | - <div class='profile-wall-image'> | |
1 | +<li class='profile-activity-item' id='profile-activity-item-<%= scrap.id %>'> | |
2 | + <div class='profile-activity-image'> | |
3 | 3 | <%= link_to(profile_image(scrap.sender, :minor), scrap.sender.url) %> |
4 | - <% if logged_in? && current_person.follows?(scrap.sender) && current_person != scrap.sender %> | |
5 | - <p class='profile-wall-send-message'><%= link_to_function _('Scrap'), "hide_and_show(['#profile-wall-message-response-#{scrap.id}'],['#profile-wall-message-#{scrap.id}', '#profile-wall-form-#{scrap.id}']);$('content_#{scrap.id}').value='';return false", :class => "profile-send-message", :title => _("Send a message to %s") % scrap.sender.name %></p> | |
6 | - <% end %> | |
7 | 4 | </div> |
8 | - <% comment_balloon :class => 'profile-wall-description' do %> | |
9 | - <p class='profile-wall-sender'><%= link_to scrap.sender.name, scrap.sender.url %></p> | |
10 | - <p class='profile-wall-time'><%= time_ago_as_sentence(scrap.created_at) + ' ' + _('ago') %></p> | |
11 | - <p class='profile-wall-text'><%= txt2html scrap.content %></p> | |
12 | - <%= button_to_remote(:delete, content_tag(:span, _('Remove')), :url =>{:action => 'remove_scrap', :scrap_id => scrap.id}, :update => "profile-wall-item-#{scrap.id}") if logged_in? && user.can_control_scrap?(scrap) %> | |
13 | - <% if logged_in? && current_person.follows?(scrap.sender) && scrap.root.nil? %> | |
14 | - <p class='profile-wall-send-reply'><%= link_to_function _('Reply'), "hide_and_show(['#profile-wall-reply-response-#{scrap.id}'],['#profile-wall-reply-#{scrap.id}', '#profile-wall-reply-form-#{scrap.id}']);$('reply_content_#{scrap.id}').value='';$('scrap_id_#{scrap.id}').value='#{scrap.id}';return false", :class => "profile-send-reply icon-reply" %></p> | |
5 | + <div class='profile-activity-description'> | |
6 | + <p class='profile-activity-sender'><%= link_to scrap.sender.name, scrap.sender.url %></p> | |
7 | + <p class='profile-activity-text'><%= txt2html scrap.content %></p> | |
8 | + <p class='profile-activity-time'><%= time_ago_as_sentence(scrap.created_at) %></p> | |
9 | + <div class='profile-wall-actions'> | |
10 | + <% if logged_in? && current_person.follows?(scrap.sender) %> | |
11 | + <span class='profile-activity-send-reply'> | |
12 | + <%= link_to_function s_('profile|Comment'), "hide_and_show(['#profile-wall-message-response-#{scrap.id}'],['#profile-wall-reply-#{scrap.id}', '#profile-wall-reply-form-#{scrap.id}']);$('reply_content_#{scrap.id}').value='';$('reply_content_#{scrap.id}').focus();return false", :class => "profile-send-reply" %> | |
13 | + </span> | |
15 | 14 | <% end %> |
15 | + <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_scrap', :scrap_id => scrap.id}, :update => "profile-activity-item-#{scrap.id}") if logged_in? && user.can_control_scrap?(scrap) %> | |
16 | + </div> | |
17 | + </div> | |
18 | + | |
19 | + <% if scrap.replies.count > 2 %> | |
20 | + <div class='view-all-comments icon-chat'> | |
21 | + <%= link_to(_("View all %s comments") % scrap.replies.count, '#') %> | |
22 | + </div> | |
16 | 23 | <% end %> |
17 | - <ul class="profile-wall-scrap-replies"> | |
24 | + | |
25 | + <ul class="profile-wall-activities-comments scrap-replies" style="width: auto; <%= 'display:none;' if (scrap.replies.count > 2) %>" > | |
18 | 26 | <% scrap.replies.map do |reply| %> |
19 | 27 | <%= render :partial => 'profile_scrap', :locals => {:scrap => reply} %> |
20 | 28 | <% end %> |
21 | 29 | </ul> |
22 | - <div id='profile-wall-message-<%= scrap.id%>' style='display:none;'> | |
23 | - <div id='profile-wall-form-<%= scrap.id%>' style='display:none;'> | |
24 | - <p class='profile-wall-message'> | |
25 | - <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_scrap', :not_load_scraps => true}, :update => "profile-wall-message-response-#{scrap.id}", :success =>"hide_and_show(['#profile-wall-form-#{scrap.id}'],['#profile-wall-message-response-#{scrap.id}'])" do %> | |
26 | - <%= limited_text_area :scrap, :content, 420, "content_#{scrap.id}", :cols => 50, :rows => 2 %> | |
27 | - <%= hidden_field_tag 'receiver_id', scrap.sender.id %> | |
28 | - <%= submit_button :add, _('Leave a scrap') %> | |
29 | - <%= button_to_function :cancel, _('Cancel'), "hide_and_show(['#profile-wall-message-#{scrap.id}'],[]);return false" %> | |
30 | - <% end %> | |
31 | - </p> | |
32 | - </div> | |
33 | - <div id='profile-wall-message-response-<%=scrap.id%>' class='profile-wall-message-response'></div> | |
34 | - </div> | |
35 | - <div id='profile-wall-reply-<%= scrap.id%>' style='display:none;'> | |
36 | - <div id='profile-wall-reply-form-<%= scrap.id%>' style='display:none;'> | |
37 | - <p class='profile-wall-reply'> | |
38 | - <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_scrap'}, :update => "profile_scraps", :success =>"hide_and_show(['#profile-wall-reply-form-#{scrap.id}'],['#profile-wall-reply-response-#{scrap.id}'])" do %> | |
39 | - <%= limited_text_area :scrap, :content, 420, "reply_content_#{scrap.id}", :cols => 50, :rows => 2 %> | |
40 | - <%= hidden_field :scrap, :scrap_id, :id => "scrap_id_#{scrap.id}" %> | |
41 | - <%= hidden_field_tag 'receiver_id', scrap.sender.id %> | |
42 | - <%= submit_button :add, _('Leave a scrap') %> | |
43 | - <%= button_to_function :cancel, _('Cancel'), "hide_and_show(['#profile-wall-reply-#{scrap.id}'],[]);return false" %> | |
44 | - <% end %> | |
45 | - </p> | |
46 | - </div> | |
47 | - <div id='profile-wall-message-response-<%=scrap.id%>' class='profile-wall-message-response'></div> | |
48 | - </div> | |
30 | + <%= render :partial => 'profile_scrap_reply_form', :locals => { :scrap => scrap } %> | |
49 | 31 | <hr /> |
50 | 32 | </li> | ... | ... |
... | ... | @@ -0,0 +1,20 @@ |
1 | +<div id='profile-wall-reply-<%= scrap.id%>' style='display:none'> | |
2 | + <div id='profile-wall-reply-form-<%= scrap.id%>' style='display:none'> | |
3 | + <p class='profile-wall-reply'> | |
4 | + <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_scrap'}, :update => "profile_activities", :html => { :class => 'profile-wall-reply-form'} do %> | |
5 | + <%= text_area :scrap, :content, { :id => "reply_content_#{scrap.id}", | |
6 | + :cols => 50, | |
7 | + :rows => 1, | |
8 | + :class => 'submit-with-keypress', | |
9 | + :title => _('Leave your comment'), | |
10 | + :onfocus => ('if(this.value==this.title){this.value="";this.style.color="#000"};this.style.backgroundImage="url(' + profile_icon(current_person, :icon, false) + ')"' if logged_in?), | |
11 | + :onblur => ('if(this.value==""){this.value=this.title;this.style.color="#ccc"};this.style.backgroundImage="none"' if logged_in?), | |
12 | + :value => _('Leave your comment') | |
13 | + } %> | |
14 | + <%= hidden_field_tag 'scrap[scrap_id]', scrap.id %> | |
15 | + <%= hidden_field_tag 'receiver_id', scrap.sender.id %> | |
16 | + <% end %> | |
17 | + </p> | |
18 | + </div> | |
19 | + <div id='profile-wall-message-response-<%=scrap.id%>' class='profile-wall-message-response'></div> | |
20 | +</div> | ... | ... |
app/views/profile/_profile_scraps.rhtml
1 | -<% scraps.map do |scrap| %> | |
2 | - <%= render :partial => 'profile_scrap', :locals => {:scrap => scrap} %> | |
3 | -<% end %> | |
4 | -<% if scraps.current_page < scraps.total_pages %> | |
5 | - <div id='profile_scraps_page_<%= scraps.current_page %>'> | |
6 | - <%= button_to_remote :add, _('View more'), :url => {:action => 'view_more_scraps', :page => (scraps.current_page + 1)}, :update => "profile_scraps_page_#{scraps.current_page}" %> | |
7 | - </div> | |
8 | -<% end %> | |
1 | +NÃO DEVE APARECER | ... | ... |
app/views/profile/_profile_wall.rhtml
1 | 1 | <h3><%= _("%s's wall") % @profile.name %></h3> |
2 | 2 | <div id='leave_scrap'> |
3 | 3 | <%= flash[:error] %> |
4 | - <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_scrap', :tab_action => 'wall' }, :update => 'profile_scraps', :success => "$('leave_scrap_content').value=''" do %> | |
4 | + <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_scrap', :tab_action => 'wall' }, :update => 'profile_activities', :success => "$('leave_scrap_content').value=''" do %> | |
5 | 5 | <%= limited_text_area :scrap, :content, 420, 'leave_scrap_content', :cols => 50, :rows => 2 %> |
6 | - <%= submit_button :scrap, _('Leave a scrap') %> | |
6 | + <%= submit_button :new, _('Share') %> | |
7 | 7 | <% end %> |
8 | 8 | </div> |
9 | 9 | <div id='leave_scrap_response'></div> |
10 | -<ul id='profile_scraps'> | |
11 | - <%= render :partial => 'profile_scraps', :locals => {:scraps => @wall_items} %> | |
10 | +<ul id='profile_activities' class='profile-activities'> | |
11 | + <%= render :partial => 'profile_activities_list', :locals => {:activities => @activities} %> | |
12 | 12 | </ul> | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +NAO É PRA APARECER | ... | ... |
... | ... | @@ -0,0 +1,20 @@ |
1 | +<div class="activity-gallery-images-count-<%= activity.get_view_url.size %>"> | |
2 | + <div class='profile-activity-image'> | |
3 | + <%= link_to(profile_image(activity.user, :minor), activity.user.url) %> | |
4 | + </div> | |
5 | + <div class='profile-activity-description'> | |
6 | + <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> | |
7 | + <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
8 | + <div class='profile-wall-actions'> | |
9 | + <%= link_to(s_('profile|Comment'), '#', { :class => 'focus-on-comment'}) unless activity.get_view_url.size == 1 %> | |
10 | + <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> | |
11 | + </div> | |
12 | + </div> | |
13 | +</div> | |
14 | +<div title='<%= activity.target.class.short_description %>' class='profile-activity-icon icon-new icon-newgallery'></div> | |
15 | + | |
16 | +<% if activity.get_view_url.size == 1 %> | |
17 | + <%= render :partial => 'profile_comments', :locals => { :activity => activity, :tab_action => tab_action } %> | |
18 | +<% end %> | |
19 | + | |
20 | +<br/> | ... | ... |
app/views/profile/index.rhtml
... | ... | @@ -17,6 +17,31 @@ |
17 | 17 | |
18 | 18 | <% if @profile.public? || (logged_in? && current_person.follows?(@profile)) %> |
19 | 19 | <table class='profile'> |
20 | - <%= render :partial => 'profile' %> | |
20 | + <tr> | |
21 | + <td colspan='2'> | |
22 | + <% plugins_tabs = @plugins.dispatch(:profile_tabs). | |
23 | + map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content]), :start => tab[:title]} }%> | |
24 | + | |
25 | + <% tabs = plugins_tabs.select { |tab| tab[:start] } %> | |
26 | + | |
27 | + <% if @profile.organization? %> | |
28 | + <% tabs << {:title => _('Profile'), :id => 'organization-profile', :content => (render :partial => 'organization_profile')} %> | |
29 | + <% if logged_in? && current_person.follows?(@profile) %> | |
30 | + <% tabs << {:title => _('Wall'), :id => 'profile-wall', :content => (render :partial => 'profile_wall')} %> | |
31 | + <% end %> | |
32 | + <% tabs << {:title => _('What\'s new'), :id => 'profile-network', :content => (render :partial => 'profile_network')} %> | |
33 | + <% elsif @profile.person? %> | |
34 | + <% tabs << {:title => _('Profile'), :id => 'person-profile', :content => (render :partial => 'person_profile')} %> | |
35 | + <% if logged_in? && current_person.follows?(@profile) %> | |
36 | + <% tabs << {:title => _('Wall'), :id => 'profile-wall', :content => (render :partial => 'profile_wall')} %> | |
37 | + <% tabs << {:title => _('Network'), :id => 'profile-network', :content => (render :partial => 'profile_network')} %> | |
38 | + <% end %> | |
39 | + <% end %> | |
40 | + | |
41 | + <% tabs += plugins_tabs.select { |tab| !tab[:start] } %> | |
42 | + | |
43 | + <%= render_tabs(tabs) %> | |
44 | + </td> | |
45 | + </tr> | |
21 | 46 | </table> |
22 | 47 | <% end %> | ... | ... |
app/views/tasks/_abuse_complaint_accept_details.rhtml
... | ... | @@ -2,7 +2,7 @@ |
2 | 2 | <% task.abuse_reports.each do |abuse_report| %> |
3 | 3 | <div> |
4 | 4 | <strong style="word-wrap: break-word; display: block; padding-right: 40px">"<%= abuse_report.reason %>"</strong> <br /> |
5 | - <i><%= _('Reported by %{reporter} %{time}.') % {:reporter => abuse_report.reporter.name, :time => time_ago_as_sentence(abuse_report.created_at) + ' ' + _('ago')}%></i> <br /> | |
5 | + <i><%= _('Reported by %{reporter} %{time}.') % {:reporter => abuse_report.reporter.name, :time => time_ago_as_sentence(abuse_report.created_at) }%></i> <br /> | |
6 | 6 | <% if !abuse_report.content.blank? %> |
7 | 7 | <button class="display-abuse-report-details" data-report="<%=abuse_report.id%>"><%=_('View details')%></button> |
8 | 8 | <div style='display: none' id=<%= 'abuse-report-details-'+abuse_report.id.to_s %> class="abuse-report-details"> | ... | ... |
config/initializers/action_tracker.rb
... | ... | @@ -5,18 +5,7 @@ require 'noosfero/i18n' |
5 | 5 | ActionTrackerConfig.verbs = { |
6 | 6 | |
7 | 7 | :create_article => { |
8 | - :description => lambda { n_('published 1 article: %{title}', 'published %{num} articles: %{title}', get_name.size) % { :num => get_name.size, :title => '{{ta.collect_group_with_index(:name){ |n,i| link_to(truncate(n), ta.get_url[i]) }.to_sentence(:connector => "%s")}}' % _("and") } }, | |
9 | - :type => :groupable | |
10 | - }, | |
11 | - | |
12 | - :update_article => { | |
13 | - :description => lambda { n_('updated 1 article: %{title}', 'updated %{num} articles: %{title}', get_name.uniq.size) % { :num => get_name.uniq.size, :title => '{{ta.collect_group_with_index(:name){ |n,i| link_to(truncate(n), ta.get_url[i]) }.uniq.to_sentence(:connector => "%s")}}' % _("and") } }, | |
14 | - :type => :groupable | |
15 | - }, | |
16 | - | |
17 | - :remove_article => { | |
18 | - :description => lambda { n_('removed 1 article: %{title}', 'removed %{num} articles: %{title}', get_name.size) % { :num => get_name.size, :title => '{{ta.get_name.collect{ |n| truncate(n) }.to_sentence(:connector => "%s")}}' % _("and") } }, | |
19 | - :type => :groupable | |
8 | + :description => lambda { _('published an article: %{title}') % { :title => '{{link_to(truncate(ta.get_name), ta.get_url)}}' } } | |
20 | 9 | }, |
21 | 10 | |
22 | 11 | :new_friendship => { |
... | ... | @@ -33,24 +22,11 @@ ActionTrackerConfig.verbs = { |
33 | 22 | :description => lambda { _('has joined the community.') }, |
34 | 23 | }, |
35 | 24 | |
36 | - :remove_member_in_community => { | |
37 | - :description => lambda { _('has left the community.') }, | |
38 | - }, | |
39 | - | |
40 | - :leave_community => { | |
41 | - :description => lambda { n_('has left 1 community:<br />%{name}', 'has left %{num} communities:<br />%{name}', get_resource_name.size) % { :num => get_resource_name.size, :name => '{{ta.collect_group_with_index(:resource_name){ |n,i| link_to(image_tag(ta.get_resource_profile_custom_icon[i] || default_or_themed_icon("/images/icons-app/community-icon.png")), ta.get_resource_url[i], :title => n)}.join}}' } }, | |
42 | - :type => :groupable | |
43 | - }, | |
44 | - | |
45 | 25 | :upload_image => { |
46 | - :description => lambda { n_('uploaded 1 image:<br />%{thumbnails}<br />%{details}', 'uploaded %{num} images:<br />%{thumbnails}<br />%{details}', get_view_url.size) % { :num => get_view_url.size, :thumbnails => '{{ta.collect_group_with_index(:thumbnail_path){ |t,i| content_tag(:span, link_to(image_tag(t), ta.get_view_url[i]))}.last(3).join}}', :details => '{{unique_with_count(ta.collect_group_with_index(:parent_name){ |n,i| link_to(n, ta.get_parent_url[i])}, "%s").join("<br />")}}' % _("in the gallery") } }, | |
26 | + :description => lambda { n_('uploaded 1 image<br />%{thumbnails}<br style="clear: both;" />', 'uploaded %{num} images<br />%{thumbnails}<br style="clear: both;" />', get_view_url.size) % { :num => get_view_url.size, :thumbnails => '{{ta.collect_group_with_index(:thumbnail_path){ |t,i| content_tag(:span, link_to(image_tag(t), ta.get_view_url[i]))}.last(3).join}}' } }, | |
47 | 27 | :type => :groupable |
48 | 28 | }, |
49 | 29 | |
50 | - :leave_comment => { | |
51 | - :description => lambda { _('has left a comment entitled "%{title}" on the article %{article}: <br /> "%{comment}" (%{read})') % { :title => "{{truncate(ta.get_title)}}", :article => "{{link_to(truncate(ta.get_article_title), ta.get_article_url)}}", :comment => "{{truncate(ta.get_body, 50)}}", :read => '{{link_to("%s", ta.get_url)}}' % _("read") } } | |
52 | - }, | |
53 | - | |
54 | 30 | :leave_scrap => { |
55 | 31 | :description => lambda { _('sent a message to %{receiver}: <br /> "%{message}"') % { :receiver => "{{link_to(ta.get_receiver_name, ta.get_receiver_url)}}", :message => "{{auto_link_urls(ta.get_content)}}" } } |
56 | 32 | }, | ... | ... |
db/migrate/20111211204445_add_polymorphism_on_comment.rb
0 → 100644
... | ... | @@ -0,0 +1,12 @@ |
1 | +class AddPolymorphismOnComment < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + rename_column :comments, :article_id, :source_id | |
4 | + add_column :comments, :source_type, :string | |
5 | + execute("update comments set source_type = 'Article'") | |
6 | + end | |
7 | + | |
8 | + def self.down | |
9 | + remove_column :comments, :source_type | |
10 | + rename_column :comments, :source_id, :article_id | |
11 | + end | |
12 | +end | ... | ... |
db/migrate/20111211233957_add_comment_count_to_action_tracker.rb
0 → 100644
db/migrate/20111228202739_remove_useless_tracked_actions.rb
0 → 100644
... | ... | @@ -0,0 +1,17 @@ |
1 | +class RemoveUselessTrackedActions < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + select_all("SELECT id FROM action_tracker").each do |tracker| | |
4 | + verbs = ['update_article', 'remove_article', 'leave_comment', 'leave_community', 'remove_member_in_community'] | |
5 | + activity = ActionTracker::Record.find_by_id(tracker['id']) | |
6 | + if activity | |
7 | + if (activity.updated_at.to_time < Time.now.months_ago(3)) || verbs.include?(activity.verb) | |
8 | + activity.destroy | |
9 | + end | |
10 | + end | |
11 | + end | |
12 | + end | |
13 | + | |
14 | + def self.down | |
15 | + say "this migration can't be reverted" | |
16 | + end | |
17 | +end | ... | ... |
db/migrate/20120228154642_add_visibility_to_action_tracker.rb
0 → 100644
db/migrate/20120228202739_adapt_create_articles_activity.rb
0 → 100644
... | ... | @@ -0,0 +1,24 @@ |
1 | +class AdaptCreateArticlesActivity < ActiveRecord::Migration | |
2 | + | |
3 | + # Removing 'create_article' activities that grouped articles. | |
4 | + # Creating new activities only to recent articles (not grouping) | |
5 | + def self.up | |
6 | + select_all("SELECT id FROM action_tracker WHERE verb = 'create_article'").each do |tracker| | |
7 | + activity = ActionTracker::Record.find_by_id(tracker['id']) | |
8 | + if activity | |
9 | + activity.destroy | |
10 | + end | |
11 | + end | |
12 | + | |
13 | + select_all("SELECT id FROM articles").each do |art| | |
14 | + article = Article.find(art['id']) | |
15 | + if article && article.created_at >= 8.days.ago && article.author && article.author.kind_of?(Person) | |
16 | + article.create_activity | |
17 | + end | |
18 | + end | |
19 | + end | |
20 | + | |
21 | + def self.down | |
22 | + say "this migration can't be reverted" | |
23 | + end | |
24 | +end | ... | ... |
db/schema.rb
... | ... | @@ -29,6 +29,8 @@ ActiveRecord::Schema.define(:version => 20120307200651) do |
29 | 29 | t.string "verb" |
30 | 30 | t.datetime "created_at" |
31 | 31 | t.datetime "updated_at" |
32 | + t.integer "comments_count", :default => 0 | |
33 | + t.boolean "visible", :default => true | |
32 | 34 | end |
33 | 35 | |
34 | 36 | add_index "action_tracker", ["target_id", "target_type"], :name => "index_action_tracker_on_dispatcher_id_and_dispatcher_type" |
... | ... | @@ -198,7 +200,7 @@ ActiveRecord::Schema.define(:version => 20120307200651) do |
198 | 200 | create_table "comments", :force => true do |t| |
199 | 201 | t.string "title" |
200 | 202 | t.text "body" |
201 | - t.integer "article_id" | |
203 | + t.integer "source_id" | |
202 | 204 | t.integer "author_id" |
203 | 205 | t.string "name" |
204 | 206 | t.string "email" |
... | ... | @@ -206,6 +208,7 @@ ActiveRecord::Schema.define(:version => 20120307200651) do |
206 | 208 | t.integer "reply_of_id" |
207 | 209 | t.string "ip_address" |
208 | 210 | t.boolean "spam" |
211 | + t.string "source_type" | |
209 | 212 | end |
210 | 213 | |
211 | 214 | create_table "contact_lists", :force => true do |t| | ... | ... |
lib/notify_activity_to_profiles_job.rb
1 | 1 | class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id) |
2 | 2 | NOTIFY_ONLY_COMMUNITY = [ |
3 | - 'add_member_in_community', | |
4 | - 'remove_member_in_community', | |
3 | + 'add_member_in_community' | |
5 | 4 | ] |
6 | 5 | |
7 | 6 | NOT_NOTIFY_COMMUNITY = [ |
8 | - 'join_community', | |
9 | - 'leave_community', | |
7 | + 'join_community' | |
10 | 8 | ] |
11 | 9 | def perform |
12 | 10 | return unless ActionTracker::Record.exists?(tracked_action_id) |
... | ... | @@ -19,6 +17,7 @@ class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id) |
19 | 17 | |
20 | 18 | ActionTrackerNotification.create(:profile_id => tracked_action.user.id, :action_tracker_id => tracked_action.id) |
21 | 19 | |
20 | + #Notify all friends | |
22 | 21 | ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select f.friend_id, #{tracked_action.id} from friendships as f where person_id=#{tracked_action.user.id} and f.friend_id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id})") |
23 | 22 | |
24 | 23 | if target.is_a?(Community) |
... | ... | @@ -26,5 +25,12 @@ class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id) |
26 | 25 | |
27 | 26 | ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb) |
28 | 27 | end |
28 | + | |
29 | + if target.is_a?(Article) && target.profile.is_a?(Community) | |
30 | + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.profile.id}") | |
31 | + | |
32 | + ActionTrackerNotification.create(:profile_id => target.profile.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb) | |
33 | + end | |
34 | + | |
29 | 35 | end |
30 | 36 | end | ... | ... |
public/designs/icons/tango/style.css
... | ... | @@ -91,7 +91,7 @@ |
91 | 91 | .icon-lock { background-image: url(Tango/16x16/actions/lock.png) } |
92 | 92 | .icon-chat { background-image: url(Tango/16x16/apps/internet-group-chat.png); background-repeat: no-repeat } |
93 | 93 | .icon-reply { background-image: url(Tango/16x16/actions/mail-reply-sender.png) } |
94 | -.icon-newforum { background-image: url(Tango/16x16/apps/system-users.png) } | |
94 | +.icon-newforum { background-image: url(Tango/16x16/apps/internet-group-chat.png) } | |
95 | 95 | .icon-forum { background-image: url(Tango/16x16/apps/system-users.png) } |
96 | 96 | .icon-gallery { background-image: url(Tango/16x16/mimetypes/image-x-generic.png) } |
97 | 97 | .icon-newgallery { background-image: url(Tango/16x16/mimetypes/image-x-generic.png) } | ... | ... |
public/designs/templates/default/stylesheets/style.css
public/designs/templates/leftbar/stylesheets/style.css
... | ... | @@ -23,3 +23,54 @@ |
23 | 23 | #profile-wall ul { |
24 | 24 | width: 620px; |
25 | 25 | } |
26 | + | |
27 | +.profile-activity-lead { | |
28 | + width: 534px; | |
29 | +} | |
30 | + | |
31 | +#profile-wall textarea { | |
32 | + width: 534px; | |
33 | +} | |
34 | + | |
35 | +#profile-wall #leave_scrap textarea { | |
36 | + width: 640px; | |
37 | +} | |
38 | + | |
39 | +#profile-wall li textarea { | |
40 | + width: 548px; | |
41 | +} | |
42 | + | |
43 | +.profile-activity-article-forum .profile-activity-lead { | |
44 | + background: url(/images/forum-activity-bg-onecol.png); | |
45 | + width: 489px; | |
46 | +} | |
47 | + | |
48 | +#profile-wall li.profile-activity-item.upload_image span, | |
49 | +#profile-wall li.profile-activity-item.upload_image span img, | |
50 | +#profile-wall li.profile-activity-item.upload_image span a, | |
51 | +#profile-network li.profile-activity-item.upload_image span, | |
52 | +#profile-network li.profile-activity-item.upload_image span img, | |
53 | +#profile-network li.profile-activity-item.upload_image span a { | |
54 | + width: 178px; | |
55 | + height: 144px; | |
56 | +} | |
57 | + | |
58 | +#profile-wall li.profile-activity-item.upload_image span a, | |
59 | +#profile-network li.profile-activity-item.upload_image span a { | |
60 | + background-image: url(/images/gallery-image-activity-border-onecol.png); | |
61 | +} | |
62 | + | |
63 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span, | |
64 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span img, | |
65 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a, | |
66 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span, | |
67 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span img, | |
68 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a { | |
69 | + width: 549px; | |
70 | + height: 254px; | |
71 | +} | |
72 | + | |
73 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a, | |
74 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a { | |
75 | + background-image: url(/images/gallery-image-activity-border-big-onecol.png); | |
76 | +} | ... | ... |
public/designs/templates/rightbar/stylesheets/style.css
... | ... | @@ -23,3 +23,54 @@ |
23 | 23 | #profile-wall ul { |
24 | 24 | width: 620px; |
25 | 25 | } |
26 | + | |
27 | +.profile-activity-lead { | |
28 | + width: 534px; | |
29 | +} | |
30 | + | |
31 | +#profile-wall textarea { | |
32 | + width: 534px; | |
33 | +} | |
34 | + | |
35 | +#profile-wall #leave_scrap textarea { | |
36 | + width: 640px; | |
37 | +} | |
38 | + | |
39 | +#profile-wall li textarea { | |
40 | + width: 548px; | |
41 | +} | |
42 | + | |
43 | +.profile-activity-article-forum .profile-activity-lead { | |
44 | + background: url(/images/forum-activity-bg-onecol.png); | |
45 | + width: 489px; | |
46 | +} | |
47 | + | |
48 | +#profile-wall li.profile-activity-item.upload_image span, | |
49 | +#profile-wall li.profile-activity-item.upload_image span img, | |
50 | +#profile-wall li.profile-activity-item.upload_image span a, | |
51 | +#profile-network li.profile-activity-item.upload_image span, | |
52 | +#profile-network li.profile-activity-item.upload_image span img, | |
53 | +#profile-network li.profile-activity-item.upload_image span a { | |
54 | + width: 178px; | |
55 | + height: 144px; | |
56 | +} | |
57 | + | |
58 | +#profile-wall li.profile-activity-item.upload_image span a, | |
59 | +#profile-network li.profile-activity-item.upload_image span a { | |
60 | + background-image: url(/images/gallery-image-activity-border-onecol.png); | |
61 | +} | |
62 | + | |
63 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span, | |
64 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span img, | |
65 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a, | |
66 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span, | |
67 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span img, | |
68 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a { | |
69 | + width: 549px; | |
70 | + height: 254px; | |
71 | +} | |
72 | + | |
73 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a, | |
74 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a { | |
75 | + background-image: url(/images/gallery-image-activity-border-big-onecol.png); | |
76 | +} | ... | ... |
1.73 KB
1.72 KB
477 Bytes
2.21 KB
1.32 KB
1.44 KB
1.01 KB
public/javascripts/application.js
... | ... | @@ -711,3 +711,37 @@ Array.min = function(array) { |
711 | 711 | return Math.min.apply(Math, array); |
712 | 712 | }; |
713 | 713 | |
714 | +jQuery(function($){ | |
715 | + $('.submit-with-keypress').live('keydown', function(e) { | |
716 | + field = this; | |
717 | + if (e.keyCode == 13) { | |
718 | + e.preventDefault(); | |
719 | + var form = $(field).closest("form"); | |
720 | + $.ajax({ | |
721 | + url: form.attr("action"), | |
722 | + data: form.serialize(), | |
723 | + beforeSend: function() { | |
724 | + loading_for_button($(field)); | |
725 | + }, | |
726 | + success: function(data) { | |
727 | + var update = form.attr('data-update'); | |
728 | + $('#'+update).html(data); | |
729 | + $(field).val($(field).attr('title')); | |
730 | + } | |
731 | + }); | |
732 | + return false; | |
733 | + } | |
734 | + }); | |
735 | + | |
736 | + $('.view-all-comments').live('click', function(e) { | |
737 | + var link = this; | |
738 | + $(link).parent().find('.profile-wall-activities-comments').show(); | |
739 | + $(link).hide(); | |
740 | + return false; | |
741 | + }); | |
742 | + $('.focus-on-comment').live('click', function(e) { | |
743 | + var link = this; | |
744 | + $(link).parents('.profile-activity-item').find('textarea').focus(); | |
745 | + return false; | |
746 | + }); | |
747 | +}); | ... | ... |
public/stylesheets/application.css
... | ... | @@ -268,6 +268,12 @@ td.field-name { |
268 | 268 | vertical-align: top; |
269 | 269 | } |
270 | 270 | |
271 | +table.profile .ui-tabs .ui-tabs-panel { | |
272 | + border-left: 0; | |
273 | + border-right: 0; | |
274 | + border-bottom: 0; | |
275 | +} | |
276 | + | |
271 | 277 | table.profile th { |
272 | 278 | border-bottom: 2px solid #eeeeec; |
273 | 279 | padding: 10px 0px 0px 0px; |
... | ... | @@ -1429,7 +1435,8 @@ a.comment-picture { |
1429 | 1435 | border-radius: 5px; |
1430 | 1436 | } |
1431 | 1437 | |
1432 | -.comment-replies .article-comment-inner { | |
1438 | +.comment-replies .article-comment-inner, | |
1439 | +.scrap-replies { | |
1433 | 1440 | border: 1px solid #fff; |
1434 | 1441 | padding: 0; |
1435 | 1442 | -moz-border-radius: 4px; |
... | ... | @@ -5883,8 +5890,183 @@ h1#agenda-title { |
5883 | 5890 | |
5884 | 5891 | #profile-activity li, #profile-network li, #profile-wall li { |
5885 | 5892 | display: block; |
5886 | - padding: 0; | |
5887 | - margin-bottom: 8px; | |
5893 | + padding: 3px; | |
5894 | + margin-bottom: 3px; | |
5895 | + background-color: #fff; | |
5896 | + border-bottom: 1px solid #e8e8e8; | |
5897 | + position: relative; | |
5898 | +} | |
5899 | + | |
5900 | +#profile-activity li, #profile-network li, #profile-wall li { | |
5901 | +} | |
5902 | + | |
5903 | +.profile-activity-lead img { | |
5904 | + width: 124px; | |
5905 | + float: left; | |
5906 | + margin-right: 5px; | |
5907 | +} | |
5908 | + | |
5909 | +.profile-activity-lead { | |
5910 | + width: 370px; | |
5911 | + display: inline-block; | |
5912 | + text-align: left; | |
5913 | + margin: 5px 0; | |
5914 | +} | |
5915 | + | |
5916 | +.profile-activity-article-forum .profile-activity-lead { | |
5917 | + height: 50px; | |
5918 | + width: 297px; | |
5919 | + padding-left: 60px; | |
5920 | + float: none; | |
5921 | + overflow: hidden; | |
5922 | + background: transparent url(/images/forum-activity-bg.png) left center no-repeat; | |
5923 | +} | |
5924 | + | |
5925 | +.profile-activity-article-forum .see-forum { | |
5926 | + text-align: right; | |
5927 | +} | |
5928 | + | |
5929 | +.profile-activity-article-forum .see-forum a { | |
5930 | + background: transparent url(/images/forum-activity-icon.png) left center no-repeat; | |
5931 | + padding-left: 30px; | |
5932 | + font-weight: bold; | |
5933 | + color: #dadada !important; | |
5934 | + text-decoration: none; | |
5935 | + font-size: 11px; | |
5936 | +} | |
5937 | + | |
5938 | +.profile-activity-article-forum .profile-activity-lead b { | |
5939 | + font-weight: normal; | |
5940 | +} | |
5941 | + | |
5942 | +#profile-activity li a, #profile-network li a, #profile-wall li a, | |
5943 | +#profile-wall .profile-wall-send-reply { | |
5944 | + color: #333; | |
5945 | +} | |
5946 | + | |
5947 | +#profile-activity li a, #profile-network li a, #profile-wall li a { | |
5948 | + font-weight: bold; | |
5949 | + text-decoration: none; | |
5950 | +} | |
5951 | + | |
5952 | +#profile-activity li a:hover, #profile-network li a:hover, #profile-wall li a:hover { | |
5953 | + text-decoration: underline; | |
5954 | +} | |
5955 | + | |
5956 | +.profile-activity-text { | |
5957 | + margin: 0; | |
5958 | + color: #000; | |
5959 | +} | |
5960 | + | |
5961 | +#profile-wall li.profile-activity-item.upload_image span, | |
5962 | +#profile-wall li.profile-activity-item.upload_image span a, | |
5963 | +#profile-network li.profile-activity-item.upload_image span, | |
5964 | +#profile-network li.profile-activity-item.upload_image span a { | |
5965 | + width: 110px; | |
5966 | + height: 100px; | |
5967 | + display: block; | |
5968 | + overflow: hidden; | |
5969 | + position: absolute; | |
5970 | +} | |
5971 | + | |
5972 | +#profile-wall li.profile-activity-item.upload_image span a img, | |
5973 | +#profile-network li.profile-activity-item.upload_image span a img { | |
5974 | + width: 110px; | |
5975 | + height: 100px; | |
5976 | +} | |
5977 | + | |
5978 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span, | |
5979 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a, | |
5980 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a img, | |
5981 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span, | |
5982 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a img { | |
5983 | + width: 383px; | |
5984 | + height: auto; | |
5985 | +} | |
5986 | + | |
5987 | +#profile-wall li.profile-activity-item.upload_image span img, | |
5988 | +#profile-network li.profile-activity-item.upload_image span img { | |
5989 | + display: block; | |
5990 | +} | |
5991 | + | |
5992 | +#profile-wall li.profile-activity-item.upload_image span, | |
5993 | +#profile-network li.profile-activity-item.upload_image span { | |
5994 | + position: relative; | |
5995 | + display: inline-block; | |
5996 | + margin: 5px 0px 0px 5px; | |
5997 | +} | |
5998 | + | |
5999 | +#profile-wall li.profile-activity-item.upload_image .profile-activity-text span, | |
6000 | +#profile-network li.profile-activity-item.upload_image .profile-activity-text span { | |
6001 | + border: 4px solid #D2D2D2; | |
6002 | + border-radius: 4px; | |
6003 | + -webkit-border-radius: 4px; | |
6004 | + -moz-border-radius: 4px; | |
6005 | +} | |
6006 | + | |
6007 | +#profile-wall li.profile-activity-item.upload_image span a, | |
6008 | +#profile-network li.profile-activity-item.upload_image span a { | |
6009 | + Xbackground: transparent url(/images/gallery-image-activity-border.png) center center no-repeat; | |
6010 | + text-indent: -5000em; | |
6011 | +} | |
6012 | + | |
6013 | +#profile-wall li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a, | |
6014 | +#profile-network li.profile-activity-item.upload_image .activity-gallery-images-count-1 span a { | |
6015 | + Xbackground-image: url(/images/gallery-image-activity-border-big.png); | |
6016 | + position: relative; | |
6017 | +} | |
6018 | + | |
6019 | +#profile-wall li.profile-activity-item.upload_image .article-comment span, | |
6020 | +#profile-wall li.profile-activity-item.upload_image .profile-wall-actions span, | |
6021 | +#profile-network li.profile-activity-item.upload_image .article-comment span, | |
6022 | +#profile-network li.profile-activity-item.upload_image .profile-wall-actions span { | |
6023 | + display: inline; | |
6024 | + position: static; | |
6025 | + margin: 0; | |
6026 | + float: none; | |
6027 | + width: auto; | |
6028 | + height: auto; | |
6029 | + font-weight: normal; | |
6030 | +} | |
6031 | + | |
6032 | +#profile-wall li.profile-activity-item ul.profile-wall-activities-comments, | |
6033 | +#profile-network li.profile-activity-item ul.profile-wall-activities-comments { | |
6034 | + margin-top: 0; | |
6035 | +} | |
6036 | + | |
6037 | +#profile-wall li.profile-activity-item.upload_image .profile-activity-text, | |
6038 | +#profile-network li.profile-activity-item.upload_image .profile-activity-text, | |
6039 | +#profile-network li.profile-activity-item ul.profile-wall-activities-comments { | |
6040 | + padding-left: 50px; | |
6041 | +} | |
6042 | + | |
6043 | +#profile-wall li.profile-activity-item.join_community .profile-activity-text a img, | |
6044 | +#profile-wall li.profile-activity-item.new_friendship .profile-activity-text a img, | |
6045 | +#profile-network li.profile-activity-item.join_community .profile-activity-text a img, | |
6046 | +#profile-network li.profile-activity-item.new_friendship .profile-activity-text a img { | |
6047 | + margin: 5px 5px 0 0; | |
6048 | + padding: 1px; | |
6049 | + border: 1px solid #ccc; | |
6050 | +} | |
6051 | + | |
6052 | +#profile-wall li.profile-activity-item.create_article, | |
6053 | +#profile-netowrk li.profile-activity-item.create_article { | |
6054 | + position: relative; | |
6055 | +} | |
6056 | + | |
6057 | +.profile-activity-icon { | |
6058 | + width: 16px; | |
6059 | + height: 16px; | |
6060 | + display: inline-block; | |
6061 | + position: absolute; | |
6062 | + top: 0px; | |
6063 | + right: 0px; | |
6064 | +} | |
6065 | + | |
6066 | +#profile-activity .profile-wall-scrap-replies li, | |
6067 | +#profile-network .profile-wall-scrap-replies li, | |
6068 | +#profile-wall .profile-wall-scrap-replies li { | |
6069 | + border-bottom: none; | |
5888 | 6070 | } |
5889 | 6071 | |
5890 | 6072 | #profile-activity .profile-activity-image, #profile-network .profile-network-image, #profile-wall .profile-wall-image { |
... | ... | @@ -5898,12 +6080,12 @@ h1#agenda-title { |
5898 | 6080 | |
5899 | 6081 | #profile-activity .profile-activity-description, #profile-network .profile-network-description, #profile-wall .profile-wall-description { |
5900 | 6082 | float: left; |
5901 | - min-height: 60px; | |
6083 | + Xmin-height: 60px; | |
5902 | 6084 | margin: 0; |
5903 | 6085 | padding: 0; |
5904 | 6086 | border: 1px solid #ccc; |
5905 | 6087 | overflow: hidden; |
5906 | - background-color: #fff; | |
6088 | + Xbackground-color: #fff; | |
5907 | 6089 | position: relative; |
5908 | 6090 | } |
5909 | 6091 | |
... | ... | @@ -5918,7 +6100,7 @@ h1#agenda-title { |
5918 | 6100 | } |
5919 | 6101 | |
5920 | 6102 | #profile-activity .profile-activity-description .icon-delete, |
5921 | -#profile-network .profile-network-description .icon-delete, | |
6103 | +#profile-network .profile-activity-description .icon-delete, | |
5922 | 6104 | #profile-wall .profile-wall-description .icon-delete { |
5923 | 6105 | position: absolute; |
5924 | 6106 | top: 4px; |
... | ... | @@ -5930,24 +6112,56 @@ h1#agenda-title { |
5930 | 6112 | -moz-border-radius: 3px; |
5931 | 6113 | } |
5932 | 6114 | |
5933 | -#profile-activity .profile-activity-text, #profile-network .profile-network-text, #profile-wall .profile-wall-text { | |
6115 | +#profile-activity .profile-activity-text, | |
6116 | +#profile-network .profile-activity-text, | |
6117 | +#profile-wall .profile-wall-text { | |
5934 | 6118 | font-size: 13px; |
5935 | - margin: 5px; | |
6119 | + margin: 2px 5px; | |
5936 | 6120 | } |
5937 | 6121 | |
5938 | 6122 | #profile-wall .profile-wall-text { |
5939 | 6123 | padding-top: 0; |
5940 | 6124 | } |
5941 | 6125 | |
5942 | -#profile-activity .profile-activity-time, #profile-network .profile-network-time, #profile-wall .profile-wall-time { | |
6126 | +.profile-activities .profile-activity-time, | |
6127 | +#profile-network .profile-activity-time, | |
6128 | +#profile-wall .profile-wall-time { | |
5943 | 6129 | font-size: 11px; |
5944 | 6130 | margin: 5px; |
5945 | 6131 | color: #babdb6; |
6132 | + text-align: right; | |
6133 | +} | |
6134 | + | |
6135 | +#profile-wall .profile-wall-send-reply, | |
6136 | +.profile-activities .profile-activity-time, | |
6137 | +#profile-network .profile-activity-time, | |
6138 | +#profile-wall .profile-wall-time, | |
6139 | +.profile-wall-actions a { | |
6140 | + display: block; | |
6141 | + float: right; | |
6142 | + font-size: 10px; | |
6143 | + margin: 2px 0 3px 10px; | |
6144 | + color: #ccc; | |
6145 | + padding: 0; | |
6146 | +} | |
6147 | + | |
6148 | +#profile-wall li .profile-wall-actions a, | |
6149 | +#profile-activity li .profile-wall-actions a, | |
6150 | +#profile-network li .profile-wall-actions a, | |
6151 | +#profile-wall .profile-wall-send-reply a { | |
6152 | + text-decoration: none; | |
6153 | + color: #333; | |
6154 | + font-weight: normal; | |
6155 | +} | |
6156 | + | |
6157 | +#profile-wall li .profile-wall-actions a:hover, | |
6158 | +#profile-network li .profile-wall-actions a:hover, | |
6159 | +#profile-wall .profile-wall-send-reply a:hover { | |
6160 | + text-decoration: underline; | |
5946 | 6161 | } |
5947 | 6162 | |
5948 | 6163 | #profile-activity hr, #profile-network hr, #profile-wall hr { |
5949 | - clear: both; | |
5950 | - border: 0; | |
6164 | + display: none; | |
5951 | 6165 | } |
5952 | 6166 | |
5953 | 6167 | #profile-activity .profile-activity-send-message, #profile-network .profile-network-send-message, #profile-wall .profile-wall-send-message { |
... | ... | @@ -6029,11 +6243,13 @@ h1#agenda-title { |
6029 | 6243 | .profile-network-time, |
6030 | 6244 | .profile-network-description { |
6031 | 6245 | padding-left: 5px; |
6246 | + margin: 5px; | |
6032 | 6247 | } |
6033 | 6248 | |
6034 | 6249 | .profile-network-sender, |
6250 | +.profile-activity-sender, | |
6035 | 6251 | .profile-wall-sender { |
6036 | - margin: 2px 0; | |
6252 | + margin: 0; | |
6037 | 6253 | } |
6038 | 6254 | |
6039 | 6255 | #profile-activity .profile-activity-time, |
... | ... | @@ -6050,6 +6266,13 @@ h1#agenda-title { |
6050 | 6266 | overflow: hidden; |
6051 | 6267 | } |
6052 | 6268 | |
6269 | +#profile-network li textarea:focus, | |
6270 | +#profile-wall li textarea:focus { | |
6271 | + background-position: left center; | |
6272 | + background-repeat: no-repeat; | |
6273 | + text-indent: 28px; | |
6274 | +} | |
6275 | + | |
6053 | 6276 | .profile-network-message, |
6054 | 6277 | .profile-wall-message { |
6055 | 6278 | margin: 0; |
... | ... | @@ -6084,21 +6307,25 @@ h1#agenda-title { |
6084 | 6307 | } |
6085 | 6308 | |
6086 | 6309 | .profile-send-reply { |
6087 | - background-color: #eee; | |
6088 | - border: 1px solid #aaa; | |
6089 | - padding: 2px; | |
6090 | - padding-left: 20px; | |
6091 | - background-repeat: no-repeat; | |
6092 | - background-position: 2px center; | |
6310 | + xbackground-color: #eee; | |
6311 | + xborder: 1px solid #aaa; | |
6312 | + xpadding: 2px; | |
6313 | + xpadding-left: 20px; | |
6314 | + xbackground-repeat: no-repeat; | |
6315 | + xbackground-position: 2px center; | |
6093 | 6316 | color: #aaa; |
6094 | - text-decoration: none; | |
6095 | - margin-left: 8px; | |
6317 | + Xtext-decoration: none; | |
6318 | + Xmargin-left: 8px; | |
6096 | 6319 | } |
6097 | 6320 | |
6098 | 6321 | #content .profile-send-reply:hover { |
6099 | 6322 | text-decoration: none; |
6100 | 6323 | } |
6101 | 6324 | |
6325 | +#profile-wall .profile-wall-actions { | |
6326 | + text-align: right; | |
6327 | +} | |
6328 | + | |
6102 | 6329 | #profile-wall .profile-wall-scrap-replies .profile-wall-description { |
6103 | 6330 | background: transparent; |
6104 | 6331 | } |
... | ... | @@ -6116,6 +6343,104 @@ h1#agenda-title { |
6116 | 6343 | background: transparent; |
6117 | 6344 | } |
6118 | 6345 | |
6346 | +#profile-wall ul.profile-wall-activities-comments, | |
6347 | +#profile-network ul.profile-wall-activities-comments { | |
6348 | + margin-top: 35px; | |
6349 | + padding-left: 50px; | |
6350 | + width: auto; | |
6351 | +} | |
6352 | + | |
6353 | +#profile-wall ul.profile-wall-activities-comments ul, | |
6354 | +#profile-network ul.profile-wall-activities-comments ul { | |
6355 | + padding-left: 0px; | |
6356 | +} | |
6357 | + | |
6358 | +#profile-wall .profile-wall-activities-comments li, | |
6359 | +#profile-network .profile-wall-activities-comments li { | |
6360 | + background: #f0f0f1; | |
6361 | + border-bottom: 1px solid #d2d2d2 !important; | |
6362 | + border-top: 1px solid #fff; | |
6363 | + margin-bottom: 0; | |
6364 | +} | |
6365 | + | |
6366 | +#profile-wall .profile-wall-activities-comments img, | |
6367 | +#profile-network .profile-wall-activities-comments img { | |
6368 | + width: 33px; | |
6369 | + height: 33px; | |
6370 | +} | |
6371 | + | |
6372 | +#profile-wall .profile-wall-activities-comments .comment_reply, | |
6373 | +#profile-wall .profile-wall-activities-comments h4, | |
6374 | +#profile-network .profile-wall-activities-comments .comment_reply, | |
6375 | +#profile-network .profile-wall-activities-comments h4 { | |
6376 | + display: none; | |
6377 | +} | |
6378 | + | |
6379 | +#profile-wall .profile-wall-activities-comments .comment-picture, | |
6380 | +#profile-network .profile-wall-activities-comments .comment-picture { | |
6381 | + width: 33px; | |
6382 | + margin-right: 10px; | |
6383 | +} | |
6384 | + | |
6385 | +#profile-wall .profile-wall-activities-comments .comment-text p, | |
6386 | +#profile-network .profile-wall-activities-comments .comment-text p { | |
6387 | + margin: 0; | |
6388 | +} | |
6389 | + | |
6390 | +#profile-wall .profile-wall-activities-comments .profile-activity-time, | |
6391 | +#profile-network .profile-wall-activities-comments .profile-activity-time { | |
6392 | + clear: both; | |
6393 | +} | |
6394 | + | |
6395 | +#profile-wall .profile-wall-activities-comments .comment-details, | |
6396 | +#profile-network .profile-wall-activities-comments .comment-details { | |
6397 | + padding: 0; | |
6398 | +} | |
6399 | + | |
6400 | +#profile-wall .profile-wall-activities-comments .article-comment .button-bar, | |
6401 | +#profile-network .profile-wall-activities-comments .article-comment .button-bar { | |
6402 | + float: right; | |
6403 | + padding: 0; | |
6404 | + text-align: right; | |
6405 | + position: static; | |
6406 | + clear: none; | |
6407 | + display: none; | |
6408 | +} | |
6409 | + | |
6410 | +#profile-wall .profile-wall-activities-comments .article-comment:hover .button-bar, | |
6411 | +#profile-network .profile-wall-activities-comments .article-comment:hover .button-bar { | |
6412 | + display: block; | |
6413 | +} | |
6414 | + | |
6415 | +#profile-wall .profile-wall-activities-comments .article-comment .button-bar a.button, | |
6416 | +#profile-network .profile-wall-activities-comments .article-comment .button-bar a.button { | |
6417 | + background: transparent; | |
6418 | + border: 0; | |
6419 | + height: auto; | |
6420 | + line-height: auto; | |
6421 | + color: #333; | |
6422 | + text-decoration: none; | |
6423 | + font-size: 10px; | |
6424 | + padding: 0; | |
6425 | + margin: 0; | |
6426 | + display: inline; | |
6427 | + position: static; | |
6428 | + float: none; | |
6429 | + font-weight: normal; | |
6430 | +} | |
6431 | + | |
6432 | +#profile-wall .profile-wall-activities-comments .article-comment .button-bar a.button:hover, | |
6433 | +#profile-network .profile-wall-activities-comments .article-comment .button-bar a.button:hover { | |
6434 | + text-decoration: underline; | |
6435 | +} | |
6436 | + | |
6437 | +#profile-wall .profile-wall-activities-comments .article-comment .button-bar .button span, | |
6438 | +#profile-network .profile-wall-activities-comments .article-comment .button-bar .button span { | |
6439 | + display: inline; | |
6440 | + position: static; | |
6441 | + display: inline; | |
6442 | +} | |
6443 | + | |
6119 | 6444 | /* friends online {{{ */ |
6120 | 6445 | |
6121 | 6446 | #chat-online-users { |
... | ... | @@ -6245,18 +6570,37 @@ h1#agenda-title { |
6245 | 6570 | } |
6246 | 6571 | |
6247 | 6572 | #profile-wall .comment-balloon-content { |
6248 | - padding: 3px 0 3px 15px; | |
6573 | + padding: 3px 0px; | |
6249 | 6574 | } |
6250 | 6575 | |
6251 | 6576 | .profile-wall-reply { |
6252 | 6577 | margin: 0; |
6253 | 6578 | } |
6254 | 6579 | |
6580 | +.profile-wall-reply-form { | |
6581 | + display: block; | |
6582 | + background: #f0f0f1; | |
6583 | + border-bottom: 1px solid #d2d2d2; | |
6584 | + border-top: 1px solid #fff; | |
6585 | + margin-left: 50px; | |
6586 | + padding: 0 5px; | |
6587 | +} | |
6588 | + | |
6589 | +.scrap-replies .profile-wall-reply-form { | |
6590 | + margin-left: 0px; | |
6591 | +} | |
6592 | + | |
6255 | 6593 | .profile-wall-scrap-replies { |
6256 | 6594 | float: right; |
6257 | 6595 | margin-right: 2px; |
6258 | 6596 | } |
6259 | 6597 | |
6598 | +.view-all-comments { | |
6599 | + clear: both; | |
6600 | + margin-left: 50px; | |
6601 | + padding-left: 20px; | |
6602 | +} | |
6603 | + | |
6260 | 6604 | /* Profile activity relative dimensions */ |
6261 | 6605 | |
6262 | 6606 | #leave_scrap { |
... | ... | @@ -6267,18 +6611,36 @@ h1#agenda-title { |
6267 | 6611 | width: 98%; |
6268 | 6612 | } |
6269 | 6613 | |
6270 | -#profile-activity .profile-activity-image, #profile-network .profile-network-image, #profile-wall .profile-wall-image { | |
6271 | - width: 19%; | |
6614 | +.profile-activities .profile-activity-image, | |
6615 | +#profile-network .profile-activity-image, | |
6616 | +#profile-wall .profile-wall-image { | |
6617 | + width: 50px; | |
6618 | + margin: 5px; | |
6619 | + float: left; | |
6272 | 6620 | } |
6273 | 6621 | |
6274 | -#profile-activity .profile-activity-description, #profile-network .profile-network-description, #profile-wall .profile-wall-description { | |
6275 | - width: 80%; | |
6622 | +#profile-activity .profile-activity-description, | |
6623 | +#profile-network .profile-activity-description, | |
6624 | +#profile-wall .profile-wall-description { | |
6276 | 6625 | word-wrap: break-word; |
6277 | 6626 | } |
6278 | 6627 | |
6628 | +#profile-wall textarea { | |
6629 | + width: 375px; | |
6630 | +} | |
6631 | + | |
6632 | +#profile-wall li textarea { | |
6633 | + width: 388px; | |
6634 | +} | |
6635 | + | |
6279 | 6636 | #profile-wall .profile-wall-scrap-replies textarea, |
6280 | -#profile-network textarea, #profile-wall textarea { | |
6281 | - width: 99%; | |
6637 | +#profile-network textarea, #profile-wall textarea, | |
6638 | +#profile-wall li .profile-wall-reply-form textarea { | |
6639 | + width: 98%; | |
6640 | +} | |
6641 | + | |
6642 | +#profile-wall #leave_scrap textarea { | |
6643 | + width: 442px; | |
6282 | 6644 | } |
6283 | 6645 | |
6284 | 6646 | .profile-wall-scrap-replies { | ... | ... |
test/factories.rb
... | ... | @@ -372,7 +372,7 @@ module Noosfero::Factory |
372 | 372 | ############################################### |
373 | 373 | |
374 | 374 | def defaults_for_scrap(params = {}) |
375 | - { :content => 'soment content ', :sender_id => 1, :receiver_id => 1, :created_at => DateTime.now }.merge(params) | |
375 | + { :content => 'some content ', :sender_id => 1, :receiver_id => 1, :created_at => DateTime.now }.merge(params) | |
376 | 376 | end |
377 | 377 | |
378 | 378 | ############################################### |
... | ... | @@ -440,7 +440,7 @@ module Noosfero::Factory |
440 | 440 | |
441 | 441 | def defaults_for_comment(params = {}) |
442 | 442 | name = "comment_#{rand(1000)}" |
443 | - { :title => name, :body => "my own comment", :article_id => 1 }.merge(params) | |
443 | + { :title => name, :body => "my own comment", :source_id => 1 }.merge(params) | |
444 | 444 | end |
445 | 445 | |
446 | 446 | ############################################### | ... | ... |
test/functional/profile_controller_test.rb
... | ... | @@ -714,25 +714,23 @@ class ProfileControllerTest < ActionController::TestCase |
714 | 714 | assert_no_tag :tag => 'p', :content => 'A scrap' |
715 | 715 | end |
716 | 716 | |
717 | - should 'see all activities of the current profile' do | |
718 | - p1= Person.first | |
717 | + should 'not display activities of the current profile when he is not followed by the viewer' do | |
718 | + p1= fast_create(Person) | |
719 | 719 | p2= fast_create(Person) |
720 | - assert !p1.is_a_friend?(p2) | |
721 | - p3= fast_create(Person) | |
722 | - assert !p1.is_a_friend?(p3) | |
723 | - ActionTracker::Record.destroy_all | |
724 | - Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1)) | |
725 | - a1 = ActionTracker::Record.last | |
720 | + | |
721 | + UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | |
722 | + scrap1 = Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p2)) | |
723 | + | |
726 | 724 | UserStampSweeper.any_instance.stubs(:current_user).returns(p2) |
727 | - Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) | |
728 | - a2 = ActionTracker::Record.last | |
729 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | |
730 | - Scrap.create!(defaults_for_scrap(:sender => p3, :receiver => p1)) | |
731 | - a3 = ActionTracker::Record.last | |
725 | + scrap2 = Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p1)) | |
726 | + | |
727 | + UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | |
728 | + TinyMceArticle.create!(:profile => p1, :name => 'An article about free software') | |
729 | + a1 = ActionTracker::Record.last | |
730 | + | |
732 | 731 | login_as(profile.identifier) |
733 | 732 | get :index, :profile => p1.identifier |
734 | - assert_not_nil assigns(:activities) | |
735 | - assert_equal [a1], assigns(:activities) | |
733 | + assert_nil assigns(:activities) | |
736 | 734 | end |
737 | 735 | |
738 | 736 | should 'see the activities_items paginated' do |
... | ... | @@ -744,26 +742,27 @@ class ProfileControllerTest < ActionController::TestCase |
744 | 742 | assert_equal 30, assigns(:activities).count |
745 | 743 | end |
746 | 744 | |
747 | - should 'see not see the friends activities in the current profile activity' do | |
748 | - p1= Person.first | |
745 | + should 'not see the friends activities in the current profile' do | |
749 | 746 | p2= fast_create(Person) |
750 | - assert !p1.is_a_friend?(p2) | |
747 | + assert !profile.is_a_friend?(p2) | |
751 | 748 | p3= fast_create(Person) |
752 | - p1.add_friend(p3) | |
753 | - assert p1.is_a_friend?(p3) | |
749 | + p3.add_friend(profile) | |
750 | + assert p3.is_a_friend?(profile) | |
754 | 751 | ActionTracker::Record.destroy_all |
755 | - Scrap.create!(defaults_for_scrap(:sender => p1, :receiver => p1)) | |
756 | - a1 = ActionTracker::Record.last | |
757 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
758 | - Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) | |
759 | - a2 = ActionTracker::Record.last | |
752 | + | |
753 | + scrap1 = Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => p3)) | |
754 | + scrap2 = Scrap.create!(defaults_for_scrap(:sender => p2, :receiver => profile)) | |
755 | + | |
760 | 756 | UserStampSweeper.any_instance.stubs(:current_user).returns(p3) |
761 | - Scrap.create!(defaults_for_scrap(:sender => p3, :receiver => p1)) | |
762 | - a3 = ActionTracker::Record.last | |
757 | + article1 = TinyMceArticle.create!(:profile => p3, :name => 'An article about free software') | |
758 | + | |
759 | + UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
760 | + article2 = TinyMceArticle.create!(:profile => p2, :name => 'Another article about free software') | |
761 | + | |
763 | 762 | login_as(profile.identifier) |
764 | - get :index, :profile => p1.identifier | |
763 | + get :index, :profile => p3.identifier | |
765 | 764 | assert_not_nil assigns(:activities) |
766 | - assert_equal [a1], assigns(:activities) | |
765 | + assert_equivalent [scrap1, article1.activity], assigns(:activities).map { |a| a.klass.constantize.find(a.id) } | |
767 | 766 | end |
768 | 767 | |
769 | 768 | should 'see all the activities in the current profile network' do |
... | ... | @@ -931,13 +930,29 @@ class ProfileControllerTest < ActionController::TestCase |
931 | 930 | assert_template 'index' |
932 | 931 | end |
933 | 932 | |
934 | - should 'have wall_itens defined' do | |
935 | - p1= ActionTracker::Record.current_user_from_model | |
933 | + should 'not have activities defined if not logged in' do | |
934 | + p1= fast_create(Person) | |
935 | + get :index, :profile => p1.identifier | |
936 | + assert_nil assigns(:actvities) | |
937 | + end | |
938 | + | |
939 | + should 'not have activities defined if logged in but is not following profile' do | |
940 | + login_as(profile.identifier) | |
941 | + p1= fast_create(Person) | |
936 | 942 | get :index, :profile => p1.identifier |
937 | - assert_equal [], assigns(:wall_items) | |
943 | + assert_nil assigns(:activities) | |
938 | 944 | end |
939 | 945 | |
940 | - should 'the wall_itens be the received scraps in people profile' do | |
946 | + should 'have activities defined if logged in and is following profile' do | |
947 | + login_as(profile.identifier) | |
948 | + p1= fast_create(Person) | |
949 | + p1.add_friend(profile) | |
950 | + ActionTracker::Record.destroy_all | |
951 | + get :index, :profile => p1.identifier | |
952 | + assert_equal [], assigns(:activities) | |
953 | + end | |
954 | + | |
955 | + should 'the activities be the received scraps in people profile' do | |
941 | 956 | p1 = ActionTracker::Record.current_user_from_model |
942 | 957 | p2 = fast_create(Person) |
943 | 958 | p3 = fast_create(Person) |
... | ... | @@ -952,10 +967,10 @@ class ProfileControllerTest < ActionController::TestCase |
952 | 967 | @controller.stubs(:current_user).returns(user) |
953 | 968 | Person.any_instance.stubs(:follows?).returns(true) |
954 | 969 | get :index, :profile => p1.identifier |
955 | - assert_equal [s2,s3], assigns(:wall_items) | |
970 | + assert_equal [s2,s3], assigns(:activities) | |
956 | 971 | end |
957 | 972 | |
958 | - should 'the wall_itens be the received scraps in community profile' do | |
973 | + should 'the activities be the received scraps in community profile' do | |
959 | 974 | c = fast_create(Community) |
960 | 975 | p1 = fast_create(Person) |
961 | 976 | p2 = fast_create(Person) |
... | ... | @@ -971,12 +986,12 @@ class ProfileControllerTest < ActionController::TestCase |
971 | 986 | @controller.stubs(:current_user).returns(user) |
972 | 987 | Person.any_instance.stubs(:follows?).returns(true) |
973 | 988 | get :index, :profile => c.identifier |
974 | - assert_equal [s2,s3], assigns(:wall_items) | |
989 | + assert_equal [s2,s3], assigns(:activities) | |
975 | 990 | end |
976 | 991 | |
977 | - should 'the wall_itens be paginated in people profiles' do | |
992 | + should 'the activities be paginated in people profiles' do | |
978 | 993 | p1 = Person.first |
979 | - 40.times{fast_create(Scrap, :sender_id => p1.id)} | |
994 | + 40.times{fast_create(Scrap, :sender_id => p1.id, :created_at => Time.now)} | |
980 | 995 | |
981 | 996 | @controller.stubs(:logged_in?).returns(true) |
982 | 997 | user = mock() |
... | ... | @@ -986,10 +1001,10 @@ class ProfileControllerTest < ActionController::TestCase |
986 | 1001 | Person.any_instance.stubs(:follows?).returns(true) |
987 | 1002 | assert_equal 40, p1.scraps_received.not_replies.count |
988 | 1003 | get :index, :profile => p1.identifier |
989 | - assert_equal 30, assigns(:wall_items).count | |
1004 | + assert_equal 30, assigns(:activities).count | |
990 | 1005 | end |
991 | 1006 | |
992 | - should 'the wall_itens be paginated in community profiles' do | |
1007 | + should 'the activities be paginated in community profiles' do | |
993 | 1008 | p1 = Person.first |
994 | 1009 | c = fast_create(Community) |
995 | 1010 | 40.times{fast_create(Scrap, :receiver_id => c.id)} |
... | ... | @@ -1002,7 +1017,7 @@ class ProfileControllerTest < ActionController::TestCase |
1002 | 1017 | Person.any_instance.stubs(:follows?).returns(true) |
1003 | 1018 | assert_equal 40, c.scraps_received.not_replies.count |
1004 | 1019 | get :index, :profile => c.identifier |
1005 | - assert_equal 30, assigns(:wall_items).count | |
1020 | + assert_equal 30, assigns(:activities).count | |
1006 | 1021 | end |
1007 | 1022 | |
1008 | 1023 | should "the owner of activity could remove it" do |
... | ... | @@ -1072,17 +1087,17 @@ class ProfileControllerTest < ActionController::TestCase |
1072 | 1087 | end |
1073 | 1088 | end |
1074 | 1089 | |
1075 | - should "not show the scrap button on network activity if the user don't follow the user" do | |
1090 | + should "not show the network activity if the viewer don't follow the profile" do | |
1076 | 1091 | login_as(profile.identifier) |
1077 | 1092 | person = fast_create(Person) |
1078 | 1093 | at = fast_create(ActionTracker::Record, :user_id => person.id) |
1079 | 1094 | atn = fast_create(ActionTrackerNotification, :profile_id => profile.id, :action_tracker_id => at.id) |
1080 | - get :index, :profile => profile.identifier | |
1081 | - assert_no_tag :tag => 'p', :attributes => {:class => 'profile-network-send-message'} | |
1095 | + get :index, :profile => person.identifier | |
1096 | + assert_no_tag :tag => 'div', :attributes => {:id => 'profile-network'} | |
1082 | 1097 | |
1083 | 1098 | person.add_friend(profile) |
1084 | - get :index, :profile => profile.identifier | |
1085 | - assert_tag :tag => 'p', :attributes => {:class => 'profile-network-send-message'} | |
1099 | + get :index, :profile => person.identifier | |
1100 | + assert_tag :tag => 'div', :attributes => {:id => 'profile-network'} | |
1086 | 1101 | end |
1087 | 1102 | |
1088 | 1103 | should "not show the scrap button on network activity if the user is himself" do |
... | ... | @@ -1093,16 +1108,16 @@ class ProfileControllerTest < ActionController::TestCase |
1093 | 1108 | assert_no_tag :tag => 'p', :attributes => {:class => 'profile-network-send-message'} |
1094 | 1109 | end |
1095 | 1110 | |
1096 | - should "not show the scrap button on wall activity if the user don't follow the user" do | |
1111 | + should "not show the scrap area on wall if the user don't follow the user" do | |
1097 | 1112 | login_as(profile.identifier) |
1098 | 1113 | person = fast_create(Person) |
1099 | 1114 | scrap = fast_create(Scrap, :sender_id => person.id, :receiver_id => profile.id) |
1100 | - get :index, :profile => profile.identifier | |
1101 | - assert_no_tag :tag => 'p', :attributes => {:class => 'profile-wall-send-message'} | |
1115 | + get :index, :profile => person.identifier | |
1116 | + assert_no_tag :tag => 'div', :attributes => {:id => 'leave_scrap'}, :descendant => { :tag => 'input', :attributes => {:value => 'Share'} } | |
1102 | 1117 | |
1103 | 1118 | person.add_friend(profile) |
1104 | - get :index, :profile => profile.identifier | |
1105 | - assert_tag :tag => 'p', :attributes => {:class => 'profile-wall-send-message'} | |
1119 | + get :index, :profile => person.identifier | |
1120 | + assert_tag :tag => 'div', :attributes => {:id => 'leave_scrap'}, :descendant => { :tag => 'input', :attributes => {:value => 'Share'} } | |
1106 | 1121 | end |
1107 | 1122 | |
1108 | 1123 | should "not show the scrap button on wall activity if the user is himself" do |
... | ... | @@ -1158,7 +1173,7 @@ class ProfileControllerTest < ActionController::TestCase |
1158 | 1173 | assert_equal 40, profile.tracked_actions.count |
1159 | 1174 | get :view_more_activities, :profile => profile.identifier, :page => 2 |
1160 | 1175 | assert_response :success |
1161 | - assert_template '_profile_activities' | |
1176 | + assert_template '_profile_activities_list' | |
1162 | 1177 | assert_equal 10, assigns(:activities).count |
1163 | 1178 | end |
1164 | 1179 | |
... | ... | @@ -1247,4 +1262,70 @@ class ProfileControllerTest < ActionController::TestCase |
1247 | 1262 | post :register_report, :profile => reported.identifier, :abuse_report => {:reason => 'some reason'} |
1248 | 1263 | end |
1249 | 1264 | end |
1265 | + | |
1266 | + should 'display activities and scraps together' do | |
1267 | + another_person = fast_create(Person) | |
1268 | + Scrap.create!(defaults_for_scrap(:sender => another_person, :receiver => profile, :content => 'A scrap')) | |
1269 | + | |
1270 | + UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
1271 | + ActionTracker::Record.destroy_all | |
1272 | + TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') | |
1273 | + | |
1274 | + login_as(profile.identifier) | |
1275 | + get :index, :profile => profile.identifier | |
1276 | + | |
1277 | + assert_tag :tag => 'p', :content => 'A scrap', :attributes => { :class => 'profile-activity-text'} | |
1278 | + assert_tag :tag => 'div', :attributes => { :class => 'profile-activity-lead' }, :descendant => { :tag => 'a', :content => 'An article about free software' } | |
1279 | + end | |
1280 | + | |
1281 | + should 'have scraps and activities on activities' do | |
1282 | + another_person = fast_create(Person) | |
1283 | + scrap = Scrap.create!(defaults_for_scrap(:sender => another_person, :receiver => profile, :content => 'A scrap')) | |
1284 | + | |
1285 | + UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
1286 | + ActionTracker::Record.destroy_all | |
1287 | + TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') | |
1288 | + activity = ActionTracker::Record.last | |
1289 | + | |
1290 | + login_as(profile.identifier) | |
1291 | + get :index, :profile => profile.identifier | |
1292 | + | |
1293 | + assert_equivalent [scrap,activity], assigns(:activities).map {|a| a.klass.constantize.find(a.id)} | |
1294 | + end | |
1295 | + | |
1296 | + should "be logged in to leave comment on an activity" do | |
1297 | + article = TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') | |
1298 | + activity = ActionTracker::Record.last | |
1299 | + count = activity.comments.count | |
1300 | + | |
1301 | + post :leave_comment_on_activity, :profile => profile.identifier, :comment => {:body => 'something', :source_id => activity.id} | |
1302 | + assert_equal count, activity.comments.count | |
1303 | + assert_redirected_to :controller => 'account', :action => 'login' | |
1304 | + end | |
1305 | + | |
1306 | + should "leave a comment in own activity" do | |
1307 | + login_as(profile.identifier) | |
1308 | + TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') | |
1309 | + activity = ActionTracker::Record.last | |
1310 | + count = activity.comments.count | |
1311 | + | |
1312 | + assert_equal 0, count | |
1313 | + post :leave_comment_on_activity, :profile => profile.identifier, :comment => {:body => 'something'}, :source_id => activity.id | |
1314 | + assert_equal count + 1, ActionTracker::Record.find(activity.id).comments_count | |
1315 | + assert_response :success | |
1316 | + assert_equal "Comment successfully added.", assigns(:message) | |
1317 | + end | |
1318 | + | |
1319 | + should "leave a comment on another profile's activity" do | |
1320 | + login_as(profile.identifier) | |
1321 | + another_person = fast_create(Person) | |
1322 | + TinyMceArticle.create!(:profile => another_person, :name => 'An article about free software') | |
1323 | + activity = ActionTracker::Record.last | |
1324 | + count = activity.comments.count | |
1325 | + assert_equal 0, count | |
1326 | + post :leave_comment_on_activity, :profile => another_person.identifier, :comment => {:body => 'something'}, :source_id => activity.id | |
1327 | + assert_equal count + 1, ActionTracker::Record.find(activity.id).comments_count | |
1328 | + assert_response :success | |
1329 | + assert_equal "Comment successfully added.", assigns(:message) | |
1330 | + end | |
1250 | 1331 | end | ... | ... |
test/unit/action_tracker_notification_test.rb
... | ... | @@ -76,4 +76,28 @@ class ActionTrackerNotificationTest < ActiveSupport::TestCase |
76 | 76 | assert_equal [last_notification], at.action_tracker_notifications |
77 | 77 | end |
78 | 78 | |
79 | + should "have comments through action_tracker" do | |
80 | + person = fast_create(Person) | |
81 | + community = fast_create(Community) | |
82 | + community.add_member(person) | |
83 | + activity = ActionTracker::Record.last | |
84 | + process_delayed_job_queue | |
85 | + notification = ActionTrackerNotification.last | |
86 | + | |
87 | + comment = create(Comment, :source => activity, :author => person) | |
88 | + | |
89 | + assert_equal activity.comments, notification.comments | |
90 | + end | |
91 | + | |
92 | + should "have comments through article action_tracker" do | |
93 | + person = fast_create(Person) | |
94 | + article = create(TextileArticle, :profile_id => person.id) | |
95 | + process_delayed_job_queue | |
96 | + notification = ActionTrackerNotification.last | |
97 | + | |
98 | + comment = create(Comment, :source => article, :author => person) | |
99 | + | |
100 | + assert_equal article.activity.comments, notification.comments | |
101 | + end | |
102 | + | |
79 | 103 | end | ... | ... |
test/unit/approve_article_test.rb
... | ... | @@ -250,7 +250,7 @@ class ApproveArticleTest < ActiveSupport::TestCase |
250 | 250 | assert_equal 1, ActionTracker::Record.count |
251 | 251 | end |
252 | 252 | |
253 | - should 'notify with different trackers activity create with different targets' do | |
253 | + should 'not group trackers activity of article\'s creation' do | |
254 | 254 | ActionTracker::Record.delete_all |
255 | 255 | |
256 | 256 | article = fast_create(TextileArticle) |
... | ... | @@ -260,28 +260,15 @@ class ApproveArticleTest < ActiveSupport::TestCase |
260 | 260 | article = fast_create(TextileArticle) |
261 | 261 | a = ApproveArticle.create!(:name => 'another bar', :article => article, :target => community, :requestor => profile) |
262 | 262 | a.finish |
263 | - assert_equal 1, ActionTracker::Record.count | |
264 | 263 | |
265 | 264 | article = fast_create(TextileArticle) |
266 | 265 | other_community = fast_create(Community) |
267 | 266 | a = ApproveArticle.create!(:name => 'another bar', :article => article, :target => other_community, :requestor => profile) |
268 | 267 | a.finish |
269 | - assert_equal 2, ActionTracker::Record.count | |
270 | - end | |
271 | - | |
272 | - should 'notify activity on update' do | |
273 | - ActionTracker::Record.delete_all | |
274 | - a = ApproveArticle.create!(:name => 'bar', :article => article, :target => community, :requestor => profile) | |
275 | - a.finish | |
276 | - assert_equal 1, ActionTracker::Record.count | |
277 | - | |
278 | - published = article.class.last | |
279 | - published.name = 'foo' | |
280 | - published.save! | |
281 | - assert_equal 2, ActionTracker::Record.count | |
268 | + assert_equal 3, ActionTracker::Record.count | |
282 | 269 | end |
283 | 270 | |
284 | - should 'notify with different trackers activity update with different targets' do | |
271 | + should 'not create trackers activity when updating articles' do | |
285 | 272 | ActionTracker::Record.delete_all |
286 | 273 | article1 = fast_create(TextileArticle) |
287 | 274 | a = ApproveArticle.create!(:name => 'bar', :article => article1, :target => community, :requestor => profile) |
... | ... | @@ -293,16 +280,16 @@ class ApproveArticleTest < ActiveSupport::TestCase |
293 | 280 | a.finish |
294 | 281 | assert_equal 2, ActionTracker::Record.count |
295 | 282 | |
296 | - published = article1.class.last | |
297 | - published.name = 'foo';published.save! | |
298 | - assert_equal 3, ActionTracker::Record.count | |
299 | - | |
300 | - published = article2.class.last | |
301 | - published.name = 'another foo';published.save! | |
302 | - assert_equal 4, ActionTracker::Record.count | |
283 | + assert_no_difference ActionTracker::Record, :count do | |
284 | + published = article1.class.last | |
285 | + published.name = 'foo';published.save! | |
286 | + | |
287 | + published = article2.class.last | |
288 | + published.name = 'another foo';published.save! | |
289 | + end | |
303 | 290 | end |
304 | 291 | |
305 | - should "the tracker action target be defined as Community by custom_target method on articles'creation in communities" do | |
292 | + should "the tracker action target be defined as the article on articles'creation in communities" do | |
306 | 293 | ActionTracker::Record.delete_all |
307 | 294 | person = fast_create(Person) |
308 | 295 | community.add_member(person) |
... | ... | @@ -310,17 +297,21 @@ class ApproveArticleTest < ActiveSupport::TestCase |
310 | 297 | a = ApproveArticle.create!(:article => article, :target => community, :requestor => profile) |
311 | 298 | a.finish |
312 | 299 | |
313 | - assert_equal Community, ActionTracker::Record.last.target.class | |
300 | + approved_article = community.articles.find_by_name(article.name) | |
301 | + | |
302 | + assert_equal approved_article, ActionTracker::Record.last.target | |
314 | 303 | end |
315 | 304 | |
316 | - should "the tracker action target be defined as person by custom_target method on articles'creation in profile" do | |
305 | + should "the tracker action target be defined as the article on articles'creation in profile" do | |
317 | 306 | ActionTracker::Record.delete_all |
318 | 307 | person = fast_create(Person) |
319 | 308 | |
320 | 309 | a = ApproveArticle.create!(:article => article, :target => person, :requestor => profile) |
321 | 310 | a.finish |
322 | 311 | |
323 | - assert_equal Person, ActionTracker::Record.last.target.class | |
312 | + approved_article = person.articles.find_by_name(article.name) | |
313 | + | |
314 | + assert_equal approved_article, ActionTracker::Record.last.target | |
324 | 315 | end |
325 | 316 | |
326 | 317 | should "have the same is_trackable method as original article" do | ... | ... |
test/unit/article_test.rb
... | ... | @@ -320,15 +320,16 @@ class ArticleTest < ActiveSupport::TestCase |
320 | 320 | |
321 | 321 | should 'list most commented articles' do |
322 | 322 | Article.delete_all |
323 | + (1..4).each do |n| | |
324 | + create(TextileArticle, :name => "art #{n}", :profile_id => profile.id) | |
325 | + end | |
326 | + first_article = profile.articles.first | |
327 | + 2.times { Comment.create(:title => 'test', :body => 'asdsad', :author => profile, :source => first_article).save! } | |
323 | 328 | |
324 | - person = create_user('testuser').person | |
325 | - articles = (1..4).map {|n| a = person.articles.build(:name => "art #{n}"); a.save!; a } | |
326 | - | |
327 | - 2.times { articles[0].comments.build(:title => 'test', :body => 'asdsad', :author => person).save! } | |
328 | - 4.times { articles[1].comments.build(:title => 'test', :body => 'asdsad', :author => person).save! } | |
329 | - | |
329 | + last_article = profile.articles.last | |
330 | + 4.times { Comment.create(:title => 'test', :body => 'asdsad', :author => profile, :source => last_article).save! } | |
330 | 331 | # should respect the order (more commented comes first) |
331 | - assert_equal [articles[1], articles[0]], person.articles.most_commented(2) | |
332 | + assert_equal [last_article, first_article], profile.articles.most_commented(2) | |
332 | 333 | end |
333 | 334 | |
334 | 335 | should 'identify itself as a non-folder' do |
... | ... | @@ -362,16 +363,16 @@ class ArticleTest < ActiveSupport::TestCase |
362 | 363 | |
363 | 364 | should 'index comments title together with article' do |
364 | 365 | owner = create_user('testuser').person |
365 | - art = owner.articles.build(:name => 'ytest'); art.save! | |
366 | - c1 = art.comments.build(:title => 'a nice comment', :body => 'anything', :author => owner); c1.save! | |
366 | + art = fast_create(TinyMceArticle, :profile_id => owner.id, :name => 'ytest') | |
367 | + c1 = Comment.create(:title => 'a nice comment', :body => 'anything', :author => owner, :source => art ); c1.save! | |
367 | 368 | |
368 | 369 | assert_includes Article.find_by_contents('nice'), art |
369 | 370 | end |
370 | 371 | |
371 | 372 | should 'index comments body together with article' do |
372 | 373 | owner = create_user('testuser').person |
373 | - art = owner.articles.build(:name => 'ytest'); art.save! | |
374 | - c1 = art.comments.build(:title => 'test comment', :body => 'anything', :author => owner); c1.save! | |
374 | + art = fast_create(TinyMceArticle, :profile_id => owner.id, :name => 'ytest') | |
375 | + c1 = Comment.create(:title => 'test comment', :body => 'anything', :author => owner, :source => art); c1.save! | |
375 | 376 | |
376 | 377 | assert_includes Article.find_by_contents('anything'), art |
377 | 378 | end |
... | ... | @@ -934,79 +935,34 @@ class ArticleTest < ActiveSupport::TestCase |
934 | 935 | end |
935 | 936 | |
936 | 937 | should 'track action when a published article is created outside a community' do |
937 | - article = TinyMceArticle.create! :name => 'Tracked Article', :profile_id => profile.id | |
938 | - assert article.published? | |
939 | - assert_kind_of Person, article.profile | |
940 | - ta = ActionTracker::Record.last | |
941 | - assert_equal 'Tracked Article', ta.get_name.last | |
942 | - assert_equal article.url, ta.get_url.last | |
943 | - assert_kind_of Person, ta.user | |
944 | - ta.created_at = Time.now.ago(26.hours); ta.save! | |
945 | - article = TinyMceArticle.create! :name => 'Another Tracked Article', :profile_id => profile.id | |
946 | - ta = ActionTracker::Record.last | |
947 | - assert_equal ['Another Tracked Article'], ta.get_name | |
948 | - assert_equal [article.url], ta.get_url | |
938 | + article = create(TinyMceArticle, :profile_id => profile.id) | |
939 | + ta = article.activity | |
940 | + assert_equal article.name, ta.get_name | |
941 | + assert_equal article.url, ta.get_url | |
949 | 942 | end |
950 | 943 | |
951 | 944 | should 'track action when a published article is created in a community' do |
952 | 945 | community = fast_create(Community) |
953 | - p1 = ActionTracker::Record.current_user_from_model | |
946 | + p1 = fast_create(Person) | |
954 | 947 | p2 = fast_create(Person) |
955 | 948 | p3 = fast_create(Person) |
956 | 949 | community.add_member(p1) |
957 | 950 | community.add_member(p2) |
958 | - assert p1.is_member_of?(community) | |
959 | - assert p2.is_member_of?(community) | |
960 | - assert !p3.is_member_of?(community) | |
961 | - Article.destroy_all | |
962 | - ActionTracker::Record.destroy_all | |
963 | - article = TinyMceArticle.create! :name => 'Tracked Article', :profile_id => community.id | |
964 | - assert article.published? | |
965 | - assert_kind_of Community, article.profile | |
966 | - ta = ActionTracker::Record.last | |
967 | - assert_equal 'Tracked Article', ta.get_name.last | |
968 | - assert_equal article.url, ta.get_url.last | |
969 | - assert_kind_of Person, ta.user | |
951 | + UserStampSweeper.any_instance.expects(:current_user).returns(p1).at_least_once | |
952 | + | |
953 | + article = create(TinyMceArticle, :profile_id => community.id) | |
954 | + activity = article.activity | |
955 | + | |
970 | 956 | process_delayed_job_queue |
971 | - assert_equal 3, ActionTrackerNotification.count | |
972 | - ActionTrackerNotification.all.map{|a|a.profile}.map do |profile| | |
973 | - assert [p1,p2,community].include?(profile) | |
974 | - end | |
957 | + assert_equal 3, ActionTrackerNotification.find_all_by_action_tracker_id(activity.id).count | |
958 | + assert_equivalent [p1,p2,community], ActionTrackerNotification.find_all_by_action_tracker_id(activity.id).map(&:profile) | |
975 | 959 | end |
976 | 960 | |
977 | - should 'track action when a published article is updated' do | |
978 | - a = TinyMceArticle.create! :name => 'a', :profile_id => profile.id | |
979 | - a.update_attributes! :name => 'b' | |
980 | - ta = ActionTracker::Record.last | |
981 | - assert_equal ['b'], ta.get_name | |
982 | - assert_equal [a.reload.url], ta.get_url | |
983 | - a.update_attributes! :name => 'c' | |
984 | - ta = ActionTracker::Record.last | |
985 | - assert_equal ['b','c'], ta.get_name | |
986 | - assert_equal [a.url,a.reload.url], ta.get_url | |
987 | - a.update_attributes! :body => 'test' | |
988 | - ta = ActionTracker::Record.last | |
989 | - assert_equal ['b','c','c'], ta.get_name | |
990 | - assert_equal [a.url,a.reload.url,a.reload.url], ta.get_url | |
991 | - a.update_attributes! :hits => 50 | |
992 | - ta = ActionTracker::Record.last | |
993 | - assert_equal ['b','c','c'], ta.get_name | |
994 | - assert_equal [a.url,a.reload.url,a.reload.url], ta.get_url | |
995 | - end | |
996 | - | |
997 | - should 'track action when a published article is removed' do | |
998 | - a = TinyMceArticle.create! :name => 'a', :profile_id => profile.id | |
999 | - a.destroy | |
1000 | - ta = ActionTracker::Record.last | |
1001 | - assert_equal ['a'], ta.get_name | |
1002 | - a = TinyMceArticle.create! :name => 'b', :profile_id => profile.id | |
1003 | - a.destroy | |
1004 | - ta = ActionTracker::Record.last | |
1005 | - assert_equal ['a','b'], ta.get_name | |
1006 | - a = TinyMceArticle.create! :name => 'c', :profile_id => profile.id, :published => false | |
1007 | - a.destroy | |
1008 | - ta = ActionTracker::Record.last | |
1009 | - assert_equal ['a','b'], ta.get_name | |
961 | + should 'not track action when a published article is removed' do | |
962 | + a = create(TinyMceArticle, :profile_id => profile.id) | |
963 | + assert_no_difference ActionTracker::Record, :count do | |
964 | + a.destroy | |
965 | + end | |
1010 | 966 | end |
1011 | 967 | |
1012 | 968 | should 'notifiable is false by default' do |
... | ... | @@ -1035,6 +991,15 @@ class ArticleTest < ActiveSupport::TestCase |
1035 | 991 | assert_equal 0, ActionTracker::Record.count |
1036 | 992 | end |
1037 | 993 | |
994 | + should 'create activity' do | |
995 | + a = TextileArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | |
996 | + a.activity.destroy | |
997 | + assert_nil a.activity | |
998 | + | |
999 | + a.create_activity | |
1000 | + assert_not_nil a.activity | |
1001 | + end | |
1002 | + | |
1038 | 1003 | should "the action_tracker_target method be defined" do |
1039 | 1004 | assert Article.method_defined?(:action_tracker_target) |
1040 | 1005 | end |
... | ... | @@ -1071,141 +1036,64 @@ class ArticleTest < ActiveSupport::TestCase |
1071 | 1036 | assert_equal false, a.is_trackable? |
1072 | 1037 | end |
1073 | 1038 | |
1074 | - should 'not create more than one notification track action to community when update more than one artile' do | |
1075 | - community = fast_create(Community) | |
1076 | - p1 = Person.first || fast_create(Person) | |
1077 | - community.add_member(p1) | |
1078 | - assert p1.is_member_of?(community) | |
1079 | - Article.destroy_all | |
1080 | - ActionTracker::Record.destroy_all | |
1081 | - article = TinyMceArticle.create! :name => 'Tracked Article 1', :profile_id => community.id | |
1082 | - assert article.published? | |
1083 | - assert_kind_of Community, article.profile | |
1084 | - assert_equal 1, ActionTracker::Record.count | |
1085 | - ta = ActionTracker::Record.last | |
1086 | - assert_equal 'Tracked Article 1', ta.get_name.last | |
1087 | - assert_equal article.url, ta.get_url.last | |
1088 | - assert p1, ta.user | |
1089 | - assert community, ta.target | |
1090 | - process_delayed_job_queue | |
1091 | - assert_equal 2, ActionTrackerNotification.count | |
1092 | - | |
1093 | - article = TinyMceArticle.create! :name => 'Tracked Article 2', :profile_id => community.id | |
1094 | - assert article.published? | |
1095 | - assert_kind_of Community, article.profile | |
1096 | - assert_equal 1, ActionTracker::Record.count | |
1097 | - ta = ActionTracker::Record.last | |
1098 | - assert_equal 'Tracked Article 2', ta.get_name.last | |
1099 | - assert_equal article.url, ta.get_url.last | |
1100 | - assert_equal p1, ta.user | |
1101 | - assert_equal community, ta.target | |
1102 | - process_delayed_job_queue | |
1103 | - assert_equal 2, ActionTrackerNotification.count | |
1039 | + should "not be trackable if article is inside a private community" do | |
1040 | + private_community = fast_create(Community, :public_profile => false) | |
1041 | + a = fast_create(TinyMceArticle, :profile_id => private_community.id) | |
1042 | + assert_equal false, a.is_trackable? | |
1104 | 1043 | end |
1105 | 1044 | |
1106 | - should 'create the notification to the member when one member has the notification and the other no' do | |
1045 | + should 'create the notification to organization and all organization members' do | |
1107 | 1046 | community = fast_create(Community) |
1108 | - p1 = Person.first || fast_create(Person) | |
1109 | - community.add_member(p1) | |
1110 | - assert p1.is_member_of?(community) | |
1111 | - Article.destroy_all | |
1112 | - ActionTracker::Record.destroy_all | |
1047 | + member_1 = Person.first | |
1048 | + community.add_member(member_1) | |
1049 | + | |
1113 | 1050 | article = TinyMceArticle.create! :name => 'Tracked Article 1', :profile_id => community.id |
1114 | - assert article.published? | |
1115 | - assert_kind_of Community, article.profile | |
1116 | - assert_equal 1, ActionTracker::Record.count | |
1117 | - ta = ActionTracker::Record.first | |
1118 | - assert_equal 'Tracked Article 1', ta.get_name.last | |
1119 | - assert_equal article.url, ta.get_url.last | |
1120 | - assert p1, ta.user | |
1121 | - assert community, ta.target | |
1122 | - process_delayed_job_queue | |
1123 | - assert_equal 2, ActionTrackerNotification.count | |
1051 | + first_activity = article.activity | |
1052 | + assert_equal [first_activity], ActionTracker::Record.find_all_by_verb('create_article') | |
1124 | 1053 | |
1125 | - p2 = fast_create(Person) | |
1126 | - community.add_member(p2) | |
1127 | 1054 | process_delayed_job_queue |
1128 | - assert_equal 5, ActionTrackerNotification.count | |
1129 | - | |
1130 | - article = TinyMceArticle.create! :name => 'Tracked Article 2', :profile_id => community.id | |
1131 | - assert article.published? | |
1132 | - assert_kind_of Community, article.profile | |
1133 | - assert_equal 3, ActionTracker::Record.count | |
1134 | - ta = ActionTracker::Record.first | |
1135 | - assert_equal 'Tracked Article 2', ta.get_name.last | |
1136 | - assert_equal article.url, ta.get_url.last | |
1137 | - assert_equal p1, ta.user | |
1138 | - assert_equal community, ta.target | |
1055 | + assert_equal 2, ActionTrackerNotification.find_all_by_action_tracker_id(first_activity.id).count | |
1056 | + | |
1057 | + member_2 = fast_create(Person) | |
1058 | + community.add_member(member_2) | |
1059 | + | |
1060 | + article2 = TinyMceArticle.create! :name => 'Tracked Article 2', :profile_id => community.id | |
1061 | + second_activity = article2.activity | |
1062 | + assert_equivalent [first_activity, second_activity], ActionTracker::Record.find_all_by_verb('create_article') | |
1063 | + | |
1139 | 1064 | process_delayed_job_queue |
1140 | - assert_equal 6, ActionTrackerNotification.count | |
1065 | + assert_equal 3, ActionTrackerNotification.find_all_by_action_tracker_id(second_activity.id).count | |
1141 | 1066 | end |
1142 | 1067 | |
1143 | - should 'not create more than one notification track action to friends when update more than one artile' do | |
1144 | - p1 = Person.first || fast_create(Person) | |
1068 | + should 'create notifications to friends when creating an article' do | |
1145 | 1069 | friend = fast_create(Person) |
1146 | - p1.add_friend(friend) | |
1070 | + profile.add_friend(friend) | |
1147 | 1071 | Article.destroy_all |
1148 | 1072 | ActionTracker::Record.destroy_all |
1149 | 1073 | ActionTrackerNotification.destroy_all |
1150 | - article = TinyMceArticle.create! :name => 'Tracked Article 1', :profile_id => p1.id | |
1151 | - assert article.published? | |
1152 | - assert_kind_of Person, article.profile | |
1153 | - assert_equal 1, ActionTracker::Record.count | |
1154 | - ta = ActionTracker::Record.last | |
1155 | - assert_equal 'Tracked Article 1', ta.get_name.last | |
1156 | - assert_equal article.url, ta.get_url.last | |
1157 | - assert p1, ta.user | |
1158 | - assert p1, ta.target | |
1159 | - process_delayed_job_queue | |
1160 | - assert_equal 2, ActionTrackerNotification.count | |
1161 | - | |
1162 | - article = TinyMceArticle.create! :name => 'Tracked Article 2', :profile_id => p1.id | |
1163 | - assert article.published? | |
1164 | - assert_kind_of Person, article.profile | |
1165 | - assert_equal 1, ActionTracker::Record.count | |
1166 | - ta = ActionTracker::Record.last | |
1167 | - assert_equal 'Tracked Article 2', ta.get_name.last | |
1168 | - assert_equal article.url, ta.get_url.last | |
1169 | - assert_equal p1, ta.user | |
1170 | - assert_equal p1, ta.target | |
1074 | + UserStampSweeper.any_instance.expects(:current_user).returns(profile).at_least_once | |
1075 | + article = create(TinyMceArticle, :profile_id => profile.id) | |
1076 | + | |
1171 | 1077 | process_delayed_job_queue |
1172 | - assert_equal 2, ActionTrackerNotification.count | |
1078 | + assert_equal friend, ActionTrackerNotification.last.profile | |
1173 | 1079 | end |
1174 | 1080 | |
1175 | 1081 | should 'create the notification to the friend when one friend has the notification and the other no' do |
1176 | - p1 = Person.first || fast_create(Person) | |
1177 | 1082 | f1 = fast_create(Person) |
1178 | - p1.add_friend(f1) | |
1179 | - Article.destroy_all | |
1180 | - ActionTracker::Record.destroy_all | |
1181 | - ActionTrackerNotification.destroy_all | |
1182 | - article = TinyMceArticle.create! :name => 'Tracked Article 1', :profile_id => p1.id | |
1183 | - assert article.published? | |
1184 | - assert_kind_of Person, article.profile | |
1185 | - assert_equal 1, ActionTracker::Record.count | |
1186 | - ta = ActionTracker::Record.first | |
1187 | - assert_equal 'Tracked Article 1', ta.get_name.last | |
1188 | - assert_equal article.url, ta.get_url.last | |
1189 | - assert p1, ta.user | |
1190 | - assert p1, ta.target | |
1083 | + profile.add_friend(f1) | |
1084 | + | |
1085 | + UserStampSweeper.any_instance.expects(:current_user).returns(profile).at_least_once | |
1086 | + article = TinyMceArticle.create! :name => 'Tracked Article 1', :profile_id => profile.id | |
1087 | + assert_equal 1, ActionTracker::Record.find_all_by_verb('create_article').count | |
1191 | 1088 | process_delayed_job_queue |
1192 | - assert_equal 2, ActionTrackerNotification.count | |
1089 | + assert_equal 2, ActionTrackerNotification.find_all_by_action_tracker_id(article.activity.id).count | |
1193 | 1090 | |
1194 | 1091 | f2 = fast_create(Person) |
1195 | - p1.add_friend(f2) | |
1196 | - process_delayed_job_queue | |
1197 | - assert_equal 5, ActionTrackerNotification.count | |
1198 | - article = TinyMceArticle.create! :name => 'Tracked Article 2', :profile_id => p1.id | |
1199 | - assert article.published? | |
1200 | - assert_kind_of Person, article.profile | |
1201 | - assert_equal 2, ActionTracker::Record.count | |
1202 | - ta = ActionTracker::Record.first | |
1203 | - assert_equal 'Tracked Article 2', ta.get_name.last | |
1204 | - assert_equal article.url, ta.get_url.last | |
1205 | - assert_equal p1, ta.user | |
1206 | - assert_equal p1, ta.target | |
1092 | + profile.add_friend(f2) | |
1093 | + article2 = TinyMceArticle.create! :name => 'Tracked Article 2', :profile_id => profile.id | |
1094 | + assert_equal 2, ActionTracker::Record.find_all_by_verb('create_article').count | |
1207 | 1095 | process_delayed_job_queue |
1208 | - assert_equal 6, ActionTrackerNotification.count | |
1096 | + assert_equal 3, ActionTrackerNotification.find_all_by_action_tracker_id(article2.activity.id).count | |
1209 | 1097 | end |
1210 | 1098 | |
1211 | 1099 | should 'found articles with published date between a range' do |
... | ... | @@ -1560,7 +1448,7 @@ class ArticleTest < ActiveSupport::TestCase |
1560 | 1448 | should 'survive to a invalid src attribute while looking for images in body' do |
1561 | 1449 | article = Article.new(:body => "An article with invalid src in img tag <img src='path with spaces.png' />", :profile => @profile) |
1562 | 1450 | assert_nothing_raised URI::InvalidURIError do |
1563 | - assert_equal ['http://localhost/path%20with%20spaces.png'], article.body_images_paths | |
1451 | + assert_equal ["http://#{profile.environment.default_hostname}/path%20with%20spaces.png"], article.body_images_paths | |
1564 | 1452 | end |
1565 | 1453 | end |
1566 | 1454 | |
... | ... | @@ -1671,4 +1559,24 @@ class ArticleTest < ActiveSupport::TestCase |
1671 | 1559 | assert !a.allow_edit?(nil) |
1672 | 1560 | end |
1673 | 1561 | |
1562 | + should 'get first image from lead' do | |
1563 | + a = fast_create(Article, :body => '<p>Foo</p><p><img src="bar.png" />Bar<img src="foo.png" /></p>', | |
1564 | + :abstract => '<p>Lead</p><p><img src="leadbar.png" />Bar<img src="leadfoo.png" /></p>') | |
1565 | + assert_equal 'leadbar.png', a.first_image | |
1566 | + end | |
1567 | + | |
1568 | + should 'get first image from body' do | |
1569 | + a = fast_create(Article, :body => '<p>Foo</p><p><img src="bar.png" />Bar<img src="foo.png" /></p>') | |
1570 | + assert_equal 'bar.png', a.first_image | |
1571 | + end | |
1572 | + | |
1573 | + should 'not get first image from anywhere' do | |
1574 | + a = fast_create(Article, :body => '<p>Foo</p><p>Bar</p>') | |
1575 | + assert_equal '', a.first_image | |
1576 | + end | |
1577 | + | |
1578 | + should 'store first image in tracked action' do | |
1579 | + a = TinyMceArticle.create! :name => 'Tracked Article', :body => '<p>Foo<img src="foo.png" />Bar</p>', :profile_id => profile.id | |
1580 | + assert_equal 'foo.png', ActionTracker::Record.last.get_first_image | |
1581 | + end | |
1674 | 1582 | end | ... | ... |
test/unit/category_finder_test.rb
... | ... | @@ -188,17 +188,20 @@ class CategoryFinderTest < ActiveSupport::TestCase |
188 | 188 | end |
189 | 189 | |
190 | 190 | should 'return most commented articles' do |
191 | + person = create_user('testuser').person | |
191 | 192 | Article.delete_all |
192 | 193 | |
193 | - person = create_user('testuser').person | |
194 | - articles = (1..4).map {|n| a = person.articles.build(:name => "art #{n}", :category_ids => [@category.id]); a.save!; a } | |
194 | + (1..4).map {|n| create(TextileArticle, :profile_id => person.id, :name => "art #{n}", :category_ids => [@category.id]) } | |
195 | + | |
196 | + first_article = person.articles.first | |
197 | + 2.times { Comment.create(:title => 'test', :body => 'asdsad', :author => person, :source => first_article) } | |
195 | 198 | |
196 | - 2.times { articles[0].comments.build(:title => 'test', :body => 'asdsad', :author => person).save! } | |
197 | - 4.times { articles[1].comments.build(:title => 'test', :body => 'asdsad', :author => person).save! } | |
199 | + last_article = person.articles.last | |
200 | + 4.times { Comment.create(:title => 'test', :body => 'asdsad', :author => person, :source => last_article) } | |
198 | 201 | |
199 | 202 | result = @finder.most_commented_articles(2) |
200 | 203 | # should respect the order (more commented comes first) |
201 | - assert_equal [articles[1], articles[0]], result | |
204 | + assert_equal [last_article, first_article], result | |
202 | 205 | assert_respond_to result, :total_entries |
203 | 206 | end |
204 | 207 | ... | ... |
test/unit/category_test.rb
... | ... | @@ -260,13 +260,14 @@ class CategoryTest < ActiveSupport::TestCase |
260 | 260 | a2 = person.articles.build(:name => 'art2', :category_ids => [c.id]); a2.save! |
261 | 261 | a3 = person.articles.build(:name => 'art3', :category_ids => [c.id]); a3.save! |
262 | 262 | |
263 | - a1.comments.build(:title => 'test', :body => 'asdsa', :author => person).save! | |
264 | - 5.times { a2.comments.build(:title => 'test', :body => 'asdsa', :author => person).save! } | |
263 | + Comment.create(:title => 'test', :body => 'asdsa', :author => person, :source => a1) | |
264 | + 5.times { Comment.create(:title => 'test', :body => 'asdsa', :author => person, :source => a2) } | |
265 | 265 | |
266 | - 10.times { a3.comments.build(:title => 'test', :body => 'kajsdsa', :author => person).save! } | |
266 | + 10.times { Comment.create(:title => 'test', :body => 'kajsdsa', :author => person, :source => a3) } | |
267 | 267 | |
268 | 268 | assert_equal [a3, a2], c.most_commented_articles(2) |
269 | 269 | end |
270 | + | |
270 | 271 | should 'have comments' do |
271 | 272 | c = @env.categories.build(:name => 'my category'); c.save! |
272 | 273 | person = create_user('testuser').person | ... | ... |
test/unit/comment_notifier_test.rb
... | ... | @@ -12,26 +12,26 @@ class CommentNotifierTest < ActiveSupport::TestCase |
12 | 12 | @article = fast_create(Article, :name => 'Article test', :profile_id => @profile.id, :notify_comments => true) |
13 | 13 | end |
14 | 14 | |
15 | - should 'deliver mail after make aarticle commment' do | |
15 | + should 'deliver mail after make an article comment' do | |
16 | 16 | assert_difference ActionMailer::Base.deliveries, :size do |
17 | - @article.comments << Comment.new(:author => @profile, :title => 'test comment', :body => 'you suck!') | |
17 | + Comment.create(:author => @profile, :title => 'test comment', :body => 'you suck!', :source => @article ) | |
18 | 18 | end |
19 | 19 | end |
20 | 20 | |
21 | 21 | should 'deliver mail to owner of article' do |
22 | - @article.comments << Comment.new(:author => @profile, :title => 'test comment', :body => 'you suck!') | |
22 | + Comment.create(:author => @profile, :title => 'test comment', :body => 'you suck!', :source => @article ) | |
23 | 23 | sent = ActionMailer::Base.deliveries.first |
24 | 24 | assert_equal [@profile.email], sent.to |
25 | 25 | end |
26 | 26 | |
27 | 27 | should 'display author name in delivered mail' do |
28 | - @article.comments << Comment.new(:author => @profile, :title => 'test comment', :body => 'you suck!') | |
28 | + Comment.create(:author => @profile, :title => 'test comment', :body => 'you suck!', :source => @article) | |
29 | 29 | sent = ActionMailer::Base.deliveries.first |
30 | 30 | assert_match /user_comment_test/, sent.body |
31 | 31 | end |
32 | 32 | |
33 | 33 | should 'display unauthenticated author name and email in delivered mail' do |
34 | - @article.comments << Comment.new(:name => 'flatline', :email => 'flatline@invalid.com', :title => 'test comment', :body => 'you suck!') | |
34 | + Comment.create(:name => 'flatline', :email => 'flatline@invalid.com', :title => 'test comment', :body => 'you suck!', :source => @article ) | |
35 | 35 | sent = ActionMailer::Base.deliveries.first |
36 | 36 | assert_match /flatline/, sent.body |
37 | 37 | assert_match /flatline@invalid.com/, sent.body |
... | ... | @@ -45,13 +45,13 @@ class CommentNotifierTest < ActiveSupport::TestCase |
45 | 45 | end |
46 | 46 | |
47 | 47 | should 'include comment title in the e-mail' do |
48 | - @article.comments << Comment.new(:author => @profile, :title => 'comment title', :body => 'comment title') | |
48 | + Comment.create(:author => @profile, :title => 'comment title', :body => 'comment body', :source => @article) | |
49 | 49 | sent = ActionMailer::Base.deliveries.first |
50 | 50 | assert_match /comment title/, sent.body |
51 | 51 | end |
52 | 52 | |
53 | 53 | should 'include comment text in the e-mail' do |
54 | - @article.comments << Comment.new(:author => @profile, :title => 'comment title', :body => 'comment body') | |
54 | + Comment.create(:author => @profile, :title => 'comment title', :body => 'comment body', :source => @article) | |
55 | 55 | sent = ActionMailer::Base.deliveries.first |
56 | 56 | assert_match /comment body/, sent.body |
57 | 57 | end | ... | ... |
test/unit/comment_test.rb
... | ... | @@ -13,13 +13,13 @@ class CommentTest < ActiveSupport::TestCase |
13 | 13 | assert_mandatory(Comment.new, :body) |
14 | 14 | end |
15 | 15 | |
16 | - should 'belong to an article' do | |
16 | + should 'have a polymorphic relationship with source' do | |
17 | 17 | c = Comment.new |
18 | - assert_raise ActiveRecord::AssociationTypeMismatch do | |
19 | - c.article = 1 | |
18 | + assert_nothing_raised do | |
19 | + c.source = Article.new | |
20 | 20 | end |
21 | 21 | assert_nothing_raised do |
22 | - c.article = Article.new | |
22 | + c.source = ActionTracker::Record.new | |
23 | 23 | end |
24 | 24 | end |
25 | 25 | |
... | ... | @@ -65,12 +65,33 @@ class CommentTest < ActiveSupport::TestCase |
65 | 65 | |
66 | 66 | should 'update counter cache in article' do |
67 | 67 | owner = create_user('testuser').person |
68 | - art = owner.articles.build(:name => 'ytest'); art.save! | |
69 | - | |
68 | + art = create(TextileArticle, :profile_id => owner.id) | |
70 | 69 | cc = art.comments_count |
71 | - art.comments.build(:title => 'test comment', :body => 'anything', :author => owner).save! | |
72 | - art.reload | |
73 | - assert_equal cc + 1, art.comments_count | |
70 | + | |
71 | + comment = create(Comment, :source => art, :author_id => owner.id) | |
72 | + assert_equal cc + 1, Article.find(art.id).comments_count | |
73 | + end | |
74 | + | |
75 | + should 'update counter cache in article activity' do | |
76 | + owner = create_user('testuser').person | |
77 | + article = create(TextileArticle, :profile_id => owner.id) | |
78 | + | |
79 | + action = article.activity | |
80 | + cc = action.comments_count | |
81 | + comment = create(Comment, :source => action, :author_id => owner.id) | |
82 | + assert_equal cc + 1, ActionTracker::Record.find(action.id).comments_count | |
83 | + end | |
84 | + | |
85 | + should 'update counter cache in general activity when add a comment' do | |
86 | + person = fast_create(Person) | |
87 | + community = fast_create(Community) | |
88 | + | |
89 | + activity = ActionTracker::Record.create :user => person, :target => community, :verb => 'add_member_in_community' | |
90 | + | |
91 | + cc = activity.comments_count | |
92 | + | |
93 | + comment = create(Comment, :source => activity, :author_id => person.id) | |
94 | + assert_equal cc + 1, ActionTracker::Record.find(activity.id).comments_count | |
74 | 95 | end |
75 | 96 | |
76 | 97 | should 'provide author name for authenticated authors' do |
... | ... | @@ -217,30 +238,10 @@ class CommentTest < ActiveSupport::TestCase |
217 | 238 | assert File.exists?(File.join(Rails.root, 'public', image)), "#{image} does not exist." |
218 | 239 | end |
219 | 240 | |
220 | - should 'track action when comment is created' do | |
221 | - owner = create_user('testuser').person | |
222 | - article = owner.articles.create!(:name => 'test', :body => '...') | |
223 | - comment = article.comments.create!(:article => article, :name => 'foo', :title => 'bar', :body => 'my comment', :email => 'cracker@test.org') | |
224 | - ta = ActionTracker::Record.last | |
225 | - assert_equal 'bar', ta.get_title | |
226 | - assert_equal 'my comment', ta.get_body | |
227 | - assert_equal 'test', ta.get_article_title | |
228 | - assert_equal article.url, ta.get_article_url | |
229 | - assert_equal comment.url, ta.get_url | |
230 | - end | |
231 | - | |
232 | 241 | should 'have the action_tracker_target defined' do |
233 | 242 | assert Comment.method_defined?(:action_tracker_target) |
234 | 243 | end |
235 | 244 | |
236 | - should "have the action_tracker_target be the articles's profile" do | |
237 | - owner = create_user('testuser').person | |
238 | - article = owner.articles.create!(:name => 'test', :body => '...') | |
239 | - comment = article.comments.create!(:article => article, :name => 'foo', :title => 'bar', :body => 'my comment', :email => 'cracker@test.org') | |
240 | - ta = ActionTracker::Record.last | |
241 | - assert_equal owner, ta.target | |
242 | - end | |
243 | - | |
244 | 245 | should "get children of a comment" do |
245 | 246 | c = fast_create(Comment) |
246 | 247 | c1 = fast_create(Comment, :reply_of_id => c.id) |
... | ... | @@ -307,11 +308,11 @@ class CommentTest < ActiveSupport::TestCase |
307 | 308 | |
308 | 309 | should "return comments as a thread" do |
309 | 310 | a = fast_create(Article) |
310 | - c0 = fast_create(Comment, :article_id => a.id) | |
311 | - c1 = fast_create(Comment, :reply_of_id => c0.id, :article_id => a.id) | |
312 | - c2 = fast_create(Comment, :reply_of_id => c1.id, :article_id => a.id) | |
313 | - c3 = fast_create(Comment, :reply_of_id => c0.id, :article_id => a.id) | |
314 | - c4 = fast_create(Comment, :article_id => a.id) | |
311 | + c0 = fast_create(Comment, :source_id => a.id) | |
312 | + c1 = fast_create(Comment, :reply_of_id => c0.id, :source_id => a.id) | |
313 | + c2 = fast_create(Comment, :reply_of_id => c1.id, :source_id => a.id) | |
314 | + c3 = fast_create(Comment, :reply_of_id => c0.id, :source_id => a.id) | |
315 | + c4 = fast_create(Comment, :source_id => a.id) | |
315 | 316 | result = a.comments.as_thread |
316 | 317 | assert_equal c0.id, result[0].id |
317 | 318 | assert_equal [c1.id, c3.id], result[0].replies.map(&:id) |
... | ... | @@ -338,4 +339,27 @@ class CommentTest < ActiveSupport::TestCase |
338 | 339 | assert c.rejected? |
339 | 340 | end |
340 | 341 | |
342 | + should 'update article activity when add a comment' do | |
343 | + profile = create_user('testuser').person | |
344 | + article = create(TinyMceArticle, :profile => profile) | |
345 | + action = article.activity | |
346 | + time = action.updated_at | |
347 | + | |
348 | + Time.stubs(:now).returns(time + 1.day) | |
349 | + | |
350 | + comment = create(Comment, :source => article, :author => profile) | |
351 | + assert_equal time + 1.day, article.activity.updated_at | |
352 | + end | |
353 | + | |
354 | + should 'create a new activity when add a comment and the activity was removed' do | |
355 | + profile = create_user('testuser').person | |
356 | + article = create(TinyMceArticle, :profile => profile) | |
357 | + article.activity.destroy | |
358 | + | |
359 | + assert_nil article.activity | |
360 | + | |
361 | + comment = create(Comment, :source => article, :author => profile) | |
362 | + assert_not_nil article.activity | |
363 | + end | |
364 | + | |
341 | 365 | end | ... | ... |
test/unit/community_test.rb
... | ... | @@ -274,22 +274,19 @@ class CommunityTest < ActiveSupport::TestCase |
274 | 274 | end |
275 | 275 | end |
276 | 276 | |
277 | - should "be created an tracked action to the community when an community's article is commented" do | |
277 | + should "update the action of article creation when an community's article is commented" do | |
278 | 278 | ActionTrackerNotification.delete_all |
279 | 279 | p1 = Person.first |
280 | 280 | community = fast_create(Community) |
281 | 281 | p2 = fast_create(Person) |
282 | 282 | p3 = fast_create(Person) |
283 | 283 | community.add_member(p3) |
284 | - article = fast_create(Article, :profile_id => community.id) | |
285 | - ActionTracker::Record.destroy_all | |
286 | - assert_difference(ActionTrackerNotification, :count, 3) do | |
287 | - Comment.create!(:article_id => article.id, :title => 'some', :body => 'some', :author_id => p2.id) | |
288 | - process_delayed_job_queue | |
289 | - end | |
290 | - ActionTrackerNotification.all.map{|a|a.profile}.map do |profile| | |
291 | - assert [community,p1,p3].include?(profile) | |
292 | - end | |
284 | + article = create(TextileArticle, :profile_id => community.id) | |
285 | + time = article.activity.updated_at | |
286 | + Time.stubs(:now).returns(time + 1.day) | |
287 | + Comment.create!(:source_id => article.id, :title => 'some', :body => 'some', :author_id => p2.id) | |
288 | + process_delayed_job_queue | |
289 | + assert_equal time, article.activity.updated_at | |
293 | 290 | end |
294 | 291 | |
295 | 292 | should "see get all received scraps" do |
... | ... | @@ -341,4 +338,35 @@ class CommunityTest < ActiveSupport::TestCase |
341 | 338 | assert_equal false, community.receives_scrap_notification? |
342 | 339 | end |
343 | 340 | |
341 | + should 'return scraps as activities' do | |
342 | + person = fast_create(Person) | |
343 | + community = fast_create(Community) | |
344 | + | |
345 | + scrap = Scrap.create!(defaults_for_scrap(:sender => person, :receiver => community, :content => 'A scrap')) | |
346 | + activity = ActionTracker::Record.last | |
347 | + | |
348 | + assert_equal [activity,scrap], community.activities.map { |a| a.klass.constantize.find(a.id) } | |
349 | + end | |
350 | + | |
351 | + should 'return tracked_actions of community as activities' do | |
352 | + person = fast_create(Person) | |
353 | + community = fast_create(Community) | |
354 | + | |
355 | + UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
356 | + article = create(TinyMceArticle, :profile => community, :name => 'An article about free software') | |
357 | + | |
358 | + assert_equal [article.activity], community.activities.map { |a| a.klass.constantize.find(a.id) } | |
359 | + end | |
360 | + | |
361 | + should 'not return tracked_actions of other community as activities' do | |
362 | + person = fast_create(Person) | |
363 | + community = fast_create(Community) | |
364 | + community2 = fast_create(Community) | |
365 | + | |
366 | + UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
367 | + article = create(TinyMceArticle, :profile => community2, :name => 'Another article about free software') | |
368 | + | |
369 | + assert_not_includes community.activities.map { |a| a.klass.constantize.find(a.id) }, article.activity | |
370 | + end | |
371 | + | |
344 | 372 | end | ... | ... |
test/unit/enterprise_test.rb
... | ... | @@ -450,4 +450,37 @@ class EnterpriseTest < ActiveSupport::TestCase |
450 | 450 | e = fast_create(Enterprise) |
451 | 451 | assert_respond_to e, :production_costs |
452 | 452 | end |
453 | + | |
454 | + should 'return scraps as activities' do | |
455 | + person = fast_create(Person) | |
456 | + enterprise = fast_create(Enterprise) | |
457 | + | |
458 | + | |
459 | + activity = ActionTracker::Record.last | |
460 | + scrap = Scrap.create!(defaults_for_scrap(:sender => person, :receiver => enterprise, :content => 'A scrap')) | |
461 | + | |
462 | + assert_equal [scrap], enterprise.activities.map { |a| a.klass.constantize.find(a.id) } | |
463 | + end | |
464 | + | |
465 | + should 'return tracked_actions of community as activities' do | |
466 | + person = fast_create(Person) | |
467 | + enterprise = fast_create(Enterprise) | |
468 | + | |
469 | + UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
470 | + article = create(TinyMceArticle, :profile => enterprise, :name => 'An article about free software') | |
471 | + | |
472 | + assert_equal [article.activity], enterprise.activities.map { |a| a.klass.constantize.find(a.id) } | |
473 | + end | |
474 | + | |
475 | + should 'not return tracked_actions of other community as activities' do | |
476 | + person = fast_create(Person) | |
477 | + enterprise = fast_create(Enterprise) | |
478 | + enterprise2 = fast_create(Enterprise) | |
479 | + | |
480 | + UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
481 | + article = create(TinyMceArticle, :profile => enterprise2, :name => 'Another article about free software') | |
482 | + | |
483 | + assert_not_includes enterprise.activities.map { |a| a.klass.constantize.find(a.id) }, article.activity | |
484 | + end | |
485 | + | |
453 | 486 | end | ... | ... |
test/unit/event_test.rb
test/unit/forum_helper_test.rb
... | ... | @@ -63,7 +63,7 @@ class ForumHelperTest < ActiveSupport::TestCase |
63 | 63 | some_post.comments << Comment.new(:name => 'John', :email => 'lenon@example.com', :title => 'test', :body => 'test') |
64 | 64 | c = Comment.last |
65 | 65 | out = last_topic_update(some_post) |
66 | - assert_match "#{c.created_at.to_s} ago by John", out | |
66 | + assert_match "#{c.created_at.to_s} by John", out | |
67 | 67 | assert_match 'John', out |
68 | 68 | end |
69 | 69 | ... | ... |
test/unit/forum_test.rb
... | ... | @@ -28,21 +28,21 @@ class ForumTest < ActiveSupport::TestCase |
28 | 28 | |
29 | 29 | should 'create rss feed automatically' do |
30 | 30 | p = create_user('testuser').person |
31 | - b = create(Forum, :profile_id => p.id, :name => 'forum_feed_test') | |
31 | + b = create(Forum, :profile_id => p.id, :name => 'forum_feed_test', :body => 'Forum') | |
32 | 32 | assert_kind_of RssFeed, b.feed |
33 | 33 | end |
34 | 34 | |
35 | 35 | should 'save feed options' do |
36 | 36 | p = create_user('testuser').person |
37 | - p.articles << Forum.new(:profile => p, :name => 'forum_feed_test') | |
37 | + p.articles << forum = Forum.new(:profile => p, :name => 'forum_feed_test', :body => 'Forum test') | |
38 | 38 | p.forum.feed = { :limit => 7 } |
39 | - assert_equal 7, p.forum.feed.limit | |
39 | + assert_equal 7, Forum.find(forum.id).feed.limit | |
40 | 40 | end |
41 | 41 | |
42 | 42 | should 'save feed options after create forum' do |
43 | 43 | p = create_user('testuser').person |
44 | - p.articles << Forum.new(:profile => p, :name => 'forum_feed_test', :feed => { :limit => 7 }) | |
45 | - assert_equal 7, p.forum.feed.limit | |
44 | + p.articles << forum = Forum.new(:profile => p, :name => 'forum_feed_test', :body => 'Forum test', :feed => { :limit => 7 }) | |
45 | + assert_equal 7, Forum.find(forum.id).feed.limit | |
46 | 46 | end |
47 | 47 | |
48 | 48 | should 'list 5 posts per page by default' do |
... | ... | @@ -52,16 +52,15 @@ class ForumTest < ActiveSupport::TestCase |
52 | 52 | |
53 | 53 | should 'update posts per page setting' do |
54 | 54 | p = create_user('testuser').person |
55 | - p.articles << Forum.new(:profile => p, :name => 'Forum test') | |
56 | - forum = p.forum | |
55 | + p.articles << forum = Forum.new(:profile => p, :name => 'Forum test', :body => 'Forum test') | |
57 | 56 | forum.posts_per_page = 7 |
58 | 57 | assert forum.save! |
59 | - assert_equal 7, p.forum.posts_per_page | |
58 | + assert_equal 7, Forum.find(forum.id).posts_per_page | |
60 | 59 | end |
61 | 60 | |
62 | 61 | should 'has posts' do |
63 | 62 | p = create_user('testuser').person |
64 | - forum = fast_create(Forum, :profile_id => p.id, :name => 'Forum test') | |
63 | + p.articles << forum = Forum.new(:profile => p, :name => 'Forum test', :body => 'Forum test') | |
65 | 64 | post = fast_create(TextileArticle, :name => 'First post', :profile_id => p.id, :parent_id => forum.id) |
66 | 65 | forum.children << post |
67 | 66 | assert_includes forum.posts, post |
... | ... | @@ -69,7 +68,7 @@ class ForumTest < ActiveSupport::TestCase |
69 | 68 | |
70 | 69 | should 'not includes rss feed in posts' do |
71 | 70 | p = create_user('testuser').person |
72 | - forum = create(Forum, :profile_id => p.id, :name => 'Forum test') | |
71 | + forum = create(Forum, :profile_id => p.id, :name => 'Forum test', :body => 'Forum') | |
73 | 72 | assert_includes forum.children, forum.feed |
74 | 73 | assert_not_includes forum.posts, forum.feed |
75 | 74 | end |
... | ... | @@ -89,13 +88,13 @@ class ForumTest < ActiveSupport::TestCase |
89 | 88 | p = create_user('testuser').person |
90 | 89 | fast_create(Forum, :name => 'Forum test', :profile_id => p.id) |
91 | 90 | assert_nothing_raised ActiveRecord::RecordInvalid do |
92 | - Forum.create!(:name => 'Another Forum', :profile => p) | |
91 | + Forum.create!(:name => 'Another Forum', :profile => p, :body => 'Forum test') | |
93 | 92 | end |
94 | 93 | end |
95 | 94 | |
96 | 95 | should 'not update slug from name for existing forum' do |
97 | 96 | p = create_user('testuser').person |
98 | - forum = Forum.create!(:name => 'Forum test', :profile => p) | |
97 | + forum = Forum.create(:name => 'Forum test', :profile_id => p.id, :body => 'Forum') | |
99 | 98 | assert_equal 'forum-test', forum.slug |
100 | 99 | forum.name = 'Changed name' |
101 | 100 | assert_not_equal 'changed-name', forum.slug |
... | ... | @@ -110,4 +109,28 @@ class ForumTest < ActiveSupport::TestCase |
110 | 109 | assert !folder.accept_uploads? |
111 | 110 | end |
112 | 111 | |
112 | + should 'be notifiable' do | |
113 | + assert Forum.new.notifiable? | |
114 | + end | |
115 | + | |
116 | + should 'get first paragraph' do | |
117 | + f = fast_create(Forum, :body => '<p>First</p><p>Second</p>') | |
118 | + assert_equal '<p>First</p>', f.first_paragraph | |
119 | + end | |
120 | + | |
121 | + should 'not get first paragraph' do | |
122 | + f = fast_create(Forum, :body => 'Nothing to do here') | |
123 | + assert_equal '', f.first_paragraph | |
124 | + end | |
125 | + | |
126 | + should 'provide first_paragraph even if body was not given' do | |
127 | + f = fast_create(Forum) | |
128 | + assert_equal '', f.first_paragraph | |
129 | + end | |
130 | + | |
131 | + should 'provide first_paragraph even if body is nil' do | |
132 | + f = fast_create(Forum, :body => nil) | |
133 | + assert_equal '', f.first_paragraph | |
134 | + end | |
135 | + | |
113 | 136 | end | ... | ... |
test/unit/notify_activity_to_profiles_job_test.rb
... | ... | @@ -24,28 +24,6 @@ class NotifyActivityToProfilesJobTest < ActiveSupport::TestCase |
24 | 24 | end |
25 | 25 | end |
26 | 26 | |
27 | - should 'notify just the community in tracker with remove_member_in_community verb' do | |
28 | - person = fast_create(Person) | |
29 | - community = fast_create(Community) | |
30 | - action_tracker = fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person.id, :target_type => 'Profile', :target_id => community.id, :verb => 'remove_member_in_community') | |
31 | - assert NotifyActivityToProfilesJob::NOTIFY_ONLY_COMMUNITY.include?(action_tracker.verb) | |
32 | - p1, p2, m1, m2 = fast_create(Person), fast_create(Person), fast_create(Person), fast_create(Person) | |
33 | - fast_create(Friendship, :person_id => person.id, :friend_id => p1.id) | |
34 | - fast_create(Friendship, :person_id => person.id, :friend_id => p2.id) | |
35 | - fast_create(RoleAssignment, :accessor_id => m1.id, :role_id => 3, :resource_id => community.id) | |
36 | - fast_create(RoleAssignment, :accessor_id => m2.id, :role_id => 3, :resource_id => community.id) | |
37 | - ActionTrackerNotification.delete_all | |
38 | - job = NotifyActivityToProfilesJob.new(action_tracker.id) | |
39 | - job.perform | |
40 | - process_delayed_job_queue | |
41 | - | |
42 | - assert_equal 1, ActionTrackerNotification.count | |
43 | - [community].each do |profile| | |
44 | - notification = ActionTrackerNotification.find_by_profile_id profile.id | |
45 | - assert_equal action_tracker, notification.action_tracker | |
46 | - end | |
47 | - end | |
48 | - | |
49 | 27 | should 'notify just the users and his friends tracking user actions' do |
50 | 28 | person = fast_create(Person) |
51 | 29 | community = fast_create(Community) |
... | ... | @@ -132,36 +110,14 @@ class NotifyActivityToProfilesJobTest < ActiveSupport::TestCase |
132 | 110 | end |
133 | 111 | end |
134 | 112 | |
135 | - should 'not notify the community tracking leave_community verb' do | |
136 | - person = fast_create(Person) | |
137 | - community = fast_create(Community) | |
138 | - action_tracker = fast_create(ActionTracker::Record, :user_type => 'Profile', :user_id => person.id, :target_type => 'Profile', :target_id => community.id, :verb => 'leave_community') | |
139 | - assert !NotifyActivityToProfilesJob::NOTIFY_ONLY_COMMUNITY.include?(action_tracker.verb) | |
140 | - p1, p2, m1, m2 = fast_create(Person), fast_create(Person), fast_create(Person), fast_create(Person) | |
141 | - fast_create(Friendship, :person_id => person.id, :friend_id => p1.id) | |
142 | - fast_create(Friendship, :person_id => person.id, :friend_id => p2.id) | |
143 | - fast_create(RoleAssignment, :accessor_id => m1.id, :role_id => 3, :resource_id => community.id) | |
144 | - fast_create(RoleAssignment, :accessor_id => m2.id, :role_id => 3, :resource_id => community.id) | |
145 | - ActionTrackerNotification.delete_all | |
146 | - job = NotifyActivityToProfilesJob.new(action_tracker.id) | |
147 | - job.perform | |
148 | - process_delayed_job_queue | |
149 | - | |
150 | - assert_equal 5, ActionTrackerNotification.count | |
151 | - [person, p1, p2, m1, m2].each do |profile| | |
152 | - notification = ActionTrackerNotification.find_by_profile_id profile.id | |
153 | - assert_equal action_tracker, notification.action_tracker | |
154 | - end | |
155 | - end | |
156 | - | |
157 | 113 | should "the NOTIFY_ONLY_COMMUNITY constant has all the verbs tested" do |
158 | - notify_community_verbs = ['add_member_in_community', 'remove_member_in_community'] | |
114 | + notify_community_verbs = ['add_member_in_community'] | |
159 | 115 | assert_equal [], notify_community_verbs - NotifyActivityToProfilesJob::NOTIFY_ONLY_COMMUNITY |
160 | 116 | assert_equal [], NotifyActivityToProfilesJob::NOTIFY_ONLY_COMMUNITY - notify_community_verbs |
161 | 117 | end |
162 | 118 | |
163 | 119 | should "the NOT_NOTIFY_COMMUNITY constant has all the verbs tested" do |
164 | - not_notify_community_verbs = ['join_community', 'leave_community'] | |
120 | + not_notify_community_verbs = ['join_community'] | |
165 | 121 | assert_equal [], not_notify_community_verbs - NotifyActivityToProfilesJob::NOT_NOTIFY_COMMUNITY |
166 | 122 | assert_equal [], NotifyActivityToProfilesJob::NOT_NOTIFY_COMMUNITY - not_notify_community_verbs |
167 | 123 | end | ... | ... |
test/unit/person_test.rb
... | ... | @@ -1013,65 +1013,14 @@ class PersonTest < ActiveSupport::TestCase |
1013 | 1013 | assert has_add_member_notification |
1014 | 1014 | end |
1015 | 1015 | |
1016 | - should 'track only one action when a person leaves a community' do | |
1016 | + should 'not track when a person leaves a community' do | |
1017 | 1017 | p = create_user('test_user').person |
1018 | 1018 | c = fast_create(Community, :name => "Foo") |
1019 | 1019 | c.add_member(p) |
1020 | 1020 | c.add_moderator(p) |
1021 | 1021 | ActionTracker::Record.delete_all |
1022 | 1022 | c.remove_member(p) |
1023 | - assert_equal ["Foo"], ActionTracker::Record.last(:conditions => {:verb => 'leave_community'}).get_resource_name | |
1024 | - end | |
1025 | - | |
1026 | - should 'the tracker target be Community when a person leaves a community' do | |
1027 | - ActionTracker::Record.delete_all | |
1028 | - p = create_user('test_user').person | |
1029 | - c = fast_create(Community, :name => "Foo") | |
1030 | - c.add_member(p) | |
1031 | - c.add_moderator(p) | |
1032 | - ActionTracker::Record.delete_all | |
1033 | - c.remove_member(p) | |
1034 | - assert_kind_of Community, ActionTracker::Record.last(:conditions => {:verb => 'leave_community'}).target | |
1035 | - end | |
1036 | - | |
1037 | - should 'the community be notified specifically when a person leaves a community' do | |
1038 | - ActionTracker::Record.delete_all | |
1039 | - p = create_user('test_user').person | |
1040 | - c = fast_create(Community, :name => "Foo") | |
1041 | - c.add_member(p) | |
1042 | - c.add_moderator(p) | |
1043 | - ActionTracker::Record.delete_all | |
1044 | - c.remove_member(p) | |
1045 | - assert_not_nil ActionTracker::Record.last(:conditions => {:verb => 'remove_member_in_community'}) | |
1046 | - end | |
1047 | - | |
1048 | - should 'the community specific notification created when a member leaves community could not be propagated to members' do | |
1049 | - ActionTracker::Record.delete_all | |
1050 | - p1 = Person.first | |
1051 | - p2 = create_user('test_user').person | |
1052 | - p3 = create_user('test_user').person | |
1053 | - c = fast_create(Community, :name => "Foo") | |
1054 | - process_delayed_job_queue | |
1055 | - Delayed::Job.delete_all | |
1056 | - c.add_member(p1) | |
1057 | - c.add_member(p3) | |
1058 | - c.add_moderator(p1) | |
1059 | - c.add_moderator(p3) | |
1060 | - ActionTracker::Record.delete_all | |
1061 | - c.remove_member(p1) | |
1062 | - process_delayed_job_queue | |
1063 | - c.remove_member(p3) | |
1064 | - process_delayed_job_queue | |
1065 | - assert_equal 4, ActionTracker::Record.count | |
1066 | - assert_equal 5, ActionTrackerNotification.count | |
1067 | - has_remove_member_notification = false | |
1068 | - ActionTrackerNotification.all.map do |notification| | |
1069 | - if notification.action_tracker.verb == 'remove_member_in_community' | |
1070 | - has_remove_member_notification = true | |
1071 | - assert_equal c, notification.profile | |
1072 | - end | |
1073 | - end | |
1074 | - assert has_remove_member_notification | |
1023 | + assert_equal [], ActionTracker::Record.all | |
1075 | 1024 | end |
1076 | 1025 | |
1077 | 1026 | should 'get all friends online' do |
... | ... | @@ -1243,4 +1192,32 @@ class PersonTest < ActiveSupport::TestCase |
1243 | 1192 | assert !person.visible |
1244 | 1193 | assert_not_equal password, person.user.password |
1245 | 1194 | end |
1195 | + | |
1196 | + should 'return tracked_actions and scraps as activities' do | |
1197 | + person = fast_create(Person) | |
1198 | + another_person = fast_create(Person) | |
1199 | + | |
1200 | + scrap = Scrap.create!(defaults_for_scrap(:sender => another_person, :receiver => person, :content => 'A scrap')) | |
1201 | + UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
1202 | + article = TinyMceArticle.create!(:profile => person, :name => 'An article about free software') | |
1203 | + | |
1204 | + assert_equivalent [scrap,article.activity], person.activities.map { |a| a.klass.constantize.find(a.id) } | |
1205 | + end | |
1206 | + | |
1207 | + should 'not return tracked_actions and scraps from others as activities' do | |
1208 | + person = fast_create(Person) | |
1209 | + another_person = fast_create(Person) | |
1210 | + | |
1211 | + person_scrap = Scrap.create!(defaults_for_scrap(:sender => person, :receiver => person, :content => 'A scrap from person')) | |
1212 | + another_person_scrap = Scrap.create!(defaults_for_scrap(:sender => another_person, :receiver => another_person, :content => 'A scrap from another person')) | |
1213 | + | |
1214 | + TinyMceArticle.create!(:profile => another_person, :name => 'An article about free software from another person') | |
1215 | + another_person_activity = ActionTracker::Record.last | |
1216 | + | |
1217 | + UserStampSweeper.any_instance.stubs(:current_user).returns(person) | |
1218 | + TinyMceArticle.create!(:profile => person, :name => 'An article about free software') | |
1219 | + person_activity = ActionTracker::Record.last | |
1220 | + | |
1221 | + assert_equal [person_scrap,person_activity], person.activities.map { |a| a.klass.constantize.find(a.id) } | |
1222 | + end | |
1246 | 1223 | end | ... | ... |
test/unit/profile_test.rb
... | ... | @@ -1623,7 +1623,7 @@ class ProfileTest < ActiveSupport::TestCase |
1623 | 1623 | |
1624 | 1624 | should 'have forum' do |
1625 | 1625 | p = fast_create(Profile) |
1626 | - p.articles << Forum.new(:profile => p, :name => 'forum_feed_test') | |
1626 | + p.articles << Forum.new(:profile => p, :name => 'forum_feed_test', :body => 'Forum test') | |
1627 | 1627 | assert p.has_forum? |
1628 | 1628 | end |
1629 | 1629 | |
... | ... | @@ -1639,9 +1639,9 @@ class ProfileTest < ActiveSupport::TestCase |
1639 | 1639 | |
1640 | 1640 | should 'get first forum when has multiple forums' do |
1641 | 1641 | p = fast_create(Profile) |
1642 | - p.forums << Forum.new(:profile => p, :name => 'Forum one') | |
1643 | - p.forums << Forum.new(:profile => p, :name => 'Forum two') | |
1644 | - p.forums << Forum.new(:profile => p, :name => 'Forum three') | |
1642 | + p.forums << Forum.new(:profile => p, :name => 'Forum one', :body => 'Forum test') | |
1643 | + p.forums << Forum.new(:profile => p, :name => 'Forum two', :body => 'Forum test') | |
1644 | + p.forums << Forum.new(:profile => p, :name => 'Forum three', :body => 'Forum test') | |
1645 | 1645 | assert_equal 'Forum one', p.forum.name |
1646 | 1646 | assert_equal 3, p.forums.count |
1647 | 1647 | end |
... | ... | @@ -1704,6 +1704,7 @@ class ProfileTest < ActiveSupport::TestCase |
1704 | 1704 | assert profile.is_on_homepage?("/#{profile.identifier}/#{homepage.slug}", homepage) |
1705 | 1705 | end |
1706 | 1706 | |
1707 | + | |
1707 | 1708 | should 'find profiles with image' do |
1708 | 1709 | env = fast_create(Environment) |
1709 | 1710 | 2.times do |n| |
... | ... | @@ -1764,6 +1765,11 @@ class ProfileTest < ActiveSupport::TestCase |
1764 | 1765 | end |
1765 | 1766 | end |
1766 | 1767 | |
1768 | + should 'return empty array as activities' do | |
1769 | + profile = Profile.new | |
1770 | + assert_equal [], profile.activities | |
1771 | + end | |
1772 | + | |
1767 | 1773 | private |
1768 | 1774 | |
1769 | 1775 | def assert_invalid_identifier(id) | ... | ... |
test/unit/textile_article_test.rb
... | ... | @@ -38,80 +38,72 @@ class TextileArticleTest < ActiveSupport::TestCase |
38 | 38 | assert_equal 1, ActionTracker::Record.count |
39 | 39 | end |
40 | 40 | |
41 | - should 'notify with different trackers activity create with different targets' do | |
41 | + should 'not group trackers activity of article\'s creation' do | |
42 | 42 | ActionTracker::Record.delete_all |
43 | 43 | profile = fast_create(Profile) |
44 | 44 | TextileArticle.create! :name => 'bar', :profile_id => profile.id, :published => true |
45 | 45 | TextileArticle.create! :name => 'another bar', :profile_id => profile.id, :published => true |
46 | - assert_equal 1, ActionTracker::Record.count | |
47 | 46 | TextileArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true |
48 | - assert_equal 2, ActionTracker::Record.count | |
47 | + assert_equal 3, ActionTracker::Record.count | |
49 | 48 | end |
50 | 49 | |
51 | - should 'notify activity on update' do | |
50 | + should 'not update activity on update of an article' do | |
52 | 51 | ActionTracker::Record.delete_all |
53 | - a = TextileArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | |
54 | - assert_equal 1, ActionTracker::Record.count | |
55 | - a.name = 'foo' | |
56 | - a.save! | |
57 | - assert_equal 2, ActionTracker::Record.count | |
52 | + profile = fast_create(Profile) | |
53 | + article = create(TextileArticle, :profile_id => profile.id) | |
54 | + time = article.activity.updated_at | |
55 | + Time.stubs(:now).returns(time + 1.day) | |
56 | + assert_no_difference ActionTracker::Record, :count do | |
57 | + article.name = 'foo' | |
58 | + article.save! | |
59 | + end | |
60 | + assert_equal time, article.activity.updated_at | |
58 | 61 | end |
59 | 62 | |
60 | - should 'notify with different trackers activity update with different targets' do | |
63 | + should 'not create trackers activity when updating articles' do | |
61 | 64 | ActionTracker::Record.delete_all |
62 | 65 | a1 = TextileArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true |
63 | 66 | a2 = TextileArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true |
64 | - assert_equal 2, ActionTracker::Record.count | |
65 | - a1.name = 'foo' | |
66 | - a1.save! | |
67 | - assert_equal 3, ActionTracker::Record.count | |
68 | - a2.name = 'another foo' | |
69 | - a2.save! | |
70 | - assert_equal 4, ActionTracker::Record.count | |
67 | + assert_no_difference ActionTracker::Record, :count do | |
68 | + a1.name = 'foo';a1.save! | |
69 | + a2.name = 'another foo';a2.save! | |
70 | + end | |
71 | 71 | end |
72 | 72 | |
73 | - should 'notify activity on destroy' do | |
73 | + should 'not notify activity on destroy' do | |
74 | 74 | ActionTracker::Record.delete_all |
75 | 75 | a = TextileArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true |
76 | - assert_equal 1, ActionTracker::Record.count | |
77 | - a.destroy | |
78 | - assert_equal 2, ActionTracker::Record.count | |
76 | + assert_no_difference ActionTracker::Record, :count do | |
77 | + a.destroy | |
78 | + end | |
79 | 79 | end |
80 | 80 | |
81 | - should 'notify different activities when destroy articles with diferrents targets' do | |
81 | + should 'not notify when an article is destroyed' do | |
82 | 82 | ActionTracker::Record.delete_all |
83 | 83 | a1 = TextileArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true |
84 | 84 | a2 = TextileArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true |
85 | 85 | assert_equal 2, ActionTracker::Record.count |
86 | - a1.destroy | |
87 | - assert_equal 3, ActionTracker::Record.count | |
88 | - a2.destroy | |
89 | - assert_equal 4, ActionTracker::Record.count | |
86 | + assert_no_difference ActionTracker::Record, :count do | |
87 | + a1.destroy | |
88 | + a2.destroy | |
89 | + end | |
90 | 90 | end |
91 | 91 | |
92 | - should "the tracker action target be defined as Community by custom_target method on articles'creation in communities" do | |
92 | + should "the tracker action target be defined as the article on articles'creation in communities" do | |
93 | 93 | ActionTracker::Record.delete_all |
94 | 94 | community = fast_create(Community) |
95 | 95 | p1 = Person.first |
96 | 96 | community.add_member(p1) |
97 | 97 | assert p1.is_member_of?(community) |
98 | 98 | article = TextileArticle.create! :name => 'test', :profile_id => community.id |
99 | - assert_equal true, article.published? | |
100 | - assert_equal true, article.notifiable? | |
101 | - assert_equal false, article.image? | |
102 | - assert_equal Community, article.profile.class | |
103 | - assert_equal Community, ActionTracker::Record.last.target.class | |
99 | + assert_equal article, ActionTracker::Record.last.target | |
104 | 100 | end |
105 | 101 | |
106 | - should "the tracker action target be defined as person by custom_target method on articles'creation in profile" do | |
102 | + should "the tracker action target be defined as the article on articles'creation in profile" do | |
107 | 103 | ActionTracker::Record.delete_all |
108 | 104 | person = Person.first |
109 | 105 | article = TextileArticle.create! :name => 'test', :profile_id => person.id |
110 | - assert_equal true, article.published? | |
111 | - assert_equal true, article.notifiable? | |
112 | - assert_equal false, article.image? | |
113 | - assert_equal Person, article.profile.class | |
114 | - assert_equal person, ActionTracker::Record.last.target | |
106 | + assert_equal article, ActionTracker::Record.last.target | |
115 | 107 | end |
116 | 108 | |
117 | 109 | should 'not notify activity if the article is not advertise' do | ... | ... |
test/unit/tiny_mce_article_test.rb
... | ... | @@ -134,80 +134,64 @@ class TinyMceArticleTest < ActiveSupport::TestCase |
134 | 134 | assert_equal 1, ActionTracker::Record.count |
135 | 135 | end |
136 | 136 | |
137 | - should 'notify with different trackers activity create with different targets' do | |
137 | + should 'not group trackers activity of article\'s creation' do | |
138 | 138 | ActionTracker::Record.delete_all |
139 | 139 | profile = fast_create(Profile) |
140 | 140 | TinyMceArticle.create! :name => 'bar', :profile_id => profile.id, :published => true |
141 | 141 | TinyMceArticle.create! :name => 'another bar', :profile_id => profile.id, :published => true |
142 | - assert_equal 1, ActionTracker::Record.count | |
143 | - TinyMceArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true | |
144 | 142 | assert_equal 2, ActionTracker::Record.count |
143 | + TinyMceArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true | |
144 | + assert_equal 3, ActionTracker::Record.count | |
145 | 145 | end |
146 | 146 | |
147 | - should 'notify activity on update' do | |
147 | + should 'not update activity on update of an article' do | |
148 | 148 | ActionTracker::Record.delete_all |
149 | - a = TinyMceArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | |
150 | - assert_equal 1, ActionTracker::Record.count | |
151 | - a.name = 'foo' | |
152 | - a.save! | |
153 | - assert_equal 2, ActionTracker::Record.count | |
149 | + profile = fast_create(Profile) | |
150 | + article = create(TinyMceArticle, :profile_id => profile.id) | |
151 | + time = article.activity.updated_at | |
152 | + Time.stubs(:now).returns(time + 1.day) | |
153 | + assert_no_difference ActionTracker::Record, :count do | |
154 | + article.name = 'foo' | |
155 | + article.save! | |
156 | + end | |
157 | + assert_equal time, article.activity.updated_at | |
154 | 158 | end |
155 | 159 | |
156 | - should 'notify with different trackers activity update with different targets' do | |
160 | + should 'not create trackers activity when updating articles' do | |
157 | 161 | ActionTracker::Record.delete_all |
158 | 162 | a1 = TinyMceArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true |
159 | 163 | a2 = TinyMceArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true |
160 | - assert_equal 2, ActionTracker::Record.count | |
161 | - a1.name = 'foo' | |
162 | - a1.save! | |
163 | - assert_equal 3, ActionTracker::Record.count | |
164 | - a2.name = 'another foo' | |
165 | - a2.save! | |
166 | - assert_equal 4, ActionTracker::Record.count | |
164 | + assert_no_difference ActionTracker::Record, :count do | |
165 | + a1.name = 'foo';a1.save! | |
166 | + a2.name = 'another foo';a2.save! | |
167 | + end | |
167 | 168 | end |
168 | 169 | |
169 | - should 'notify activity on destroy' do | |
170 | - ActionTracker::Record.delete_all | |
171 | - a = TinyMceArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true | |
172 | - assert_equal 1, ActionTracker::Record.count | |
173 | - a.destroy | |
174 | - assert_equal 2, ActionTracker::Record.count | |
175 | - end | |
176 | - | |
177 | - should 'notify different activities when destroy articles with diferrents targets' do | |
170 | + should 'not notify when an article is destroyed' do | |
178 | 171 | ActionTracker::Record.delete_all |
179 | 172 | a1 = TinyMceArticle.create! :name => 'bar', :profile_id => fast_create(Profile).id, :published => true |
180 | 173 | a2 = TinyMceArticle.create! :name => 'another bar', :profile_id => fast_create(Profile).id, :published => true |
181 | - assert_equal 2, ActionTracker::Record.count | |
182 | - a1.destroy | |
183 | - assert_equal 3, ActionTracker::Record.count | |
184 | - a2.destroy | |
185 | - assert_equal 4, ActionTracker::Record.count | |
174 | + assert_no_difference ActionTracker::Record, :count do | |
175 | + a1.destroy | |
176 | + a2.destroy | |
177 | +end | |
186 | 178 | end |
187 | 179 | |
188 | - should "the tracker action target be defined as Community by custom_target method on articles'creation in communities" do | |
180 | + should "the tracker action target be defined as the article on articles'creation in communities" do | |
189 | 181 | ActionTracker::Record.delete_all |
190 | 182 | community = fast_create(Community) |
191 | 183 | p1 = Person.first |
192 | 184 | community.add_member(p1) |
193 | 185 | assert p1.is_member_of?(community) |
194 | 186 | article = TinyMceArticle.create! :name => 'test', :profile_id => community.id |
195 | - assert_equal true, article.published? | |
196 | - assert_equal true, article.notifiable? | |
197 | - assert_equal false, article.image? | |
198 | - assert_equal Community, article.profile.class | |
199 | - assert_equal Community, ActionTracker::Record.last.target.class | |
187 | + assert_equal article, ActionTracker::Record.last.target | |
200 | 188 | end |
201 | 189 | |
202 | - should "the tracker action target be defined as person by custom_target method on articles'creation in profile" do | |
190 | + should "the tracker action target be defined as the article on articles'creation in profile" do | |
203 | 191 | ActionTracker::Record.delete_all |
204 | 192 | person = Person.first |
205 | 193 | article = TinyMceArticle.create! :name => 'test', :profile_id => person.id |
206 | - assert_equal true, article.published? | |
207 | - assert_equal true, article.notifiable? | |
208 | - assert_equal false, article.image? | |
209 | - assert_equal Person, article.profile.class | |
210 | - assert_equal person, ActionTracker::Record.last.target | |
194 | + assert_equal article, ActionTracker::Record.last.target | |
211 | 195 | end |
212 | 196 | |
213 | 197 | should 'not notify activity if the article is not advertise' do | ... | ... |
test/unit/uploaded_file_test.rb
... | ... | @@ -231,10 +231,10 @@ class UploadedFileTest < ActiveSupport::TestCase |
231 | 231 | should 'return a thumbnail for images' do |
232 | 232 | f = UploadedFile.new |
233 | 233 | f.expects(:image?).returns(true) |
234 | - f.expects(:full_filename).with(:thumb).returns(File.join(RAILS_ROOT, 'public', 'images', '0000', '0005', 'x.png')) | |
234 | + f.expects(:full_filename).with(:display).returns(File.join(RAILS_ROOT, 'public', 'images', '0000', '0005', 'x.png')) | |
235 | 235 | assert_equal '/images/0000/0005/x.png', f.thumbnail_path |
236 | 236 | f = UploadedFile.new |
237 | - f.stubs(:full_filename).with(:thumb).returns(File.join(RAILS_ROOT, 'public', 'images', '0000', '0005', 'x.png')) | |
237 | + f.stubs(:full_filename).with(:display).returns(File.join(RAILS_ROOT, 'public', 'images', '0000', '0005', 'x.png')) | |
238 | 238 | f.expects(:image?).returns(false) |
239 | 239 | assert_nil f.thumbnail_path |
240 | 240 | end |
... | ... | @@ -330,4 +330,11 @@ class UploadedFileTest < ActiveSupport::TestCase |
330 | 330 | assert_equal 'hello_world.php.txt', file.filename |
331 | 331 | end |
332 | 332 | |
333 | + should 'use itself as target for action tracker' do | |
334 | + p = fast_create(Gallery, :profile_id => @profile.id) | |
335 | + f = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :parent => p, :profile => @profile) | |
336 | + ta = f.activity | |
337 | + assert_equal f, ta.target | |
338 | + end | |
339 | + | |
333 | 340 | end | ... | ... |
vendor/plugins/access_control/lib/role_assignment.rb
... | ... | @@ -7,12 +7,8 @@ class RoleAssignment < ActiveRecord::Base |
7 | 7 | |
8 | 8 | track_actions :join_community, :after_create, :keep_params => ["resource.name", "resource.url", "resource.profile_custom_icon"], :if => Proc.new { |x| x.resource.is_a?(Community) && x.accessor.role_assignments.count(:conditions => { :resource_id => x.resource.id, :resource_type => 'Profile' }) == 1 }, :custom_user => :accessor, :custom_target => :resource |
9 | 9 | |
10 | - track_actions :add_member_in_community, :after_create, :if => Proc.new { |x| x.resource.is_a?(Community) && x.accessor.role_assignments.count(:conditions => { :resource_id => x.resource.id, :resource_type => 'Profile' }) == 1 }, :custom_user => :accessor, :custom_target => :resource | |
10 | +# track_actions :add_member_in_community, :after_create, :if => Proc.new { |x| x.resource.is_a?(Community) && x.accessor.role_assignments.count(:conditions => { :resource_id => x.resource.id, :resource_type => 'Profile' }) == 1 }, :custom_user => :accessor, :custom_target => :resource | |
11 | 11 | |
12 | - track_actions :leave_community, :before_destroy, :keep_params => ["resource.name", "resource.url", "resource.profile_custom_icon"], :if => Proc.new { |x| x.resource.is_a?(Community) && x.accessor.role_assignments.count(:conditions => { :resource_id => x.resource.id, :resource_type => 'Profile' }) == 1 }, :custom_user => :accessor, :custom_target => :resource | |
13 | - | |
14 | - track_actions :remove_member_in_community, :before_destroy, :if => Proc.new { |x| x.resource.is_a?(Community) && x.accessor.role_assignments.count(:conditions => { :resource_id => x.resource.id, :resource_type => 'Profile' }) == 1 }, :custom_target => :resource, :custom_user => :accessor | |
15 | - | |
16 | 12 | def has_permission?(perm, res) |
17 | 13 | return false unless role.has_permission?(perm.to_s) && (resource || is_global) |
18 | 14 | return true if is_global | ... | ... |
vendor/plugins/action_tracker/lib/action_tracker_model.rb
... | ... | @@ -0,0 +1,12 @@ |
1 | +# monkey patch to add comments on action_tracker | |
2 | + | |
3 | +ActionTracker::Record.module_eval do | |
4 | + | |
5 | + has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :finder_sql => 'SELECT * FROM comments WHERE #{conditions_for_comments} ORDER BY created_at ASC', :counter_sql => 'SELECT * FROM comments WHERE #{conditions_for_comments}' | |
6 | + | |
7 | + def conditions_for_comments | |
8 | + type, id = (self.target_type == 'Article' ? ['Article', self.target_id] : [self.class.to_s, self.id]) | |
9 | + "source_type = '#{type}' AND source_id = '#{id}'" | |
10 | + end | |
11 | + | |
12 | +end | ... | ... |
vendor/plugins/active_record_counter_cache_on_polymorphic_association/init.rb
0 → 100644
... | ... | @@ -0,0 +1,36 @@ |
1 | +# monkey patch to fix ActiveRecord bug | |
2 | +# | |
3 | +# https://rails.lighthouseapp.com/projects/8994/tickets/2452-counter_cache-not-updated-when-an-item-updates-its-polymorphic-owner | |
4 | + | |
5 | +#ActiveRecord::Associations.module_eval do | |
6 | +# | |
7 | +# def replace(record) | |
8 | +# | |
9 | +# counter_cache_name = @reflection.counter_cache_column | |
10 | +# | |
11 | +# if record.nil? | |
12 | +# if counter_cache_name && !@owner.new_record? | |
13 | +# record.class.base_class.decrement_counter(counter_cache_name, @owner[@reflection.primary_key_name]) if @owner[@reflection.primary_key_name] | |
14 | +# end | |
15 | +# | |
16 | +# @target = @owner[@reflection.primary_key_name] = @owner[@reflection.options[:foreign_type]] = nil | |
17 | +# else | |
18 | +# @target = (AssociationProxy === record ? record.target : record) | |
19 | +# | |
20 | +# if counter_cache_name && !@owner.new_record? | |
21 | +# record.class.base_class.increment_counter(counter_cache_name, record.id) | |
22 | +# record.class.base_class.decrement_counter(counter_cache_name, @owner[@reflection.primary_key_name]) if @owner[@reflection.primary_key_name] | |
23 | +# end | |
24 | +# | |
25 | +# @owner[@reflection.primary_key_name] = record.id | |
26 | +# @owner[@reflection.options[:foreign_type]] = record.class.base_class.name.to_s | |
27 | +# | |
28 | +# | |
29 | +# @updated = true | |
30 | +# end | |
31 | +# | |
32 | +# loaded | |
33 | +# record | |
34 | +# end | |
35 | +# | |
36 | +#end | ... | ... |