diff options
| author | Zog | 2018-03-08 15:58:34 +0100 | 
|---|---|---|
| committer | Zog | 2018-03-12 12:00:15 +0100 | 
| commit | 9b1da47adecbfb8d5d148fce06ad1aece18b41d0 (patch) | |
| tree | 3d10008a4a05f3a1a9de762d61fd849031aec609 | |
| parent | 132db2e97fd6e28105e472ee562062b7ebc07b39 (diff) | |
| download | chouette-core-9b1da47adecbfb8d5d148fce06ad1aece18b41d0.tar.bz2 | |
Refs #6133: Async exports
| -rw-r--r-- | app/controllers/export_tasks_controller.rb | 87 | ||||
| -rw-r--r-- | app/models/export/base.rb | 4 | ||||
| -rw-r--r-- | app/models/export/referential_companies.rb | 39 | ||||
| -rw-r--r-- | app/models/gtfs_export.rb | 47 | ||||
| -rw-r--r-- | app/models/hub_export.rb | 24 | ||||
| -rw-r--r-- | app/models/kml_export.rb | 24 | ||||
| -rw-r--r-- | app/models/neptune_export.rb | 27 | ||||
| -rw-r--r-- | app/models/netex_export.rb | 24 | ||||
| -rw-r--r-- | app/models/simple_interface.rb | 4 | ||||
| -rw-r--r-- | app/views/exports/show.html.slim | 2 | ||||
| -rw-r--r-- | app/views/shared/iev_interfaces/_messages.html.slim | 2 | ||||
| -rw-r--r-- | app/workers/simple_export_worker.rb | 7 | 
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 | 
