From 21c53e9a51b14cee68557aebf63ac85496b958ec Mon Sep 17 00:00:00 2001 From: Gustavo Camello Date: Thu, 12 Aug 2021 14:41:19 +0100 Subject: [PATCH 1/2] Add spree 4.0 support --- .../spree/checkout_controller_decorator.rb | 34 +++++++--- .../spree/home_controller_decorator.rb | 14 +++- .../spree/orders_controller_decorator.rb | 18 ++++-- .../spree/products_controller_decorator.rb | 14 +++- .../spree/taxons_controller_decorator.rb | 14 +++- .../spree/order_contents_decorator.rb | 64 ------------------- app/models/spree/cart_event.rb | 2 - app/trackers/spree/cart/event/tracker.rb | 23 +------ .../install/install_generator.rb | 4 +- spree_events_tracker.gemspec | 2 +- 10 files changed, 75 insertions(+), 114 deletions(-) delete mode 100644 app/models/concerns/spree/order_contents_decorator.rb diff --git a/app/controllers/spree/checkout_controller_decorator.rb b/app/controllers/spree/checkout_controller_decorator.rb index 407873e..39b0c52 100644 --- a/app/controllers/spree/checkout_controller_decorator.rb +++ b/app/controllers/spree/checkout_controller_decorator.rb @@ -1,17 +1,27 @@ -Spree::CheckoutController.class_eval do - - include Spree::CheckoutEventTracker - - after_action :track_order_state_change, only: :edit - after_action :track_order_completion, only: :update, if: :confirm? +module Spree + module CheckoutControllerDecorator + def self.prepended(base) + base.include Spree::CheckoutEventTracker + base.after_action :track_order_state_change, only: :edit + base.after_action :track_order_completion, only: :update, if: :confirm? + end - private + private def confirm? - previous_state == 'confirm' + previous_state == 'payment' || 'confirm' end def track_order_completion - track_activity(activity: :complete_order, previous_state: previous_state, next_state: 'complete') + activity = '' + state = '' + if @order.payment_state == 'paid' + activity = :complete_order + state = :complete + elsif @order.payment_state == 'failed' + activity = :failed + state = :payment + end + track_activity(activity: activity, previous_state: previous_state, next_state: state) end def track_order_state_change @@ -19,4 +29,10 @@ def track_order_state_change track_activity(activity: :change_order_state, previous_state: previous_state, next_state: next_state) end end + + end +end + +if ::Spree::CheckoutController.included_modules.exclude?(Spree::CheckoutControllerDecorator) + ::Spree::CheckoutController.prepend Spree::CheckoutControllerDecorator end diff --git a/app/controllers/spree/home_controller_decorator.rb b/app/controllers/spree/home_controller_decorator.rb index fba2002..22d5b81 100644 --- a/app/controllers/spree/home_controller_decorator.rb +++ b/app/controllers/spree/home_controller_decorator.rb @@ -1,4 +1,12 @@ -Spree::HomeController.class_eval do - include Spree::PageTracker - track_actions [:index] +module Spree + module HomeControllerDecorator + def self.prepended(base) + base.include Spree::PageTracker + base.track_actions[:index] + end + end +end + +if ::Spree::HomeController.included_modules.exclude?(Spree::HomeControllerDecorator) + ::Spree::HomeController.prepend Spree::HomeControllerDecorator end diff --git a/app/controllers/spree/orders_controller_decorator.rb b/app/controllers/spree/orders_controller_decorator.rb index 18eeb00..ac4a1a0 100644 --- a/app/controllers/spree/orders_controller_decorator.rb +++ b/app/controllers/spree/orders_controller_decorator.rb @@ -1,11 +1,14 @@ -Spree::OrdersController.class_eval do +module Spree + module OrdersControllerDecorator + def self.prepended(base) + base.include Spree::CheckoutEventTracker - include Spree::CheckoutEventTracker + base.after_action :track_return_to_cart, only: :edit, if: :current_order + base.after_action :track_empty_cart_activity, only: :empty + end - after_action :track_return_to_cart, only: :edit, if: :current_order - after_action :track_empty_cart_activity, only: :empty + private - private def track_empty_cart_activity track_activity(activity: :empty_cart, previous_state: previous_state, next_state: nil) end @@ -28,5 +31,10 @@ def current_order_includes_previous_state? def referred_from_any_checkout_step? current_order_includes_previous_state? || previous_state.eql?('cart') end + + end +end +if ::Spree::OrdersController.included_modules.exclude?(Spree::OrdersControllerDecorator) + ::Spree::OrdersController.prepend Spree::OrdersControllerDecorator end diff --git a/app/controllers/spree/products_controller_decorator.rb b/app/controllers/spree/products_controller_decorator.rb index 08c86b2..291ec79 100644 --- a/app/controllers/spree/products_controller_decorator.rb +++ b/app/controllers/spree/products_controller_decorator.rb @@ -1,4 +1,12 @@ -Spree::ProductsController.class_eval do - include Spree::PageTracker - track_actions [:show, :index] +module Spree + module ProductsControllerDecorator + def self.prepended(base) + base.include Spree::PageTracker + base.track_actions [:show, :index] + end + end +end + +if ::Spree::ProductsController.included_modules.exclude?(Spree::ProductsControllerDecorator) + ::Spree::ProductsController.prepend Spree::ProductsControllerDecorator end diff --git a/app/controllers/spree/taxons_controller_decorator.rb b/app/controllers/spree/taxons_controller_decorator.rb index 71cb623..e8bf336 100644 --- a/app/controllers/spree/taxons_controller_decorator.rb +++ b/app/controllers/spree/taxons_controller_decorator.rb @@ -1,4 +1,12 @@ -Spree::TaxonsController.class_eval do - include Spree::PageTracker - track_actions [:show] +module Spree + module TaxonsControllerDecorator + def self.prepended(base) + base.include Spree::PageTracker + base.track_actions [:show] + end + end +end + +if ::Spree::TaxonsController.included_modules.exclude?(Spree::TaxonsControllerDecorator) + ::Spree::TaxonsController.prepend Spree::TaxonsControllerDecorator end diff --git a/app/models/concerns/spree/order_contents_decorator.rb b/app/models/concerns/spree/order_contents_decorator.rb deleted file mode 100644 index a71d8f4..0000000 --- a/app/models/concerns/spree/order_contents_decorator.rb +++ /dev/null @@ -1,64 +0,0 @@ -module Spree - module OrderContentsWithTracker - - # Override: since order's line_items were overridden - def update_cart(params) - if order.update_attributes(filter_order_items(params)) - order.line_items.each do |line_item| - if line_item.previous_changes.keys.include?('quantity') - Spree::Cart::Event::Tracker.new( - actor: order, target: line_item, total: order.total, variant_id: line_item.variant_id - ).track - end - end - # line_items which have 0 quantity will be lost and couldn't be tracked - # so tracking is done before the execution of next statement - order.line_items = order.line_items.select { |li| li.quantity > 0 } - persist_totals - PromotionHandler::Cart.new(order).activate - order.ensure_updated_shipments - persist_totals - true - else - false - end - end - - def remove_line_item(line_item, options = {}) - # In Cart Event Tracker, we use DirtyObject's previous_changes method. - # Following statement handles the case, when we delete a line_item from order's cart page (from back_end) - line_item.update(quantity: 0) - super - end - - def remove_from_line_item(variant, quantity, options = {}) - line_item = grab_line_item_by_variant(variant, true, options) - line_item.quantity -= quantity - line_item.target_shipment= options[:shipment] - - if line_item.quantity.zero? - # In Cart Event Tracker, we use DirtyObject's previous_changes method. - # Following statement handles the case, when we delete a line_item from order's shipments page (from back_end) - line_item.update(quantity: 0) - order.line_items.destroy(line_item) - else - line_item.save! - end - - line_item - end - - private - - # Override: Add tracking entry after a line_item is added or removed - def after_add_or_remove(line_item, options = {}) - line_item = super - Spree::Cart::Event::Tracker.new( - actor: order, target: line_item, total: order.total, variant_id: line_item.variant_id - ).track - line_item - end - end -end - -Spree::OrderContents.send(:prepend, Spree::OrderContentsWithTracker) diff --git a/app/models/spree/cart_event.rb b/app/models/spree/cart_event.rb index e5365d4..0ae2b30 100644 --- a/app/models/spree/cart_event.rb +++ b/app/models/spree/cart_event.rb @@ -15,8 +15,6 @@ class CartEvent < Spree::Base :total, :variant, presence: true - - scope :added, -> { where(activity: 'add') } scope :removed, -> { where(activity: 'remove') } scope :updated, -> { where(activity: 'update') } diff --git a/app/trackers/spree/cart/event/tracker.rb b/app/trackers/spree/cart/event/tracker.rb index 1505934..9ecf398 100644 --- a/app/trackers/spree/cart/event/tracker.rb +++ b/app/trackers/spree/cart/event/tracker.rb @@ -10,34 +10,13 @@ def initialize(arguments = {}) @quantity = arguments[:quantity] @total = arguments[:total] @variant_id = arguments[:variant_id] + @activity = arguments[:activity] end def track - changed_quantity = changed_quantity(target.previous_changes[:quantity].map(&:to_i)) - self.activity = activity(changed_quantity, target) - self.quantity = changed_quantity CartEvent.create(instance_values) end - private - # 1. ADD EVENT: When a new product is added to cart - # so the changed quantity will be equal to line_item.quantity - # 2. REMOVE EVENT: When a product is removed from cart, - # change in quantity will be negative and line_items quantity will be zero - # 3. UPDATE EVENT: When product's quantity is changed from the cart and it shouldn't be removed - def activity(changed_quantity, line_item) - if (changed_quantity > 0 && changed_quantity == line_item.quantity) - :add - elsif (changed_quantity < 0 && line_item.quantity == 0) - :remove - elsif changed_quantity - :update - end - end - - def changed_quantity(previous_quantity_changes) - previous_quantity_changes.last - previous_quantity_changes.first - end end end end diff --git a/lib/generators/spree_events_tracker/install/install_generator.rb b/lib/generators/spree_events_tracker/install/install_generator.rb index b7129ad..792518b 100644 --- a/lib/generators/spree_events_tracker/install/install_generator.rb +++ b/lib/generators/spree_events_tracker/install/install_generator.rb @@ -10,8 +10,8 @@ def add_javascripts end def add_stylesheets - inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_events_tracker\n", :before => /\*\//, :verbose => true - inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_events_tracker\n", :before => /\*\//, :verbose => true + inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.scss', " *= require spree/frontend/spree_events_tracker\n", :before => /\*\//, :verbose => true + inject_into_file 'vendor/assets/stylesheets/spree/backend/all.scss', " *= require spree/backend/spree_events_tracker\n", :before => /\*\//, :verbose => true end def add_migrations diff --git a/spree_events_tracker.gemspec b/spree_events_tracker.gemspec index e3b4373..4c73410 100644 --- a/spree_events_tracker.gemspec +++ b/spree_events_tracker.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| s.require_path = 'lib' s.requirements << 'none' - spree_version = '>= 3.2.0', '< 4.0' + spree_version = '>= 3.2.0', '< 4.3.0' s.add_dependency 'spree_extension', '~> 0.0.5' s.add_dependency 'spree_core', spree_version From 431b207b2c9aeffb017036ab6f4766a26a9748b1 Mon Sep 17 00:00:00 2001 From: Felipe Zavan Date: Fri, 25 Nov 2022 16:17:27 +0000 Subject: [PATCH 2/2] Update spree_events_tracker.gemspec --- spree_events_tracker.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spree_events_tracker.gemspec b/spree_events_tracker.gemspec index 4c73410..4c916d6 100644 --- a/spree_events_tracker.gemspec +++ b/spree_events_tracker.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |s| s.require_path = 'lib' s.requirements << 'none' - spree_version = '>= 3.2.0', '< 4.3.0' + spree_version = '>= 3.2.0', '< 4.5.0' s.add_dependency 'spree_extension', '~> 0.0.5' s.add_dependency 'spree_core', spree_version