Commit ab8d14e6e0d82d9523a95fc6e654ebd2337b6477

Authored by Braulio Bhavamitra
2 parents 16f70434 2ce4aa07

Merge branch 'products-activities' into 'master'

Add products activities on wall

Depends !473

See merge request !474
app/helpers/action_tracker_helper.rb
... ... @@ -67,4 +67,22 @@ module ActionTrackerHelper
67 67 }
68 68 end
69 69  
  70 + def create_product_description
  71 + _('created the product %{title}') % {
  72 + title: link_to(truncate(ta.get_name), ta.get_url),
  73 + }
  74 + end
  75 +
  76 + def update_product_description
  77 + _('updated the product %{title}') % {
  78 + title: link_to(truncate(ta.get_name), ta.get_url),
  79 + }
  80 + end
  81 +
  82 + def remove_product_description
  83 + _('removed the product %{title}') % {
  84 + title: truncate(ta.get_name),
  85 + }
  86 + end
  87 +
70 88 end
... ...
app/models/enterprise.rb
... ... @@ -15,7 +15,10 @@ class Enterprise < Organization
15 15  
16 16 N_('Enterprise')
17 17  
18   - has_many :products, :foreign_key => :profile_id, :dependent => :destroy, :order => 'name ASC'
  18 + acts_as_trackable after_add: proc{ |p, t| notify_activity t }
  19 +
  20 + has_many :products, :foreign_key => :profile_id, :dependent => :destroy
  21 + has_many :product_categories, :through => :products
19 22 has_many :inputs, :through => :products
20 23 has_many :production_costs, :as => :owner
21 24  
... ... @@ -202,4 +205,9 @@ class Enterprise < Organization
202 205 ''
203 206 end
204 207  
  208 + def followed_by? person
  209 + super or self.fans.where(id: person.id).count > 0
  210 + end
  211 +
  212 +
205 213 end
... ...
app/models/organization.rb
... ... @@ -35,6 +35,10 @@ class Organization < Profile
35 35  
36 36 validate :presence_of_required_fieds, :unless => :is_template
37 37  
  38 + def self.notify_activity tracked_action
  39 + Delayed::Job.enqueue NotifyActivityToProfilesJob.new(tracked_action.id)
  40 + end
  41 +
38 42 def presence_of_required_fieds
39 43 self.required_fields.each do |field|
40 44 if self.send(field).blank?
... ...
app/models/product.rb
... ... @@ -17,13 +17,14 @@ class Product < ActiveRecord::Base
17 17 'full'
18 18 end
19 19  
20   - belongs_to :enterprise, :foreign_key => :profile_id, :class_name => 'Profile'
21 20 belongs_to :profile
  21 + # backwards compatibility
  22 + belongs_to :enterprise, :foreign_key => :profile_id, :class_name => 'Profile'
22 23 alias_method :enterprise=, :profile=
23 24 alias_method :enterprise, :profile
24 25  
25   - has_one :region, :through => :enterprise
26   - validates_presence_of :enterprise
  26 + has_one :region, :through => :profile
  27 + validates_presence_of :profile
27 28  
28 29 belongs_to :product_category
29 30  
... ... @@ -37,6 +38,10 @@ class Product < ActiveRecord::Base
37 38  
38 39 acts_as_having_settings :field => :data
39 40  
  41 + track_actions :create_product, :after_create, :keep_params => [:name, :url ], :if => Proc.new { |a| a.is_trackable? }, :custom_user => :action_tracker_user
  42 + track_actions :update_product, :before_update, :keep_params => [:name, :url], :if => Proc.new { |a| a.is_trackable? }, :custom_user => :action_tracker_user
  43 + track_actions :remove_product, :before_destroy, :keep_params => [:name], :if => Proc.new { |a| a.is_trackable? }, :custom_user => :action_tracker_user
  44 +
40 45 validates_uniqueness_of :name, :scope => :profile_id, :allow_nil => true, :if => :validate_uniqueness_of_column_name?
41 46  
42 47 validates_presence_of :product_category_id
... ... @@ -54,10 +59,10 @@ class Product < ActiveRecord::Base
54 59 after_update :save_image
55 60  
56 61 def lat
57   - self.enterprise.lat
  62 + self.profile.lat
58 63 end
59 64 def lng
60   - self.enterprise.lng
  65 + self.profile.lng
61 66 end
62 67  
63 68 xss_terminate :only => [ :name ], :on => 'validation'
... ... @@ -71,7 +76,7 @@ class Product < ActiveRecord::Base
71 76 filter_iframes :description
72 77  
73 78 def iframe_whitelist
74   - enterprise && enterprise.environment && enterprise.environment.trusted_sites_for_iframe
  79 + self.profile && self.profile.environment && self.profile.environment.trusted_sites_for_iframe
75 80 end
76 81  
77 82 def name
... ... @@ -109,16 +114,16 @@ class Product < ActiveRecord::Base
109 114 end
110 115  
111 116 def url
112   - enterprise.public_profile_url.merge(:controller => 'manage_products', :action => 'show', :id => id)
  117 + self.profile.public_profile_url.merge(:controller => 'manage_products', :action => 'show', :id => id)
113 118 end
114 119  
115 120 def public?
116   - enterprise.public?
  121 + self.profile.public?
117 122 end
118 123  
119 124 def formatted_value(method)
120 125 value = self[method] || self.send(method)
121   - ("%.2f" % value).to_s.gsub('.', enterprise.environment.currency_separator) if value
  126 + ("%.2f" % value).to_s.gsub('.', self.profile.environment.currency_separator) if value
122 127 end
123 128  
124 129 def price_with_discount
... ... @@ -223,16 +228,16 @@ class Product < ActiveRecord::Base
223 228 end
224 229  
225 230 def available_production_costs
226   - self.enterprise.environment.production_costs + self.enterprise.production_costs
  231 + self.profile.environment.production_costs + self.profile.production_costs
227 232 end
228 233  
229 234 include Rails.application.routes.url_helpers
230 235 def price_composition_bar_display_url
231   - url_for({:host => enterprise.default_hostname, :controller => 'manage_products', :action => 'display_price_composition_bar', :profile => enterprise.identifier, :id => self.id }.merge(Noosfero.url_options))
  236 + url_for({:host => self.profile.default_hostname, :controller => 'manage_products', :action => 'display_price_composition_bar', :profile => self.profile.identifier, :id => self.id }.merge(Noosfero.url_options))
232 237 end
233 238  
234 239 def inputs_cost_update_url
235   - url_for({:host => enterprise.default_hostname, :controller => 'manage_products', :action => 'display_inputs_cost', :profile => enterprise.identifier, :id => self.id }.merge(Noosfero.url_options))
  240 + url_for({:host => self.profile.default_hostname, :controller => 'manage_products', :action => 'display_inputs_cost', :profile => self.profile.identifier, :id => self.id }.merge(Noosfero.url_options))
236 241 end
237 242  
238 243 def percentage_from_solidarity_economy
... ... @@ -249,7 +254,7 @@ class Product < ActiveRecord::Base
249 254 end
250 255 end
251 256  
252   - delegate :enabled, :region, :region_id, :environment, :environment_id, :to => :enterprise
  257 + delegate :enabled, :region, :region_id, :environment, :environment_id, :to => :profile, allow_nil: true
253 258  
254 259 protected
255 260  
... ... @@ -257,4 +262,13 @@ class Product < ActiveRecord::Base
257 262 true
258 263 end
259 264  
  265 + def is_trackable?
  266 + # shopping_cart create products without profile
  267 + self.profile.present?
  268 + end
  269 +
  270 + def action_tracker_user
  271 + self.profile
  272 + end
  273 +
260 274 end
... ...
app/views/profile/_create_product.html.erb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<div class='profile-activity-image'>
  2 + <%= link_to image_tag(activity.target.default_image :minor), activity.target.url, class: 'product-pic' if activity.target.present? %>
  3 +</div>
  4 +<div class='profile-activity-description'>
  5 + <p class='profile-activity-text'><%= link_to activity.user.short_name(nil), activity.user.url %> <%= describe activity %></p>
  6 + <p class='profile-activity-time'><%= time_ago_as_sentence activity.created_at %></p>
  7 +
  8 + <div class='profile-wall-actions'>
  9 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %>
  10 + </div>
  11 +</div>
  12 +
  13 +<div style="clear: both"></div>
... ...
app/views/profile/_remove_product.html.erb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +<div class='profile-activity-image'>
  2 +</div>
  3 +<div class='profile-activity-description'>
  4 + <p class='profile-activity-text'><%= link_to activity.user.short_name(nil), activity.user.url %> <%= describe activity %></p>
  5 + <p class='profile-activity-time'><%= time_ago_as_sentence activity.created_at %></p>
  6 +
  7 + <div class='profile-wall-actions'>
  8 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %>
  9 + </div>
  10 +</div>
  11 +
  12 +<div style="clear: both"></div>
... ...
app/views/profile/_update_product.html.erb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<div class='profile-activity-image'>
  2 + <%= link_to image_tag(activity.target.default_image :minor), activity.target.url, class: 'product-pic' if activity.target.present? %>
  3 +</div>
  4 +<div class='profile-activity-description'>
  5 + <p class='profile-activity-text'><%= link_to activity.user.short_name(nil), activity.user.url %> <%= describe activity %></p>
  6 + <p class='profile-activity-time'><%= time_ago_as_sentence activity.created_at %></p>
  7 +
  8 + <div class='profile-wall-actions'>
  9 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %>
  10 + </div>
  11 +</div>
  12 +
  13 +<div style="clear: both"></div>
... ...
config/initializers/action_tracker.rb
... ... @@ -30,6 +30,16 @@ ActionTrackerConfig.verbs = {
30 30  
31 31 reply_scrap_on_self: {
32 32 },
  33 +
  34 + create_product: {
  35 + },
  36 +
  37 + update_product: {
  38 + },
  39 +
  40 + remove_product: {
  41 + },
  42 +
33 43 }
34 44  
35 45 ActionTrackerConfig.current_user = proc do
... ...
lib/notify_activity_to_profiles_job.rb
... ... @@ -22,6 +22,12 @@ class NotifyActivityToProfilesJob &lt; Struct.new(:tracked_action_id)
22 22 # Notify all friends
23 23 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})")
24 24  
  25 + if tracked_action.user.is_a? Organization
  26 + ActionTrackerNotification.connection.execute "insert into action_tracker_notifications(profile_id, action_tracker_id) " +
  27 + "select distinct accessor_id, #{tracked_action.id} from role_assignments where resource_id = #{tracked_action.user.id} and resource_type='Profile' " +
  28 + if tracked_action.user.is_a? Enterprise then "union select distinct person_id, #{tracked_action.id} from favorite_enteprises_people where enterprise_id = #{tracked_action.user.id}" else "" end
  29 + end
  30 +
25 31 if target.is_a?(Community)
26 32 ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
27 33  
... ...
plugins/bsc/lib/bsc_plugin/ext/product.rb
... ... @@ -12,4 +12,14 @@ class Product
12 12 def display_supplier_on_search?
13 13 false
14 14 end
  15 +
  16 + def action_tracker_user
  17 + return self.enterprise if self.enterprise.validated
  18 +
  19 + if self.enterprise.bsc
  20 + self.enterprise.bsc
  21 + else
  22 + self.enterprise
  23 + end
  24 + end
15 25 end
... ...
test/unit/product_test.rb
... ... @@ -117,7 +117,7 @@ class ProductTest &lt; ActiveSupport::TestCase
117 117 enterprise.expects(:public_profile_url).returns({})
118 118  
119 119 product.expects(:id).returns(999)
120   - product.expects(:enterprise).returns(enterprise)
  120 + product.expects(:profile).returns(enterprise)
121 121 assert_equal({:controller => 'manage_products', :action => 'show', :id => 999}, product.url)
122 122 end
123 123  
... ...