diff options
Diffstat (limited to 'app/models/import_task.rb')
| -rw-r--r-- | app/models/import_task.rb | 369 | 
1 files changed, 240 insertions, 129 deletions
| 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 | 
