From 42ac1fa61ea79fe612bcd98f2b38bad5b6f24421 Mon Sep 17 00:00:00 2001
From: Zog
Date: Tue, 24 Apr 2018 14:00:17 +0200
Subject: Rework imports to use Resources and make the a little more verbose
---
app/assets/stylesheets/application.sass | 3 +
app/controllers/import_resources_controller.rb | 9 ++
app/helpers/exports_helper.rb | 2 +-
app/helpers/imports_helper.rb | 24 ++++--
app/helpers/table_builder_helper.rb | 6 +-
app/models/concerns/iev_interfaces/resource.rb | 20 ++++-
app/models/import/base.rb | 8 ++
app/models/import/gtfs.rb | 36 +++++++-
app/models/import/netex.rb | 53 ++++++++++--
app/models/import/resource.rb | 12 +++
app/models/import/workbench.rb | 10 ++-
app/models/referential.rb | 1 +
app/views/import_resources/show.html.slim | 52 ++++++++++++
app/views/imports/show.html.slim | 97 +++++++++++-----------
.../object_state_updater.rb | 17 +++-
config/breadcrumbs.rb | 5 ++
config/locales/import_messages.fr.yml | 15 +++-
config/locales/import_resources.fr.yml | 9 +-
config/locales/imports.en.yml | 10 +++
config/locales/imports.fr.yml | 11 +++
config/routes.rb | 2 +-
...2095756_add_referentials_to_import_resources.rb | 5 ++
db/schema.rb | 1 +
23 files changed, 330 insertions(+), 78 deletions(-)
create mode 100644 app/views/import_resources/show.html.slim
create mode 100644 db/migrate/20180412095756_add_referentials_to_import_resources.rb
diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass
index 3f8467efe..632ade179 100644
--- a/app/assets/stylesheets/application.sass
+++ b/app/assets/stylesheets/application.sass
@@ -21,3 +21,6 @@
@import 'modules/import_messages'
@import 'flag-icon'
+
+span.fa + span
+ margin-left: 0.2em
diff --git a/app/controllers/import_resources_controller.rb b/app/controllers/import_resources_controller.rb
index 1535fd171..46f8f0337 100644
--- a/app/controllers/import_resources_controller.rb
+++ b/app/controllers/import_resources_controller.rb
@@ -24,6 +24,15 @@ class ImportResourcesController < ChouetteController
@import_resources ||= parent.resources
end
+ def resource
+ @import ||= Import::Base.find params[:import_id]
+ @import_resource ||= begin
+ import_resource = Import::Resource.find params[:id]
+ raise ActiveRecord::RecordNotFound unless import_resource.import == @import
+ import_resource
+ end
+ end
+
private
def decorate_import_resources(import_resources)
diff --git a/app/helpers/exports_helper.rb b/app/helpers/exports_helper.rb
index 2e784ad35..f30a80ed9 100644
--- a/app/helpers/exports_helper.rb
+++ b/app/helpers/exports_helper.rb
@@ -17,7 +17,7 @@ module ExportsHelper
message.message_attributes["text"]
else
t([message.class.name.underscore.gsub('/', '_').pluralize, message.message_key].join('.'), message.message_attributes&.symbolize_keys || {})
- end
+ end.html_safe
end
def fields_for_export_task_format(form)
diff --git a/app/helpers/imports_helper.rb b/app/helpers/imports_helper.rb
index 140660153..a297c2521 100644
--- a/app/helpers/imports_helper.rb
+++ b/app/helpers/imports_helper.rb
@@ -2,33 +2,47 @@
module ImportsHelper
# Import statuses helper
- def import_status(status)
- if %w[new running pending].include? status
+ def import_status(status, verbose: false)
+ status = status.to_s.downcase
+ out = if %w[new running pending].include? status
content_tag :span, '', class: "fa fa-clock-o"
else
cls =''
cls = 'success' if status == 'successful'
+ cls = 'success' if status == 'ok'
cls = 'warning' if status == 'warning'
- cls = 'danger' if %w[failed aborted canceled].include? status
+ cls = 'danger' if %w[failed aborted canceled error].include? status
content_tag :span, '', class: "fa fa-circle text-#{cls}"
end
+ if verbose
+ out += content_tag :span do
+ txt = "imports.status.#{status}".t(fallback: "")
+ end
+ end
+ out
end
# Compliance check set messages
def bootstrap_class_for_message_criticity message_criticity
- case message_criticity
- when "error"
+ case message_criticity.downcase
+ when "error", "aborted"
"alert alert-danger"
when "warning"
"alert alert-warning"
when "info"
"alert alert-info"
+ when "ok", "success"
+ "alert alert-success"
else
message_criticity.to_s
end
end
+ def import_message_content message
+ export_message_content message
+ end
+
##############################
# TO CLEAN!!!
##############################
diff --git a/app/helpers/table_builder_helper.rb b/app/helpers/table_builder_helper.rb
index e2aa2e9ea..8c73cb33c 100644
--- a/app/helpers/table_builder_helper.rb
+++ b/app/helpers/table_builder_helper.rb
@@ -153,7 +153,7 @@ module TableBuilderHelper
i = columns.index(column)
if overhead[i].blank?
- if (i > 0) && (overhead[i - 1][:width] > 1)
+ if (i > 0) && overhead[i - 1][:width] && (overhead[i - 1][:width] > 1)
clsArrayH = overhead[i - 1][:cls].split
hcont << content_tag(:th, build_column_header(
@@ -225,7 +225,7 @@ module TableBuilderHelper
if column.linkable?
path = column.link_to(item)
- link = value.present? && path.present? ? link_to(value, path) : ""
+ link = value.present? && path.present? ? link_to(value, path) : value
if overhead.empty?
bcont << content_tag(:td, link, title: 'Voir', class: extra_class)
@@ -234,7 +234,7 @@ module TableBuilderHelper
i = columns.index(column)
if overhead[i].blank?
- if (i > 0) && (overhead[i - 1][:width] > 1)
+ if (i > 0) && overhead[i - 1][:width] && (overhead[i - 1][:width] > 1)
clsArrayAlt = overhead[i - 1][:cls].split
bcont << content_tag(:td, link, title: 'Voir', class: td_cls(clsArrayAlt, extra_class))
diff --git a/app/models/concerns/iev_interfaces/resource.rb b/app/models/concerns/iev_interfaces/resource.rb
index 7f8c3eefd..254f88a33 100644
--- a/app/models/concerns/iev_interfaces/resource.rb
+++ b/app/models/concerns/iev_interfaces/resource.rb
@@ -4,6 +4,24 @@ module IevInterfaces::Resource
included do
extend Enumerize
enumerize :status, in: %i(OK ERROR WARNING IGNORED), scope: true
- validates_presence_of :name, :resource_type, :reference
+ validates_presence_of :name, :resource_type
+ end
+
+ def update_status_from_importer importer_status
+ self.update status: status_from_importer(importer_status)
+ end
+
+ def status_from_importer importer_status
+ return nil unless importer_status.present?
+ {
+ new: nil,
+ pending: nil,
+ successful: :OK,
+ warning: :WARNING,
+ failed: :ERROR,
+ running: nil,
+ aborted: :ERROR,
+ canceled: :ERROR
+ }[importer_status.to_sym]
end
end
diff --git a/app/models/import/base.rb b/app/models/import/base.rb
index f98e359d4..333fb0f56 100644
--- a/app/models/import/base.rb
+++ b/app/models/import/base.rb
@@ -39,6 +39,14 @@ class Import::Base < ApplicationModel
private
+ def failed!
+ update status: :failed
+ end
+
+ def aborted!
+ update status: :aborted
+ end
+
def initialize_fields
super
self.token_download ||= SecureRandom.urlsafe_base64
diff --git a/app/models/import/gtfs.rb b/app/models/import/gtfs.rb
index ceb849bd8..e1bac36a6 100644
--- a/app/models/import/gtfs.rb
+++ b/app/models/import/gtfs.rb
@@ -1,10 +1,28 @@
class Import::Gtfs < Import::Base
after_commit :launch_worker, :on => :create
+ after_commit do
+ main_resource.update_status_from_importer self.status
+ true
+ end
+
def launch_worker
GtfsImportWorker.perform_async id
end
+ def main_resource
+ @resource ||= parent.resources.find_or_create_by(name: self.name, resource_type: "referential", reference: self.name)
+ end
+
+ def notify_parent
+ super
+ main_resource.update_status_from_importer self.status
+ end
+
+ def create_message args
+ main_resource.messages.create args
+ end
+
def import
update status: 'running', started_at: Time.now
@@ -35,6 +53,7 @@ class Import::Gtfs < Import::Base
workbench_id: workbench.id,
metadatas: [referential_metadata]
)
+ main_resource.update referential: referential
end
def referential_metadata
@@ -131,17 +150,21 @@ class Import::Gtfs < Import::Base
end
def import_agencies
+ count = 0
Chouette::Company.transaction do
source.agencies.each do |agency|
company = line_referential.companies.find_or_initialize_by(registration_number: agency.id)
company.attributes = { name: agency.name }
save_model company
+ count += 1
end
end
+ create_message criticity: "info", message_key: "gtfs.agencies.imported", message_attributes: {count: count}
end
def import_stops
+ count = 0
Chouette::StopArea.transaction do
source.stops.each do |stop|
stop_area = stop_area_referential.stop_areas.find_or_initialize_by(registration_number: stop.id)
@@ -155,11 +178,14 @@ class Import::Gtfs < Import::Base
# TODO correct default timezone
save_model stop_area
+ count += 1
end
+ create_message criticity: "info", message_key: "gtfs.stops.imported", message_attributes: {count: count}
end
end
def import_routes
+ count = 0
Chouette::Line.transaction do
source.routes.each do |route|
line = line_referential.lines.find_or_initialize_by(registration_number: route.id)
@@ -178,7 +204,9 @@ class Import::Gtfs < Import::Base
line.url = route.url
save_model line
+ count += 1
end
+ create_message criticity: "info", message_key: "gtfs.routes.imported", message_attributes: {count: count}
end
end
@@ -187,6 +215,7 @@ class Import::Gtfs < Import::Base
end
def import_trips
+ count = 0
source.trips.each_slice(100) do |slice|
slice.each do |trip|
Chouette::Route.transaction do
@@ -205,18 +234,20 @@ class Import::Gtfs < Import::Base
vehicle_journey = journey_pattern.vehicle_journeys.build route: route
vehicle_journey.published_journey_name = trip.headsign.presence || trip.id
save_model vehicle_journey
+ count += 1
time_table = referential.time_tables.find_by(id: time_tables_by_service_id[trip.service_id]) if time_tables_by_service_id[trip.service_id]
if time_table
vehicle_journey.time_tables << time_table
else
- messages.create! criticity: "warning", message_key: "gtfs.trips.unkown_service_id", message_attributes: {service_id: trip.service_id}
+ create_message criticity: "warning", message_key: "gtfs.trips.unkown_service_id", message_attributes: {service_id: trip.service_id}
end
vehicle_journey_by_trip_id[trip.id] = vehicle_journey.id
end
end
end
+ create_message criticity: "info", message_key: "gtfs.trips.imported", message_attributes: {count: count}
end
def import_stop_times
@@ -262,6 +293,7 @@ class Import::Gtfs < Import::Base
end
def import_calendars
+ count = 0
source.calendars.each_slice(500) do |slice|
Chouette::TimeTable.transaction do
slice.each do |calendar|
@@ -272,11 +304,13 @@ class Import::Gtfs < Import::Base
time_table.periods.build period_start: calendar.start_date, period_end: calendar.end_date
save_model time_table
+ count += 1
time_tables_by_service_id[calendar.service_id] = time_table.id
end
end
end
+ create_message criticity: "info", message_key: "gtfs.calendars.imported", message_attributes: {count: count}
end
def import_calendar_dates
diff --git a/app/models/import/netex.rb b/app/models/import/netex.rb
index 49554ee90..e27f1a34c 100644
--- a/app/models/import/netex.rb
+++ b/app/models/import/netex.rb
@@ -4,6 +4,11 @@ class Import::Netex < Import::Base
after_commit :call_iev_callback, on: :create
+ after_commit do
+ main_resource.update_status_from_importer self.status
+ true
+ end
+
before_save do
self.status = 'aborted' unless referential
self.referential&.failed! if self.status == 'aborted' || self.status == 'failed'
@@ -11,7 +16,22 @@ class Import::Netex < Import::Base
validates_presence_of :parent
+ def main_resource
+ @resource ||= parent.resources.find_or_create_by(name: self.name, resource_type: "referential", reference: self.name)
+ end
+
+ def notify_parent
+ super
+ main_resource.update_status_from_importer self.status
+ end
+
+ def create_message args
+ main_resource.messages.create args
+ end
+
def create_with_referential!
+ save unless persisted?
+
self.referential =
Referential.new(
name: self.name,
@@ -20,15 +40,35 @@ class Import::Netex < Import::Base
metadatas: [referential_metadata]
)
self.referential.save
- if self.referential.invalid?
+
+ if self.referential.valid?
+ main_resource.update referential: referential
+ call_iev_callback
+ save!
+ else
Rails.logger.info "Can't create referential for import #{self.id}: #{referential.inspect} #{referential.metadatas.inspect} #{referential.errors.messages}"
- if referential.metadatas.all?{|m| m.line_ids.present? && m.line_ids.empty?}
- parent.messages.create criticity: :error, message_key: "referential_creation_missing_lines", message_attributes: {referential_name: referential.name}
+ aborted!
+ if referential.metadatas.all?{|m| m.line_ids.empty? && m.line_ids.empty?}
+ create_message criticity: :error, message_key: "referential_creation_missing_lines", message_attributes: {referential_name: referential.name}
+ elsif (overlapped_referential_ids = referential.overlapped_referential_ids).any?
+ overlapped = Referential.find overlapped_referential_ids.last
+ create_message(
+ criticity: :error,
+ message_key: "referential_creation_overlapping_existing_referential",
+ message_attributes: {
+ referential_name: referential.name,
+ overlapped_name: overlapped.name,
+ overlapped_url: Rails.application.routes.url_helpers.referential_path(overlapped)
+ }
+ )
else
- parent.messages.create criticity: :error, message_key: "referential_creation", message_attributes: {referential_name: referential.name}
+ create_message(
+ criticity: :error,
+ message_key: "referential_creation",
+ message_attributes: {referential_name: referential.name},
+ resource_attributes: referential.errors.messages
+ )
end
- else
- save!
end
end
@@ -55,6 +95,7 @@ class Import::Netex < Import::Base
metadata.periodes = frame.periods
line_objectids = frame.line_refs.map { |ref| "STIF:CODIFLIGNE:Line:#{ref}" }
+ create_message criticity: :info, message_key: "referential_creation_lines_found", message_attributes: {line_objectids: line_objectids.to_sentence}
metadata.line_ids = workbench.lines.where(objectid: line_objectids).pluck(:id)
end
end
diff --git a/app/models/import/resource.rb b/app/models/import/resource.rb
index 1951daacd..e6de935ae 100644
--- a/app/models/import/resource.rb
+++ b/app/models/import/resource.rb
@@ -4,5 +4,17 @@ class Import::Resource < ApplicationModel
include IevInterfaces::Resource
belongs_to :import, class_name: Import::Base
+ belongs_to :referential
has_many :messages, class_name: "Import::Message", foreign_key: :resource_id
+
+ def root_import
+ import = self.import
+ import = import.parent while import.parent
+ import
+ end
+
+ def netex_import
+ return unless self.resource_type == "referential"
+ import.children.where(name: self.reference).last
+ end
end
diff --git a/app/models/import/workbench.rb b/app/models/import/workbench.rb
index 124b9b0d8..95d23fe5b 100644
--- a/app/models/import/workbench.rb
+++ b/app/models/import/workbench.rb
@@ -9,14 +9,18 @@ class Import::Workbench < Import::Base
end
end
+ # def main_resource
+ # @resource ||= resources.find_or_create_by(name: self.name, resource_type: "workbench_import")
+ # end
+
def import_gtfs
update_column :status, 'running'
update_column :started_at, Time.now
- Import::Gtfs.create! parent_id: self.id, workbench: workbench, file: File.new(file.path), name: "Import GTFS", creator: "Web service"
+ Import::Gtfs.create! parent_type: self.class.name, parent_id: self.id, workbench: workbench, file: File.new(file.path), name: "Import GTFS", creator: "Web service"
- update_column :status, 'successful'
- update_column :ended_at, Time.now
+ # update_column :status, 'successful'
+ # update_column :ended_at, Time.now
rescue Exception => e
Rails.logger.error "Error while processing GTFS file: #{e}"
diff --git a/app/models/referential.rb b/app/models/referential.rb
index 792353a73..76b3bd84d 100644
--- a/app/models/referential.rb
+++ b/app/models/referential.rb
@@ -26,6 +26,7 @@ class Referential < ApplicationModel
has_one :user
has_many :api_keys, class_name: 'Api::V1::ApiKey', dependent: :destroy
+ has_many :import_resources, class_name: 'Import::Resource', dependent: :destroy
belongs_to :organisation
validates_presence_of :organisation
diff --git a/app/views/import_resources/show.html.slim b/app/views/import_resources/show.html.slim
new file mode 100644
index 000000000..7fd8b4456
--- /dev/null
+++ b/app/views/import_resources/show.html.slim
@@ -0,0 +1,52 @@
+- breadcrumb :import_resource, @import_resource
+
+.page_content.import_messages
+ .container-fluid
+ .row
+ .col-lg-12
+ - metadata = { 'Bilan d\'import' => link_to(@import_resource.root_import.name, workbench_import_path(@import_resource.root_import.workbench, @import_resource.root_import) ),
+ 'Jeu de données associé' => ( @import_resource.referential.present? ? link_to(@import_resource.referential.name, referential_path(@import_resource.referential)) : '-' ) }
+ - metadata = metadata.update({t('.status') => import_status(@import_resource.status, verbose: true) })
+ = definition_list t('metadatas'), metadata
+
+
+ .col-lg-12
+ .error_messages
+ = render 'shared/iev_interfaces/messages', messages: @import_resource.messages
+
+
+ // XXX
+ //- if @import_resource.children.present?
+ - if @import_resource&.netex_import&.resources.present?
+ .col-lg-12
+ h2 = t('.table_title')
+ .col-lg-12
+ = t('.table_explanation')
+ .col-lg-12
+ = table_builder_2 @import_resource.netex_import.resources.where(resource_type: :file),
+ [ \
+ TableBuilderHelper::Column.new( \
+ key: :name, \
+ attribute: 'name', \
+ sortable: false, \
+ ), \
+ TableBuilderHelper::Column.new( \
+ key: :status, \
+ attribute: Proc.new { |n| import_resource_status(n.status) }, \
+ sortable: false, \
+ ), \
+ TableBuilderHelper::Column.new( \
+ name: 'Résultat des tests' , \
+ attribute: Proc.new { |n| I18n.t('import_resources.index.metrics', n.metrics.deep_symbolize_keys) }, \
+ sortable: false, \
+ ), \
+ TableBuilderHelper::Column.new( \
+ name: 'Téléchargement' , \
+ attribute: Proc.new { |n| ''.html_safe }, \
+ sortable: false, \
+ link_to: lambda do |import_resource| \
+ workbench_import_import_resource_import_messages_path(import_resource.import.workbench, import_resource.import, import_resource, format: 'csv' ) \
+ end \
+ ), \
+ ],
+ cls: 'table has-search'
diff --git a/app/views/imports/show.html.slim b/app/views/imports/show.html.slim
index 9d0a6423d..99458c7fe 100644
--- a/app/views/imports/show.html.slim
+++ b/app/views/imports/show.html.slim
@@ -6,55 +6,52 @@
.container-fluid
.row
.col-lg-6.col-md-6.col-sm-12.col-xs-12
- = definition_list t('metadatas'), { t('.data_recovery') => '-', t('.filename') => @import.try(:file_identifier)}
+ - metadata = { t('.data_recovery') => '-', t('.filename') => @import.try(:file_identifier)}
+ - metadata = metadata.update({t('.status') => import_status(@import.status, verbose: true) })
+ = definition_list t('metadatas'), metadata
- .row
- .col-lg-12
- .error_messages
- = render 'shared/iev_interfaces/messages', messages: @import.messages
+ .col-lg-12
+ .error_messages
+ = render 'shared/iev_interfaces/messages', messages: @import.messages
- - if @import.children.any?
- .row
- .col-lg-12
- = table_builder_2 @import.children,
- [ \
- TableBuilderHelper::Column.new( \
- name: t('.referential_name'), \
- attribute: 'name', \
- sortable: false, \
- link_to: lambda do |import| \
- referential_path(import.referential) if import.referential.present? \
- end \
- ), \
- TableBuilderHelper::Column.new( \
- key: :status, \
- attribute: Proc.new { |n| import_status(n.status) }, \
- sortable: false, \
- link_to: lambda do |import| \
- workbench_import_import_resources_path(import.workbench_id, import) \
- end \
- ), \
- TableBuilderHelper::Column.new( \
- name: t('.stif_control'), \
- attribute: '', \
- sortable: false, \
- ), \
- TableBuilderHelper::Column.new( \
- name: t('.organisation_control'), \
- attribute: '', \
- sortable: false, \
- ) \
- ],
- cls: 'table',
- overhead: [ \
- {}, \
- { \
- title: I18n.t('imports.show.results', count: @import.children_succeedeed, total: @import.children.count), \
- width: 1, \
- cls: "#{@import.import_status_css_class} full-border" \
- }, { \
- title: I18n.t('imports.show.summary').html_safe, \
- width: 2, \
- cls: 'overheaded-default colspan="2"' \
- } \
- ]
+ - if @import.resources.any?
+ .col-lg-12
+ = table_builder_2 @import.resources,
+ [ \
+ TableBuilderHelper::Column.new( \
+ name: t('.referential_name'), \
+ attribute: 'name', \
+ sortable: false, \
+ link_to: lambda do |item| \
+ referential_path(item.referential) if item.referential.present? \
+ end \
+ ), \
+ TableBuilderHelper::Column.new( \
+ key: :status, \
+ attribute: Proc.new { |n| import_status(n.status) }, \
+ sortable: false, \
+ link_to: lambda do |item| \
+ workbench_import_import_resource_path(@import.workbench_id, @import, item) \
+ end \
+ ), \
+ TableBuilderHelper::Column.new( \
+ name: t('.stif_control'), \
+ attribute: '', \
+ sortable: false, \
+ ), \
+ TableBuilderHelper::Column.new( \
+ name: t('.organisation_control'), \
+ attribute: '', \
+ sortable: false, \
+ ) \
+ ],
+ cls: 'table',
+ overhead: [ \
+ {}, \
+ {}, \
+ { \
+ title: I18n.t('imports.show.summary').html_safe, \
+ width: 2, \
+ cls: 'overheaded-default colspan="2"' \
+ } \
+ ]
diff --git a/app/workers/workbench_import_worker/object_state_updater.rb b/app/workers/workbench_import_worker/object_state_updater.rb
index 1edc6b9a1..39d5f20b1 100644
--- a/app/workers/workbench_import_worker/object_state_updater.rb
+++ b/app/workers/workbench_import_worker/object_state_updater.rb
@@ -2,6 +2,11 @@
class WorkbenchImportWorker
module ObjectStateUpdater
+ def resource entry
+ @_resources ||= {}
+ @_resources[entry.name] ||= workbench_import.resources.find_or_create_by(name: entry.name, resource_type: "referential")
+ end
+
def update_object_state entry, count
workbench_import.update( total_steps: count )
update_spurious entry
@@ -14,44 +19,48 @@ class WorkbenchImportWorker
def update_foreign_lines entry
return if entry.foreign_lines.empty?
- workbench_import.messages.create(
+ resource(entry).messages.create(
criticity: :error,
message_key: 'foreign_lines_in_referential',
message_attributes: {
'source_filename' => workbench_import.file.file.file,
'foreign_lines' => entry.foreign_lines.join(', ')
})
+ resource(entry).update status: :ERROR
end
def update_spurious entry
return if entry.spurious.empty?
- workbench_import.messages.create(
+ resource(entry).messages.create(
criticity: :error,
message_key: 'inconsistent_zip_file',
message_attributes: {
'source_filename' => workbench_import.file.file.file,
'spurious_dirs' => entry.spurious.join(', ')
})
+ resource(entry).update status: :ERROR
end
def update_missing_calendar entry
return unless entry.missing_calendar
- workbench_import.messages.create(
+ resource(entry).messages.create(
criticity: :error,
message_key: 'missing_calendar_in_zip_file',
message_attributes: {
'source_filename' => entry.name
})
+ resource(entry).update status: :ERROR
end
def update_wrong_calendar entry
return unless entry.wrong_calendar
- workbench_import.messages.create(
+ resource(entry).messages.create(
criticity: :error,
message_key: 'wrong_calendar_in_zip_file',
message_attributes: {
'source_filename' => entry.name
})
+ resource(entry).update status: :ERROR
end
end
end
diff --git a/config/breadcrumbs.rb b/config/breadcrumbs.rb
index e60ff187f..6285be71c 100644
--- a/config/breadcrumbs.rb
+++ b/config/breadcrumbs.rb
@@ -131,6 +131,11 @@ crumb :import_resources do |import, import_resources|
parent :import, import.workbench, import.parent
end
+crumb :import_resource do |import_resource|
+ link I18n.t('import.resources.index.title'), workbench_import_import_resource_path(import_resource.root_import.workbench, import_resource.root_import, import_resource)
+ parent :import, import_resource.root_import.workbench, import_resource.root_import
+end
+
crumb :organisation do |organisation|
link breadcrumb_name(organisation), organisation_path(organisation)
end
diff --git a/config/locales/import_messages.fr.yml b/config/locales/import_messages.fr.yml
index 5d82b9125..c05b8dc85 100644
--- a/config/locales/import_messages.fr.yml
+++ b/config/locales/import_messages.fr.yml
@@ -4,8 +4,21 @@ fr:
inconsistent_zip_file: "Le fichier zip contient des repertoires non prévus : %{spurious_dirs} qui seront ignorés"
missing_calendar_in_zip_file: "Le dossier %{source_filename} ne contient pas de calendrier"
wrong_calendar_in_zip_file: "Le calendrier contenu dans %{source_filename} contient des données incorrectes ou incohérentes"
- referential_creation: "Le référentiel %{referential_name} n'a pas pu être créé car un référentiel existe déjà sur les mêmes périodes et lignes"
+ referential_creation: "Le référentiel %{referential_name} n'a pas pu être créé."
+ referential_creation_overlapping_existing_referential: "Le référentiel %{referential_name} n'a pas pu être créé car un référentiel existe déjà sur les mêmes périodes et lignes: %{overlapped_name}"
referential_creation_missing_lines: "Le référentiel %{referential_name} n'a pas pu être créé car aucune ligne ne correspond"
+ referential_creation_lines_found: "Lignes lues dans le dossier: %{line_objectids}"
+ gtfs:
+ agencies:
+ imported: "%{count} agence(s) importée(s)"
+ stops:
+ imported: "%{count} arrêt(s) importé(s)"
+ routes:
+ imported: "%{count} itinéraire(s) importé(s)"
+ trips:
+ imported: "%{count} course(s) importé(s)"
+ calendars:
+ imported: "%{count} calndrier(s) importé(s)"
1_netexstif_2: "Le fichier %{source_filename} ne respecte pas la syntaxe XML ou la XSD NeTEx : erreur '%{error_value}' rencontré"
1_netexstif_5: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} a une date de mise à jour dans le futur"
2_netexstif_1_1: "Le fichier commun.xml ne contient pas de frame nommée NTEX_COMMUN"
diff --git a/config/locales/import_resources.fr.yml b/config/locales/import_resources.fr.yml
index 93a576f01..8ddb3fb6b 100644
--- a/config/locales/import_resources.fr.yml
+++ b/config/locales/import_resources.fr.yml
@@ -1,12 +1,17 @@
fr:
import:
resources: &resources
- index:
- title: "Rapport de conformité NeTEx"
+ table: &table
table_state: "%{lines_imported} ligne(s) importée(s) sur %{lines_in_zipfile} présente(s) dans l'archive"
table_title: "Etat des fichiers analysés"
table_explanation: "Dans le cas ou le(s) fichiers calendriers.xml et/ou commun.xml sont dans un état non importé, alors tous les fichiers lignes sont automatiquement dans un état non traité."
+ index:
+ <<: *table
+ title: "Rapport de conformité NeTEx"
metrics: "%{error_count} errors, %{warning_count} warnings"
+ show:
+ <<: *table
+ title: Rapport d'import
import_resources:
<<: *resources
activerecord:
diff --git a/config/locales/imports.en.yml b/config/locales/imports.en.yml
index c8683a2a7..344ee05a8 100644
--- a/config/locales/imports.en.yml
+++ b/config/locales/imports.en.yml
@@ -41,6 +41,16 @@ en:
warning: "Warning"
error: "Error"
fatal: "Fatal"
+ status:
+ new: New
+ pending: Pending
+ successful: Successful
+ ok: Successful
+ warning: Warning
+ failed: Failed
+ running: Running
+ aborted: Aborted
+ canceled: Canceled
activerecord:
models:
import:
diff --git a/config/locales/imports.fr.yml b/config/locales/imports.fr.yml
index 733254fa4..870896111 100644
--- a/config/locales/imports.fr.yml
+++ b/config/locales/imports.fr.yml
@@ -41,6 +41,17 @@ fr:
warning: "Alerte"
error: "Erreur"
fatal: "Fatal"
+ status:
+ new: Nouveau
+ pending: En attente
+ successful: Succès
+ ok: Succès
+ warning: Avertissement
+ failed: Échec
+ error: Échec
+ running: En cours
+ aborted: Annulé
+ canceled: Annulé
import:
base:
<<: *imports
diff --git a/config/routes.rb b/config/routes.rb
index 41b345aa5..cde1701f8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -5,7 +5,7 @@ ChouetteIhm::Application.routes.draw do
delete :referentials, on: :member, action: :delete_referentials
resources :imports do
get :download, on: :member
- resources :import_resources, only: [:index] do
+ resources :import_resources, only: [:index, :show] do
resources :import_messages, only: [:index]
end
end
diff --git a/db/migrate/20180412095756_add_referentials_to_import_resources.rb b/db/migrate/20180412095756_add_referentials_to_import_resources.rb
new file mode 100644
index 000000000..b99bed08a
--- /dev/null
+++ b/db/migrate/20180412095756_add_referentials_to_import_resources.rb
@@ -0,0 +1,5 @@
+class AddReferentialsToImportResources < ActiveRecord::Migration
+ def change
+ add_reference :import_resources, :referential, index: true, foreign_key: true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index a39cb1689..9a94dc270 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -18,6 +18,7 @@ ActiveRecord::Schema.define(version: 20180425160730) do
enable_extension "postgis"
enable_extension "hstore"
enable_extension "unaccent"
+ enable_extension "objectid"
create_table "access_links", id: :bigserial, force: :cascade do |t|
t.integer "access_point_id", limit: 8
--
cgit v1.2.3