mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-22 00:57:26 +00:00
We configured Paperclip to convert images to JPG in some cases but I omitted that here because we don't need it. If an image is better represented as PNG or another format then the user should be able to choose that. Some specs were also testing the generated URL but the Active Storage URL doesn't contain a style name anymore and it's not helpful to test the URL.
148 lines
4.1 KiB
Ruby
148 lines
4.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Represents the properties of an Enterprise when viewing the details of listed shopfronts
|
|
module Api
|
|
class EnterpriseShopfrontSerializer < ActiveModel::Serializer
|
|
include SerializerHelper
|
|
|
|
attributes :name, :id, :description, :latitude, :longitude, :long_description, :website,
|
|
:instagram, :linkedin, :twitter, :facebook, :is_primary_producer, :is_distributor,
|
|
:phone, :visible, :email_address, :hash, :logo, :promo_image, :path, :category,
|
|
:active, :producers, :orders_close_at, :hubs, :taxons, :supplied_taxons, :pickup,
|
|
:delivery, :preferred_product_low_stock_display
|
|
|
|
has_one :address, serializer: Api::AddressSerializer
|
|
has_many :supplied_properties, serializer: Api::PropertySerializer
|
|
has_many :distributed_properties, serializer: Api::PropertySerializer
|
|
|
|
def orders_close_at
|
|
OrderCycle.with_distributor(enterprise).soonest_closing.first&.orders_close_at
|
|
end
|
|
|
|
def active
|
|
@active ||=
|
|
enterprise.ready_for_checkout? && OrderCycle.active.with_distributor(enterprise).exists?
|
|
end
|
|
|
|
def pickup
|
|
shipping_types? :pickup
|
|
end
|
|
|
|
def delivery
|
|
shipping_types? :delivery
|
|
end
|
|
|
|
def email_address
|
|
enterprise.email_address.to_s.reverse
|
|
end
|
|
|
|
def hash
|
|
enterprise.to_param
|
|
end
|
|
|
|
def logo
|
|
enterprise.logo_url(:medium)
|
|
end
|
|
|
|
def promo_image
|
|
enterprise.promo_image_url(:large)
|
|
end
|
|
|
|
def path
|
|
enterprise_shop_path(enterprise)
|
|
end
|
|
|
|
def producers
|
|
ActiveModel::ArraySerializer.new(
|
|
enterprise.plus_relatives_and_oc_producers(
|
|
OrderCycle.not_closed.with_distributor(enterprise)
|
|
),
|
|
each_serializer: Api::EnterpriseThinSerializer
|
|
)
|
|
end
|
|
|
|
def hubs
|
|
ActiveModel::ArraySerializer.new(
|
|
enterprise.distributors, each_serializer: Api::EnterpriseThinSerializer
|
|
)
|
|
end
|
|
|
|
def taxons
|
|
taxons = active ? enterprise.current_distributed_taxons : enterprise.distributed_taxons
|
|
|
|
ActiveModel::ArraySerializer.new(
|
|
taxons, each_serializer: Api::TaxonSerializer
|
|
)
|
|
end
|
|
|
|
def supplied_taxons
|
|
return [] unless enterprise.is_primary_producer
|
|
|
|
ActiveModel::ArraySerializer.new(
|
|
enterprise.supplied_taxons, each_serializer: Api::TaxonSerializer
|
|
)
|
|
end
|
|
|
|
def supplied_properties
|
|
return [] unless enterprise.is_primary_producer
|
|
|
|
(product_properties + producer_properties).uniq do |property_object|
|
|
property_object.property.presentation
|
|
end
|
|
end
|
|
|
|
def distributed_properties
|
|
(distributed_product_properties + distributed_producer_properties).uniq do |property_object|
|
|
property_object.property.presentation
|
|
end
|
|
end
|
|
|
|
def distributed_product_properties
|
|
properties = Spree::Property.joins(products: { variants: { exchanges: :order_cycle } })
|
|
.merge(Exchange.outgoing)
|
|
.merge(Exchange.to_enterprise(enterprise))
|
|
.select('DISTINCT spree_properties.*')
|
|
|
|
return properties.merge(OrderCycle.active) if active
|
|
|
|
properties
|
|
end
|
|
|
|
def distributed_producer_properties
|
|
properties = Spree::Property.joins(
|
|
producer_properties: {
|
|
producer: { supplied_products: { variants: { exchanges: :order_cycle } } }
|
|
}
|
|
)
|
|
.merge(Exchange.outgoing).merge(Exchange.to_enterprise(enterprise))
|
|
.select('DISTINCT spree_properties.*')
|
|
|
|
return properties.merge(OrderCycle.active) if active
|
|
|
|
properties
|
|
end
|
|
|
|
private
|
|
|
|
def product_properties
|
|
enterprise.supplied_products.includes(:properties).flat_map(&:properties)
|
|
end
|
|
|
|
def producer_properties
|
|
enterprise.properties
|
|
end
|
|
|
|
def enterprise
|
|
object
|
|
end
|
|
|
|
def shipping_types?(type)
|
|
require_shipping = type == :delivery ? 't' : 'f'
|
|
Spree::ShippingMethod.
|
|
joins(:distributor_shipping_methods).
|
|
where('distributors_shipping_methods.distributor_id = ?', enterprise.id).
|
|
where("spree_shipping_methods.require_ship_address = '#{require_shipping}'").exists?
|
|
end
|
|
end
|
|
end
|