From da590cc73ae6c702175650a5de71164412a960d4 Mon Sep 17 00:00:00 2001 From: clemkeirua Date: Thu, 24 Oct 2019 15:30:40 +0200 Subject: [PATCH 1/3] sequence async file generation so that the queue flag is cleared --- app/models/procedure.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/procedure.rb b/app/models/procedure.rb index d4703b465..0cc6f5c16 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -169,7 +169,6 @@ class Procedure < ApplicationRecord end def queue_export(instructeur, export_format) - ExportProcedureJob.perform_now(self, instructeur, export_format) case export_format.to_sym when :csv update(csv_export_queued: true) @@ -178,6 +177,7 @@ class Procedure < ApplicationRecord when :ods update(ods_export_queued: true) end + ExportProcedureJob.perform_later(self, instructeur, export_format) end def prepare_export_download(format) From cb5f922bb68133374e0ff2e925ba6aa72c100d71 Mon Sep 17 00:00:00 2001 From: clemkeirua Date: Thu, 24 Oct 2019 15:30:09 +0200 Subject: [PATCH 2/3] cleanup the queue flag during cleanup job --- app/jobs/cleanup_stale_exports_job.rb | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/jobs/cleanup_stale_exports_job.rb b/app/jobs/cleanup_stale_exports_job.rb index f00346124..9344d4f14 100644 --- a/app/jobs/cleanup_stale_exports_job.rb +++ b/app/jobs/cleanup_stale_exports_job.rb @@ -2,9 +2,25 @@ class CleanupStaleExportsJob < ApplicationJob queue_as :cron def perform(*args) - ActiveStorage::Attachment.where( + attachments = ActiveStorage::Attachment.where( "name in ('csv_export_file', 'ods_export_file', 'xlsx_export_file') and created_at < ?", Procedure::MAX_DUREE_CONSERVATION_EXPORT.ago - ).find_each(&:purge_later) + ) + attachments.each do |attachment| + procedure = Procedure.find(attachment.record_id) + # export can't be queued if it's already attached + #  so we clean the flag up just in case it was not removed during + # the asynchronous generation + case attachment.name + when 'csv_export_file' + procedure.update(csv_export_queued: false) + when 'ods_export_file' + procedure.update(ods_export_queued: false) + when 'xlsx_export_file' + procedure.update(xlsx_export_queued: false) + end + # and we remove the stale attachment + attachment.purge_later + end end end From d9e993571c87d4cb4b2f2b0c01e358ddbd2a5459 Mon Sep 17 00:00:00 2001 From: clemkeirua Date: Thu, 24 Oct 2019 15:50:43 +0200 Subject: [PATCH 3/3] add a warning during export generation --- .../instructeurs/procedures_controller.rb | 7 +++++-- app/models/procedure.rb | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/controllers/instructeurs/procedures_controller.rb b/app/controllers/instructeurs/procedures_controller.rb index a30a52f7e..3bd2f35e1 100644 --- a/app/controllers/instructeurs/procedures_controller.rb +++ b/app/controllers/instructeurs/procedures_controller.rb @@ -207,16 +207,19 @@ module Instructeurs def download_export export_format = params[:export_format] - + notice_message = "Nous générons cet export. Lorsque celui-ci sera disponible, vous recevrez une notification par email accompagnée d'un lien de téléchargement." if procedure.should_generate_export?(export_format) procedure.queue_export(current_instructeur, export_format) respond_to do |format| format.js do - flash.notice = "Nous générons cet export. Lorsque celui-ci sera disponible, vous recevrez une notification par email accompagnée d'un lien de téléchargement." + flash.notice = notice_message @procedure = procedure end end + elsif procedure.export_queued?(export_format) + flash.notice = notice_message + redirect_to procedure else redirect_to url_for(procedure.export_file(export_format)) end diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 0cc6f5c16..6a6d3ecd6 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -145,6 +145,18 @@ class Procedure < ApplicationRecord !ods_export_file.attached? || ods_export_file.created_at < MAX_DUREE_CONSERVATION_EXPORT.ago end + def export_queued?(format) + case format.to_sym + when :csv + return csv_export_queued? + when :xlsx + return xlsx_export_queued? + when :ods + return ods_export_queued? + end + false + end + def should_generate_export?(format) case format.to_sym when :csv