mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-11 18:26:50 +00:00
This also resolves a race condition scenario. Even if the report gets rendered via websockets before the controller response is rendered then the fallback script loads the report again. It's not the most beautiful but probably okay until we replace websockts altogether. I'm leaving websockets in at the moment because it can render the report much quicker than polling can.
72 lines
1.8 KiB
Ruby
72 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Admin
|
|
class ReportsController < Spree::Admin::BaseController
|
|
include ActiveStorage::SetCurrent
|
|
include ReportsActions
|
|
helper ReportsHelper
|
|
|
|
before_action :authorize_report, only: [:show, :create]
|
|
|
|
# Define model class for Can? permissions
|
|
def model_class
|
|
Admin::ReportsController
|
|
end
|
|
|
|
def index
|
|
@reports = reports.select do |report_type, _description|
|
|
can? report_type, :report
|
|
end
|
|
end
|
|
|
|
def show
|
|
@report = report_class.new(spree_current_user, params, render: false)
|
|
@rendering_options = rendering_options
|
|
|
|
show_report
|
|
end
|
|
|
|
def create
|
|
@report = report_class.new(spree_current_user, params, render: true)
|
|
update_rendering_options
|
|
|
|
render_in_background
|
|
end
|
|
|
|
private
|
|
|
|
def show_report
|
|
assign_view_data
|
|
render "show"
|
|
end
|
|
|
|
def assign_view_data
|
|
@report_type = report_type
|
|
@report_subtypes = report_subtypes
|
|
@report_subtype = report_subtype
|
|
@report_title = report_title
|
|
@data = Reporting::FrontendData.new(spree_current_user)
|
|
|
|
variant_id_in = params[:variant_id_in]&.compact_blank
|
|
load_selected_variant if variant_id_in.present?
|
|
end
|
|
|
|
# Orders and Fulfillment Reports include a per product filter, load any selected product
|
|
def load_selected_variant
|
|
variant = Spree::Variant.find(params[:variant_id_in][0])
|
|
@variant_serialized = Api::Admin::VariantSerializer.new(variant)
|
|
end
|
|
|
|
def render_in_background
|
|
@blob = ReportBlob.create_for_upload_later!(report_filename)
|
|
|
|
ReportJob.perform_later(
|
|
report_class:, user: spree_current_user, params:,
|
|
format: report_format,
|
|
blob: @blob,
|
|
channel: ScopedChannel.for_id(params[:uuid]),
|
|
)
|
|
end
|
|
end
|
|
end
|