diff options
Diffstat (limited to 'app/models/import')
| -rw-r--r-- | app/models/import/base.rb | 8 | ||||
| -rw-r--r-- | app/models/import/gtfs.rb | 36 | ||||
| -rw-r--r-- | app/models/import/netex.rb | 53 | ||||
| -rw-r--r-- | app/models/import/resource.rb | 12 | ||||
| -rw-r--r-- | app/models/import/workbench.rb | 10 | 
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}" | 
