From b810deb08cadd56caeb76eb81cff363458bb79a3 Mon Sep 17 00:00:00 2001 From: Zog Date: Wed, 7 Mar 2018 07:50:02 +0100 Subject: Refs #6133; Fix specs --- app/controllers/api/v1/imports_controller.rb | 4 +- .../api/v1/internals/netex_imports_controller.rb | 8 +- app/controllers/api/v1/netex_imports_controller.rb | 2 +- app/controllers/exports_controller.rb | 136 ++++++++++----------- app/controllers/import_messages_controller.rb | 8 +- app/controllers/import_resources_controller.rb | 2 +- app/controllers/import_tasks_controller.rb | 69 ----------- app/controllers/imports_controller.rb | 8 +- app/controllers/statuses_controller.rb | 2 +- app/decorators/import/base_decorator.rb | 26 ++++ app/decorators/import_decorator.rb | 26 ---- app/models/concerns/iev_interfaces/message.rb | 9 ++ app/models/concerns/iev_interfaces/resource.rb | 9 ++ app/models/concerns/iev_interfaces/task.rb | 51 ++++++++ app/models/gtfs_import.rb | 36 ------ app/models/import.rb | 103 ---------------- app/models/import/base.rb | 73 +++++++++++ app/models/import/gtfs.rb | 36 ++++++ app/models/import/message.rb | 8 ++ app/models/import/netex.rb | 38 ++++++ app/models/import/resource.rb | 8 ++ app/models/import/workbench.rb | 7 ++ app/models/import_message.rb | 8 -- app/models/import_resource.rb | 11 -- app/models/netex_import.rb | 38 ------ app/models/workbench.rb | 4 +- app/models/workbench_import.rb | 7 -- app/policies/import/base_policy.rb | 15 +++ app/policies/import_policy.rb | 15 --- .../compliance_control_sets/_filters.html.slim | 2 +- app/workers/workbench_import_worker.rb | 4 +- 31 files changed, 369 insertions(+), 404 deletions(-) delete mode 100644 app/controllers/import_tasks_controller.rb create mode 100644 app/decorators/import/base_decorator.rb delete mode 100644 app/decorators/import_decorator.rb create mode 100644 app/models/concerns/iev_interfaces/message.rb create mode 100644 app/models/concerns/iev_interfaces/resource.rb create mode 100644 app/models/concerns/iev_interfaces/task.rb delete mode 100644 app/models/gtfs_import.rb delete mode 100644 app/models/import.rb create mode 100644 app/models/import/base.rb create mode 100644 app/models/import/gtfs.rb create mode 100644 app/models/import/message.rb create mode 100644 app/models/import/netex.rb create mode 100644 app/models/import/resource.rb create mode 100644 app/models/import/workbench.rb delete mode 100644 app/models/import_message.rb delete mode 100644 app/models/import_resource.rb delete mode 100644 app/models/netex_import.rb delete mode 100644 app/models/workbench_import.rb create mode 100644 app/policies/import/base_policy.rb delete mode 100644 app/policies/import_policy.rb (limited to 'app') 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/base_decorator.rb b/app/decorators/import/base_decorator.rb new file mode 100644 index 000000000..8c10479c6 --- /dev/null +++ b/app/decorators/import/base_decorator.rb @@ -0,0 +1,26 @@ +class Import::BaseDecorator < AF83::Decorator + decorates Import::Base + + set_scope { context[:workbench] } + + define_instance_method :import_status_css_class do + cls ='' + cls = 'overheaded-success' if object.status == 'successful' + cls = 'overheaded-warning' if object.status == 'warning' + cls = 'overheaded-danger' if %w[failed aborted canceled].include? object.status + cls + end + + create_action_link do |l| + l.content t('imports.actions.new') + end + + with_instance_decorator do |instance_decorator| + instance_decorator.show_action_link + + instance_decorator.action_link secondary: :show do |l| + l.content t('imports.actions.download') + l.href { object.file.url } + end + end +end diff --git a/app/decorators/import_decorator.rb b/app/decorators/import_decorator.rb deleted file mode 100644 index 1964365ae..000000000 --- a/app/decorators/import_decorator.rb +++ /dev/null @@ -1,26 +0,0 @@ -class ImportDecorator < AF83::Decorator - decorates Import - - set_scope { context[:workbench] } - - define_instance_method :import_status_css_class do - cls ='' - cls = 'overheaded-success' if object.status == 'successful' - cls = 'overheaded-warning' if object.status == 'warning' - cls = 'overheaded-danger' if %w[failed aborted canceled].include? object.status - cls - end - - create_action_link do |l| - l.content t('imports.actions.new') - end - - with_instance_decorator do |instance_decorator| - instance_decorator.show_action_link - - instance_decorator.action_link secondary: :show do |l| - l.content t('imports.actions.download') - l.href { object.file.url } - end - end -end 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/gtfs_import.rb b/app/models/gtfs_import.rb deleted file mode 100644 index d09ca4cb3..000000000 --- a/app/models/gtfs_import.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'net/http' -class GtfsImport < Import - before_destroy :destroy_non_ready_referential - - after_commit :launch_java_import, on: :create - before_save def abort_unless_referential - self.status = 'aborted' unless referential - end - - def launch_java_import - return if self.class.finished_statuses.include?(status) - threaded_call_boiv_iev - end - - private - - def destroy_non_ready_referential - if referential && !referential.ready - referential.destroy - end - end - - def threaded_call_boiv_iev - Thread.new(&method(:call_boiv_iev)) - end - - def call_boiv_iev - Rails.logger.error("Begin IEV call for import") - Net::HTTP.get(URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/importer/new?id=#{id}")) - Rails.logger.error("End IEV call for import") - rescue Exception => e - logger.error "IEV server error : #{e.message}" - logger.error e.backtrace.inspect - 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/import/gtfs.rb b/app/models/import/gtfs.rb new file mode 100644 index 000000000..03cf49e60 --- /dev/null +++ b/app/models/import/gtfs.rb @@ -0,0 +1,36 @@ +require 'net/http' +class Import::Gtfs < Import::Base + before_destroy :destroy_non_ready_referential + + after_commit :launch_java_import, on: :create + before_save def abort_unless_referential + self.status = 'aborted' unless referential + end + + def launch_java_import + return if self.class.finished_statuses.include?(status) + threaded_call_boiv_iev + end + + private + + def destroy_non_ready_referential + if referential && !referential.ready + referential.destroy + end + end + + def threaded_call_boiv_iev + Thread.new(&method(:call_boiv_iev)) + end + + def call_boiv_iev + Rails.logger.error("Begin IEV call for import") + Net::HTTP.get(URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/importer/new?id=#{id}")) + Rails.logger.error("End IEV call for import") + rescue Exception => e + logger.error "IEV server error : #{e.message}" + logger.error e.backtrace.inspect + end + +end 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/import/netex.rb b/app/models/import/netex.rb new file mode 100644 index 000000000..a4bf0920d --- /dev/null +++ b/app/models/import/netex.rb @@ -0,0 +1,38 @@ +require 'net/http' +class Import::Netex < Import::Base + before_destroy :destroy_non_ready_referential + + after_commit :launch_java_import, on: :create + before_save def abort_unless_referential + self.status = 'aborted' unless referential + end + + validates_presence_of :parent + + def launch_java_import + return if self.class.finished_statuses.include?(status) + threaded_call_boiv_iev + end + + private + + def destroy_non_ready_referential + if referential && !referential.ready + referential.destroy + end + end + + def threaded_call_boiv_iev + Thread.new(&method(:call_boiv_iev)) + end + + def call_boiv_iev + Rails.logger.error("Begin IEV call for import") + Net::HTTP.get(URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/importer/new?id=#{id}")) + Rails.logger.error("End IEV call for import") + rescue Exception => e + logger.error "IEV server error : #{e.message}" + logger.error e.backtrace.inspect + end + +end 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/import/workbench.rb b/app/models/import/workbench.rb new file mode 100644 index 000000000..f6e15cb89 --- /dev/null +++ b/app/models/import/workbench.rb @@ -0,0 +1,7 @@ +class Import::Workbench < Import::Base + after_commit :launch_worker, :on => :create + + def launch_worker + WorkbenchImportWorker.perform_async(id) + end +end 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/netex_import.rb b/app/models/netex_import.rb deleted file mode 100644 index b21af3408..000000000 --- a/app/models/netex_import.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'net/http' -class NetexImport < Import - before_destroy :destroy_non_ready_referential - - after_commit :launch_java_import, on: :create - before_save def abort_unless_referential - self.status = 'aborted' unless referential - end - - validates_presence_of :parent - - def launch_java_import - return if self.class.finished_statuses.include?(status) - threaded_call_boiv_iev - end - - private - - def destroy_non_ready_referential - if referential && !referential.ready - referential.destroy - end - end - - def threaded_call_boiv_iev - Thread.new(&method(:call_boiv_iev)) - end - - def call_boiv_iev - Rails.logger.error("Begin IEV call for import") - Net::HTTP.get(URI("#{Rails.configuration.iev_url}/boiv_iev/referentials/importer/new?id=#{id}")) - Rails.logger.error("End IEV call for import") - rescue Exception => e - logger.error "IEV server error : #{e.message}" - logger.error e.backtrace.inspect - end - -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/models/workbench_import.rb b/app/models/workbench_import.rb deleted file mode 100644 index 27f53a44f..000000000 --- a/app/models/workbench_import.rb +++ /dev/null @@ -1,7 +0,0 @@ -class WorkbenchImport < Import - after_commit :launch_worker, :on => :create - - def launch_worker - WorkbenchImportWorker.perform_async(id) - end -end diff --git a/app/policies/import/base_policy.rb b/app/policies/import/base_policy.rb new file mode 100644 index 000000000..62345e452 --- /dev/null +++ b/app/policies/import/base_policy.rb @@ -0,0 +1,15 @@ +class Import::BasePolicy < ApplicationPolicy + class Scope < Scope + def resolve + scope + end + end + + def create? + user.has_permission?('imports.create') + end + + def update? + user.has_permission?('imports.update') + end +end diff --git a/app/policies/import_policy.rb b/app/policies/import_policy.rb deleted file mode 100644 index 512bfc8ac..000000000 --- a/app/policies/import_policy.rb +++ /dev/null @@ -1,15 +0,0 @@ -class ImportPolicy < ApplicationPolicy - class Scope < Scope - def resolve - scope - end - end - - def create? - user.has_permission?('imports.create') - end - - def update? - user.has_permission?('imports.update') - end -end 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| ("#{w.name}").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 # ======= -- cgit v1.2.3