aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/import
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/import')
-rw-r--r--app/models/import/base.rb8
-rw-r--r--app/models/import/gtfs.rb36
-rw-r--r--app/models/import/netex.rb53
-rw-r--r--app/models/import/resource.rb12
-rw-r--r--app/models/import/workbench.rb10
5 files changed, 109 insertions, 10 deletions
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}"