diff options
50 files changed, 415 insertions, 485 deletions
diff --git a/app/controllers/api/v1/imports_controller.rb b/app/controllers/api/v1/imports_controller.rb index 3d7f4ca79..dc2df0697 100644 --- a/app/controllers/api/v1/imports_controller.rb +++ b/app/controllers/api/v1/imports_controller.rb @@ -1,11 +1,11 @@ class Api::V1::ImportsController < Api::V1::IbooController - defaults :resource_class => WorkbenchImport + defaults :resource_class => Import::Workbench belongs_to :workbench def create args = workbench_import_params.merge(creator: 'Webservice') @import = parent.workbench_imports.create(args) - if @import.valid? + if @import.valid? create! else render json: { status: "error", messages: @import.errors.full_messages } diff --git a/app/controllers/api/v1/internals/netex_imports_controller.rb b/app/controllers/api/v1/internals/netex_imports_controller.rb index c8e33f7b8..c2b7b20cc 100644 --- a/app/controllers/api/v1/internals/netex_imports_controller.rb +++ b/app/controllers/api/v1/internals/netex_imports_controller.rb @@ -25,13 +25,13 @@ module Api private def find_netex_import - @netex_import = NetexImport.find(params[:id]) + @netex_import = Import::Netex.find(params[:id]) rescue ActiveRecord::RecordNotFound render json: { - status: "error", + status: "error", message: "Record not found" } - finish_action! + finish_action! end def find_workbench @@ -52,7 +52,7 @@ module Api attributes = attributes.merge referential_id: @new_referential.id - @netex_import = NetexImport.new attributes + @netex_import = Import::Netex.new attributes @netex_import.save! unless @netex_import.referential diff --git a/app/controllers/api/v1/netex_imports_controller.rb b/app/controllers/api/v1/netex_imports_controller.rb index d86c1fcd8..2654fa088 100644 --- a/app/controllers/api/v1/netex_imports_controller.rb +++ b/app/controllers/api/v1/netex_imports_controller.rb @@ -34,7 +34,7 @@ module Api attributes = attributes.merge referential_id: @new_referential.id - @netex_import = NetexImport.new attributes + @netex_import = Import::Netex.new attributes @netex_import.save! unless @netex_import.referential diff --git a/app/controllers/exports_controller.rb b/app/controllers/exports_controller.rb index ccc163e34..095720aa0 100644 --- a/app/controllers/exports_controller.rb +++ b/app/controllers/exports_controller.rb @@ -3,72 +3,72 @@ require 'open-uri' class ExportsController < ChouetteController include ReferentialSupport - defaults :resource_class => Export - - respond_to :html, :only => [:show, :index, :destroy, :exported_file] - respond_to :js, :only => [:index] - belongs_to :referential - - def index - begin - index! - rescue Ievkit::Error, Faraday::Error => error - logger.error("Iev failure : #{error.message}") - flash[:error] = t(error.locale_for_error) - redirect_to referential_path(@referential) - end - end - - def show - begin - show! - rescue Ievkit::Error, Faraday::Error => error - logger.error("Iev failure : #{error.message}") - flash[:error] = t(error.locale_for_error) - redirect_to referential_path(@referential) - end - end - - def destroy - begin - destroy! - rescue Ievkit::Error, Faraday::Error => error - logger.error("Iev failure : #{error.message}") - flash[:error] = t(error.locale_for_error) - redirect_to referential_path(@referential) - end - end - - def exported_file - # WARNING : files under 10kb in size get treated as StringIO by OpenUri - # http://stackoverflow.com/questions/10496874/why-does-openuri-treat-files-under-10kb-in-size-as-stringio - OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax') - OpenURI::Buffer.const_set 'StringMax', 0 - begin - send_file open(resource.file_path), { :type => "application/#{resource.filename_extension}", :disposition => "attachment", :filename => resource.filename } - rescue Ievkit::Error, Faraday::Error => error - logger.error("Iev failure : #{error.message}") - flash[:error] = t(error.locale_for_error) - redirect_to referential_path(@referential) - end - end - - protected - - def export_service - ExportService.new(@referential) - end - - def resource - @export ||= export_service.find( params[:id] ) - @line_items = @export.report.line_items - if @line_items.size > 500 - @line_items = @line_items.paginate(page: params[:page], per_page: 20) - end - @export - end - - def collection - @exports ||= export_service.all.sort_by{ |export| export.created_at }.reverse.paginate(:page => params[:page]) - end + # defaults :resource_class => Export + # + # respond_to :html, :only => [:show, :index, :destroy, :exported_file] + # respond_to :js, :only => [:index] + # belongs_to :referential + # + # def index + # begin + # index! + # rescue Ievkit::Error, Faraday::Error => error + # logger.error("Iev failure : #{error.message}") + # flash[:error] = t(error.locale_for_error) + # redirect_to referential_path(@referential) + # end + # end + # + # def show + # begin + # show! + # rescue Ievkit::Error, Faraday::Error => error + # logger.error("Iev failure : #{error.message}") + # flash[:error] = t(error.locale_for_error) + # redirect_to referential_path(@referential) + # end + # end + # + # def destroy + # begin + # destroy! + # rescue Ievkit::Error, Faraday::Error => error + # logger.error("Iev failure : #{error.message}") + # flash[:error] = t(error.locale_for_error) + # redirect_to referential_path(@referential) + # end + # end + # + # def exported_file + # # WARNING : files under 10kb in size get treated as StringIO by OpenUri + # # http://stackoverflow.com/questions/10496874/why-does-openuri-treat-files-under-10kb-in-size-as-stringio + # OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax') + # OpenURI::Buffer.const_set 'StringMax', 0 + # begin + # send_file open(resource.file_path), { :type => "application/#{resource.filename_extension}", :disposition => "attachment", :filename => resource.filename } + # rescue Ievkit::Error, Faraday::Error => error + # logger.error("Iev failure : #{error.message}") + # flash[:error] = t(error.locale_for_error) + # redirect_to referential_path(@referential) + # end + # end + # + # protected + # + # def export_service + # ExportService.new(@referential) + # end + # + # def resource + # @export ||= export_service.find( params[:id] ) + # @line_items = @export.report.line_items + # if @line_items.size > 500 + # @line_items = @line_items.paginate(page: params[:page], per_page: 20) + # end + # @export + # end + # + # def collection + # @exports ||= export_service.all.sort_by{ |export| export.created_at }.reverse.paginate(:page => params[:page]) + # end end diff --git a/app/controllers/import_messages_controller.rb b/app/controllers/import_messages_controller.rb index 4f8fe7a25..5e39445fb 100644 --- a/app/controllers/import_messages_controller.rb +++ b/app/controllers/import_messages_controller.rb @@ -1,8 +1,8 @@ class ImportMessagesController < ChouetteController - defaults resource_class: ImportMessage, collection_name: 'import_messages', instance_name: 'import_message' + defaults resource_class: Import::Message, collection_name: 'import_messages', instance_name: 'import_message' respond_to :csv - belongs_to :import, :parent_class => Import do - belongs_to :import_resource, :parent_class => ImportResource + belongs_to :import, :parent_class => Import::Base do + belongs_to :import_resource, :parent_class => Import::Resource end @@ -20,7 +20,7 @@ class ImportMessagesController < ChouetteController end def parent - @import_resource ||= ImportResource.find(params[:import_resource_id]) + @import_resource ||= Import::Resource.find(params[:import_resource_id]) end end diff --git a/app/controllers/import_resources_controller.rb b/app/controllers/import_resources_controller.rb index ea78394a1..6d1977e0c 100644 --- a/app/controllers/import_resources_controller.rb +++ b/app/controllers/import_resources_controller.rb @@ -1,5 +1,5 @@ class ImportResourcesController < ChouetteController - defaults resource_class: ImportResource, collection_name: 'import_resources', instance_name: 'import_resource' + defaults resource_class: Import::Resource, collection_name: 'import_resources', instance_name: 'import_resource' respond_to :html belongs_to :import diff --git a/app/controllers/import_tasks_controller.rb b/app/controllers/import_tasks_controller.rb deleted file mode 100644 index 1a349087d..000000000 --- a/app/controllers/import_tasks_controller.rb +++ /dev/null @@ -1,69 +0,0 @@ -class ImportTasksController < ChouetteController - include ReferentialSupport - defaults :resource_class => ImportTask - - 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, Faraday::Error => error - logger.error("Iev failure : #{error.message}") - flash[:error] = t('iev.exception.default') - redirect_to referential_path(@referential) - end - end - - def create - @available_imports = available_imports - begin - create! do |success, failure| - success.html { redirect_to referential_imports_path(@referential) } - end - rescue Ievkit::Error, Faraday::Error => error - logger.error("Iev failure : #{error.message}") - flash[:error] = t('iev.exception.default') - redirect_to referential_path(@referential) - end - end - - protected - - def available_imports - import_task_parameters = params[:import_task] - - if import_task_parameters.present? - @available_imports = [ - import_task_parameters[:data_format] == "neptune" ? build_resource : NeptuneImport.new(:referential_id => @referential.id ), - import_task_parameters[:data_format] == "netex" ? build_resource : NetexImport.new(:referential_id => @referential.id ), - import_task_parameters[:data_format] == "gtfs" ? build_resource : GtfsImport.new(:referential_id => @referential.id ) - ] - else - @available_imports = [ - NeptuneImport.new(:referential_id => @referential.id ), - NetexImport.new(:referential_id => @referential.id ), - GtfsImport.new(:referential_id => @referential.id ) - ] - end - end - - def build_resource - @import_task ||= if params[:import_task].present? - import_task_parameters = params[:import_task] - case import_task_parameters[:data_format] - when "neptune" - NeptuneImport.new(import_task_parameters) - when "netex" - @import_task = NetexImport.new(import_task_parameters) - when "gtfs" - @import_task = GtfsImport.new(import_task_parameters) - end - else - @import_task = NeptuneImport.new - end - end - -end diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb index 7a999d657..3ebbeb665 100644 --- a/app/controllers/imports_controller.rb +++ b/app/controllers/imports_controller.rb @@ -3,7 +3,7 @@ class ImportsController < ChouetteController include RansackDateFilter before_action only: [:index] { set_date_time_params("started_at", DateTime) } skip_before_action :authenticate_user!, only: [:download] - defaults resource_class: Import, collection_name: 'imports', instance_name: 'import' + defaults resource_class: Import::Base, collection_name: 'imports', instance_name: 'import' before_action :ransack_status_params, only: [:index] respond_to :html belongs_to :workbench @@ -37,7 +37,7 @@ class ImportsController < ChouetteController protected def collection - scope = parent.imports.where(type: "WorkbenchImport") + scope = parent.imports.where(type: "Import::Workbench") scope = self.ransack_period_range(scope: scope, error_message: t('imports.filters.error_period_filter'), query: :where_started_at_in) @@ -54,14 +54,14 @@ class ImportsController < ChouetteController def ransack_status_params if params[:q] - return params[:q].delete(:status_eq_any) if params[:q][:status_eq_any].empty? || ( (Import.status.values & params[:q][:status_eq_any]).length >= 4 ) + return params[:q].delete(:status_eq_any) if params[:q][:status_eq_any].empty? || ( (Import::Base.status.values & params[:q][:status_eq_any]).length >= 4 ) params[:q][:status_eq_any].push("new", "running") if params[:q][:status_eq_any].include?("pending") params[:q][:status_eq_any].push("aborted", "canceled") if params[:q][:status_eq_any].include?("failed") end end def build_resource - @import ||= WorkbenchImport.new(*resource_params) do |import| + @import ||= Import::Workbench.new(*resource_params) do |import| import.workbench = parent import.creator = current_user.name end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index e38a92982..152da4fa2 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -5,7 +5,7 @@ class StatusesController < ChouetteController status = { referentials_blocked: Referential.blocked.count, - imports_blocked: Import.blocked.count, + imports_blocked: Import::Base.blocked.count, compliance_check_sets_blocked: ComplianceCheckSet.blocked.count } status[:status] = global_status status diff --git a/app/decorators/import_decorator.rb b/app/decorators/import/base_decorator.rb index 1964365ae..8c10479c6 100644 --- a/app/decorators/import_decorator.rb +++ b/app/decorators/import/base_decorator.rb @@ -1,5 +1,5 @@ -class ImportDecorator < AF83::Decorator - decorates Import +class Import::BaseDecorator < AF83::Decorator + decorates Import::Base set_scope { context[:workbench] } diff --git a/app/models/concerns/iev_interfaces/message.rb b/app/models/concerns/iev_interfaces/message.rb new file mode 100644 index 000000000..ad41e98b7 --- /dev/null +++ b/app/models/concerns/iev_interfaces/message.rb @@ -0,0 +1,9 @@ +module IevInterfaces::Message + extend ActiveSupport::Concern + + included do + extend Enumerize + enumerize :criticity, in: %i(info warning error) + validates :criticity, presence: true + end +end diff --git a/app/models/concerns/iev_interfaces/resource.rb b/app/models/concerns/iev_interfaces/resource.rb new file mode 100644 index 000000000..7f8c3eefd --- /dev/null +++ b/app/models/concerns/iev_interfaces/resource.rb @@ -0,0 +1,9 @@ +module IevInterfaces::Resource + extend ActiveSupport::Concern + + included do + extend Enumerize + enumerize :status, in: %i(OK ERROR WARNING IGNORED), scope: true + validates_presence_of :name, :resource_type, :reference + end +end diff --git a/app/models/concerns/iev_interfaces/task.rb b/app/models/concerns/iev_interfaces/task.rb new file mode 100644 index 000000000..2eb0c532f --- /dev/null +++ b/app/models/concerns/iev_interfaces/task.rb @@ -0,0 +1,51 @@ +module IevInterfaces::Task + extend ActiveSupport::Concern + + included do + belongs_to :parent, polymorphic: true + belongs_to :workbench, class_name: "::Workbench" + belongs_to :referential + + extend Enumerize + enumerize :status, in: %w(new pending successful warning failed running aborted canceled), scope: true, default: :new + + validates :name, presence: true + validates_presence_of :workbench, :creator + + has_many :messages, class_name: messages_class_name, dependent: :destroy, foreign_key: :import_id + has_many :resources, class_name: resources_class_name, dependent: :destroy, foreign_key: :import_id + + scope :where_started_at_in, ->(period_range) do + where('started_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) + end + + scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') } + end + + module ClassMethods + def launched_statuses + %w(new pending) + end + + def failed_statuses + %w(failed aborted canceled) + end + + def finished_statuses + %w(successful failed warning aborted canceled) + end + + def abort_old + where( + 'created_at < ? AND status NOT IN (?)', + 4.hours.ago, + finished_statuses + ).update_all(status: 'aborted') + end + end + + def notify_parent + parent.child_change + update(notified_parent_at: DateTime.now) + end +end diff --git a/app/models/import.rb b/app/models/import.rb deleted file mode 100644 index adad39b59..000000000 --- a/app/models/import.rb +++ /dev/null @@ -1,103 +0,0 @@ -class Import < ActiveRecord::Base - mount_uploader :file, ImportUploader - belongs_to :workbench - belongs_to :referential - - belongs_to :parent, polymorphic: true - - has_many :messages, class_name: "ImportMessage", dependent: :destroy - has_many :resources, class_name: "ImportResource", dependent: :destroy - has_many :children, foreign_key: :parent_id, class_name: "Import", dependent: :destroy - - scope :where_started_at_in, ->(period_range) do - where('started_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) - end - - scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') } - - extend Enumerize - enumerize :status, in: %w(new pending successful warning failed running aborted canceled), scope: true, default: :new - - validates :name, presence: true - validates :file, presence: true - validates_presence_of :workbench, :creator - - before_create :initialize_fields - - def self.model_name - ActiveModel::Name.new Import, Import, "Import" - end - - def children_succeedeed - children.with_status(:successful, :warning).count - end - - def self.launched_statuses - %w(new pending) - end - - def self.failed_statuses - %w(failed aborted canceled) - end - - def self.finished_statuses - %w(successful failed warning aborted canceled) - end - - def self.abort_old - where( - 'created_at < ? AND status NOT IN (?)', - 4.hours.ago, - finished_statuses - ).update_all(status: 'aborted') - end - - def notify_parent - parent.child_change - update(notified_parent_at: DateTime.now) - end - - def child_change - return if self.class.finished_statuses.include?(status) - - update_status - update_referentials - end - - def update_status - status = - if children.where(status: self.class.failed_statuses).count > 0 - 'failed' - elsif children.where(status: "warning").count > 0 - 'warning' - elsif children.where(status: "successful").count == children.count - 'successful' - end - - attributes = { - current_step: children.count, - status: status - } - - if self.class.finished_statuses.include?(status) - attributes[:ended_at] = Time.now - end - - update attributes - end - - def update_referentials - return unless self.class.finished_statuses.include?(status) - - children.each do |import| - import.referential.update(ready: true) if import.referential - end - end - - private - - def initialize_fields - self.token_download = SecureRandom.urlsafe_base64 - end - -end diff --git a/app/models/import/base.rb b/app/models/import/base.rb new file mode 100644 index 000000000..0e1eae2c0 --- /dev/null +++ b/app/models/import/base.rb @@ -0,0 +1,73 @@ +class Import::Base < ActiveRecord::Base + self.table_name = "imports" + + def self.messages_class_name + "Import::Message" + end + + def self.resources_class_name + "Import::Resource" + end + + include IevInterfaces::Task + + mount_uploader :file, ImportUploader + + has_many :children, foreign_key: :parent_id, class_name: "Import::Base", dependent: :destroy + + validates :file, presence: true + + before_create :initialize_fields + + def self.model_name + ActiveModel::Name.new Import::Base, Import::Base, "Import::Base" + end + + def children_succeedeed + children.with_status(:successful, :warning).count + end + + def child_change + return if self.class.finished_statuses.include?(status) + + update_status + update_referentials + end + + def update_status + status = + if children.where(status: self.class.failed_statuses).count > 0 + 'failed' + elsif children.where(status: "warning").count > 0 + 'warning' + elsif children.where(status: "successful").count == children.count + 'successful' + end + + attributes = { + current_step: children.count, + status: status + } + + if self.class.finished_statuses.include?(status) + attributes[:ended_at] = Time.now + end + + update attributes + end + + def update_referentials + return unless self.class.finished_statuses.include?(status) + + children.each do |import| + import.referential.update(ready: true) if import.referential + end + end + + private + + def initialize_fields + self.token_download = SecureRandom.urlsafe_base64 + end + +end diff --git a/app/models/gtfs_import.rb b/app/models/import/gtfs.rb index d09ca4cb3..03cf49e60 100644 --- a/app/models/gtfs_import.rb +++ b/app/models/import/gtfs.rb @@ -1,5 +1,5 @@ require 'net/http' -class GtfsImport < Import +class Import::Gtfs < Import::Base before_destroy :destroy_non_ready_referential after_commit :launch_java_import, on: :create diff --git a/app/models/import/message.rb b/app/models/import/message.rb new file mode 100644 index 000000000..c1900a718 --- /dev/null +++ b/app/models/import/message.rb @@ -0,0 +1,8 @@ +class Import::Message < ActiveRecord::Base + self.table_name = :import_messages + + include IevInterfaces::Message + + belongs_to :import, class_name: Import::Base + belongs_to :resource, class_name: Import::Resource +end diff --git a/app/models/netex_import.rb b/app/models/import/netex.rb index b21af3408..a4bf0920d 100644 --- a/app/models/netex_import.rb +++ b/app/models/import/netex.rb @@ -1,5 +1,5 @@ require 'net/http' -class NetexImport < Import +class Import::Netex < Import::Base before_destroy :destroy_non_ready_referential after_commit :launch_java_import, on: :create diff --git a/app/models/import/resource.rb b/app/models/import/resource.rb new file mode 100644 index 000000000..73be04d0e --- /dev/null +++ b/app/models/import/resource.rb @@ -0,0 +1,8 @@ +class Import::Resource < ActiveRecord::Base + self.table_name = :import_resources + + include IevInterfaces::Resource + + belongs_to :import, class_name: Import::Base + has_many :messages, class_name: "ImportMessage", foreign_key: :resource_id +end diff --git a/app/models/workbench_import.rb b/app/models/import/workbench.rb index 27f53a44f..f6e15cb89 100644 --- a/app/models/workbench_import.rb +++ b/app/models/import/workbench.rb @@ -1,4 +1,4 @@ -class WorkbenchImport < Import +class Import::Workbench < Import::Base after_commit :launch_worker, :on => :create def launch_worker diff --git a/app/models/import_message.rb b/app/models/import_message.rb deleted file mode 100644 index de70c35d1..000000000 --- a/app/models/import_message.rb +++ /dev/null @@ -1,8 +0,0 @@ -class ImportMessage < ActiveRecord::Base - extend Enumerize - belongs_to :import - belongs_to :resource, class_name: ImportResource - enumerize :criticity, in: %i(info warning error) - - validates :criticity, presence: true -end diff --git a/app/models/import_resource.rb b/app/models/import_resource.rb deleted file mode 100644 index 55e752e74..000000000 --- a/app/models/import_resource.rb +++ /dev/null @@ -1,11 +0,0 @@ -class ImportResource < ActiveRecord::Base - belongs_to :import - - extend Enumerize - enumerize :status, in: %i(OK ERROR WARNING IGNORED), scope: true - - validates_presence_of :name, :resource_type, :reference - - has_many :messages, class_name: "ImportMessage", foreign_key: :resource_id - -end diff --git a/app/models/workbench.rb b/app/models/workbench.rb index b6f90c7dc..44415f102 100644 --- a/app/models/workbench.rb +++ b/app/models/workbench.rb @@ -13,8 +13,8 @@ class Workbench < ActiveRecord::Base has_many :companies, through: :line_referential has_many :group_of_lines, through: :line_referential has_many :stop_areas, through: :stop_area_referential - has_many :imports - has_many :workbench_imports + has_many :imports, class_name: Import::Base + has_many :workbench_imports, class_name: Import::Workbench has_many :compliance_check_sets has_many :compliance_control_sets has_many :merges diff --git a/app/policies/import_policy.rb b/app/policies/import/base_policy.rb index 512bfc8ac..62345e452 100644 --- a/app/policies/import_policy.rb +++ b/app/policies/import/base_policy.rb @@ -1,4 +1,4 @@ -class ImportPolicy < ApplicationPolicy +class Import::BasePolicy < ApplicationPolicy class Scope < Scope def resolve scope diff --git a/app/views/compliance_control_sets/_filters.html.slim b/app/views/compliance_control_sets/_filters.html.slim index 4348defac..5cf282559 100644 --- a/app/views/compliance_control_sets/_filters.html.slim +++ b/app/views/compliance_control_sets/_filters.html.slim @@ -11,7 +11,7 @@ = f.input :organisation_name_eq_any, collection: organisations_filters_values, as: :check_boxes, label: false, label_method: lambda {|w| ("<span>#{w.name}</span>").html_safe}, required: false, wrapper_html: {class: 'checkbox_list'} .form-group.togglable class=filter_item_class(params[:q], :updated_at) - = f.label Import.human_attribute_name(:updated_at), required: false, class: 'control-label' + = f.label Import::Base.human_attribute_name(:updated_at), required: false, class: 'control-label' .filter_menu = f.simple_fields_for :updated_at do |p| = p.input :start_date, as: :date, label: false, wrapper_html: {class: 'date smart_date filter_menu-item'}, default: @begin_range, include_blank: @begin_range ? false : true diff --git a/app/workers/workbench_import_worker.rb b/app/workers/workbench_import_worker.rb index 53cbb222a..fd2a888f0 100644 --- a/app/workers/workbench_import_worker.rb +++ b/app/workers/workbench_import_worker.rb @@ -12,7 +12,7 @@ class WorkbenchImportWorker def perform(import_id) @entries = 0 - @workbench_import ||= WorkbenchImport.find(import_id) + @workbench_import ||= Import::Workbench.find(import_id) workbench_import.update(status: 'running', started_at: Time.now) zip_service = ZipService.new(downloaded, allowed_lines) @@ -44,7 +44,6 @@ class WorkbenchImportWorker raise end - def upload_entry_group entry, element_count update_object_state entry, element_count.succ return unless entry.ok? @@ -80,7 +79,6 @@ class WorkbenchImportWorker File.unlink(eg_file.path) end - # Queries # ======= diff --git a/config/initializers/apartment.rb b/config/initializers/apartment.rb index f5fb8cd5e..53b27006a 100644 --- a/config/initializers/apartment.rb +++ b/config/initializers/apartment.rb @@ -18,72 +18,73 @@ Apartment.configure do |config| # config.excluded_models = %w{Tenant} # config.excluded_models = [ - 'Referential', - 'ReferentialMetadata', - 'ReferentialSuite', - 'Organisation', - 'User', 'Api::V1::ApiKey', - 'StopAreaReferential', - 'StopAreaReferentialMembership', - 'StopAreaReferentialSync', - 'StopAreaReferentialSyncMessage', - 'Chouette::StopArea', - 'LineReferential', - 'LineReferentialMembership', - 'LineReferentialSync', - 'LineReferentialSyncMessage', - 'Chouette::Line', - 'Chouette::GroupOfLine', + 'Calendar', 'Chouette::Company', + 'Chouette::GroupOfLine', + 'Chouette::Line', 'Chouette::Network', - 'ReferentialCloning', - 'Workbench', - 'Workgroup', + 'Chouette::StopArea', 'CleanUp', 'CleanUpResult', - 'Calendar', - 'Import', - 'NetexImport', - 'WorkbenchImport', - 'ImportMessage', - 'ImportResource', + 'ComplianceCheck', + 'ComplianceCheckBlock', + 'ComplianceCheckMessage', + 'ComplianceCheckResource', + 'ComplianceCheckSet', 'ComplianceControl', + 'ComplianceControlBlock', + 'ComplianceControlSet', + 'CustomField', 'GenericAttributeControl::MinMax', 'GenericAttributeControl::Pattern', 'GenericAttributeControl::Uniqueness', + 'Import::Base', + 'Import::Gtfs', + 'Import::Message', + 'Import::Netex', + 'Import::Resource', + 'Import::Workbench', 'JourneyPatternControl::Duplicates', 'JourneyPatternControl::VehicleJourney', 'LineControl::Route', + 'LineReferential', + 'LineReferentialMembership', + 'LineReferentialSync', + 'LineReferentialSyncMessage', + 'Merge', + 'Organisation', + 'Referential', + 'ReferentialCloning', + 'ReferentialMetadata', + 'ReferentialSuite', 'RouteControl::Duplicates', 'RouteControl::JourneyPattern', 'RouteControl::MinimumLength', 'RouteControl::OmnibusJourneyPattern', - 'RouteControl::OppositeRouteTerminus', 'RouteControl::OppositeRoute', + 'RouteControl::OppositeRouteTerminus', 'RouteControl::StopPointsInJourneyPattern', 'RouteControl::UnactivatedStopPoint', 'RouteControl::ZDLStopArea', 'RoutingConstraintZoneControl::MaximumLength', 'RoutingConstraintZoneControl::MinimumLength', 'RoutingConstraintZoneControl::UnactivatedStopPoint', + 'SimpleExporter', + 'SimpleImporter', + 'SimpleInterface', + 'StopAreaReferential', + 'StopAreaReferentialMembership', + 'StopAreaReferentialSync', + 'StopAreaReferentialSyncMessage', + 'User', 'VehicleJourneyControl::Delta', - 'VehicleJourneyControl::WaitingTime', 'VehicleJourneyControl::Speed', 'VehicleJourneyControl::TimeTable', 'VehicleJourneyControl::VehicleJourneyAtStops', - 'ComplianceControlSet', - 'ComplianceControlBlock', - 'ComplianceCheck', - 'ComplianceCheckSet', - 'ComplianceCheckBlock', - 'ComplianceCheckResource', - 'ComplianceCheckMessage', - 'Merge', - 'CustomField', - 'SimpleInterface', - 'SimpleImporter', - 'SimpleExporter', + 'VehicleJourneyControl::WaitingTime', + 'Workbench', + 'Workgroup', ] # use postgres schemas? diff --git a/db/migrate/20171106111448_update_import_message_criticity_type_to_string.rb b/db/migrate/20171106111448_update_import_message_criticity_type_to_string.rb index c14450387..a08a10b9a 100644 --- a/db/migrate/20171106111448_update_import_message_criticity_type_to_string.rb +++ b/db/migrate/20171106111448_update_import_message_criticity_type_to_string.rb @@ -7,10 +7,10 @@ class UpdateImportMessageCriticityTypeToString < ActiveRecord::Migration when 0 then "info" when 1 then "warning" when 2 then "error" - else + else "info" end end - ImportMessage.all.each { |im| im.update_attribute(:criticity, change_criticity_value(im.criticity)) } + Import::Message.all.each { |im| im.update_attribute(:criticity, change_criticity_value(im.criticity)) } end end diff --git a/db/migrate/20180306152953_update_imports_names.rb b/db/migrate/20180306152953_update_imports_names.rb new file mode 100644 index 000000000..086d5ce5a --- /dev/null +++ b/db/migrate/20180306152953_update_imports_names.rb @@ -0,0 +1,8 @@ +class UpdateImportsNames < ActiveRecord::Migration + def change + Import::Base.all.pluck(:type).uniq.each do |type| + next if type =~ /^Imports/ + Import::Base.where(type: type).update_all type: "Import::#{type.gsub 'Import', ''}" + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 276d7f79a..53dbaceb2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,14 +11,13 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180306135204) do +ActiveRecord::Schema.define(version: 20180306152953) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - enable_extension "hstore" enable_extension "postgis" + enable_extension "hstore" enable_extension "unaccent" - enable_extension "objectid" create_table "access_links", id: :bigserial, force: :cascade do |t| t.integer "access_point_id", limit: 8 @@ -91,9 +90,9 @@ ActiveRecord::Schema.define(version: 20180306135204) do t.integer "organisation_id", limit: 8 t.datetime "created_at" t.datetime "updated_at" + t.integer "workgroup_id", limit: 8 t.integer "int_day_types" t.date "excluded_dates", array: true - t.integer "workgroup_id", limit: 8 end add_index "calendars", ["organisation_id"], name: "index_calendars_on_organisation_id", using: :btree @@ -120,7 +119,6 @@ ActiveRecord::Schema.define(version: 20180306135204) do t.datetime "updated_at" t.date "end_date" t.string "date_type" - t.string "mode" end add_index "clean_ups", ["referential_id"], name: "index_clean_ups_on_referential_id", using: :btree @@ -755,7 +753,6 @@ ActiveRecord::Schema.define(version: 20180306135204) do t.datetime "created_at" t.datetime "updated_at" t.string "objectid_format" - t.string "registration_number_format" end create_table "stop_areas", id: :bigserial, force: :cascade do |t| diff --git a/spec/controllers/api/v1/imports_controller_spec.rb b/spec/controllers/api/v1/imports_controller_spec.rb index 8077dd052..f7022115a 100644 --- a/spec/controllers/api/v1/imports_controller_spec.rb +++ b/spec/controllers/api/v1/imports_controller_spec.rb @@ -30,7 +30,7 @@ RSpec.describe Api::V1::ImportsController, type: :controller do it 'should be successful' do expect { post :create, workbench_id: workbench.id, workbench_import: {name: "test", file: file, creator: 'test'}, format: :json - }.to change{WorkbenchImport.count}.by(1) + }.to change{Import::Workbench.count}.by(1) expect(response).to be_success end end diff --git a/spec/controllers/vehicle_journey_imports_controller_spec.rb b/spec/controllers/vehicle_journey_imports_controller_spec.rb deleted file mode 100644 index 633f90b70..000000000 --- a/spec/controllers/vehicle_journey_imports_controller_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' - -describe ImportTasksController, :type => :controller do - login_user -end diff --git a/spec/factories/import_messages.rb b/spec/factories/imports/import_messages.rb index 5d936679a..f5edf1685 100644 --- a/spec/factories/import_messages.rb +++ b/spec/factories/imports/import_messages.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :import_message do + factory :import_message, class: Import::Message do association :import association :resource, factory: :import_resource criticity :info diff --git a/spec/factories/import_resources.rb b/spec/factories/imports/import_resources.rb index 76afcc486..aaf7e3111 100644 --- a/spec/factories/import_resources.rb +++ b/spec/factories/imports/import_resources.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :import_resource do + factory :import_resource, class: Import::Resource do association :import status :WARNING sequence(:name) { |n| "Import resource #{n}" } diff --git a/spec/factories/imports.rb b/spec/factories/imports/imports.rb index e07447b60..cb7764cc6 100644 --- a/spec/factories/imports.rb +++ b/spec/factories/imports/imports.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :import do + factory :import, class: Import::Base do sequence(:name) { |n| "Import #{n}" } current_step_id "MyString" current_step_progress 1.5 @@ -16,7 +16,7 @@ FactoryGirl.define do end end - factory :bad_import do + factory :bad_import, class: Import::Base do sequence(:name) { |n| "Import #{n}" } current_step_id "MyString" current_step_progress 1.5 diff --git a/spec/factories/netex_imports.rb b/spec/factories/imports/netex_imports.rb index b59267a0a..7ee6839e8 100644 --- a/spec/factories/netex_imports.rb +++ b/spec/factories/imports/netex_imports.rb @@ -1,7 +1,7 @@ FactoryGirl.define do - factory :netex_import, class: NetexImport, parent: :import do + factory :netex_import, class: Import::Netex, parent: :import do file { File.open(Rails.root.join('spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip')) } association :parent, factory: :workbench_import - + end end diff --git a/spec/factories/workbench_imports.rb b/spec/factories/imports/workbench_imports.rb index 466bfe688..5ed1ee4e5 100644 --- a/spec/factories/workbench_imports.rb +++ b/spec/factories/imports/workbench_imports.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :workbench_import, class: WorkbenchImport, parent: :import do + factory :workbench_import, class: Import::Workbench, parent: :import do file { File.open(Rails.root.join('spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip')) } end end diff --git a/spec/models/export_log_message_spec.rb b/spec/models/export_log_message_spec.rb deleted file mode 100644 index 5ab32dec0..000000000 --- a/spec/models/export_log_message_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -describe ExportLogMessage, :type => :model do - - # describe "#attributes" do - - # subject { create :export_log_message } - - # it "should read json stored in database" do - # subject.update_attribute :arguments, { "key" => "value"} - # expect(subject.raw_attributes).to eq({ "key" => "value"}.to_json) - # end - - # end - -end diff --git a/spec/models/gtfs_export_spec.rb b/spec/models/gtfs_export_spec.rb index ccc98e872..0ef3660f5 100644 --- a/spec/models/gtfs_export_spec.rb +++ b/spec/models/gtfs_export_spec.rb @@ -1,33 +1,33 @@ require 'spec_helper' -describe GtfsExport, :type => :model do - - describe "#time_zone" do - - context "when exported data are not StopAreas" do - - before do - subject.references_type = "network" - end - - it "should be mandatory" do - should validate_presence_of(:time_zone) - end - - end - - context "when export data are StopArea" do - - before do - subject.references_type = "stop_area" - end - - it "should be mandatory" do - should_not validate_presence_of(:time_zone) - end - - end - - end - -end +# describe GtfsExport, :type => :model do +# +# describe "#time_zone" do +# +# context "when exported data are not StopAreas" do +# +# before do +# subject.references_type = "network" +# end +# +# it "should be mandatory" do +# should validate_presence_of(:time_zone) +# end +# +# end +# +# context "when export data are StopArea" do +# +# before do +# subject.references_type = "stop_area" +# end +# +# it "should be mandatory" do +# should_not validate_presence_of(:time_zone) +# end +# +# end +# +# end +# +# end diff --git a/spec/models/gtfs_import_spec.rb b/spec/models/gtfs_import_spec.rb index 07cc1905d..5cb69332c 100644 --- a/spec/models/gtfs_import_spec.rb +++ b/spec/models/gtfs_import_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe GtfsImport, :type => :model do +describe Import::Gtfs, :type => :model do # describe "#object_id_prefix" do diff --git a/spec/models/import/netex_import_spec.rb b/spec/models/import/netex_import_spec.rb index 8ffeed1f4..9b9f50117 100644 --- a/spec/models/import/netex_import_spec.rb +++ b/spec/models/import/netex_import_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe NetexImport, type: [:model, :with_commit] do +RSpec.describe Import::Netex, type: [:model, :with_commit] do let( :boiv_iev_uri ){ URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/importer/new?id=#{subject.id}")} @@ -30,4 +30,42 @@ RSpec.describe NetexImport, type: [:model, :with_commit] do end end + describe "#destroy" do + it "must destroy its associated Referential if ready: false" do + workbench_import = create(:workbench_import) + referential_ready_false = create(:referential, ready: false) + referential_ready_true = create(:referential, ready: true) + create( + :netex_import, + parent: workbench_import, + referential: referential_ready_false + ) + create( + :netex_import, + parent: workbench_import, + referential: referential_ready_true + ) + + workbench_import.destroy + + expect( + Referential.where(id: referential_ready_false.id).exists? + ).to be false + expect( + Referential.where(id: referential_ready_true.id).exists? + ).to be true + end + + it "doesn't try to destroy nil referentials" do + workbench_import = create(:workbench_import) + create( + :netex_import, + parent: workbench_import, + referential: nil + ) + + expect { workbench_import.destroy }.not_to raise_error + end + end + end diff --git a/spec/models/import_message_spec.rb b/spec/models/import_message_spec.rb index 2d8aac2b7..48e03a2cc 100644 --- a/spec/models/import_message_spec.rb +++ b/spec/models/import_message_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.describe ImportMessage, :type => :model do +RSpec.describe Import::Message, :type => :model do it { should validate_presence_of(:criticity) } it { should belong_to(:import) } it { should belong_to(:resource) } diff --git a/spec/models/import_resource_spec.rb b/spec/models/import_resource_spec.rb index c88bb5dd2..7d2eab8f1 100644 --- a/spec/models/import_resource_spec.rb +++ b/spec/models/import_resource_spec.rb @@ -1,6 +1,6 @@ require 'rails_helper' -RSpec.describe ImportResource, :type => :model do +RSpec.describe Import::Resource, :type => :model do it { should belong_to(:import) } it { should enumerize(:status).in("OK", "ERROR", "WARNING", "IGNORED") } diff --git a/spec/models/import_service_spec.rb b/spec/models/import_service_spec.rb deleted file mode 100644 index e7ee062d6..000000000 --- a/spec/models/import_service_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'spec_helper' - -describe ImportService, :type => :model do - - let(:referential) { create(:referential, :slug => "test") } - - subject { ImportService.new(referential) } - - describe '.find' do - - it "should build an import with a scheduled job" do - end - - it "should build an import with a terminated job" do - end - - end - -end diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb index 8b85f151b..cbc5907fa 100644 --- a/spec/models/import_spec.rb +++ b/spec/models/import_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe Import, type: :model do +RSpec.describe Import::Base, type: :model do it { should belong_to(:referential) } it { should belong_to(:workbench) } @@ -39,7 +39,7 @@ RSpec.describe Import, type: :model do ) current_import = create(:workbench_import, status: 'pending') - Import.abort_old + Import::Base.abort_old expect(current_import.reload.status).to eq('pending') expect(old_import.reload.status).to eq('aborted') @@ -54,7 +54,7 @@ RSpec.describe Import, type: :model do created_at: 4.hours.ago - 1.minute ) - Import.abort_old + Import::Base.abort_old expect(import.reload.status).to eq('successful') end @@ -73,7 +73,7 @@ RSpec.describe Import, type: :model do created_at: 4.hours.ago - 1.minute ) - NetexImport.abort_old + Import::Netex.abort_old expect(workbench_import.reload.status).to eq('pending') expect(netex_import.reload.status).to eq('aborted') @@ -88,25 +88,25 @@ RSpec.describe Import, type: :model do netex_import.parent.destroy expect(netex_import.parent).to be_destroyed - expect(NetexImport.count).to eq(0) + expect(Import::Netex.count).to eq(0) end - it "must destroy all associated ImportMessages" do + it "must destroy all associated Import::Messages" do import = create(:import) create(:import_resource, import: import) import.destroy - expect(ImportResource.count).to eq(0) + expect(Import::Resource.count).to eq(0) end - it "must destroy all associated ImportResources" do + it "must destroy all associated Import::Resources" do import = create(:import) create(:import_message, import: import) import.destroy - expect(ImportMessage.count).to eq(0) + expect(Import::Message.count).to eq(0) end end diff --git a/spec/models/netex_export_spec.rb b/spec/models/netex_export_spec.rb index 1d09fa07f..345bf4d5a 100644 --- a/spec/models/netex_export_spec.rb +++ b/spec/models/netex_export_spec.rb @@ -1,10 +1,10 @@ require 'spec_helper' -describe NetexExport, :type => :model do - - # describe '#export_options' do - # subject { super().export_options } - # it { is_expected.to include(:format => :netex) } - # end - -end +# describe NetexExport, :type => :model do +# +# # describe '#export_options' do +# # subject { super().export_options } +# # it { is_expected.to include(:format => :netex) } +# # end +# +# end diff --git a/spec/models/netex_import_spec.rb b/spec/models/netex_import_spec.rb deleted file mode 100644 index c6051a869..000000000 --- a/spec/models/netex_import_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -RSpec.describe NetexImport, type: :model do - describe "#destroy" do - it "must destroy its associated Referential if ready: false" do - workbench_import = create(:workbench_import) - referential_ready_false = create(:referential, ready: false) - referential_ready_true = create(:referential, ready: true) - create( - :netex_import, - parent: workbench_import, - referential: referential_ready_false - ) - create( - :netex_import, - parent: workbench_import, - referential: referential_ready_true - ) - - workbench_import.destroy - - expect( - Referential.where(id: referential_ready_false.id).exists? - ).to be false - expect( - Referential.where(id: referential_ready_true.id).exists? - ).to be true - end - - it "doesn't try to destroy nil referentials" do - workbench_import = create(:workbench_import) - create( - :netex_import, - parent: workbench_import, - referential: nil - ) - - expect { workbench_import.destroy }.not_to raise_error - end - end -end diff --git a/spec/policies/import_policy_spec.rb b/spec/policies/import_policy_spec.rb index 9c7fca8a5..f9effd21a 100644 --- a/spec/policies/import_policy_spec.rb +++ b/spec/policies/import_policy_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe ImportPolicy, type: :policy do +RSpec.describe Import::BasePolicy, type: :policy do let( :record ){ build_stubbed :import } before { stub_policy_scope(record) } diff --git a/spec/requests/api/v1/netex_import_spec.rb b/spec/requests/api/v1/netex_import_spec.rb index 8597c1d32..14dac9a25 100644 --- a/spec/requests/api/v1/netex_import_spec.rb +++ b/spec/requests/api/v1/netex_import_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe "NetexImport", type: :request do +RSpec.describe "Import::Netex", type: :request do describe 'POST netex_imports' do @@ -39,7 +39,7 @@ RSpec.describe "NetexImport", type: :request do post_request.(netex_import: legal_attributes) expect( response ).to be_success expect( json_response_body ).to eq( - 'id' => NetexImport.last.id, + 'id' => Import::Netex.last.id, 'referential_id' => Referential.last.id, 'workbench_id' => workbench.id ) @@ -51,7 +51,7 @@ RSpec.describe "NetexImport", type: :request do create(:line, objectid: 'STIF:CODIFLIGNE:Line:C00108', line_referential: workbench.line_referential) create(:line, objectid: 'STIF:CODIFLIGNE:Line:C00109', line_referential: workbench.line_referential) - expect{ post_request.(netex_import: legal_attributes) }.to change{NetexImport.count}.by(1) + expect{ post_request.(netex_import: legal_attributes) }.to change{Import::Netex.count}.by(1) end it 'creates a correct Referential', pending: 'see #5073' do @@ -96,7 +96,7 @@ RSpec.describe "NetexImport", type: :request do end it 'does not create an Import object' do - expect{ post_request.(netex_import: illegal_attributes) }.not_to change{Import.count} + expect{ post_request.(netex_import: illegal_attributes) }.not_to change{Import::Base.count} end it 'might not create a referential' do diff --git a/spec/services/parent_notifier_spec.rb b/spec/services/parent_notifier_spec.rb index ecf508fcd..d4ca73ab3 100644 --- a/spec/services/parent_notifier_spec.rb +++ b/spec/services/parent_notifier_spec.rb @@ -20,7 +20,7 @@ RSpec.describe ParentNotifier do expect(netex_import).to receive(:notify_parent) end - ParentNotifier.new(Import).notify_when_finished(netex_imports) + ParentNotifier.new(Import::Base).notify_when_finished(netex_imports) end it "doesn't call #notify_parent if its `notified_parent_at` is set" do @@ -33,7 +33,7 @@ RSpec.describe ParentNotifier do expect(netex_import).not_to receive(:notify_parent) - ParentNotifier.new(Import).notify_when_finished + ParentNotifier.new(Import::Base).notify_when_finished end end @@ -47,7 +47,7 @@ RSpec.describe ParentNotifier do ) expect( - ParentNotifier.new(Import).objects_pending_notification + ParentNotifier.new(Import::Base).objects_pending_notification ).to eq([netex_import]) end @@ -55,7 +55,7 @@ RSpec.describe ParentNotifier do create(:import, parent: nil) expect( - ParentNotifier.new(Import).objects_pending_notification + ParentNotifier.new(Import::Base).objects_pending_notification ).to be_empty end @@ -70,7 +70,7 @@ RSpec.describe ParentNotifier do end expect( - ParentNotifier.new(Import).objects_pending_notification + ParentNotifier.new(Import::Base).objects_pending_notification ).to be_empty end @@ -83,7 +83,7 @@ RSpec.describe ParentNotifier do ) expect( - ParentNotifier.new(Import).objects_pending_notification + ParentNotifier.new(Import::Base).objects_pending_notification ).to be_empty end end |
