diff options
| author | Zakaria BOUZIANE | 2015-04-27 15:51:17 +0200 |
|---|---|---|
| committer | Zakaria BOUZIANE | 2015-04-27 15:51:17 +0200 |
| commit | 8d2329a9c7172689901186e293951fb48636b254 (patch) | |
| tree | f1181e714cd2a8b5b65c9a201cbd23a4bc32c1ab | |
| parent | a6171536fe1fbf61c6be54b300c9404c7dcd6349 (diff) | |
| parent | e470b78a10672fd927de4cd9b3ac6cae0097e12a (diff) | |
| download | chouette-core-8d2329a9c7172689901186e293951fb48636b254.tar.bz2 | |
Validation to ComplianceCheckTask : git conflict resolution
24 files changed, 450 insertions, 646 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 dc1ab1ba7..797085752 100644 --- a/app/models/import_task.rb +++ b/app/models/import_task.rb @@ -11,13 +11,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 = {} ) @@ -42,7 +42,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 } @@ -57,32 +57,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 @@ -92,7 +90,6 @@ class ImportTask end def save_resources - # resources is a required attribute FileUtils.mkdir_p root FileUtils.cp resources.path, saved_resources_path end @@ -101,185 +98,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/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 5b78bf02c..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" - activemodel: - 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" - activemodel: - 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 |
