mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-27 06:05:19 +00:00
Ensure producer properties are included in properties results
This commit is contained in:
@@ -57,7 +57,7 @@ Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, Ord
|
||||
page: page || $scope.page,
|
||||
per_page: $scope.per_page,
|
||||
'q[name_or_meta_keywords_or_supplier_name_cont]': $scope.query,
|
||||
'q[properties_id_in_any][]': $scope.activeProperties,
|
||||
'q[properties_id_or_supplier_properties_id_in_any][]': $scope.activeProperties,
|
||||
'q[primary_taxon_id_in_any][]': $scope.activeTaxons
|
||||
}
|
||||
|
||||
|
||||
@@ -21,25 +21,38 @@ module Api
|
||||
def taxons
|
||||
taxons = Spree::Taxon.
|
||||
joins(:products).
|
||||
where(spree_products: { id: distributed_products(distributor, order_cycle, customer) }).
|
||||
where(spree_products: { id: distributed_products }).
|
||||
select('DISTINCT spree_taxons.*')
|
||||
|
||||
render json: ActiveModel::ArraySerializer.new(taxons, each_serializer: Api::TaxonSerializer)
|
||||
end
|
||||
|
||||
def properties
|
||||
properties = Spree::Property.
|
||||
joins(:products).
|
||||
where(spree_products: { id: distributed_products(distributor, order_cycle, customer) }).
|
||||
select('DISTINCT spree_properties.*')
|
||||
|
||||
render json: ActiveModel::ArraySerializer.new(
|
||||
properties, each_serializer: Api::PropertySerializer
|
||||
product_properties | producer_properties, each_serializer: Api::PropertySerializer
|
||||
)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def product_properties
|
||||
Spree::Property.
|
||||
joins(:products).
|
||||
where(spree_products: { id: distributed_products }).
|
||||
select('DISTINCT spree_properties.*')
|
||||
end
|
||||
|
||||
def producer_properties
|
||||
producers = Enterprise.
|
||||
joins(:supplied_products).
|
||||
where(spree_products: { id: distributed_products })
|
||||
|
||||
Spree::Property.
|
||||
joins(:producer_properties).
|
||||
where(producer_properties: { producer_id: producers }).
|
||||
select('DISTINCT spree_properties.*')
|
||||
end
|
||||
|
||||
def search_params
|
||||
permitted_search_params = params.slice :q, :page, :per_page
|
||||
|
||||
@@ -52,7 +65,7 @@ module Api
|
||||
|
||||
def permitted_ransack_params
|
||||
[:name_or_meta_keywords_or_supplier_name_cont,
|
||||
:properties_id_in_any,
|
||||
:properties_id_or_supplier_properties_id_in_any,
|
||||
:primary_taxon_id_in_any]
|
||||
end
|
||||
|
||||
@@ -68,7 +81,7 @@ module Api
|
||||
@current_api_user.andand.customer_of(distributor) || nil
|
||||
end
|
||||
|
||||
def distributed_products(distributor, order_cycle, customer)
|
||||
def distributed_products
|
||||
OrderCycleDistributedProducts.new(distributor, order_cycle, customer).products_relation
|
||||
end
|
||||
end
|
||||
|
||||
@@ -63,7 +63,7 @@ module Api
|
||||
context "with property filters" do
|
||||
it "filters by product property" do
|
||||
api_get :products, id: order_cycle.id, distributor: distributor.id,
|
||||
q: { properties_id_in_any: [property1.id, property2.id] }
|
||||
q: { properties_id_or_supplier_properties_id_in_any: [property1.id, property2.id] }
|
||||
|
||||
expect(product_ids).to include product1.id, product2.id
|
||||
expect(product_ids).to_not include product3.id
|
||||
@@ -168,6 +168,23 @@ module Api
|
||||
expect(json_response.length).to be 2
|
||||
expect(properties).to include property1.presentation, property2.presentation
|
||||
end
|
||||
|
||||
context "with producer properties" do
|
||||
let!(:property4) { create(:property) }
|
||||
let!(:producer_property) {
|
||||
create(:producer_property, producer_id: product1.supplier.id, property: property4)
|
||||
}
|
||||
|
||||
it "loads producer properties for distributed products in the order cycle" do
|
||||
api_get :properties, id: order_cycle.id, distributor: distributor.id
|
||||
|
||||
properties = json_response.map{ |property| property['name'] }
|
||||
|
||||
expect(json_response.length).to be 3
|
||||
expect(properties).to include property1.presentation, property2.presentation,
|
||||
producer_property.property.presentation
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
Reference in New Issue
Block a user