aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/csv_import.rb4
-rw-r--r--app/models/gtfs_import.rb7
-rw-r--r--app/models/import.rb68
-rw-r--r--app/models/import_report.rb22
-rw-r--r--app/models/import_task.rb369
-rw-r--r--app/models/neptune_import.rb1
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