Commit 23d32ba1d58f96ecb3b92da4b5f371e93cad9dca

Authored by Daniela Feitosa
1 parent f31c657e

Some fixes

app/controllers/public/profile_controller.rb
... ... @@ -3,17 +3,14 @@ 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_scraps, :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 11 @network_activities = !@profile.is_a?(Person) ? @profile.tracked_notifications.paginate(:per_page => 30, :page => params[:page]) : []
14 12 if logged_in? && current_person.follows?(@profile)
15 13 @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])
17 14 @activities = @profile.activities.paginate(:per_page => 30, :page => params[:page])
18 15 end
19 16 @tags = profile.article_tags
... ... @@ -187,7 +184,7 @@ class ProfileController < PublicController
187 184  
188 185 def leave_comment_on_activity
189 186 @comment = Comment.new(params[:comment])
190   - @comment.author = user #'if logged_in?
  187 + @comment.author = user
191 188 @comment.source = ActionTracker::Record.find(params[:comment][:source_id])
192 189 @tab_action = params[:tab_action]
193 190 @message = @comment.save ? _("Comment successfully added.") : _("You can't leave an empty comment.")
... ... @@ -201,7 +198,6 @@ class ProfileController < PublicController
201 198 end
202 199  
203 200 def view_more_activities
204   -# @activities = @profile.tracked_actions.paginate(:per_page => 30, :page => params[:page])
205 201 @activities = @profile.activities.paginate(:per_page => 30, :page => params[:page])
206 202 render :partial => 'profile_activities_scraps', :locals => {:activities => @activities}
207 203 end
... ...
app/models/action_tracker_notification.rb
... ... @@ -11,4 +11,3 @@ class ActionTrackerNotification < ActiveRecord::Base
11 11 end
12 12  
13 13 ActionTracker::Record.has_many :action_tracker_notifications, :class_name => 'ActionTrackerNotification', :foreign_key => 'action_tracker_id', :dependent => :destroy
14   -ActionTracker::Record.has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
... ...
app/models/article.rb
... ... @@ -2,7 +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, :lead], :if => Proc.new { |a| a.is_trackable? && !a.image? }, :custom_target => :action_tracker_target
  5 + track_actions :create_article, :after_create, :keep_params => [:name, :url, :lead, :id], :if => Proc.new { |a| a.is_trackable? && !a.image? }, :custom_target => :action_tracker_target
6 6  
7 7 # xss_terminate plugin can't sanitize array fields
8 8 before_save :sanitize_tag_list
... ... @@ -15,7 +15,7 @@ class Article &lt; ActiveRecord::Base
15 15  
16 16 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id'
17 17  
18   - has_many :comments, :dependent => :destroy, :order => 'created_at asc', :as => :source
  18 + has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
19 19  
20 20 has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ]
21 21 has_many :categories, :through => :article_categorizations
... ... @@ -133,7 +133,10 @@ class Article &lt; ActiveRecord::Base
133 133 article.advertise = true
134 134 end
135 135  
136   - after_update do |article|
  136 + after_update :update_creation_activity
  137 + def update_creation_activity
  138 + a = ActionTracker::Record.all.select {|a| a.verb == 'create_article' && a.target == article.profile}
  139 + a.first.touch
137 140 #update article's activity
138 141 end
139 142  
... ...
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 4  
7   - belongs_to :source, :foreign_key => :source_id, :counter_cache => true, :polymorphic => true
  5 + belongs_to :source, :counter_cache => true, :polymorphic => true
8 6 alias :article :source
9 7 alias :article= :source=
10 8  
... ...
app/views/profile/_comment.rhtml
... ... @@ -3,14 +3,14 @@
3 3  
4 4 <div class="comment-content comment-logged-in">
5 5  
6   - <%# if comment.author %>
7   - <%= link_to image_tag(profile_icon(comment.author, :minor)) +
8   - content_tag('span', comment.author_name, :class => 'comment-info'),
9   - comment.author.url,
  6 + <% if Person.find(comment.author_id) %>
  7 + <%= link_to image_tag(profile_icon(Person.find(comment.author_id), :minor)) +
  8 + content_tag('span', Person.find(comment.author_id).name, :class => 'comment-info'),
  9 + Person.find(comment.author_id).url,
10 10 :class => 'comment-picture',
11   - :title => comment.author_name
  11 + :title => Person.find(comment.author_id).name
12 12 %>
13   - <%# end %>
  13 + <% end %>
14 14  
15 15 <div class="comment-details">
16 16 <h4><%= comment.title %></h4>
... ... @@ -23,11 +23,11 @@
23 23 </div>
24 24 </div>
25 25  
26   - <%# if logged_in? && (user == profile || user == comment.author || user.has_permission?(:moderate_comments, profile)) %>
  26 + <% if logged_in? && (user == profile || user == Person.find(comment.author_id) || user.has_permission?(:moderate_comments, profile)) %>
27 27 <% button_bar(:style => 'float: right; margin-top: 0px;') do %>
28   - <%= icon_button(:delete, _('Remove this comment and all its replies'), { :profile => params[:profile], :remove_comment => comment.id, :view => params[:view] }, :method => :post, :confirm => _('Are you sure you want to remove this comment and all its replies?')) %>
  28 + <%= icon_button(:delete, _('Remove'), { :profile => params[:profile], :remove_comment => comment.id, :view => params[:view] }, :method => :post, :confirm => _('Are you sure you want to remove this comment and all its replies?')) %>
29 29 <% end %>
30   - <%# end %>
  30 + <% end %>
31 31  
32 32 <div class="comment_reply post_comment_box closed">
33 33 <% if @comment && @comment.errors.any? && @comment.reply_of_id.to_i == comment.id %>
... ... @@ -39,7 +39,7 @@
39 39 });
40 40 </script>
41 41 <% end %>
42   - <%= report_abuse(comment.author, :comment_link, comment) if comment.author %>
  42 + <%= report_abuse(Person.find(comment.author_id), :comment_link, comment) if Person.find(comment.author_id) %>
43 43 <%= link_to_function _('Reply'),
44 44 "var f = add_comment_reply_form(this, %s); f.find('input[name=comment[title]], textarea').val(''); return false" % comment.id,
45 45 :class => 'comment-footer comment-footer-link comment-footer-hide',
... ... @@ -49,7 +49,7 @@
49 49  
50 50 </div>
51 51  
52   - <% unless comment.replies.blank? %>
  52 + <% unless Comment.find(comment.id).replies.blank? %>
53 53 <ul class="comment-replies">
54 54 <% comment.replies.each do |reply| %>
55 55 <%= render :partial => 'comment', :locals => { :comment => reply } %>
... ...
app/views/profile/_profile.rhtml
... ... @@ -18,7 +18,6 @@
18 18 <% tabs << {:title => _('Network'), :id => 'profile-network', :content => (render :partial => 'profile_network')} %>
19 19 <% end %>
20 20  
21   - <% tabs << {:title => _('Activity'), :id => 'profile-activity', :content => (render :partial => 'profile_activity')} %>
22 21 <% tabs << {:title => _('Profile'), :id => 'person-profile', :content => (render :partial => 'person_profile')} %>
23 22 <% end %>
24 23  
... ...
app/views/profile/_profile_activities.rhtml
... ... @@ -1,28 +0,0 @@
1   -<li class='profile-activity-item <%= activity.verb %>' id='profile-activity-item-<%= activity.id %>'>
2   - <%= render :partial => activity.verb, :locals => { :activity => activity }%>
3   - <hr />
4   -
5   - <%# if logged_in? && current_person.follows?(activity.sender) && activity.root.nil? %>
6   - <span class='profile-wall-send-reply'><%= link_to_function _('Comment'), "hide_and_show(['#profile-wall-reply-response-#{activity.id}'],['#profile-wall-reply-#{activity.id}', '#profile-wall-reply-form-#{activity.id}']);$('reply_content_#{activity.id}').value='';$('activity_id_#{activity.id}').value='#{activity.id}';return false", :class => "profile-send-reply" %></span>
7   - <%# end %>
8   -
9   - <ul class="profile-wall-activities-comments" style='padding-left: 50px;width:auto'>
10   - <%= render :partial => 'comment', :collection => activity.comments %>
11   - </ul>
12   -
13   - <div id='profile-wall-reply-<%= activity.id%>' style='display:none;width:auto;'>
14   - <div id='profile-wall-reply-form-<%= activity.id%>' style='display:none;'>
15   - <p class='profile-wall-reply'>
16   - <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_comment_on_activity'}, :update => "profile_activities", :success =>"hide_and_show(['#profile-wall-reply-form-#{activity.id}'],['#profile-wall-reply-response-#{activity.id}'])" do %>
17   - <%= limited_text_area :comment, :body, 420, "reply_content_#{activity.id}", :cols => 50, :rows => 2 %>
18   - <%= hidden_field :comment, :source_id, :id => "activity_id_#{activity.id}" %>
19   - <%= hidden_field :comment, :author_id, :value => user.id %>
20   - <%= submit_button :add, _('Leave a comment') %>
21   - <%= button_to_function :cancel, _('Cancel'), "hide_and_show(['#profile-wall-reply-#{activity.id}'],[]);return false" %>
22   - <% end %>
23   - </p>
24   - </div>
25   - <div id='profile-wall-message-response-<%=activity.id%>' class='profile-wall-message-response'></div>
26   - </div>
27   -
28   -</li>
app/views/profile/_profile_activities_scraps.rhtml
1 1 <% activities.each do |a| %>
2 2 <% activity = a.klass.constantize.find(a.id) %>
3 3 <% if activity.kind_of?(ActionTracker::Record) && @profile.person? %>
4   - <%= render :partial => 'profile_activities', :locals => {:activity => activity} %>
  4 + <%= render :partial => 'profile_activity', :locals => {:activity => activity} %>
5 5 <% else %>
6 6 <%= render :partial => 'profile_scrap', :locals => {:scrap => activity } %>
7 7 <% 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_scraps', :locals => {:activities => @activities} %>
  1 +<li class='profile-activity-item <%= activity.verb %>' id='profile-activity-item-<%= activity.id %>'>
  2 + <%= render :partial => activity.verb, :locals => { :activity => activity }%>
  3 + <hr />
  4 +
  5 + <% if logged_in? && current_person.follows?(activity.user) %>
  6 + <span class='profile-wall-send-reply'><%= link_to_function _('Comment'), "hide_and_show(['#profile-wall-reply-response-#{activity.id}'],['#profile-wall-reply-#{activity.id}', '#profile-wall-reply-form-#{activity.id}']);$('reply_content_#{activity.id}').value='';$('activity_id_#{activity.id}').value='#{activity.id}';return false", :class => "profile-send-reply" %></span>
  7 + <% end %>
  8 +
  9 + <ul class="profile-wall-activities-comments" style='padding-left: 50px;width:auto'>
  10 + <%= render :partial => 'comment', :collection => activity.comments %>
5 11 </ul>
6   -</div>
  12 +
  13 + <div id='profile-wall-reply-<%= activity.id%>' style='display:none;width:auto;'>
  14 + <div id='profile-wall-reply-form-<%= activity.id%>' style='display:none;'>
  15 + <p class='profile-wall-reply'>
  16 + <% form_remote_tag :url => {:controller => 'profile', :action => 'leave_comment_on_activity'}, :update => "profile_activities", :success =>"hide_and_show(['#profile-wall-reply-form-#{activity.id}'],['#profile-wall-reply-response-#{activity.id}'])" do %>
  17 + <%= limited_text_area :comment, :body, 420, "reply_content_#{activity.id}", :cols => 50, :rows => 2 %>
  18 + <%= hidden_field :comment, :source_id, :id => "activity_id_#{activity.id}" %>
  19 + <%= submit_button :add, _('Leave a comment') %>
  20 + <%= button_to_function :cancel, _('Cancel'), "hide_and_show(['#profile-wall-reply-#{activity.id}'],[]);return false" %>
  21 + <% end %>
  22 + </p>
  23 + </div>
  24 + <div id='profile-wall-message-response-<%=activity.id%>' class='profile-wall-message-response'></div>
  25 + </div>
  26 +
  27 +</li>
... ...
app/views/profile/_profile_wall.rhtml
... ... @@ -16,13 +16,3 @@
16 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 17 </div>
18 18 <% end %>
19   -
20   -<!--
21   -<ul id='profile_scraps'>
22   - <%#= render :partial => 'profile_scraps', :locals => {:scraps => @wall_items} %>
23   -</ul>
24   -
25   -<% if @profile.person? %>
26   - <%#= render :partial => 'profile_activity' %>
27   -<% end %>
28   --->
... ...
config/initializers/action_tracker.rb
... ... @@ -8,11 +8,6 @@ ActionTrackerConfig.verbs = {
8 8 :description => lambda { _('published an article: %{title}') % { :title => '{{link_to(truncate(ta.get_name), ta.get_url)}}' } }
9 9 },
10 10  
11   - :remove_article => {
12   - :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") } },
13   - :type => :groupable
14   - },
15   -
16 11 :new_friendship => {
17 12 :description => lambda { n_('has made 1 new friend:<br />%{name}', 'has made %{num} new friends:<br />%{name}', get_friend_name.size) % { :num => get_friend_name.size, :name => '{{ta.collect_group_with_index(:friend_name){ |n,i| link_to(image_tag(ta.get_friend_profile_custom_icon[i] || default_or_themed_icon("/images/icons-app/person-icon.png")), ta.get_friend_url[i], :title => n)}.join}}' } },
18 13 :type => :groupable
... ... @@ -27,24 +22,11 @@ ActionTrackerConfig.verbs = {
27 22 :description => lambda { _('has joined the community.') },
28 23 },
29 24  
30   - :remove_member_in_community => {
31   - :description => lambda { _('has left the community.') },
32   - },
33   -
34   - :leave_community => {
35   - :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}}' } },
36   - :type => :groupable
37   - },
38   -
39 25 :upload_image => {
40 26 :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") } },
41 27 :type => :groupable
42 28 },
43 29  
44   - :leave_comment => {
45   - :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") } }
46   - },
47   -
48 30 :leave_scrap => {
49 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)}}" } }
50 32 },
... ...
test/functional/profile_controller_test.rb
... ... @@ -1169,7 +1169,7 @@ class ProfileControllerTest &lt; ActionController::TestCase
1169 1169 assert_equal 40, profile.tracked_actions.count
1170 1170 get :view_more_activities, :profile => profile.identifier, :page => 2
1171 1171 assert_response :success
1172   - assert_template '_profile_bla'
  1172 + assert_template '_profile_activities_scraps'
1173 1173 assert_equal 10, assigns(:activities).count
1174 1174 end
1175 1175  
... ... @@ -1287,5 +1287,42 @@ class ProfileControllerTest &lt; ActionController::TestCase
1287 1287 get :index, :profile => profile.identifier
1288 1288  
1289 1289 assert_equivalent [scrap,activity], assigns(:activities).map {|a| a.klass.constantize.find(a.id)}
1290   - end
  1290 + end
  1291 +
  1292 + should "be logged in to leave comment on an activity" do
  1293 + article = TinyMceArticle.create!(:profile => profile, :name => 'An article about free software')
  1294 + activity = ActionTracker::Record.last
  1295 + count = activity.comments.count
  1296 +
  1297 + post :leave_comment_on_activity, :profile => profile.identifier, :comment => {:body => 'something', :source_id => activity.id}
  1298 + assert_equal count, activity.comments.count
  1299 + assert_redirected_to :controller => 'account', :action => 'login'
  1300 + end
  1301 +
  1302 + should "leave a comment in own activity" do
  1303 + login_as(profile.identifier)
  1304 + TinyMceArticle.create!(:profile => profile, :name => 'An article about free software')
  1305 + activity = ActionTracker::Record.last
  1306 + count = activity.comments.count
  1307 +
  1308 + assert_equal 0, count
  1309 + post :leave_comment_on_activity, :profile => profile.identifier, :comment => {:body => 'something', :source_id => activity.id}
  1310 + assert_equal count + 1, activity.comments.count
  1311 + assert_response :success
  1312 + assert_equal "Comment successfully added.", assigns(:message)
  1313 + end
  1314 +
  1315 + should "leave a comment on another profile's activity" do
  1316 + login_as(profile.identifier)
  1317 + another_person = fast_create(Person)
  1318 + TinyMceArticle.create!(:profile => another_person, :name => 'An article about free software')
  1319 + activity = ActionTracker::Record.last
  1320 + count = activity.comments.count
  1321 +
  1322 + assert_equal 0, count
  1323 + post :leave_comment_on_activity, :profile => another_person.identifier, :comment => {:body => 'something', :source_id => activity.id}
  1324 + assert_equal count + 1, activity.comments.count
  1325 + assert_response :success
  1326 + assert_equal "Comment successfully added.", assigns(:message)
  1327 + end
1291 1328 end
... ...
test/unit/comment_test.rb
... ... @@ -74,6 +74,14 @@ class CommentTest &lt; ActiveSupport::TestCase
74 74 assert_equal cc + 1, Article.find(art.id).comments_count
75 75 end
76 76  
  77 + should 'update counter cache in activity' do
  78 + action = fast_create(ActionTracker::Record)
  79 + cc = action.comments_count
  80 + comment = fast_create(Comment, :source_id => action.id)
  81 +
  82 + assert_equal cc + 1, ActionTracker::Record.find(action.id).comments_count
  83 + end
  84 +
77 85 should 'provide author name for authenticated authors' do
78 86 owner = create_user('testuser').person
79 87 assert_equal 'testuser', Comment.new(:author => owner).author_name
... ... @@ -319,4 +327,6 @@ class CommentTest &lt; ActiveSupport::TestCase
319 327 assert c.rejected?
320 328 end
321 329  
  330 + should 'update article activity when add a comment'
  331 + should 'update activity when add a comment'
322 332 end
... ...
vendor/plugins/active_record_counter_cache_on_polymorphic_association/init.rb
... ... @@ -2,31 +2,35 @@
2 2 #
3 3 # https://rails.lighthouseapp.com/projects/8994/tickets/2452-counter_cache-not-updated-when-an-item-updates-its-polymorphic-owner
4 4  
5   -ActiveRecord::Associations::ClassMethods.module_eval do
6   -
7   - def replace(record)
8   - counter_cache_name = @reflection.counter_cache_column
9   - if record.nil?
10   - if counter_cache_name && !@owner.new_record?
11   - record.class.base_class.decrement_counter(counter_cache_name, @owner[@reflection.primary_key_name]) if @owner[@reflection.primary_key_name]
12   - end
13   - @target = @owner[@reflection.primary_key_name] = @owner[@reflection.options[:foreign_type]] = nil
14   - else
15   - @target = (AssociationProxy === record ? record.target : record)
16   -
17   - if counter_cache_name && !@owner.new_record?
18   - record.class.base_class.increment_counter(counter_cache_name, record.id)
19   - record.class.base_class.decrement_counter(counter_cache_name, @owner[@reflection.primary_key_name]) if @owner[@reflection.primary_key_name]
20   - end
21   -
22   - @owner[@reflection.primary_key_name] = record.id
23   - @owner[@reflection.options[:foreign_type]] = record.class.base_class.name.to_s
24   -
25   - @updated = true
26   - end
27   -
28   - loaded
29   - record
30   - end
31   -
32   -end
  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
... ...