diff options
25 files changed, 451 insertions, 647 deletions
| diff --git a/app/assets/stylesheets/main/import_tasks.css.scss b/app/assets/stylesheets/main/import_tasks.css.scss new file mode 100644 index 000000000..3a0d48ddf --- /dev/null +++ b/app/assets/stylesheets/main/import_tasks.css.scss @@ -0,0 +1,13 @@ +#workspace.import_tasks.new, #workspace.import_tasks.create { +  .nav{ +    margin: 30px 0 10px 0;    +  } + +  .highlight { +    padding: 9px 14px; +    margin-bottom: 14px; +    background-color: #f7f7f9; +    border: 1px solid #e1e1e8; +    border-radius: 4px; +  } +} diff --git a/app/controllers/import_tasks_controller.rb b/app/controllers/import_tasks_controller.rb index 2e0b325c7..617721956 100644 --- a/app/controllers/import_tasks_controller.rb +++ b/app/controllers/import_tasks_controller.rb @@ -1,10 +1,13 @@ +# coding: utf-8  class ImportTasksController < ChouetteController    defaults :resource_class => ImportTask -  respond_to :html +  respond_to :html, :only => [:new, :create] +  respond_to :js, :only => [:new, :create]    belongs_to :referential    def new +    @available_imports = available_imports      begin        new!      rescue Ievkit::Error => error @@ -15,23 +18,44 @@ class ImportTasksController < ChouetteController    end    def create -    #begin -      neptune_import = NeptuneImport.new(params[:import_task]) -      neptune_import.save -    # rescue Ievkit::Error => error -    #   logger.error("Iev failure : #{error.message}") -    #   flash[:error] = t('iev.failure') -    #   redirect_to referential_path(@referential) -    # end +    begin             +      create! do |success, failure| +        success.html { redirect_to referential_imports_path(@referential) } +      end +    rescue Ievkit::Error => error +      logger.error("Iev failure : #{error.message}") +      flash[:error] = t('iev.failure') +      redirect_to referential_path(@referential) +    end    end    protected -  def build_resource(attributes = {}) -    @csv_import ||= CsvImport.new(:referential_id => @referential.id ) -    @neptune_import ||= NeptuneImport.new(:referential_id => @referential.id ) -    @netex_import ||= NetexImport.new(:referential_id => @referential.id ) -    @gtfs_import ||= GtfsImport.new(:referential_id => @referential.id ) +  def available_imports +    @available_imports ||= [ +      NeptuneImport.new(:referential_id => @referential.id ), +      NetexImport.new(:referential_id => @referential.id ), +      GtfsImport.new(:referential_id => @referential.id ) +    ] +  end +   +  def build_resource +    import_task_parameters = params[:import_task] +     +    if import_task_parameters.present? +      case import_task_parameters[:data_format] +      when "neptune" +        @import_task = NeptuneImport.new(import_task_parameters) +      when "netex" +        @import_task = NetexImport.new(import_task_parameters) +      when "gtfs" +        @import_task = GtfsImport.new(import_task_parameters) +      else +        @import_task = nil +      end +    else +      @import_task = nil +    end    end  end diff --git a/app/models/export_task.rb b/app/models/export_task.rb index 0ca3b49b3..eaa73f63d 100644 --- a/app/models/export_task.rb +++ b/app/models/export_task.rb @@ -46,7 +46,7 @@ class ExportTask      end    end -  def self.formats +  def self.data_formats      self.data_format.values    end diff --git a/app/models/gtfs_import.rb b/app/models/gtfs_import.rb index 3fe7dcea7..434fa3b3d 100644 --- a/app/models/gtfs_import.rb +++ b/app/models/gtfs_import.rb @@ -1,11 +1,39 @@  class GtfsImport < ImportTask -  attr_accessor :object_id_prefix, :max_distance_for_commercial, :ignore_last_word,  :ignore_end_chars, :max_distance_for_connection_link +  enumerize :references_type, in: %w( all stoparea ) +   +  attr_accessor :object_id_prefix, :max_distance_for_commercial, :ignore_last_word,  :ignore_end_chars, :max_distance_for_connection_link, :references_type    validates_presence_of :object_id_prefix +  validates_presence_of :references_type    def references_types -    [ Chouette::StopArea ] +    self.references_type.values +  end + +  def action_params   +    { "parameters" => +        { +          "gtfs-import" => { +            "no_save" => false, +            "user_name" => user_name, +            "name" => name, +            "organisation_name" => organisation.name, +            "referential_name" => referential.name, +            "object_id_prefix" => object_id_prefix, +            "max_distance_for_commercial" => max_distance_for_commercial, +            "ignore_last_word" => ignore_last_word, +            "ignore_end_chars" => ignore_end_chars, +            "max_distance_for_connection_link" => max_distance_for_connection_link, +            "references_type" => references_type             +          } +        } +    } +  end +   + +  def data_format +    "gtfs"    end  end diff --git a/app/models/import_task.rb b/app/models/import_task.rb index d53c04766..1df264010 100644 --- a/app/models/import_task.rb +++ b/app/models/import_task.rb @@ -10,13 +10,13 @@ class ImportTask    @@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 +  enumerize :data_format, in: %w( neptune netex gtfs ) +  attr_accessor :rule_parameter_set_id, :referential_id, :user_id, :user_name, :data_format, :resources, :name    validates_presence_of :referential_id    validates_presence_of :resources    validates_presence_of :user_id    validates_presence_of :user_name -  validates_presence_of :no_save    validates_presence_of :name    def initialize( params = {} ) @@ -41,7 +41,7 @@ class ImportTask      # Call Iev Server      begin  -      Ievkit.create_job(referential.name, "importer", "neptune", { +      Ievkit.create_job(referential.name, "importer", data_format, {                                                    :file1 => action_params_io,                                                    :file2 => transport_data_io                          } @@ -56,32 +56,30 @@ class ImportTask        raise exception      end -    puts "End save"    end -  def references_types -    [] +  def action_params +    { +      "parameters" => {} +    } +  end + +   +  def self.data_formats +    self.data_format.values    end    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 ) +    file = StringIO.new( action_params.to_s )      Faraday::UploadIO.new(file, "application/json", "parameters.json")    end    def transport_data_io +    file = File.new(saved_resources_path, "r")      if file_extname == ".zip" -      Faraday::UploadIO.new(saved_resources_path, "application/zip") +      Faraday::UploadIO.new(file, "application/zip", original_filename )      elsif file_extname == ".xml" -      Faraday::UploadIO.new(File.open(saved_resources_path), "application/xml", "10136939.xml") +      Faraday::UploadIO.new(file, "application/xml", original_filename )      end       end @@ -91,7 +89,6 @@ class ImportTask    end    def save_resources -    # resources is a required attribute      FileUtils.mkdir_p root      FileUtils.cp resources.path, saved_resources_path    end @@ -100,185 +97,16 @@ class ImportTask      FileUtils.rm saved_resources_path if File.exists? saved_resources_path    end +  def original_filename +    resources.original_filename +  end +      def file_extname      File.extname(resources.original_filename)    end -  # TODO : Find a good filename    def saved_resources_path      "#{root}/#{Time.now.to_i}#{file_extname}"    end -   -  # attr_accessor :resources, :rule_parameter_set_id - -  # belongs_to :referential - -  # has_one :user -  # has_one :compliance_check_task, :dependent => :delete - -  # 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 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 -  # 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 eab34e777..ae5350eee 100644 --- a/app/models/neptune_import.rb +++ b/app/models/neptune_import.rb @@ -1,7 +1,21 @@  class NeptuneImport < ImportTask -  # def import_options -  #   super.merge() -  # end +  def action_params   +    { "parameters" => +        { +          "neptune-import" => { +            "no_save" => false, +            "user_name" => user_name, +            "name" => name, +            "organisation_name" => organisation.name, +            "referential_name" => referential.name, +          } +        } +    } +  end +     +  def data_format +    "neptune" +  end  end diff --git a/app/models/netex_import.rb b/app/models/netex_import.rb index cc09fd496..cc20ef269 100644 --- a/app/models/netex_import.rb +++ b/app/models/netex_import.rb @@ -1,7 +1,21 @@  class NetexImport < ImportTask -  # def import_options -  #   super.merge(:format => :netex) -  # end +  def action_params   +    { "parameters" => +        { +          "netex-import" => { +            "no_save" => false, +            "user_name" => user_name, +            "name" => name, +            "organisation_name" => organisation.name, +            "referential_name" => referential.name, +          } +        } +    } +  end +     +  def data_format +    "netex" +  end  end diff --git a/app/views/export_tasks/new.html.erb b/app/views/export_tasks/new.html.erb index 92753a675..77998237f 100644 --- a/app/views/export_tasks/new.html.erb +++ b/app/views/export_tasks/new.html.erb @@ -1,6 +1,6 @@  <%= title_tag t(".title") %>  <ul class="nav nav-pills"> -  <% ExportTask.formats.each do |format| %>   +  <% ExportTask.data_formats.each do |format| %>      <li role="presentation"><a href="#<%= format %>" class="<%= format %>" title='<%= t(:"enumerize.data_format_detail.#{format}")%>' data-toggle="tab"><%= t(:"enumerize.data_format.#{format}") %></a></li>    <% end %>  </ul> diff --git a/app/views/import_tasks/_fields_csv_import.erb b/app/views/import_tasks/_fields_csv_import.erb deleted file mode 100644 index b4ae719a5..000000000 --- a/app/views/import_tasks/_fields_csv_import.erb +++ /dev/null @@ -1 +0,0 @@ -<%= form.input :object_id_prefix, :input_html => { :value => @referential.prefix } %> diff --git a/app/views/import_tasks/_fields_gtfs_import.erb b/app/views/import_tasks/_fields_gtfs_import.html.erb index 8b9dabcc5..1fef43584 100644 --- a/app/views/import_tasks/_fields_gtfs_import.erb +++ b/app/views/import_tasks/_fields_gtfs_import.html.erb @@ -1,3 +1,4 @@ +<%= form.input :references_type, :as => :select, :include_blank => false, :input_html => { :title => t("formtastic.titles.import_task.references_type") } %>  <%= form.input :object_id_prefix, :input_html => { :value => @referential.prefix } %>  <%= form.input :max_distance_for_commercial , :as => :number , :input_html => { :title => t("formtastic.titles.import_task.max_distance_for_commercial"), :value => 0 } %>  <%= form.input :ignore_last_word , :as => :boolean , :input_html => { :title => t("formtastic.titles.import_task.ignore_last_word"), :value => false }%> diff --git a/app/views/import_tasks/_fields_neptune_import.html.erb b/app/views/import_tasks/_fields_neptune_import.html.erb new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/import_tasks/_fields_neptune_import.html.erb diff --git a/app/views/import_tasks/_fields_netex_import.erb b/app/views/import_tasks/_fields_netex_import.erb new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/import_tasks/_fields_netex_import.erb diff --git a/app/views/import_tasks/_import_task.html.erb b/app/views/import_tasks/_import_task.html.erb deleted file mode 100644 index c277d429a..000000000 --- a/app/views/import_tasks/_import_task.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -<%= form.input :referential_id, :as => :hidden, :value => @referential.id %> -<%= form.input :user_id, :as => :hidden, :value => current_user.id %> -<%= form.input :user_name, :as => :hidden, :value => current_user.name %>   -<%= form.input :format, :as => :hidden %> -<%= form.input :name %>       -<%= form.input :no_save, :as => :boolean, :collection => [true, false] %>   -<%= form.input :rule_parameter_set_id, :as => :select, -        :collection =>  @referential.organisation.rule_parameter_sets.map { |rps| [ rps.name, rps.id ] }, :include_blank => true %> -<%= form.input :resources, :as => :file %> -<% unless import_task.references_types.empty? %> -  <p class="warning"><%= t('.'+import_partial_name(form)+'.warning')%></p> -  <%= form.input :references_type, :as => :select, :collection => import_task.references_types.map { |c| [ c.model_name.human.capitalize.pluralize, c.name ] }, :include_blank => t(".all") %> -<% end %>     diff --git a/app/views/import_tasks/_neptune_import.html.erb b/app/views/import_tasks/_neptune_import.html.erb deleted file mode 100644 index 37f0bddbd..000000000 --- a/app/views/import_tasks/_neptune_import.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/app/views/import_tasks/new.html.erb b/app/views/import_tasks/new.html.erb index e1bbe34f8..b0155cd9f 100644 --- a/app/views/import_tasks/new.html.erb +++ b/app/views/import_tasks/new.html.erb @@ -1,11 +1,33 @@  <%= title_tag t(".title") %> -<%= semantic_form_for [@referential, @neptune_import], :as => :import_task, :url => referential_import_tasks_path(@referential), :html => { :id => "neptune_import_new" }, multipart: true do |form| %> +<ul class="nav nav-pills"> +  <% ImportTask.data_formats.each do |format| %>   +  <li role="presentation"><a href="#<%= format %>" class="<%= format %>" title='<%= t(:"enumerize.data_format_detail.#{format}")%>' data-toggle="tab"><%= t(:"enumerize.data_format.#{format}") %></a></li> +  <% end %> +</ul> + +<div class="tab-content"> +<% @available_imports.each do |import_task| %> +  <%= semantic_form_for [@referential, import_task], :as => :import_task, :url => referential_import_tasks_path(@referential), :namespace => import_task.data_format ,:html => { :id => "#{import_task.data_format}", :class => "tab-pane highlight"} do |form| %> +	<%= form.inputs do %> +	  <%= form.input :user_name, :as => :hidden, :input_html => { :value => current_user.name } %>      <%= form.input :user_id, :as => :hidden, :input_html => { :value => current_user.id } %> +	  <%= form.input :data_format, :as => :hidden %> +	  <%= form.input :referential_id, :as => :hidden, :input_html => { :value => @referential.id } %>	   +          <%= form.input :name %> +	  <%= form.input :rule_parameter_set_id, :as => :select, +        :collection =>  @referential.organisation.rule_parameter_sets.map { |rps| [ rps.name, rps.id ] }, :include_blank => true %> +	  <%= form.input :resources, :as => :file %> +        <% end %> +     +        <%= render partial: "fields_#{import_task.data_format}_import", :locals => { :form => form } %> + +	<%= form.actions do %> +	  <%= form.action :submit, :as => :button , :label => t( 'formtastic.import' ) %> +	  <%= form.action :cancel, :as => :link %> +	<% end %> -  <%= render :partial => "import_task", :layout => "neptune_import", :locals => { :import_task => @neptune_import, :form => form } %> -	 -  <%= form.actions do %> -    <%= form.action :submit, :as => :button , :label => t( 'formtastic.import' ) %> -    <%= form.action :cancel, :as => :link %>    <% end %>  <% end %> +</div> + +<%= javascript_include_tag new_referential_import_task_path(@referential, :format => :js) %> diff --git a/app/views/import_tasks/new.js.coffee b/app/views/import_tasks/new.js.coffee new file mode 100644 index 000000000..9bd560b16 --- /dev/null +++ b/app/views/import_tasks/new.js.coffee @@ -0,0 +1,2 @@ +jQuery -> +  $('#workspace.import_tasks .nav a:first').tab('show')  diff --git a/app/views/imports/_import.erb b/app/views/imports/_import.erb index 8245e23e3..f43e7e245 100644 --- a/app/views/imports/_import.erb +++ b/app/views/imports/_import.erb @@ -3,7 +3,7 @@      <div class="panel-title clearfix">        <span class="pull-right">                  	<% location = import.datas.links.select { |link| link["rel"] == "location" }.first.href %> -        <%= link_to referential_import_path(@referential, import.id), :method => :delete, :data => {:confirm =>  t('import_tasks.actions.destroy_confirm')}, :class => "btn btn-danger btn-sm" do %> +        <%= link_to referential_import_path(@referential, import.id), :method => :delete, :data => {:confirm =>  t('imports.actions.destroy_confirm')}, :class => "btn btn-danger btn-sm" do %>            <span class="fa fa-trash-o"></span>          <% end %>        </span> diff --git a/config/locales/import_tasks.en.yml b/config/locales/import_tasks.en.yml new file mode 100644 index 000000000..5a33a5584 --- /dev/null +++ b/config/locales/import_tasks.en.yml @@ -0,0 +1,44 @@ +en: +  import_tasks: +    actions: +      new: "New import" +    new: +      title: "New import" +      flash: "Import task on queue, refresh page to see progression" +  activemodel: +    models: +      import_task: +        zero:  "import" +        one:   "import" +        other: "imports" +      neptune_import: +        zero:  "import" +        one:   "Neptune import" +        other: "imports" +      gtfs_import: +        zero:  "import" +        one:   "GTFS import" +        other: "imports" +      netex_import: +        zero:  "import" +        one:   "NeTEx import" +        other: "imports" +    attributes: +      import_task: +        name: "Import name" +        resources: "File to import"       +        references_type: "subset" +        rule_parameter_set_id: "Rule parameter set for compliance check" +        object_id_prefix: "Neptune Id prefix" +        max_distance_for_commercial: "Max distance for commercial stop" +        max_distance_for_connection_link: "Max distance for connection link" +        ignore_last_word: "ignore last word" +        ignore_end_chars: "ignore last chars" +  formtastic: +    titles: +      import_task: +        max_distance_for_commercial: "Maximal distance to merge homonymous stops in commercial stop in meter" +        max_distance_for_connection_link: "Maximal distance to link stops by connection link stop in meter" +        ignore_last_word: "ignore last word on stop name in homonymous detection (inappliable when just one word occurs)" +        ignore_end_chars: "ignore some chars at the end of stop names in homonymous detection" +        references_type: "Filter on stop areas import only GTFS stops and transfers files, these may contain extra attributes"
\ No newline at end of file diff --git a/config/locales/import_tasks.fr.yml b/config/locales/import_tasks.fr.yml new file mode 100644 index 000000000..1625637e8 --- /dev/null +++ b/config/locales/import_tasks.fr.yml @@ -0,0 +1,44 @@ +fr: +  import_tasks: +    actions: +      new: "Nouvel import" +    new: +      title: "Nouvel import" +      flash: "La demande d'import est mise en file d'attente, veuillez rafraichir régulièrement la page pour en suivre la progression" +  activemodel: +    models: +      import_task: +        zero:  "import" +        one:   "import" +        other: "imports" +      neptune_import: +        zero:  "import" +        one:   "import Neptune" +        other: "imports" +      gtfs_import: +        zero:  "import" +        one:   "import GTFS" +        other: "imports" +      netex_import: +        zero:  "import" +        one:   "import NeTEx" +        other: "imports" +    attributes: +      import_task: +        name: "Nom de l'import" +        resources: "Fichier à importer" +        references_type: "Sous ensemble" +        rule_parameter_set_id: "Jeu de paramètres pour validation" +        object_id_prefix: "Préfixe d'identifiants" +        max_distance_for_commercial: "Distance max pour créer les zones" +        max_distance_for_connection_link: "Distance max pour créer les correspondances" +        ignore_last_word: "ignorer le dernier mot" +        ignore_end_chars: "ignorer les n derniers caractères" +  formtastic: +    titles: +      import_task: +        max_distance_for_commercial: "Distance maximale entre deux arrêts homonymes pour créer les zones d'arrêt (en mètre)" +        max_distance_for_connection_link: "Distance maximale entre deux arrêts pour créer les correspondances (en mètre)" +        ignore_last_word: "Ignorer le dernier mot pour détecter l'homonymie des noms d'arrêt (inapplicable quand le nom ne comporte qu'un mot)" +        ignore_end_chars: "Ignorer les n derniers caractères du nom de l'arrêt pour détecter l'homonymie" +        references_type: "Le filtre sur arrêts importe uniquement les fichiers GTFS stops et transfers gtfs, ceux-ci pouvant contenir des attributs supplémentaires" diff --git a/config/locales/import_tasks.yml b/config/locales/import_tasks.yml deleted file mode 100644 index d016d9664..000000000 --- a/config/locales/import_tasks.yml +++ /dev/null @@ -1,208 +0,0 @@ -en: -  import_tasks: -    actions: -      new: "New import" -      destroy: "Destroy" -      destroy_confirm: "Are you sure you want destroy this import?" -    new: -      title: "New import" -      all: "All" -      flash: "Import task on queue, refresh page to see progression" -      fields_gtfs_import: -        warning: "Filter on stop areas import only GTFS stops and transfers files, these may contain extra attributes" -    index: -      title: "Imports" -      warning: "" -    show: -      report: "Report" -      not_yet_started: "On queue" -      imported_file: "Imported file" -      completed: "[ Completed ]" -      failed: "[ Failed ]" -      pending: "[ In the treatment queue ]" -      processing: "[ In progress... ]" -      graph: -        files: -          title_zip: "Import results for files in zip" -          title_default: "Import result for %{extension} file" -          error: "Errors" -          ignored: "Ignored" -          ok: "Success" -        lines: -          title: "Imported objects" -          objects_label: "Objects count" -          lines_stats: "Lines" -          routes_stats: "Routes" -          connection_links_stats: "Connection Links" -          time_tables_stats: "Timetables" -          stop_areas_stats: "Stop Areas" -          access_points_stats: "Access Points" -          vehicle_journeys_stats: "Vehicle Journeys" -          journey_patterns_stats: "Journey Patterns" -    statuses: -      created: "Pending ..." -      scheduled: "Processing ..." -      terminated: "Completed" -      canceled: "Canceled" -      aborted: "Failed" -    compliance_check_task: "Validate Report" -    severities: -      info: "Information" -      uncheck: "Unchecked" -      ok: "Ok" -      warning: "Warning" -      error: "Error" -      fatal: "Fatal" -  activerecord: -    models: -      import_task: -        zero:  "import" -        one:   "import" -        other: "imports" -      neptune_import: -        zero:  "import" -        one:   "Neptune import" -        other: "imports" -      csv_import: -        zero:  "import" -        one:   "CSV import" -        other: "imports" -      gtfs_import: -        zero:  "import" -        one:   "GTFS import" -        other: "imports" -      netex_import: -        zero:  "import" -        one:   "NeTEx import" -        other: "imports" -    attributes: -      import_task: -        resources: "File to import" -        created_at: "Created on" -        status: "Status" -        references_type: "subset" -        no_save: "No save" -        rule_parameter_set_id: "Rule parameter set for compliance check" -        object_id_prefix: "Neptune Id prefix" -        max_distance_for_commercial: "Max distance for commercial stop" -        max_distance_for_connection_link: "Max distance for connection link" -        ignore_last_word: "ignore last word" -        ignore_end_chars: "ignore last chars" -  formtastic: -    titles: -      import_task: -        max_distance_for_commercial: "Maximal distance to merge homonymous stops in commercial stop in meter" -        max_distance_for_connection_link: "Maximal distance to link stops by connection link stop in meter" -        ignore_last_word: "ignore last word on stop name in homonymous detection (inappliable when just one word occurs)" -        ignore_end_chars: "ignore some chars at the end of stop names in homonymous detection" -fr: -  import_tasks: -    actions: -      new: "Nouvel import" -      destroy: "Supprimer cet import" -      destroy_confirm: "Etes vous sûr de supprimer cet import ?" -    new: -      title: "Nouvel import" -      all: "Tout" -      flash: "La demande d'import est mise en file d'attente, veuillez rafraichir régulièrement la page pour en suivre la progression" -      fields_gtfs_import: -        warning: "Le filtre sur arrêts importe uniquement les fichiers GTFS stops et transfers gtfs, ceux-ci pouvant contenir des attributs supplémentaires" -    index: -      title: "Imports" -      warning: "" -    show: -      report: "Rapport" -      not_yet_started: "En file d'attente" -      imported_file: "Fichier importé" -      completed: "[ Terminé ]" -      failed: "[ Echoué ]" -      pending: "[ En file d'attente ]" -      processing: "[ En progression... ]" -      graph: -        files: -          title_zip: "Résultat d'import des fichiers du zip" -          title_default: "Résultat d'import du fichier %{extension}" -          error: "Erreurs" -          ignored: "Ignorés" -          ok: "Succès" -        lines: -          title: "Volume de données lues par type de donnée" -          objects_label: "Quantité lue" -          lines_stats: "Lignes" -          routes_stats: "Séquences d'arrêts" -          connection_links_stats: "Correspondances" -          time_tables_stats: "Calendriers" -          stop_areas_stats: "Zones d'arrèt" -          access_points_stats: "Accès" -          vehicle_journeys_stats: "Courses" -          journey_patterns_stats: "Missions" -      table: -        line: -          name: "Nom" -          save: "Sauvegarde" -          routes: "Séquences d'arrêts" -          connection_links: "Correspondances" -          time_tables: "Calendriers" -          stop_areas: "Zones d'arrèt" -          access_points: "Accès" -          vehicle_journeys: "Courses" -          journey_patterns: "Missions" -          not_saved: "Non Sauvé" -          saved: "Sauvé" -          save_error: "Sauvegarde en erreur" -    statuses: -      created: "En attente ..." -      scheduled: "En cours ..." -      terminated: "Achevé" -      canceled: "Annulé" -      aborted: "Echoué" -    compliance_check_task: "Validation" -    severities: -      info: "Information" -      uncheck: "Non testé" -      ok: "Ok" -      warning: "Alerte" -      error: "Erreur" -      fatal: "Fatal" -  activerecord: -    models: -      import_task: -        zero:  "import" -        one:   "import" -        other: "imports" -      neptune_import: -        zero:  "import" -        one:   "import Neptune" -        other: "imports" -      csv_import: -        zero:  "import" -        one:   "import CSV" -        other: "imports" -      gtfs_import: -        zero:  "import" -        one:   "import GTFS" -        other: "imports" -      netex_import: -        zero:  "import" -        one:   "import NeTEx" -        other: "imports" -    attributes: -      import_task: -        resources: "Fichier à importer" -        created_at: "Créé le" -        status: "Status" -        no_save: "Pas de sauvegarde" -        references_type: "Sous ensemble" -        rule_parameter_set_id: "Jeu de paramètres pour validation" -        object_id_prefix: "Préfixe d'identifiants" -        max_distance_for_commercial: "Distance max pour créer les zones" -        max_distance_for_connection_link: "Distance max pour créer les correspondances" -        ignore_last_word: "ignorer le dernier mot" -        ignore_end_chars: "ignorer les n derniers caractères" -  formtastic: -    titles: -      import_task: -        max_distance_for_commercial: "Distance maximale entre deux arrêts homonymes pour créer les zones d'arrêt (en mètre)" -        max_distance_for_connection_link: "Distance maximale entre deux arrêts pour créer les correspondances (en mètre)" -        ignore_last_word: "Ignorer le dernier mot pour détecter l'homonymie des noms d'arrêt (inapplicable quand le nom ne comporte qu'un mot)" -        ignore_end_chars: "Ignorer les n derniers caractères du nom de l'arrêt pour détecter l'homonymie" diff --git a/config/locales/imports.en.yml b/config/locales/imports.en.yml new file mode 100644 index 000000000..512529e8f --- /dev/null +++ b/config/locales/imports.en.yml @@ -0,0 +1,79 @@ +en: +  imports: +    actions: +      new: "New import" +      destroy: "Destroy" +      destroy_confirm: "Are you sure you want destroy this import?" +    index: +      title: "Imports" +      warning: "" +    show: +      report: "Report" +      imported_file: "Imported file" +      graph: +        files: +          title_zip: "Import results for files in zip" +          title_default: "Import result for %{extension} file" +          error: "Errors" +          ignored: "Ignored" +          ok: "Success" +        lines: +          title: "Imported objects" +          objects_label: "Objects count" +          lines_stats: "Lines" +          routes_stats: "Routes" +          connection_links_stats: "Connection Links" +          time_tables_stats: "Timetables" +          stop_areas_stats: "Stop Areas" +          access_points_stats: "Access Points" +          vehicle_journeys_stats: "Vehicle Journeys" +          journey_patterns_stats: "Journey Patterns" +    statuses: +      started: "Started"       +      scheduled: "Processing ..." +      terminated: "Completed" +      canceled: "Canceled" +      aborted: "Failed" +    compliance_check_task: "Validate Report" +    severities: +      info: "Information" +      uncheck: "Unchecked" +      ok: "Ok" +      warning: "Warning" +      error: "Error" +      fatal: "Fatal" +  activerecord: +    models: +      import: +        zero:  "import" +        one:   "import" +        other: "imports" +      neptune_import: +        zero:  "import" +        one:   "Neptune import" +        other: "imports" +      csv_import: +        zero:  "import" +        one:   "CSV import" +        other: "imports" +      gtfs_import: +        zero:  "import" +        one:   "GTFS import" +        other: "imports" +      netex_import: +        zero:  "import" +        one:   "NeTEx import" +        other: "imports" +    attributes: +      import: +        resources: "File to import" +        created_at: "Created on" +        status: "Status" +        references_type: "subset" +        no_save: "No save" +        rule_parameter_set_id: "Rule parameter set for compliance check" +        object_id_prefix: "Neptune Id prefix" +        max_distance_for_commercial: "Max distance for commercial stop" +        max_distance_for_connection_link: "Max distance for connection link" +        ignore_last_word: "ignore last word" +        ignore_end_chars: "ignore last chars" diff --git a/config/locales/imports.fr.yml b/config/locales/imports.fr.yml new file mode 100644 index 000000000..aae91976c --- /dev/null +++ b/config/locales/imports.fr.yml @@ -0,0 +1,93 @@ +fr: +  imports: +    actions: +      new: "Nouvel import" +      destroy: "Supprimer cet import" +      destroy_confirm: "Etes vous sûr de supprimer cet import ?" +    index: +      title: "Imports" +      warning: "" +    show: +      report: "Rapport" +      imported_file: "Fichier importé" +      graph: +        files: +          title_zip: "Résultat d'import des fichiers du zip" +          title_default: "Résultat d'import du fichier %{extension}" +          error: "Erreurs" +          ignored: "Ignorés" +          ok: "Succès" +        lines: +          title: "Volume de données lues par type de donnée" +          objects_label: "Quantité lue" +          lines_stats: "Lignes" +          routes_stats: "Séquences d'arrêts" +          connection_links_stats: "Correspondances" +          time_tables_stats: "Calendriers" +          stop_areas_stats: "Zones d'arrèt" +          access_points_stats: "Accès" +          vehicle_journeys_stats: "Courses" +          journey_patterns_stats: "Missions" +      table: +        line: +          name: "Nom" +          save: "Sauvegarde" +          routes: "Séquences d'arrêts" +          connection_links: "Correspondances" +          time_tables: "Calendriers" +          stop_areas: "Zones d'arrèt" +          access_points: "Accès" +          vehicle_journeys: "Courses" +          journey_patterns: "Missions" +          not_saved: "Non Sauvé" +          saved: "Sauvé" +          save_error: "Sauvegarde en erreur" +    statuses: +      created: "En file d'attente..." +      scheduled: "En cours..." +      terminated: "Achevé" +      canceled: "Annulé" +      aborted: "Echoué" +    compliance_check_task: "Validation" +    severities: +      info: "Information" +      uncheck: "Non testé" +      ok: "Ok" +      warning: "Alerte" +      error: "Erreur" +      fatal: "Fatal" +  activerecord: +    models: +      import: +        zero:  "import" +        one:   "import" +        other: "imports" +      neptune_import: +        zero:  "import" +        one:   "import Neptune" +        other: "imports" +      csv_import: +        zero:  "import" +        one:   "import CSV" +        other: "imports" +      gtfs_import: +        zero:  "import" +        one:   "import GTFS" +        other: "imports" +      netex_import: +        zero:  "import" +        one:   "import NeTEx" +        other: "imports" +    attributes: +      import: +        resources: "Fichier à importer" +        created_at: "Créé le" +        status: "Status" +        no_save: "Pas de sauvegarde" +        references_type: "Sous ensemble" +        rule_parameter_set_id: "Jeu de paramètres pour validation" +        object_id_prefix: "Préfixe d'identifiants" +        max_distance_for_commercial: "Distance max pour créer les zones" +        max_distance_for_connection_link: "Distance max pour créer les correspondances" +        ignore_last_word: "ignorer le dernier mot" +        ignore_end_chars: "ignorer les n derniers caractères"
\ No newline at end of file diff --git a/config/locales/imports.yml b/config/locales/imports.yml deleted file mode 100644 index 57d28d9d7..000000000 --- a/config/locales/imports.yml +++ /dev/null @@ -1,198 +0,0 @@ -en: -  imports: -    actions: -      new: "New import" -      destroy: "Destroy" -      destroy_confirm: "Are you sure you want destroy this import?" -    new: -      title: "New import" -      all: "All" -      flash: "Import task on queue, refresh page to see progression" -      fields_gtfs_import: -        warning: "Filter on stop areas import only GTFS stops and transfers files, these may contain extra attributes" -    index: -      title: "Imports" -      warning: "" -    show: -      report: "Report" -      imported_file: "Imported file" -      graph: -        files: -          title_zip: "Import results for files in zip" -          title_default: "Import result for %{extension} file" -          error: "Errors" -          ignored: "Ignored" -          ok: "Success" -        lines: -          title: "Imported objects" -          objects_label: "Objects count" -          lines_stats: "Lines" -          routes_stats: "Routes" -          connection_links_stats: "Connection Links" -          time_tables_stats: "Timetables" -          stop_areas_stats: "Stop Areas" -          access_points_stats: "Access Points" -          vehicle_journeys_stats: "Vehicle Journeys" -          journey_patterns_stats: "Journey Patterns" -    statuses: -      started: "Started"       -      scheduled: "Processing ..." -      terminated: "Completed" -      canceled: "Canceled" -      aborted: "Failed" -    compliance_check_task: "Validate Report" -    severities: -      info: "Information" -      uncheck: "Unchecked" -      ok: "Ok" -      warning: "Warning" -      error: "Error" -      fatal: "Fatal" -  activerecord: -    models: -      import: -        zero:  "import" -        one:   "import" -        other: "imports" -      neptune_import: -        zero:  "import" -        one:   "Neptune import" -        other: "imports" -      csv_import: -        zero:  "import" -        one:   "CSV import" -        other: "imports" -      gtfs_import: -        zero:  "import" -        one:   "GTFS import" -        other: "imports" -      netex_import: -        zero:  "import" -        one:   "NeTEx import" -        other: "imports" -    attributes: -      import: -        resources: "File to import" -        created_at: "Created on" -        status: "Status" -        references_type: "subset" -        no_save: "No save" -        rule_parameter_set_id: "Rule parameter set for compliance check" -        object_id_prefix: "Neptune Id prefix" -        max_distance_for_commercial: "Max distance for commercial stop" -        max_distance_for_connection_link: "Max distance for connection link" -        ignore_last_word: "ignore last word" -        ignore_end_chars: "ignore last chars" -  formtastic: -    titles: -      import: -        max_distance_for_commercial: "Maximal distance to merge homonymous stops in commercial stop in meter" -        max_distance_for_connection_link: "Maximal distance to link stops by connection link stop in meter" -        ignore_last_word: "ignore last word on stop name in homonymous detection (inappliable when just one word occurs)" -        ignore_end_chars: "ignore some chars at the end of stop names in homonymous detection" -fr: -  imports: -    actions: -      new: "Nouvel import" -      destroy: "Supprimer cet import" -      destroy_confirm: "Etes vous sûr de supprimer cet import ?" -    new: -      title: "Nouvel import" -      all: "Tout" -      flash: "La demande d'import est mise en file d'attente, veuillez rafraichir régulièrement la page pour en suivre la progression" -      fields_gtfs_import: -        warning: "Le filtre sur arrêts importe uniquement les fichiers GTFS stops et transfers gtfs, ceux-ci pouvant contenir des attributs supplémentaires" -    index: -      title: "Imports" -      warning: "" -    show: -      report: "Rapport" -      imported_file: "Fichier importé" -      graph: -        files: -          title_zip: "Résultat d'import des fichiers du zip" -          title_default: "Résultat d'import du fichier %{extension}" -          error: "Erreurs" -          ignored: "Ignorés" -          ok: "Succès" -        lines: -          title: "Volume de données lues par type de donnée" -          objects_label: "Quantité lue" -          lines_stats: "Lignes" -          routes_stats: "Séquences d'arrêts" -          connection_links_stats: "Correspondances" -          time_tables_stats: "Calendriers" -          stop_areas_stats: "Zones d'arrèt" -          access_points_stats: "Accès" -          vehicle_journeys_stats: "Courses" -          journey_patterns_stats: "Missions" -      table: -        line: -          name: "Nom" -          save: "Sauvegarde" -          routes: "Séquences d'arrêts" -          connection_links: "Correspondances" -          time_tables: "Calendriers" -          stop_areas: "Zones d'arrèt" -          access_points: "Accès" -          vehicle_journeys: "Courses" -          journey_patterns: "Missions" -          not_saved: "Non Sauvé" -          saved: "Sauvé" -          save_error: "Sauvegarde en erreur" -    statuses: -      created: "En file d'attente..." -      scheduled: "En cours..." -      terminated: "Achevé" -      canceled: "Annulé" -      aborted: "Echoué" -    compliance_check_task: "Validation" -    severities: -      info: "Information" -      uncheck: "Non testé" -      ok: "Ok" -      warning: "Alerte" -      error: "Erreur" -      fatal: "Fatal" -  activerecord: -    models: -      import: -        zero:  "import" -        one:   "import" -        other: "imports" -      neptune_import: -        zero:  "import" -        one:   "import Neptune" -        other: "imports" -      csv_import: -        zero:  "import" -        one:   "import CSV" -        other: "imports" -      gtfs_import: -        zero:  "import" -        one:   "import GTFS" -        other: "imports" -      netex_import: -        zero:  "import" -        one:   "import NeTEx" -        other: "imports" -    attributes: -      import: -        resources: "Fichier à importer" -        created_at: "Créé le" -        status: "Status" -        no_save: "Pas de sauvegarde" -        references_type: "Sous ensemble" -        rule_parameter_set_id: "Jeu de paramètres pour validation" -        object_id_prefix: "Préfixe d'identifiants" -        max_distance_for_commercial: "Distance max pour créer les zones" -        max_distance_for_connection_link: "Distance max pour créer les correspondances" -        ignore_last_word: "ignorer le dernier mot" -        ignore_end_chars: "ignorer les n derniers caractères" -  formtastic: -    titles: -      import: -        max_distance_for_commercial: "Distance maximale entre deux arrêts homonymes pour créer les zones d'arrêt (en mètre)" -        max_distance_for_connection_link: "Distance maximale entre deux arrêts pour créer les correspondances (en mètre)" -        ignore_last_word: "Ignorer le dernier mot pour détecter l'homonymie des noms d'arrêt (inapplicable quand le nom ne comporte qu'un mot)" -        ignore_end_chars: "Ignorer les n derniers caractères du nom de l'arrêt pour détecter l'homonymie" diff --git a/lib/ievkit/client.rb b/lib/ievkit/client.rb index e35bbd0b3..5df3ca1d2 100644 --- a/lib/ievkit/client.rb +++ b/lib/ievkit/client.rb @@ -150,8 +150,11 @@ module Ievkit      #      # @return [Sawyer::Agent]      def multipart_agent +      sawyer_options[:serializer] = Ievkit::Serializer.multipart +              @agent ||= Sawyer::Agent.new(api_endpoint, sawyer_options) do |http|          http.headers[:accept] = default_media_type +        http.headers[:content_type] = "multipart/form-data"          http.headers[:user_agent] = user_agent          # Activate if authentication is needed diff --git a/lib/ievkit/serializer.rb b/lib/ievkit/serializer.rb index c9a0247ef..8110ab3b5 100644 --- a/lib/ievkit/serializer.rb +++ b/lib/ievkit/serializer.rb @@ -31,6 +31,21 @@ module Ievkit      rescue LoadError      end +    def self.multipart +      new(IevMultipart) +    rescue LoadError +    end + +    class IevMultipart +      def self.dump(data) +        data +      end +       +      def self.load(data) +        data +      end +    end +      # Public: Wraps a serialization format for Sawyer.  Nested objects are      # prepared for serialization (such as changing Times to ISO 8601 Strings).      # Any serialization format that responds to #dump and #load will work. @@ -46,9 +61,8 @@ module Ievkit      #      # Returns an encoded String.      def encode(data) -      data #@dump.call(encode_object(data)) +      @dump.call(encode_object(data))      end -      alias dump encode      # Public: Decodes a String into an Object (usually a Hash or Array of @@ -78,8 +92,10 @@ module Ievkit          when Date then hash[key] = value.to_time.utc.xmlschema          when Time then hash[key] = value.utc.xmlschema          when Hash then hash[key] = encode_hash(value) +        when UploadIO then hash[key] = value          end        end +      puts "hash #{hash.inspect}"        hash      end @@ -107,7 +123,7 @@ module Ievkit              value            end          elsif value.is_a?(Integer) || value.is_a?(Float) -          Time.at(value) +          Time.at(value)                    else            value          end | 
