aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorZog2018-03-09 10:12:48 +0100
committerZog2018-03-12 12:00:15 +0100
commitf65a9f30f600f092fe3596e9e4db3c015dd91616 (patch)
tree60883c3b12a3380d8a5219b032cb640ffc398e41 /app
parent9b1da47adecbfb8d5d148fce06ad1aece18b41d0 (diff)
downloadchouette-core-f65a9f30f600f092fe3596e9e4db3c015dd91616.tar.bz2
Refs #6133; Full UX for exports
Also added a *dumb* `WorkgroupExport` for testing purposes.
Diffstat (limited to 'app')
-rw-r--r--app/controllers/concerns/iev_interfaces.rb6
-rw-r--r--app/controllers/exports_controller.rb4
-rw-r--r--app/controllers/imports_controller.rb4
-rw-r--r--app/helpers/exports_helper.rb7
-rw-r--r--app/helpers/imports_helper.rb4
-rw-r--r--app/models/concerns/iev_interfaces/task.rb8
-rw-r--r--app/models/export/base.rb4
-rw-r--r--app/models/export/netex.rb9
-rw-r--r--app/models/export/workbench.rb9
-rw-r--r--app/models/export/workgroup.rb9
-rw-r--r--app/views/exports/_form.html.slim2
-rw-r--r--app/views/exports/show.html.slim75
-rw-r--r--app/workers/simple_export_worker.rb5
-rw-r--r--app/workers/workgroup_export_worker.rb38
14 files changed, 118 insertions, 66 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