Commit ab8d14e6e0d82d9523a95fc6e654ebd2337b6477
Exists in
master
and in
29 other branches
Merge branch 'products-activities' into 'master'
Add products activities on wall Depends !473 See merge request !474
Showing
11 changed files
with
123 additions
and
15 deletions
Show diff stats
app/helpers/action_tracker_helper.rb
| @@ -67,4 +67,22 @@ module ActionTrackerHelper | @@ -67,4 +67,22 @@ module ActionTrackerHelper | ||
| 67 | } | 67 | } |
| 68 | end | 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 | end | 88 | end |
app/models/enterprise.rb
| @@ -15,7 +15,10 @@ class Enterprise < Organization | @@ -15,7 +15,10 @@ class Enterprise < Organization | ||
| 15 | 15 | ||
| 16 | N_('Enterprise') | 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 | has_many :inputs, :through => :products | 22 | has_many :inputs, :through => :products |
| 20 | has_many :production_costs, :as => :owner | 23 | has_many :production_costs, :as => :owner |
| 21 | 24 | ||
| @@ -202,4 +205,9 @@ class Enterprise < Organization | @@ -202,4 +205,9 @@ class Enterprise < Organization | ||
| 202 | '' | 205 | '' |
| 203 | end | 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 | end | 213 | end |
app/models/organization.rb
| @@ -35,6 +35,10 @@ class Organization < Profile | @@ -35,6 +35,10 @@ class Organization < Profile | ||
| 35 | 35 | ||
| 36 | validate :presence_of_required_fieds, :unless => :is_template | 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 | def presence_of_required_fieds | 42 | def presence_of_required_fieds |
| 39 | self.required_fields.each do |field| | 43 | self.required_fields.each do |field| |
| 40 | if self.send(field).blank? | 44 | if self.send(field).blank? |
app/models/product.rb
| @@ -17,13 +17,14 @@ class Product < ActiveRecord::Base | @@ -17,13 +17,14 @@ class Product < ActiveRecord::Base | ||
| 17 | 'full' | 17 | 'full' |
| 18 | end | 18 | end |
| 19 | 19 | ||
| 20 | - belongs_to :enterprise, :foreign_key => :profile_id, :class_name => 'Profile' | ||
| 21 | belongs_to :profile | 20 | belongs_to :profile |
| 21 | + # backwards compatibility | ||
| 22 | + belongs_to :enterprise, :foreign_key => :profile_id, :class_name => 'Profile' | ||
| 22 | alias_method :enterprise=, :profile= | 23 | alias_method :enterprise=, :profile= |
| 23 | alias_method :enterprise, :profile | 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 | belongs_to :product_category | 29 | belongs_to :product_category |
| 29 | 30 | ||
| @@ -37,6 +38,10 @@ class Product < ActiveRecord::Base | @@ -37,6 +38,10 @@ class Product < ActiveRecord::Base | ||
| 37 | 38 | ||
| 38 | acts_as_having_settings :field => :data | 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 | validates_uniqueness_of :name, :scope => :profile_id, :allow_nil => true, :if => :validate_uniqueness_of_column_name? | 45 | validates_uniqueness_of :name, :scope => :profile_id, :allow_nil => true, :if => :validate_uniqueness_of_column_name? |
| 41 | 46 | ||
| 42 | validates_presence_of :product_category_id | 47 | validates_presence_of :product_category_id |
| @@ -54,10 +59,10 @@ class Product < ActiveRecord::Base | @@ -54,10 +59,10 @@ class Product < ActiveRecord::Base | ||
| 54 | after_update :save_image | 59 | after_update :save_image |
| 55 | 60 | ||
| 56 | def lat | 61 | def lat |
| 57 | - self.enterprise.lat | 62 | + self.profile.lat |
| 58 | end | 63 | end |
| 59 | def lng | 64 | def lng |
| 60 | - self.enterprise.lng | 65 | + self.profile.lng |
| 61 | end | 66 | end |
| 62 | 67 | ||
| 63 | xss_terminate :only => [ :name ], :on => 'validation' | 68 | xss_terminate :only => [ :name ], :on => 'validation' |
| @@ -71,7 +76,7 @@ class Product < ActiveRecord::Base | @@ -71,7 +76,7 @@ class Product < ActiveRecord::Base | ||
| 71 | filter_iframes :description | 76 | filter_iframes :description |
| 72 | 77 | ||
| 73 | def iframe_whitelist | 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 | end | 80 | end |
| 76 | 81 | ||
| 77 | def name | 82 | def name |
| @@ -109,16 +114,16 @@ class Product < ActiveRecord::Base | @@ -109,16 +114,16 @@ class Product < ActiveRecord::Base | ||
| 109 | end | 114 | end |
| 110 | 115 | ||
| 111 | def url | 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 | end | 118 | end |
| 114 | 119 | ||
| 115 | def public? | 120 | def public? |
| 116 | - enterprise.public? | 121 | + self.profile.public? |
| 117 | end | 122 | end |
| 118 | 123 | ||
| 119 | def formatted_value(method) | 124 | def formatted_value(method) |
| 120 | value = self[method] || self.send(method) | 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 | end | 127 | end |
| 123 | 128 | ||
| 124 | def price_with_discount | 129 | def price_with_discount |
| @@ -223,16 +228,16 @@ class Product < ActiveRecord::Base | @@ -223,16 +228,16 @@ class Product < ActiveRecord::Base | ||
| 223 | end | 228 | end |
| 224 | 229 | ||
| 225 | def available_production_costs | 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 | end | 232 | end |
| 228 | 233 | ||
| 229 | include Rails.application.routes.url_helpers | 234 | include Rails.application.routes.url_helpers |
| 230 | def price_composition_bar_display_url | 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 | end | 237 | end |
| 233 | 238 | ||
| 234 | def inputs_cost_update_url | 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 | end | 241 | end |
| 237 | 242 | ||
| 238 | def percentage_from_solidarity_economy | 243 | def percentage_from_solidarity_economy |
| @@ -249,7 +254,7 @@ class Product < ActiveRecord::Base | @@ -249,7 +254,7 @@ class Product < ActiveRecord::Base | ||
| 249 | end | 254 | end |
| 250 | end | 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 | protected | 259 | protected |
| 255 | 260 | ||
| @@ -257,4 +262,13 @@ class Product < ActiveRecord::Base | @@ -257,4 +262,13 @@ class Product < ActiveRecord::Base | ||
| 257 | true | 262 | true |
| 258 | end | 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 | end | 274 | end |
| @@ -0,0 +1,13 @@ | @@ -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> |
| @@ -0,0 +1,12 @@ | @@ -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> |
| @@ -0,0 +1,13 @@ | @@ -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,6 +30,16 @@ ActionTrackerConfig.verbs = { | ||
| 30 | 30 | ||
| 31 | reply_scrap_on_self: { | 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 | ActionTrackerConfig.current_user = proc do | 45 | ActionTrackerConfig.current_user = proc do |
lib/notify_activity_to_profiles_job.rb
| @@ -22,6 +22,12 @@ class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id) | @@ -22,6 +22,12 @@ class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id) | ||
| 22 | # Notify all friends | 22 | # Notify all friends |
| 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})") | 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 | if target.is_a?(Community) | 31 | if target.is_a?(Community) |
| 26 | ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb) | 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,4 +12,14 @@ class Product | ||
| 12 | def display_supplier_on_search? | 12 | def display_supplier_on_search? |
| 13 | false | 13 | false |
| 14 | end | 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 | end | 25 | end |
test/unit/product_test.rb
| @@ -117,7 +117,7 @@ class ProductTest < ActiveSupport::TestCase | @@ -117,7 +117,7 @@ class ProductTest < ActiveSupport::TestCase | ||
| 117 | enterprise.expects(:public_profile_url).returns({}) | 117 | enterprise.expects(:public_profile_url).returns({}) |
| 118 | 118 | ||
| 119 | product.expects(:id).returns(999) | 119 | product.expects(:id).returns(999) |
| 120 | - product.expects(:enterprise).returns(enterprise) | 120 | + product.expects(:profile).returns(enterprise) |
| 121 | assert_equal({:controller => 'manage_products', :action => 'show', :id => 999}, product.url) | 121 | assert_equal({:controller => 'manage_products', :action => 'show', :id => 999}, product.url) |
| 122 | end | 122 | end |
| 123 | 123 |