diff options
| author | Zog | 2018-03-07 08:38:38 +0100 | 
|---|---|---|
| committer | Zog | 2018-03-12 12:00:14 +0100 | 
| commit | 0b9269780989dbd69a9be9d63670aab12050cf60 (patch) | |
| tree | 1c9d3c4c5c9a881b1ffb5402705941cf2d9318e0 | |
| parent | 565641838e020f992e58f05d94ab0097b74a27b2 (diff) | |
| download | chouette-core-0b9269780989dbd69a9be9d63670aab12050cf60.tar.bz2 | |
Refs #6133; Exports naive implementation
| -rw-r--r-- | app/models/concerns/iev_interfaces/task.rb | 43 | ||||
| -rw-r--r-- | app/models/export/base.rb | 25 | ||||
| -rw-r--r-- | app/models/export/message.rb | 8 | ||||
| -rw-r--r-- | app/models/export/resource.rb | 8 | ||||
| -rw-r--r-- | app/models/import/base.rb | 37 | ||||
| -rw-r--r-- | config/initializers/apartment.rb | 3 | ||||
| -rw-r--r-- | db/migrate/20180306152953_update_imports_names.rb | 7 | ||||
| -rw-r--r-- | db/migrate/20180307071448_create_new_exports.rb | 56 | ||||
| -rw-r--r-- | db/schema.rb | 61 | 
9 files changed, 209 insertions, 39 deletions
| diff --git a/app/models/concerns/iev_interfaces/task.rb b/app/models/concerns/iev_interfaces/task.rb index 2eb0c532f..b142850fb 100644 --- a/app/models/concerns/iev_interfaces/task.rb +++ b/app/models/concerns/iev_interfaces/task.rb @@ -6,6 +6,11 @@ module IevInterfaces::Task      belongs_to :workbench, class_name: "::Workbench"      belongs_to :referential +    mount_uploader :file, ImportUploader +    validates :file, presence: true + +    has_many :children, foreign_key: :parent_id, class_name: self.name, dependent: :destroy +      extend Enumerize      enumerize :status, in: %w(new pending successful warning failed running aborted canceled), scope: true, default: :new @@ -20,6 +25,8 @@ module IevInterfaces::Task      end      scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') } + +    before_create :initialize_fields    end    module ClassMethods @@ -48,4 +55,40 @@ module IevInterfaces::Task      parent.child_change      update(notified_parent_at: DateTime.now)    end + +  def children_succeedeed +    children.with_status(:successful, :warning).count +  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 child_change +    return if self.class.finished_statuses.include?(status) + +    update_status +  end + +  private +  def initialize_fields +  end  end diff --git a/app/models/export/base.rb b/app/models/export/base.rb new file mode 100644 index 000000000..d809055db --- /dev/null +++ b/app/models/export/base.rb @@ -0,0 +1,25 @@ +class Export::Base < ActiveRecord::Base +  self.table_name = "exports" + +  def self.messages_class_name +    "Export::Message" +  end + +  def self.resources_class_name +    "Export::Resource" +  end + +  include IevInterfaces::Task + +  def self.model_name +    ActiveModel::Name.new Export::Base, Export::Base, "Export::Base" +  end + +  private + +  def initialize_fields +    super +    self.token_upload = SecureRandom.urlsafe_base64 +  end + +end diff --git a/app/models/export/message.rb b/app/models/export/message.rb new file mode 100644 index 000000000..b64b524ac --- /dev/null +++ b/app/models/export/message.rb @@ -0,0 +1,8 @@ +class Export::Message < ActiveRecord::Base +  self.table_name = :export_messages + +  include IevInterfaces::Message + +  belongs_to :export, class_name: Export::Base +  belongs_to :resource, class_name: Export::Resource +end diff --git a/app/models/export/resource.rb b/app/models/export/resource.rb new file mode 100644 index 000000000..98f103be4 --- /dev/null +++ b/app/models/export/resource.rb @@ -0,0 +1,8 @@ +class Export::Resource < ActiveRecord::Base +  self.table_name = :export_resources + +  include IevInterfaces::Resource + +  belongs_to :export, class_name: Export::Base +  has_many :messages, class_name: "ExportMessage", foreign_key: :resource_id +end diff --git a/app/models/import/base.rb b/app/models/import/base.rb index 0e1eae2c0..e2ae129be 100644 --- a/app/models/import/base.rb +++ b/app/models/import/base.rb @@ -11,51 +11,17 @@ class Import::Base < ActiveRecord::Base    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 +    super      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) @@ -67,6 +33,7 @@ class Import::Base < ActiveRecord::Base    private    def initialize_fields +    super      self.token_download = SecureRandom.urlsafe_base64    end diff --git a/config/initializers/apartment.rb b/config/initializers/apartment.rb index 53b27006a..6b817caed 100644 --- a/config/initializers/apartment.rb +++ b/config/initializers/apartment.rb @@ -36,6 +36,9 @@ Apartment.configure do |config|      'ComplianceControlBlock',      'ComplianceControlSet',      'CustomField', +    'Export::Base', +    'Export::Message', +    'Export::Resource',      'GenericAttributeControl::MinMax',      'GenericAttributeControl::Pattern',      'GenericAttributeControl::Uniqueness', diff --git a/db/migrate/20180306152953_update_imports_names.rb b/db/migrate/20180306152953_update_imports_names.rb index 086d5ce5a..42129a580 100644 --- a/db/migrate/20180306152953_update_imports_names.rb +++ b/db/migrate/20180306152953_update_imports_names.rb @@ -1,8 +1,13 @@  class UpdateImportsNames < ActiveRecord::Migration    def change      Import::Base.all.pluck(:type).uniq.each do |type| -      next if type =~ /^Imports/ +      next if type =~ /^Import/        Import::Base.where(type: type).update_all type: "Import::#{type.gsub 'Import', ''}"      end + +    Import::Base.all.pluck(:parent_type).uniq.each do |type| +      next if type =~ /^Import/ +      Import::Base.where(parent_type: type).update_all parent_type: "Import::#{type.gsub 'Import', ''}" +    end    end  end diff --git a/db/migrate/20180307071448_create_new_exports.rb b/db/migrate/20180307071448_create_new_exports.rb new file mode 100644 index 000000000..74921d108 --- /dev/null +++ b/db/migrate/20180307071448_create_new_exports.rb @@ -0,0 +1,56 @@ +class CreateNewExports < ActiveRecord::Migration +  def change +    create_table :exports do |t| +      t.string   "status" +      t.string   "current_step_id" +      t.float    "current_step_progress" +      t.integer  "workbench_id",          limit: 8 +      t.integer  "referential_id",        limit: 8 +      t.string   "name" +      t.datetime "created_at" +      t.datetime "updated_at" +      t.string   "file" +      t.datetime "started_at" +      t.datetime "ended_at" +      t.string   "token_upload" +      t.string   "type" +      t.integer  "parent_id",             limit: 8 +      t.string   "parent_type" +      t.datetime "notified_parent_at" +      t.integer  "current_step",          default: 0 +      t.integer  "total_steps",           default: 0 +      t.string   "creator" +    end + +    add_index "exports", ["referential_id"], name: "index_exports_on_referential_id", using: :btree +    add_index "exports", ["workbench_id"], name: "index_exports_on_workbench_id", using: :btree + +    create_table "export_messages", id: :bigserial, force: :cascade do |t| +      t.string   "criticity" +      t.string   "message_key" +      t.hstore   "message_attributes" +      t.integer  "export_id",           limit: 8 +      t.integer  "resource_id",         limit: 8 +      t.datetime "created_at" +      t.datetime "updated_at" +      t.hstore   "resource_attributes" +    end + +    add_index "export_messages", ["export_id"], name: "index_export_messages_on_export_id", using: :btree +    add_index "export_messages", ["resource_id"], name: "index_export_messages_on_resource_id", using: :btree + +    create_table "export_resources", id: :bigserial, force: :cascade do |t| +      t.integer  "export_id",     limit: 8 +      t.string   "status" +      t.datetime "created_at" +      t.datetime "updated_at" +      t.string   "resource_type" +      t.string   "reference" +      t.string   "name" +      t.hstore   "metrics" +    end + +    add_index "export_resources", ["export_id"], name: "index_export_resources_on_export_id", using: :btree + +  end +end diff --git a/db/schema.rb b/db/schema.rb index 53dbaceb2..094d2cb02 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,13 +11,14 @@  #  # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180306152953) do +ActiveRecord::Schema.define(version: 20180307071448) do    # These are extensions that must be enabled in order to support this database    enable_extension "plpgsql" -  enable_extension "postgis"    enable_extension "hstore" +  enable_extension "postgis"    enable_extension "unaccent" +  enable_extension "objectid"    create_table "access_links", id: :bigserial, force: :cascade do |t|      t.integer  "access_point_id",                        limit: 8 @@ -90,9 +91,9 @@ ActiveRecord::Schema.define(version: 20180306152953) 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 @@ -119,6 +120,7 @@ ActiveRecord::Schema.define(version: 20180306152953) 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 @@ -299,6 +301,58 @@ ActiveRecord::Schema.define(version: 20180306152953) do    add_index "custom_fields", ["resource_type"], name: "index_custom_fields_on_resource_type", using: :btree +  create_table "export_messages", id: :bigserial, force: :cascade do |t| +    t.string   "criticity" +    t.string   "message_key" +    t.hstore   "message_attributes" +    t.integer  "export_id",           limit: 8 +    t.integer  "resource_id",         limit: 8 +    t.datetime "created_at" +    t.datetime "updated_at" +    t.hstore   "resource_attributes" +  end + +  add_index "export_messages", ["export_id"], name: "index_export_messages_on_export_id", using: :btree +  add_index "export_messages", ["resource_id"], name: "index_export_messages_on_resource_id", using: :btree + +  create_table "export_resources", id: :bigserial, force: :cascade do |t| +    t.integer  "export_id",     limit: 8 +    t.string   "status" +    t.datetime "created_at" +    t.datetime "updated_at" +    t.string   "resource_type" +    t.string   "reference" +    t.string   "name" +    t.hstore   "metrics" +  end + +  add_index "export_resources", ["export_id"], name: "index_export_resources_on_export_id", using: :btree + +  create_table "exports", id: :bigserial, force: :cascade do |t| +    t.string   "status" +    t.string   "current_step_id" +    t.float    "current_step_progress" +    t.integer  "workbench_id",          limit: 8 +    t.integer  "referential_id",        limit: 8 +    t.string   "name" +    t.datetime "created_at" +    t.datetime "updated_at" +    t.string   "file" +    t.datetime "started_at" +    t.datetime "ended_at" +    t.string   "token_upload" +    t.string   "type" +    t.integer  "parent_id",             limit: 8 +    t.string   "parent_type" +    t.datetime "notified_parent_at" +    t.integer  "current_step",                    default: 0 +    t.integer  "total_steps",                     default: 0 +    t.string   "creator" +  end + +  add_index "exports", ["referential_id"], name: "index_exports_on_referential_id", using: :btree +  add_index "exports", ["workbench_id"], name: "index_exports_on_workbench_id", using: :btree +    create_table "facilities", id: :bigserial, force: :cascade do |t|      t.integer  "stop_area_id",       limit: 8      t.integer  "line_id",            limit: 8 @@ -753,6 +807,7 @@ ActiveRecord::Schema.define(version: 20180306152953) 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| | 
