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 |
