diff options
| -rw-r--r-- | app/controllers/concerns/iev_interfaces.rb | 6 | ||||
| -rw-r--r-- | app/controllers/exports_controller.rb | 4 | ||||
| -rw-r--r-- | app/controllers/imports_controller.rb | 4 | ||||
| -rw-r--r-- | app/helpers/exports_helper.rb | 7 | ||||
| -rw-r--r-- | app/helpers/imports_helper.rb | 4 | ||||
| -rw-r--r-- | app/models/concerns/iev_interfaces/task.rb | 8 | ||||
| -rw-r--r-- | app/models/export/base.rb | 4 | ||||
| -rw-r--r-- | app/models/export/netex.rb | 9 | ||||
| -rw-r--r-- | app/models/export/workbench.rb | 9 | ||||
| -rw-r--r-- | app/models/export/workgroup.rb | 9 | ||||
| -rw-r--r-- | app/views/exports/_form.html.slim | 2 | ||||
| -rw-r--r-- | app/views/exports/show.html.slim | 75 | ||||
| -rw-r--r-- | app/workers/simple_export_worker.rb | 5 | ||||
| -rw-r--r-- | app/workers/workgroup_export_worker.rb | 38 | ||||
| -rw-r--r-- | config/locales/exports.en.yml | 13 | ||||
| -rw-r--r-- | config/locales/exports.fr.yml | 10 | ||||
| -rw-r--r-- | spec/factories/exports/workbench_exports.rb | 5 | ||||
| -rw-r--r-- | spec/factories/exports/workgroup_exports.rb | 4 | 
18 files changed, 142 insertions, 74 deletions
| diff --git a/app/controllers/concerns/iev_interfaces.rb b/app/controllers/concerns/iev_interfaces.rb index 590482c7f..aa4d3fe6a 100644 --- a/app/controllers/concerns/iev_interfaces.rb +++ b/app/controllers/concerns/iev_interfaces.rb @@ -28,8 +28,12 @@ module IevInterfaces    end    protected +    def collection -    scope = parent.send(collection_name).where(type: "#{resource_class.parent.name}::Workbench") +    scope = parent.send(collection_name).where(parent_id: nil) +    if index_model.name.demodulize != "Base" +      scope = scope.where(type: index_model.name) +    end      scope = self.ransack_period_range(scope: scope, error_message:  t("#{collection_name}.filters.error_period_filter"), query: :where_started_at_in) diff --git a/app/controllers/exports_controller.rb b/app/controllers/exports_controller.rb index 3a91217e4..7ea57341a 100644 --- a/app/controllers/exports_controller.rb +++ b/app/controllers/exports_controller.rb @@ -7,6 +7,10 @@ class ExportsController < ChouetteController    private +  def index_model +    Export::Base +  end +    def build_resource      Export::Base.force_load_descendants if Rails.env.development?      @export ||= Export::Base.new(*resource_params) do |export| diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb index f95b6acf1..8d7a723a0 100644 --- a/app/controllers/imports_controller.rb +++ b/app/controllers/imports_controller.rb @@ -15,6 +15,10 @@ class ImportsController < ChouetteController    private +  def index_model +    Import::Workbench +  end +      def build_resource      @import ||= Import::Workbench.new(*resource_params) do |import|        import.workbench = parent diff --git a/app/helpers/exports_helper.rb b/app/helpers/exports_helper.rb index 3a32e4761..25a808c2d 100644 --- a/app/helpers/exports_helper.rb +++ b/app/helpers/exports_helper.rb @@ -1,9 +1,10 @@  # -*- coding: utf-8 -*-  module ExportsHelper -  def export_option_input form, export, attr, option_def -    opts = { required: option_def[:required], input_html: {value: @export.try(attr) || option_def[:default_value]}, as: option_def[:type]} +  def export_option_input form, export, attr, option_def, type +    opts = { required: option_def[:required], input_html: {value: export.try(attr) || option_def[:default_value]}, as: option_def[:type], selected:  export.try(attr) || option_def[:default_value]}      opts[:collection] = option_def[:collection] if option_def.has_key?(:collection) -    opts[:collection] = @export.instance_exec(&option_def[:collection]) if option_def[:collection].is_a?(Proc) +    opts[:collection] = export.instance_exec(&option_def[:collection]) if option_def[:collection].is_a?(Proc) +    opts[:label] = t "activerecord.attributes.export.#{type.name.demodulize.underscore}.#{attr}"      form.input attr, opts    end diff --git a/app/helpers/imports_helper.rb b/app/helpers/imports_helper.rb index 140660153..5d05117c9 100644 --- a/app/helpers/imports_helper.rb +++ b/app/helpers/imports_helper.rb @@ -15,6 +15,10 @@ module ImportsHelper      end    end +  def export_status status +    import_status status +  end +    # Compliance check set messages    def bootstrap_class_for_message_criticity message_criticity      case message_criticity diff --git a/app/models/concerns/iev_interfaces/task.rb b/app/models/concerns/iev_interfaces/task.rb index f60c16750..dbdcef8ee 100644 --- a/app/models/concerns/iev_interfaces/task.rb +++ b/app/models/concerns/iev_interfaces/task.rb @@ -26,6 +26,7 @@ module IevInterfaces::Task      scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') }      before_create :initialize_fields +    after_save :notify_parent    end    module ClassMethods @@ -51,8 +52,11 @@ module IevInterfaces::Task    end    def notify_parent +    return unless parent.present? +    return unless status_changed?      parent.child_change -    update(notified_parent_at: DateTime.now) +    self.notified_parent_at = DateTime.now +    self.class.where(id: self.id).update_all notified_parent_at: DateTime.now    end    def children_succeedeed @@ -67,6 +71,8 @@ module IevInterfaces::Task          'warning'        elsif children.where(status: "successful").count == children.count          'successful' +      else +        'running'        end      attributes = { diff --git a/app/models/export/base.rb b/app/models/export/base.rb index b078da273..58a0ec22b 100644 --- a/app/models/export/base.rb +++ b/app/models/export/base.rb @@ -12,7 +12,7 @@ class Export::Base < ActiveRecord::Base    end    def self.human_name -    self.name.demodulize.humanize +    I18n.t("export.#{self.name.demodulize.underscore}")    end    if Rails.env.development? @@ -34,7 +34,7 @@ class Export::Base < ActiveRecord::Base      end    end -  def self.option name, opts +  def self.option name, opts={}      store_accessor :options, name      if !!opts[:required]        validates name, presence: true diff --git a/app/models/export/netex.rb b/app/models/export/netex.rb index a5bdb63d2..069ec2209 100644 --- a/app/models/export/netex.rb +++ b/app/models/export/netex.rb @@ -1,5 +1,8 @@  class Export::Netex < Export::Base    after_commit :call_iev_callback, on: :create +  option :export_type, collection: %w(line full), required: true +  option :duration, type: :integer, default_value: 90, required: true +  option :line_code    private @@ -7,9 +10,9 @@ class Export::Netex < Export::Base      URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/exporter/new?id=#{id}")    end -  def self.user_visible? -    false -  end +  # def self.user_visible? +  #   false +  # end    def destroy_non_ready_referential      if referential && !referential.ready diff --git a/app/models/export/workbench.rb b/app/models/export/workbench.rb deleted file mode 100644 index 9ec15f22f..000000000 --- a/app/models/export/workbench.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Export::Workbench < Export::Base -  after_commit :launch_worker, :on => :create - -  option :timelapse, required: true, type: :integer, default_value: 90 - -  def launch_worker -    # WorkbenchImportWorker.perform_async(id) -  end -end diff --git a/app/models/export/workgroup.rb b/app/models/export/workgroup.rb new file mode 100644 index 000000000..3430596c7 --- /dev/null +++ b/app/models/export/workgroup.rb @@ -0,0 +1,9 @@ +class Export::Workgroup < Export::Base +  after_commit :launch_worker, :on => :create + +  option :duration, required: true, type: :integer, default_value: 90 + +  def launch_worker +    WorkgroupExportWorker.perform_async(id) +  end +end diff --git a/app/views/exports/_form.html.slim b/app/views/exports/_form.html.slim index b8fe0f632..7817fdf1a 100644 --- a/app/views/exports/_form.html.slim +++ b/app/views/exports/_form.html.slim @@ -9,7 +9,7 @@        - Export::Base.user_visible_descendants.each do |child|          .slave data-master="[name='export[type]']" data-value=child.name            - child.options.each do |attr, option_def| -            = export_option_input form, export, attr, option_def +            = export_option_input form, export, attr, option_def, child    = form.button :submit, t('actions.submit'), class: 'btn btn-default formSubmitr', form: 'wb_export_form' diff --git a/app/views/exports/show.html.slim b/app/views/exports/show.html.slim index 6407ea398..2a7d7583c 100644 --- a/app/views/exports/show.html.slim +++ b/app/views/exports/show.html.slim @@ -7,9 +7,10 @@      .row        .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.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)}) +        - metadatas = metadatas.update({I18n.t("activerecord.attributes.export.status") => export_status(@export.status)}) +        - metadatas = metadatas.update({I18n.t("activerecord.attributes.export.parent") => link_to(@export.parent.name, [@export.parent.workbench, @export.parent])}) if @export.parent.present? +        - metadatas = metadatas.update Hash[*@export.visible_options.map{|k, v| [t("activerecord.attributes.export.#{@export.object.class.name.demodulize.underscore}.#{k}"), @export.display_option_value(k, self)]}.flatten] +        - metadatas = metadatas.update({I18n.t("activerecord.attributes.export.file") => (@export.file.present? ? link_to(t("actions.download"), @export.file.url) : "-")})          = definition_list t('metadatas'), metadatas      .row @@ -20,45 +21,29 @@      - if @export.children.any?        .row          .col-lg-12 -          = table_builder_2 @export.children, -            [ \ -              TableBuilderHelper::Column.new( \ -                name: 'Nom du jeu de données', \ -                attribute: 'name', \ -                sortable: false, \ -                link_to: lambda do |export| \ -                  referential_path(export.referential) if export.referential.present? \ -                end \ -              ), \ -              TableBuilderHelper::Column.new( \ -                key: :status, \ -                attribute: Proc.new { |n| export_status(n.status) }, \ -                sortable: false, \ -                link_to: lambda do |export| \ -                  workbench_export_export_resources_path(export.workbench_id, export) \ -                end \ -              ), \ -              TableBuilderHelper::Column.new( \ -                name: 'Contrôle STIF', \ -                attribute: '', \ -                sortable: false, \ -              ), \ -              TableBuilderHelper::Column.new( \ -                name: 'Contrôle organisation', \ -                attribute: '', \ -                sortable: false, \ -              ) \ -            ], -            cls: 'table', -            overhead: [ \ -              {}, \ -              { \ -                title: "#{@export.children_succeedeed} jeu de données validé sur #{@export.children.count} présent(s) dans l'archive", \ -                width: 1, \ -                cls: "#{@export.export_status_css_class} full-border" \ -              }, { \ -                title: 'Bilan des jeux de contrôles d\'export <span title="Lorem ipsum..." class="fa fa-lg fa-info-circle text-info"></span>', \ -                width: 2, \ -                cls: 'overheaded-default colspan="2"' \ -              } \ -            ] +        - coll = @export.children.paginate(page: params[:page] || 1) +        = table_builder_2 coll, +          [ \ +            TableBuilderHelper::Column.new( \ +              key: :status, \ +              attribute: Proc.new { |n| export_status(n.status) }, \ +            ), \ +            TableBuilderHelper::Column.new( \ +              key: :started_at, \ +              attribute: Proc.new { |n| l(n.started_at, format: :long) if n.started_at }, \ +            ), \ +            TableBuilderHelper::Column.new( \ +              key: :name, \ +              attribute: 'name', \ +              link_to: lambda do |export| \ +                workbench_export_path(@workbench, export) \ +              end \ +            ), \ +            TableBuilderHelper::Column.new( \ +              key: :creator, \ +              attribute: 'creator' \ +            ) \ +          ], +          cls: 'table has-search' + +        = new_pagination coll, 'pull-right' diff --git a/app/workers/simple_export_worker.rb b/app/workers/simple_export_worker.rb index 953ded92f..d41736307 100644 --- a/app/workers/simple_export_worker.rb +++ b/app/workers/simple_export_worker.rb @@ -2,6 +2,9 @@ class SimpleExportWorker    include Sidekiq::Worker    def perform(export_id) -    Export::Base.find(export_id).call_exporter +    export = Export::Base.find(export_id) +    export.update(status: 'running', started_at: Time.now) +    export.call_exporter +    export.update(ended_at: Time.now)    end  end diff --git a/app/workers/workgroup_export_worker.rb b/app/workers/workgroup_export_worker.rb new file mode 100644 index 000000000..29493cea6 --- /dev/null +++ b/app/workers/workgroup_export_worker.rb @@ -0,0 +1,38 @@ +class WorkgroupExportWorker +  include Sidekiq::Worker + +  attr_reader :workbench_export + +  # Workers +  # ======= + +  def perform(export_id) +    @entries = 0 +    @workbench_export ||= Export::Workgroup.find(export_id) + +    workbench_export.update(status: 'running', started_at: Time.now) +    create_sub_jobs +  rescue Exception => e +    logger.error e.message +    workbench_export.update( status: 'failed' ) +    raise +  end + +  def create_sub_jobs +    # XXX TO DO +    workbench_export.workbench.workgroup.referentials.each do |ref| +      ref.lines.each do |line| +        netex_export = Export::Netex.new +        netex_export.name = "Export line #{line.name} of Referential #{ref.name}" +        netex_export.workbench = workbench_export.workbench +        netex_export.creator = workbench_export.creator +        netex_export.export_type = :line +        netex_export.duration = workbench_export.duration +        netex_export.line_code = line.objectid +        netex_export.parent = workbench_export +        netex_export.save! +      end +    end +  end + +end diff --git a/config/locales/exports.en.yml b/config/locales/exports.en.yml index 73d49b1f8..88c1b99f8 100644 --- a/config/locales/exports.en.yml +++ b/config/locales/exports.en.yml @@ -1,5 +1,5 @@  en: -  exports: +  exports: &exports      search_no_results: "No export matching your query"      filters:        referential: "Select data space..." @@ -34,6 +34,12 @@ en:        warning: "Warning"        error: "Error"        fatal: "Fatal" +  export: +    workgroup: Workgroup +    netex:     Netex +    referential_companies: Companies +    base: +      <<: *exports    activerecord:      models:        export: @@ -78,10 +84,15 @@ en:          max_distance_for_connection_link: "Max distance for connection link"          ignore_last_word: "ignore last word"          ignore_end_chars: "ignore last chars" +        parent: Parent        export:          <<: *attrs          base:            <<: *attrs +        workgroup: +          duration: Duration +        referential_companies: +          referential_id: Referential    flash:      exports:        create: diff --git a/config/locales/exports.fr.yml b/config/locales/exports.fr.yml index e88339c38..fa3ac8fc7 100644 --- a/config/locales/exports.fr.yml +++ b/config/locales/exports.fr.yml @@ -35,6 +35,9 @@ fr:        error: "Erreur"        fatal: "Fatal"    export: +    workgroup: Groupe de travail +    netex:     Netex +    referential_companies: Transporteurs      base:        <<: *exports    activerecord: @@ -83,12 +86,15 @@ fr:          ignore_end_chars: "ignorer les n derniers caractères"          type: "Type d'export"          file: "Résultat" +        parent: Parent        export:          <<: *attrs          base:            <<: *attrs -        workbench: -          timelapse: Durée +        workgroup: +          duration: Durée +        referential_companies: +          referential_id: Jeu de données    flash:      exports:        create: diff --git a/spec/factories/exports/workbench_exports.rb b/spec/factories/exports/workbench_exports.rb deleted file mode 100644 index e00efb58a..000000000 --- a/spec/factories/exports/workbench_exports.rb +++ /dev/null @@ -1,5 +0,0 @@ -FactoryGirl.define do -  factory :workbench_export, class: Export::Workbench, parent: :export do -    file { File.open(Rails.root.join('spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip')) } -  end -end diff --git a/spec/factories/exports/workgroup_exports.rb b/spec/factories/exports/workgroup_exports.rb new file mode 100644 index 000000000..4b1ef45ab --- /dev/null +++ b/spec/factories/exports/workgroup_exports.rb @@ -0,0 +1,4 @@ +FactoryGirl.define do +  factory :workbench_export, class: Export::Workgroup, parent: :export do +  end +end | 
