aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZog2018-03-08 15:58:34 +0100
committerZog2018-03-12 12:00:15 +0100
commit9b1da47adecbfb8d5d148fce06ad1aece18b41d0 (patch)
tree3d10008a4a05f3a1a9de762d61fd849031aec609
parent132db2e97fd6e28105e472ee562062b7ebc07b39 (diff)
downloadchouette-core-9b1da47adecbfb8d5d148fce06ad1aece18b41d0.tar.bz2
Refs #6133: Async exports
-rw-r--r--app/controllers/export_tasks_controller.rb87
-rw-r--r--app/models/export/base.rb4
-rw-r--r--app/models/export/referential_companies.rb39
-rw-r--r--app/models/gtfs_export.rb47
-rw-r--r--app/models/hub_export.rb24
-rw-r--r--app/models/kml_export.rb24
-rw-r--r--app/models/neptune_export.rb27
-rw-r--r--app/models/netex_export.rb24
-rw-r--r--app/models/simple_interface.rb4
-rw-r--r--app/views/exports/show.html.slim2
-rw-r--r--app/views/shared/iev_interfaces/_messages.html.slim2
-rw-r--r--app/workers/simple_export_worker.rb7
12 files changed, 50 insertions, 241 deletions
diff --git a/app/controllers/export_tasks_controller.rb b/app/controllers/export_tasks_controller.rb
deleted file mode 100644
index b889c1882..000000000
--- a/app/controllers/export_tasks_controller.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-class ExportTasksController < ChouetteController
- include ReferentialSupport
- defaults :resource_class => ExportTask
-
- respond_to :html, :only => [:new, :create]
- respond_to :js, :only => [:new, :create]
- belongs_to :referential
-
- def new
- @available_exports = available_exports
- begin
- new!
- rescue Ievkit::Error, Faraday::Error => error
- logger.error("Iev failure : #{error.message}")
- flash[:error] = t(error.locale_for_error)
- redirect_to referential_path(@referential)
- end
- end
-
- def create
- @available_exports = available_exports
- begin
- create! do |success, failure|
- success.html { redirect_to referential_exports_path(@referential) }
- end
- rescue Ievkit::Error, Faraday::Error => error
- logger.error("Iev failure : #{error.message}")
- flash[:error] = t(error.locale_for_error)
- redirect_to referential_path(@referential)
- end
- end
-
- def references
- references_type = params[:filter].pluralize
- references = @referential.send(references_type).where("name ilike ?", "%#{params[:q]}%").select("id, name")
- respond_to do |format|
- format.json do
- render :json => references.collect { |child| { :id => child.id, :name => child.name } }
- end
- end
- end
-
- protected
-
- def available_exports
- export_task_parameters = params[:export_task]
- if export_task_parameters.present?
- @available_exports = [
- export_task_parameters[:data_format] == "neptune" ? build_resource : NeptuneExport.new(:referential_id => @referential.id ),
- export_task_parameters[:data_format] == "netex" ? build_resource : NetexExport.new(:referential_id => @referential.id ),
- export_task_parameters[:data_format] == "gtfs" ? build_resource : GtfsExport.new(:referential_id => @referential.id ),
- export_task_parameters[:data_format] == "hub" ? build_resource : HubExport.new(:referential_id => @referential.id ),
- export_task_parameters[:data_format] == "kml" ? build_resource : KmlExport.new(:referential_id => @referential.id )
- ]
- else
- @available_exports = [
- NeptuneExport.new(:referential_id => @referential.id ),
- NetexExport.new(:referential_id => @referential.id ),
- GtfsExport.new(:referential_id => @referential.id ),
- HubExport.new(:referential_id => @referential.id ),
- KmlExport.new(:referential_id => @referential.id )
- ]
- end
- end
-
- def build_resource
- @export_task ||= if params[:export_task].present?
- export_task_parameters = params[:export_task]
- case export_task_parameters[:data_format]
- when "neptune"
- NeptuneExport.new(export_task_parameters)
- when "netex"
- NetexExport.new(export_task_parameters)
- when "gtfs"
- GtfsExport.new(export_task_parameters)
- when "hub"
- HubExport.new(export_task_parameters)
- when "kml"
- KmlExport.new(export_task_parameters)
- end
- else
- NeptuneExport.new
- end
-
- end
-
-end
diff --git a/app/models/export/base.rb b/app/models/export/base.rb
index ae34be0d0..b078da273 100644
--- a/app/models/export/base.rb
+++ b/app/models/export/base.rb
@@ -61,6 +61,10 @@ class Export::Base < ActiveRecord::Base
true
end
+ def visible_options
+ options.select{|k, v| ! k.match /^_/}
+ end
+
def display_option_value option_name, context
option = self.class.options[option_name.to_sym]
val = self.options[option_name.to_s]
diff --git a/app/models/export/referential_companies.rb b/app/models/export/referential_companies.rb
index 7a796fb48..0b6187060 100644
--- a/app/models/export/referential_companies.rb
+++ b/app/models/export/referential_companies.rb
@@ -5,35 +5,62 @@ class Export::ReferentialCompanies < Export::Base
required: true,
display: ->(val){r = Referential.find(val); link_to(r.name, [r])}
- after_commit :call_exporter, on: :create
+ after_create :call_exporter_async
def referential
Referential.find referential_id
end
+ def call_exporter_async
+ SimpleExportWorker.perform_async(id)
+ end
+
+ def exporter
+ SimpleExporter.define :referential_companies do |config|
+ config.separator = ";"
+ config.encoding = 'ISO-8859-1'
+ config.add_column :name
+ config.add_column :registration_number
+ end
+
+ @exporter ||= begin
+ if options[:_exporter_id]
+ exporter = SimpleExporter.find options[:exporter_id]
+ else
+ exporter = SimpleExporter.create configuration_name: :referential_companies
+ options[:_exporter_id] = exporter.id
+ end
+ exporter
+ end
+ end
+
def call_exporter
tmp = Tempfile.new ["referential_companies", ".csv"]
- exporter = SimpleExporter.create configuration_name: :referential_companies, filepath: tmp.path
referential.switch
exporter.configure do |config|
config.collection = referential.companies.order(:name)
end
+ exporter.filepath = tmp.path
exporter.export
+ set_status_from_exporter
+ convert_exporter_journal_to_messages
+ self.file = tmp
+ self.save!
+ end
+
+ def set_status_from_exporter
if exporter.status == :error
self.status = :failed
else
- self.file = tmp
if exporter.status == :success
self.status = :successful
else
self.status = :warning
end
end
- convert_exporter_journal_to_messages exporter
- self.save!
end
- def convert_exporter_journal_to_messages exporter
+ def convert_exporter_journal_to_messages
self.messages.destroy_all
exporter.journal.each do |journal_item|
journal_item.symbolize_keys!
diff --git a/app/models/gtfs_export.rb b/app/models/gtfs_export.rb
deleted file mode 100644
index d0b9fc4f9..000000000
--- a/app/models/gtfs_export.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-class GtfsExport < ExportTask
-
- validates_presence_of :time_zone, unless: Proc.new { |e| e.optional_attribute? :time_zone }
- attr_accessor :object_id_prefix, :time_zone
-
- enumerize :references_type, in: %w( network line company group_of_line stop_area )
-
- after_initialize :init_params
-
- def init_params
- if time_zone.nil?
- self.time_zone = "Paris"
- end
- end
-
- def real_time_zone
- ActiveSupport::TimeZone.find_tzinfo(time_zone).name
- end
-
- def action_params
- {
- "gtfs-export" => {
- "name" => name,
- "references_type" => references_type,
- "reference_ids" => reference_ids,
- "user_name" => user_name,
- "organisation_name" => organisation.name,
- "referential_name" => referential.name,
- "time_zone" => real_time_zone,
- "object_id_prefix" => object_id_prefix,
- "start_date" => start_date,
- "end_date" => end_date
- }
- }
- end
-
- def self.optional_attributes(references_type)
- super.tap do |optional_attributes|
- optional_attributes.push :time_zone, :start_date, :end_date if references_type == "stop_area"
- end
- end
-
- def data_format
- "gtfs"
- end
-
-end
diff --git a/app/models/hub_export.rb b/app/models/hub_export.rb
deleted file mode 100644
index 802600692..000000000
--- a/app/models/hub_export.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class HubExport < ExportTask
-
- enumerize :references_type, in: %w( network line company group_of_line )
-
- def action_params
- {
- "hub-export" => {
- "name" => name,
- "references_type" => references_type,
- "reference_ids" => reference_ids,
- "user_name" => user_name,
- "organisation_name" => organisation.name,
- "referential_name" => referential.name,
- "start_date" => start_date,
- "end_date" => end_date
- }
- }
- end
-
- def data_format
- "hub"
- end
-
-end
diff --git a/app/models/kml_export.rb b/app/models/kml_export.rb
deleted file mode 100644
index f6db77172..000000000
--- a/app/models/kml_export.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class KmlExport < ExportTask
-
- enumerize :references_type, in: %w( network line company group_of_line )
-
- def action_params
- {
- "kml-export" => {
- "name" => name,
- "references_type" => references_type,
- "reference_ids" => reference_ids,
- "user_name" => user_name,
- "organisation_name" => organisation.name,
- "referential_name" => referential.name,
- "start_date" => start_date,
- "end_date" => end_date
- }
- }
- end
-
- def data_format
- "kml"
- end
-
-end
diff --git a/app/models/neptune_export.rb b/app/models/neptune_export.rb
deleted file mode 100644
index f25db69c0..000000000
--- a/app/models/neptune_export.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-class NeptuneExport < ExportTask
-
- attr_accessor :extensions, :export_type
- enumerize :references_type, in: %w( network line company group_of_line )
-
- def action_params
- {
- "neptune-export" => {
- "name" => name,
- "references_type" => references_type,
- "reference_ids" => reference_ids,
- "user_name" => user_name,
- "organisation_name" => organisation.name,
- "referential_name" => referential.name,
- "projection_type" => projection_type || "",
- "add_extension" => extensions,
- "start_date" => start_date,
- "end_date" => end_date
- }
- }
- end
-
- def data_format
- "neptune"
- end
-
-end
diff --git a/app/models/netex_export.rb b/app/models/netex_export.rb
deleted file mode 100644
index a4c3e2454..000000000
--- a/app/models/netex_export.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class NetexExport < ExportTask
-
- enumerize :references_type, in: %w( network line company group_of_line )
-
- def action_params
- {
- "netex-export" => {
- "name" => name,
- "references_type" => references_type,
- "reference_ids" => reference_ids,
- "user_name" => user_name,
- "organisation_name" => organisation.name,
- "referential_name" => referential.name,
- "start_date" => start_date,
- "end_date" => end_date
- }
- }
- end
-
- def data_format
- "netex"
- end
-
-end
diff --git a/app/models/simple_interface.rb b/app/models/simple_interface.rb
index c766d483a..11b9d0dcd 100644
--- a/app/models/simple_interface.rb
+++ b/app/models/simple_interface.rb
@@ -27,6 +27,10 @@ class SimpleInterface < ActiveRecord::Base
self.journal ||= []
end
+ def configuration
+ @configuration ||= self.class.find_configuration self.configuration_name
+ end
+
def init_env opts
@verbose = opts.delete :verbose
diff --git a/app/views/exports/show.html.slim b/app/views/exports/show.html.slim
index 0455fe375..6407ea398 100644
--- a/app/views/exports/show.html.slim
+++ b/app/views/exports/show.html.slim
@@ -8,7 +8,7 @@
.col-lg-6.col-md-6.col-sm-12.col-xs-12
- metadatas = { I18n.t("activerecord.attributes.export.type") => @export.object.class.human_name }
- metadatas = metadatas.update({I18n.t("activerecord.attributes.export.status") => @export.status})
- - metadatas = metadatas.update Hash[*@export.options.map{|k, v| [t("activerecord.attributes.export.#{@export.object.class.name.demodulize.tableize.singularize}.#{k}"), @export.display_option_value(k, self)]}.flatten]
+ - metadatas = metadatas.update Hash[*@export.visible_options.map{|k, v| [t("activerecord.attributes.export.#{@export.object.class.name.demodulize.tableize.singularize}.#{k}"), @export.display_option_value(k, self)]}.flatten]
- metadatas = metadatas.update({I18n.t("activerecord.attributes.export.file") => link_to(t("actions.download"), @export.file.url)})
= definition_list t('metadatas'), metadatas
diff --git a/app/views/shared/iev_interfaces/_messages.html.slim b/app/views/shared/iev_interfaces/_messages.html.slim
index d65f006e6..eb7a47bc1 100644
--- a/app/views/shared/iev_interfaces/_messages.html.slim
+++ b/app/views/shared/iev_interfaces/_messages.html.slim
@@ -1,6 +1,6 @@
- if messages.any?
ul.list-unstyled.import_message-list
- - messages.each do | message |
+ - messages.order(:created_at).each do | message |
li
.row class=bootstrap_class_for_message_criticity(message.criticity)
- if message.message_attributes["line"]
diff --git a/app/workers/simple_export_worker.rb b/app/workers/simple_export_worker.rb
new file mode 100644
index 000000000..953ded92f
--- /dev/null
+++ b/app/workers/simple_export_worker.rb
@@ -0,0 +1,7 @@
+class SimpleExportWorker
+ include Sidekiq::Worker
+
+ def perform(export_id)
+ Export::Base.find(export_id).call_exporter
+ end
+end