diff options
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/csv_import.rb | 4 | ||||
| -rw-r--r-- | app/models/gtfs_import.rb | 7 | ||||
| -rw-r--r-- | app/models/import.rb | 68 | ||||
| -rw-r--r-- | app/models/import_report.rb | 22 | ||||
| -rw-r--r-- | app/models/import_task.rb | 369 | ||||
| -rw-r--r-- | app/models/neptune_import.rb | 1 |
6 files changed, 295 insertions, 176 deletions
diff --git a/app/models/csv_import.rb b/app/models/csv_import.rb index 69603b237..2635fee71 100644 --- a/app/models/csv_import.rb +++ b/app/models/csv_import.rb @@ -1,6 +1,6 @@ class CsvImport < ImportTask + attr_accessor :object_id_prefix validates_presence_of :object_id_prefix - option :object_id_prefix - + end diff --git a/app/models/gtfs_import.rb b/app/models/gtfs_import.rb index c2457548f..3fe7dcea7 100644 --- a/app/models/gtfs_import.rb +++ b/app/models/gtfs_import.rb @@ -1,11 +1,8 @@ class GtfsImport < ImportTask + attr_accessor :object_id_prefix, :max_distance_for_commercial, :ignore_last_word, :ignore_end_chars, :max_distance_for_connection_link + validates_presence_of :object_id_prefix - option :object_id_prefix - option :max_distance_for_commercial - option :ignore_last_word - option :ignore_end_chars - option :max_distance_for_connection_link def references_types [ Chouette::StopArea ] diff --git a/app/models/import.rb b/app/models/import.rb index f445faa3e..9629881d3 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -3,7 +3,7 @@ class Import extend ActiveModel::Naming include ActiveModel::Model - # enumerize :status, in: %w{created scheduled terminated canceled aborted}, default: "created", predicates: true + # enumerize :status, in: %w{started scheduled terminated canceled aborted}, default: "created", predicates: true # enumerize :format, in: %w{neptune netex gtfs}, default: "neptune", predicates: true attr_reader :datas @@ -12,10 +12,18 @@ class Import @datas = response # @status = @datas.status.downcase if @datas.status? # @format = @datas.type.downcase if @datas.type? - end + end + + def links + {}.tap do |links| + datas.links.each do |link| + links[link["rel"]] = link["href"] + end + end + end def report - report_path = datas.links.select{ |link| link["rel"] == "action_report"}.first.href + report_path = links["action_report"] if report_path response = Ievkit.get(report_path) ImportReport.new(response) @@ -25,7 +33,7 @@ class Import end def compliance_check - compliance_check_path = datas.links.select{ |link| link["rel"] == "validation_report"}.first.href + compliance_check_path = links["validation_report"] if compliance_check_path response = Ievkit.get(compliance_check_path) ComplianceCheck.new(response) @@ -34,21 +42,20 @@ class Import end end - def delete - delete_path = datas.links.select{ |link| link["rel"] == "delete"}.first.href - if delete_path - Ievkit.delete(delete_path) - else - raise Ievkit::Error("Impossible to access delete path link for import") - end + def file_path + links["data"] end - def cancel - cancel_path = datas.links.select{ |link| link["rel"] == "cancel"}.first.href - if cancel_path + def destroy + delete_path = links["delete"] + cancel_path = links["cancel"] + + if delete_path + Ievkit.delete(delete_path) + elsif cancel_path Ievkit.delete(cancel_path) else - raise Ievkit::Error("Impossible to access cancel path link for import") + raise Ievkit::Error("Impossible to access delete path link for import") end end @@ -57,7 +64,7 @@ class Import end def status - datas.status + datas.status.downcase end def format @@ -65,21 +72,11 @@ class Import end def filename - datas.links.select{ |link| link["rel"] == "data"}.first.href.gsub( /\/.*\//, "" ) + links["data"].gsub( /\/.*\//, "" ) if links["data"] end def filename_extension - File.extname(filename) if filename - end - - def percentage_progress - if %w{created}.include? status - 0 - elsif %w{ terminated canceled aborted }.include? status - 100 - else - 20 - end + File.extname(filename).gsub(".", "") if filename end def referential_name @@ -97,20 +94,13 @@ class Import def no_save datas.action_parameters.no_save end - - def created_at? - datas.created? - end - def created_at - Time.at(datas.created.to_i / 1000) if created_at? - end - - def updated_at? - datas.updated? + def created_at + Time.at(datas.created.to_i / 1000) if datas.created end def updated_at - Time.at(datas.updated.to_i / 1000) if updated_at? + Time.at(datas.updated.to_i / 1000) if datas.updated end + end diff --git a/app/models/import_report.rb b/app/models/import_report.rb index 411aa3a4f..fff209e8e 100644 --- a/app/models/import_report.rb +++ b/app/models/import_report.rb @@ -5,7 +5,27 @@ class ImportReport attr_reader :datas def initialize( response ) - @datas = response[:action_report] + @datas = response.action_report + end + + def current_level + datas.progression.current_step if datas.progression + end + + def last_step + datas.progression.steps.last if datas.progression + end + + def current_step_name + last_step.step if last_step + end + + def current_step + last_step.realized if last_step + end + + def total_steps + last_step.total if last_step end def zip_file diff --git a/app/models/import_task.rb b/app/models/import_task.rb index 26b3808c7..d53c04766 100644 --- a/app/models/import_task.rb +++ b/app/models/import_task.rb @@ -1,173 +1,284 @@ -class ImportTask < ActiveRecord::Base - attr_accessor :resources, :rule_parameter_set_id +require "zip" - belongs_to :referential +class ImportTask + extend Enumerize + extend ActiveModel::Naming + include ActiveModel::Validations + include ActiveModel::Conversion - has_one :user - has_one :compliance_check_task, :dependent => :delete - - serialize :parameter_set, JSON - serialize :result, JSON + # TODO : Move in configuration + @@root = "#{Rails.root}/tmp/imports" + cattr_accessor :root + attr_accessor :rule_parameter_set_id, :referential_id, :user_id, :user_name, :no_save, :format, :resources, :name + validates_presence_of :referential_id validates_presence_of :resources validates_presence_of :user_id validates_presence_of :user_name - validates_inclusion_of :status, :in => %w{ pending processing completed failed } - - def references_types - [] - end - - protected - - def self.option(name, type=nil) - name = name.to_s - - define_method(name) do - self.parameter_set and self.parameter_set[name] - end - - if type.to_s == "boolean" - define_method("#{name}=") do |prefix| - (self.parameter_set ||= {})[name] = (prefix=="1" || prefix==true) - end - else - define_method("#{name}=") do |prefix| - (self.parameter_set ||= {})[name] = prefix - end - end + validates_presence_of :no_save + validates_presence_of :name + + def initialize( params = {} ) + params.each {|k,v| send("#{k}=",v)} end - public - - def self.formats - %w{Neptune Csv Gtfs Netex} + def referential + Referential.find(referential_id) end - def self.format_label(format) - I18n.t 'exchange.format.'+format.downcase + def organisation + referential.organisation end - def delayed_import - delay.import + def rule_parameter_set + organisation.rule_parameter_sets.find(rule_parameter_set_id) if rule_parameter_set_id.present? end - def save_requested? - !parameter_set["no_save"] + def save + # Save resources + save_resources + + # Call Iev Server + begin + Ievkit.create_job(referential.name, "importer", "neptune", { + :file1 => action_params_io, + :file2 => transport_data_io + } + + ) + + # Delete resources + delete_resources + rescue Exception => exception + # If iev server has an error must delete resources before + delete_resources + + raise exception + end + puts "End save" end - protected - - option :no_save, :boolean - option :format - option :file_path - option :references_type - - validates_inclusion_of :no_save, :in => [ true, false] - validates_inclusion_of :format, :in => self.formats - - def chouette_command - Chouette::Command.new(:schema => referential.slug) + def references_types + [] end - - before_validation :define_default_attributes, :on => :create - def define_default_attributes - self.status ||= "pending" + + def action_params_io + file = StringIO.new( { "parameters" => { + "neptune-import" => { + "no_save" => no_save, + "user_name" => user_name, + "name" => name, + "organisation_name" => organisation.name, + "referential_name" => referential.name, + } + } + }.to_s ) + Faraday::UploadIO.new(file, "application/json", "parameters.json") end - @@root = "#{Rails.root}/tmp/imports" - cattr_accessor :root - - def compliance_check_task_attributes - {:referential_id => referential.id, - :user_id => user_id, - :user_name => user_name, - :rule_parameter_set_id => rule_parameter_set_id} + def transport_data_io + if file_extname == ".zip" + Faraday::UploadIO.new(saved_resources_path, "application/zip") + elsif file_extname == ".xml" + Faraday::UploadIO.new(File.open(saved_resources_path), "application/xml", "10136939.xml") + end end - after_create :update_info, :save_resources - def update_info - self.file_path = saved_resources - self.update_attribute :parameter_set, self.parameter_set - - self.create_compliance_check_task( self.compliance_check_task_attributes) + # TODO : How to find RuleParameterSet + def rule_parameter_set_io + UploadIO.new(rule_parameter_set.parameters, "application/octet-stream", "rule_parameter_set") if rule_parameter_set.present? end def save_resources # resources is a required attribute FileUtils.mkdir_p root - FileUtils.cp resources.path, saved_resources + FileUtils.cp resources.path, saved_resources_path end - after_destroy :destroy_resources - def destroy_resources - FileUtils.rm file_path if File.exists? file_path + def delete_resources + FileUtils.rm saved_resources_path if File.exists? saved_resources_path end - def saved_resources - raise Exception.new("Illegal call") if self.new_record? - "#{root}/#{id}#{File.extname(resources.original_filename)}" + def file_extname + File.extname(resources.original_filename) end - def chouette_command_args - {:c => "import", :id => id} + # TODO : Find a good filename + def saved_resources_path + "#{root}/#{Time.now.to_i}#{file_extname}" end - public + + # attr_accessor :resources, :rule_parameter_set_id - def failed? - status == "failed" - end + # belongs_to :referential - def completed? - status == "completed" - end + # has_one :user + # has_one :compliance_check_task, :dependent => :delete - def file_path_extension - extension = File.extname( self.file_path ) - if extension == ".xml" - "xml" - elsif extension == ".zip" - "zip" - else - "basic" - end - end + # serialize :parameter_set, JSON + # serialize :result, JSON + + # validates_presence_of :referential_id + # validates_presence_of :resources + # validates_presence_of :user_id + # validates_presence_of :user_name + # validates_inclusion_of :status, :in => %w{ pending processing completed failed } - def name - "#{ImportTask.model_name.human} #{self.format} #{self.id}" - end + # def references_types + # [] + # end - def full_name - return name unless no_save - "#{name} - #{I18n.t('activerecord.attributes.import_task.no_save')}" - end + # protected - # Create ImportTask and ComplianceCheckTask associated and give import id to Chouette Loader - def import - return nil if self.new_record? - - begin - chouette_command.run! chouette_command_args - reload - update_attribute :status, "completed" - compliance_check_task.update_attribute :status, "completed" - rescue => e - Rails.logger.error "Import #{id} failed : #{e}, #{e.backtrace}" - reload - update_attribute :status, "failed" - compliance_check_task.update_attribute :status, "failed" - end - end + # def self.option(name, type=nil) + # name = name.to_s - def self.new(attributes = {}, parameter_set = {}, &block) - if self == ImportTask - attributes[:format] = "Neptune" unless attributes[:format] - Object.const_get( attributes[:format] + "Import").new(attributes, parameter_set) - else - super - end - end + # define_method(name) do + # self.parameter_set and self.parameter_set[name] + # end + + # if type.to_s == "boolean" + # define_method("#{name}=") do |prefix| + # (self.parameter_set ||= {})[name] = (prefix=="1" || prefix==true) + # end + # else + # define_method("#{name}=") do |prefix| + # (self.parameter_set ||= {})[name] = prefix + # end + # end + # end + + # public + + # def self.formats + # %w{Neptune Csv Gtfs Netex} + # end + + # def self.format_label(format) + # I18n.t 'exchange.format.'+format.downcase + # end + + # def delayed_import + # delay.import + # end + + # def save_requested? + # !parameter_set["no_save"] + # end + + # protected + + # option :no_save, :boolean + # option :format + # option :file_path + # option :references_type + + # validates_inclusion_of :no_save, :in => [ true, false] + # validates_inclusion_of :format, :in => self.formats + + # def chouette_command + # Chouette::Command.new(:schema => referential.slug) + # end + + # before_validation :define_default_attributes, :on => :create + # def define_default_attributes + # self.status ||= "pending" + # end + + # @@root = "#{Rails.root}/tmp/imports" + # cattr_accessor :root + + # def compliance_check_task_attributes + # {:referential_id => referential.id, + # :user_id => user_id, + # :user_name => user_name, + # :rule_parameter_set_id => rule_parameter_set_id} + # end + + # after_create :update_info, :save_resources + # def update_info + # self.file_path = saved_resources + # self.update_attribute :parameter_set, self.parameter_set + + # self.create_compliance_check_task( self.compliance_check_task_attributes) + # end + + # def save_resources + # # resources is a required attribute + # FileUtils.mkdir_p root + # FileUtils.cp resources.path, saved_resources + # end + + # after_destroy :destroy_resources + # def destroy_resources + # FileUtils.rm file_path if File.exists? file_path + # end + + # def saved_resources + # raise Exception.new("Illegal call") if self.new_record? + # "#{root}/#{id}#{File.extname(resources.original_filename)}" + # end + + # def chouette_command_args + # {:c => "import", :id => id} + # end + + # public + + # def failed? + # status == "failed" + # end + + # def completed? + # status == "completed" + # end + + # def file_path_extension + # extension = File.extname( self.file_path ) + # if extension == ".xml" + # "xml" + # elsif extension == ".zip" + # "zip" + # else + # "basic" + # end + # end + + # def name + # "#{ImportTask.model_name.human} #{self.format} #{self.id}" + # end + + # def full_name + # return name unless no_save + # "#{name} - #{I18n.t('activerecord.attributes.import_task.no_save')}" + # end + + # # Create ImportTask and ComplianceCheckTask associated and give import id to Chouette Loader + # def import + # return nil if self.new_record? + + # begin + # chouette_command.run! chouette_command_args + # reload + # update_attribute :status, "completed" + # compliance_check_task.update_attribute :status, "completed" + # rescue => e + # Rails.logger.error "Import #{id} failed : #{e}, #{e.backtrace}" + # reload + # update_attribute :status, "failed" + # compliance_check_task.update_attribute :status, "failed" + # end + # end + + # def self.new(attributes = {}, parameter_set = {}, &block) + # if self == ImportTask + # attributes[:format] = "Neptune" unless attributes[:format] + # Object.const_get( attributes[:format] + "Import").new(attributes, parameter_set) + # else + # super + # end + # end end diff --git a/app/models/neptune_import.rb b/app/models/neptune_import.rb index 24e3355d7..eab34e777 100644 --- a/app/models/neptune_import.rb +++ b/app/models/neptune_import.rb @@ -1,4 +1,5 @@ class NeptuneImport < ImportTask + # def import_options # super.merge() # end |
