mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-04-09 07:56:58 +00:00
Merge pull request #5030 from Matt-Yorkley/reports-loading
Improve reports performance
This commit is contained in:
@@ -36,6 +36,10 @@ Spree::LineItem.class_eval do
|
||||
end
|
||||
}
|
||||
|
||||
scope :in_orders, lambda { |orders|
|
||||
where(order_id: orders)
|
||||
}
|
||||
|
||||
# Find line items that are from order sorted by variant name and unit value
|
||||
scope :sorted_by_name_and_unit_value, -> {
|
||||
joins(variant: :product).
|
||||
|
||||
@@ -2,24 +2,28 @@ require 'open_food_network/permissions'
|
||||
|
||||
module Permissions
|
||||
class Order
|
||||
def initialize(user)
|
||||
def initialize(user, search_params = nil)
|
||||
@user = user
|
||||
@permissions = OpenFoodNetwork::Permissions.new(@user)
|
||||
@search_params = search_params
|
||||
end
|
||||
|
||||
# Find orders that the user can see
|
||||
def visible_orders
|
||||
Spree::Order.
|
||||
orders = Spree::Order.
|
||||
with_line_items_variants_and_products_outer.
|
||||
where(visible_orders_where_values)
|
||||
|
||||
filtered_orders(orders)
|
||||
end
|
||||
|
||||
# Any orders that the user can edit
|
||||
def editable_orders
|
||||
Spree::Order.where(
|
||||
managed_orders_where_values.
|
||||
or(coordinated_orders_where_values)
|
||||
)
|
||||
orders = Spree::Order.
|
||||
where(managed_orders_where_values.
|
||||
or(coordinated_orders_where_values))
|
||||
|
||||
filtered_orders(orders)
|
||||
end
|
||||
|
||||
def visible_line_items
|
||||
@@ -35,6 +39,18 @@ module Permissions
|
||||
|
||||
private
|
||||
|
||||
attr_reader :search_params
|
||||
|
||||
def filtered_orders(orders)
|
||||
return orders unless filter_orders?
|
||||
|
||||
orders.complete.not_state(:canceled).search(search_params).result
|
||||
end
|
||||
|
||||
def filter_orders?
|
||||
search_params.present?
|
||||
end
|
||||
|
||||
def visible_orders_where_values
|
||||
# Grouping keeps the 2 where clauses from produced_orders_where_values inside parentheses
|
||||
# This way it makes the OR work between the 3 types of orders:
|
||||
|
||||
@@ -128,7 +128,7 @@ module OpenFoodNetwork
|
||||
|
||||
def order_permissions
|
||||
return @order_permissions unless @order_permissions.nil?
|
||||
@order_permissions = ::Permissions::Order.new(@user)
|
||||
@order_permissions = ::Permissions::Order.new(@user, @params[:q])
|
||||
end
|
||||
|
||||
def report_line_items
|
||||
|
||||
@@ -5,7 +5,7 @@ module OpenFoodNetwork
|
||||
@user = user
|
||||
@render_table = render_table
|
||||
|
||||
@permissions = ::Permissions::Order.new(user)
|
||||
@permissions = ::Permissions::Order.new(user, @params[:q])
|
||||
end
|
||||
|
||||
def header
|
||||
|
||||
@@ -83,7 +83,7 @@ module OpenFoodNetwork
|
||||
|
||||
def order_permissions
|
||||
return @order_permissions unless @order_permissions.nil?
|
||||
@order_permissions = ::Permissions::Order.new(@user)
|
||||
@order_permissions = ::Permissions::Order.new(@user, options[:q])
|
||||
end
|
||||
|
||||
def report_line_items
|
||||
|
||||
@@ -128,7 +128,7 @@ module OpenFoodNetwork
|
||||
|
||||
def order_permissions
|
||||
return @order_permissions unless @order_permissions.nil?
|
||||
@order_permissions = ::Permissions::Order.new(@user)
|
||||
@order_permissions = ::Permissions::Order.new(@user, @params[:q])
|
||||
end
|
||||
|
||||
def is_temperature_controlled?(line_item)
|
||||
|
||||
@@ -12,9 +12,7 @@ module OpenFoodNetwork
|
||||
end
|
||||
|
||||
def list(line_item_includes = nil)
|
||||
line_items = @order_permissions.
|
||||
visible_line_items.
|
||||
merge(Spree::LineItem.where(order_id: orders.result))
|
||||
line_items = @order_permissions.visible_line_items.in_orders(orders.result)
|
||||
|
||||
if @params[:supplier_id_in].present?
|
||||
line_items = line_items.supplied_by_any(@params[:supplier_id_in])
|
||||
|
||||
@@ -5,14 +5,21 @@ module Permissions
|
||||
let(:user) { double(:user) }
|
||||
let(:permissions) { Permissions::Order.new(user) }
|
||||
let!(:basic_permissions) { OpenFoodNetwork::Permissions.new(user) }
|
||||
let(:distributor) { create(:distributor_enterprise) }
|
||||
let(:coordinator) { create(:distributor_enterprise) }
|
||||
let(:order_cycle) { create(:simple_order_cycle, coordinator: coordinator, distributors: [distributor]) }
|
||||
let(:order_completed) { create(:completed_order_with_totals, order_cycle: order_cycle, distributor: distributor ) }
|
||||
let(:order_cancelled) { create(:order, order_cycle: order_cycle, distributor: distributor, state: 'canceled' ) }
|
||||
let(:order_cart) { create(:order, order_cycle: order_cycle, distributor: distributor, state: 'cart' ) }
|
||||
let(:order_from_last_year) {
|
||||
create(:completed_order_with_totals, order_cycle: order_cycle, distributor: distributor,
|
||||
completed_at: Time.zone.now - 1.year)
|
||||
}
|
||||
|
||||
before { allow(OpenFoodNetwork::Permissions).to receive(:new) { basic_permissions } }
|
||||
|
||||
describe "finding orders that are visible in reports" do
|
||||
let(:distributor) { create(:distributor_enterprise) }
|
||||
let(:coordinator) { create(:distributor_enterprise) }
|
||||
let(:random_enterprise) { create(:distributor_enterprise) }
|
||||
let(:order_cycle) { create(:simple_order_cycle, coordinator: coordinator, distributors: [distributor]) }
|
||||
let(:order) { create(:order, order_cycle: order_cycle, distributor: distributor ) }
|
||||
let!(:line_item) { create(:line_item, order: order) }
|
||||
let!(:producer) { create(:supplier_enterprise) }
|
||||
@@ -64,6 +71,18 @@ module Permissions
|
||||
expect(permissions.visible_orders).to_not include order
|
||||
end
|
||||
end
|
||||
|
||||
context "with search params" do
|
||||
let(:search_params) { { completed_at_gt: Time.zone.now.yesterday.strftime('%Y-%m-%d') } }
|
||||
let(:permissions) { Permissions::Order.new(user, search_params) }
|
||||
|
||||
it "only returns completed, non-cancelled orders within search filter range" do
|
||||
expect(permissions.visible_orders).to include order_completed
|
||||
expect(permissions.visible_orders).to_not include order_cancelled
|
||||
expect(permissions.visible_orders).to_not include order_cart
|
||||
expect(permissions.visible_orders).to_not include order_from_last_year
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "as an enterprise that is a distributor in the order cycle, but not the distributor of the order" do
|
||||
@@ -78,10 +97,7 @@ module Permissions
|
||||
end
|
||||
|
||||
describe "finding line items that are visible in reports" do
|
||||
let(:distributor) { create(:distributor_enterprise) }
|
||||
let(:coordinator) { create(:distributor_enterprise) }
|
||||
let(:random_enterprise) { create(:distributor_enterprise) }
|
||||
let(:order_cycle) { create(:simple_order_cycle, coordinator: coordinator, distributors: [distributor]) }
|
||||
let(:order) { create(:order, order_cycle: order_cycle, distributor: distributor ) }
|
||||
let!(:line_item1) { create(:line_item, order: order) }
|
||||
let!(:line_item2) { create(:line_item, order: order) }
|
||||
@@ -137,6 +153,27 @@ module Permissions
|
||||
expect(permissions.visible_line_items).to_not include line_item1, line_item2
|
||||
end
|
||||
end
|
||||
|
||||
context "with search params" do
|
||||
let!(:line_item3) { create(:line_item, order: order_completed) }
|
||||
let!(:line_item4) { create(:line_item, order: order_cancelled) }
|
||||
let!(:line_item5) { create(:line_item, order: order_cart) }
|
||||
let!(:line_item6) { create(:line_item, order: order_from_last_year) }
|
||||
|
||||
let(:search_params) { { completed_at_gt: Time.zone.now.yesterday.strftime('%Y-%m-%d') } }
|
||||
let(:permissions) { Permissions::Order.new(user, search_params) }
|
||||
|
||||
before do
|
||||
allow(user).to receive(:has_spree_role?) { "admin" }
|
||||
end
|
||||
|
||||
it "only returns line items from completed, non-cancelled orders within search filter range" do
|
||||
expect(permissions.visible_line_items).to include order_completed.line_items.first
|
||||
expect(permissions.visible_line_items).to_not include order_cancelled.line_items.first
|
||||
expect(permissions.visible_line_items).to_not include order_cart.line_items.first
|
||||
expect(permissions.visible_line_items).to_not include order_from_last_year.line_items.first
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user