mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Remove callbacks in Adjustment that call order.update!
This commit is contained in:
@@ -4,29 +4,23 @@ class CartController < BaseController
|
||||
def populate
|
||||
order = current_order(true)
|
||||
|
||||
# Without intervention, the Spree::Adjustment#update_adjustable callback is called many times
|
||||
# during cart population, for both taxation and enterprise fees. This operation triggers a
|
||||
# costly Spree::Order#update!, which only needs to be run once. We avoid this by disabling
|
||||
# callbacks on Spree::Adjustment and then manually invoke Spree::Order#update! on success.
|
||||
Spree::Adjustment.without_callbacks do
|
||||
cart_service = CartService.new(order)
|
||||
cart_service = CartService.new(order)
|
||||
|
||||
cart_service.populate(params.slice(:variants, :quantity), true)
|
||||
if cart_service.valid?
|
||||
order.recreate_all_fees!
|
||||
order.cap_quantity_at_stock!
|
||||
order.update!
|
||||
cart_service.populate(params.slice(:variants, :quantity), true)
|
||||
if cart_service.valid?
|
||||
order.cap_quantity_at_stock!
|
||||
order.recreate_all_fees!
|
||||
|
||||
variant_ids = variant_ids_in(cart_service.variants_h)
|
||||
variant_ids = variant_ids_in(cart_service.variants_h)
|
||||
|
||||
render json: { error: false,
|
||||
stock_levels: VariantsStockLevels.new.call(order, variant_ids) },
|
||||
status: :ok
|
||||
else
|
||||
render json: { error: cart_service.errors.full_messages.join(",") },
|
||||
status: :precondition_failed
|
||||
end
|
||||
render json: { error: false,
|
||||
stock_levels: VariantsStockLevels.new.call(order, variant_ids) },
|
||||
status: :ok
|
||||
else
|
||||
render json: { error: cart_service.errors.full_messages.join(",") },
|
||||
status: :precondition_failed
|
||||
end
|
||||
|
||||
populate_variant_attributes
|
||||
end
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@ module Spree
|
||||
|
||||
def update
|
||||
@order.recreate_all_fees!
|
||||
@order.update!
|
||||
|
||||
unless order_params.present? && @order.update(order_params) && @order.line_items.present?
|
||||
if @order.line_items.empty?
|
||||
|
||||
@@ -47,9 +47,6 @@ module Spree
|
||||
validates :label, presence: true
|
||||
validates :amount, numericality: true
|
||||
|
||||
after_save :update_adjustable
|
||||
after_destroy :update_adjustable
|
||||
|
||||
state_machine :state, initial: :open do
|
||||
event :close do
|
||||
transition from: :open, to: :closed
|
||||
@@ -144,29 +141,11 @@ module Spree
|
||||
included_tax.positive?
|
||||
end
|
||||
|
||||
def self.without_callbacks
|
||||
skip_callback :save, :after, :update_adjustable
|
||||
skip_callback :destroy, :after, :update_adjustable
|
||||
|
||||
result = yield
|
||||
ensure
|
||||
set_callback :save, :after, :update_adjustable
|
||||
set_callback :destroy, :after, :update_adjustable
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
# Allow accessing soft-deleted originator objects
|
||||
def originator
|
||||
return if originator_type.blank?
|
||||
|
||||
originator_type.constantize.unscoped { super }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_adjustable
|
||||
adjustable.update! if adjustable.is_a? Order
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -20,6 +20,8 @@ class OrderFeesHandler
|
||||
create_line_item_fees!
|
||||
create_order_fees!
|
||||
end
|
||||
|
||||
order.update!
|
||||
end
|
||||
|
||||
def create_line_item_fees!
|
||||
|
||||
@@ -78,7 +78,6 @@ describe Spree::Admin::OrdersController, type: :controller do
|
||||
order.line_items.last.update(variant_id: variant2.id)
|
||||
while !order.completed? do break unless order.next! end
|
||||
order.recreate_all_fees!
|
||||
order.update!
|
||||
order
|
||||
end
|
||||
|
||||
|
||||
@@ -313,7 +313,6 @@ describe Spree::OrdersController, type: :controller do
|
||||
order.reload.line_items.last.update(variant_id: variant2.id)
|
||||
while !order.completed? do break unless order.next! end
|
||||
order.recreate_all_fees!
|
||||
order.update!
|
||||
order
|
||||
end
|
||||
let(:params) {
|
||||
|
||||
@@ -63,18 +63,6 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
context "#save" do
|
||||
it "should call order#update!" do
|
||||
adjustment = Spree::Adjustment.new(
|
||||
adjustable: order,
|
||||
amount: 10,
|
||||
label: "Foo"
|
||||
)
|
||||
expect(order).to receive(:update!)
|
||||
adjustment.save
|
||||
end
|
||||
end
|
||||
|
||||
context "adjustment state" do
|
||||
let(:adjustment) { create(:adjustment, state: 'open') }
|
||||
|
||||
|
||||
@@ -525,6 +525,7 @@ describe Spree::Order do
|
||||
|
||||
before do
|
||||
allow(subject).to receive(:fee_handler) { fee_handler }
|
||||
allow(subject).to receive(:update!)
|
||||
end
|
||||
|
||||
it "clears all enterprise fee adjustments on the order" do
|
||||
|
||||
Reference in New Issue
Block a user