aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZog2018-04-18 09:24:08 +0200
committerJohan Van Ryseghem2018-04-27 11:17:19 +0200
commit681f874e3150c35b03e74b25827b74791ae9ae95 (patch)
tree5a0cb5c7ab520ec2b8471f95287f89724a469851
parent9279fbf0cc56e0e793de2a17547da9465ae83997 (diff)
downloadchouette-core-681f874e3150c35b03e74b25827b74791ae9ae95.tar.bz2
Refs #6572; Define 4 different states on Referentials
With according methods and scopes
-rw-r--r--app/models/referential.rb26
-rw-r--r--db/migrate/20180418070400_add_failed_at_to_referentials.rb5
-rw-r--r--db/schema.rb28
-rw-r--r--spec/models/referential_spec.rb46
4 files changed, 82 insertions, 23 deletions
diff --git a/app/models/referential.rb b/app/models/referential.rb
index 0522d72c0..486c3c495 100644
--- a/app/models/referential.rb
+++ b/app/models/referential.rb
@@ -58,7 +58,13 @@ class Referential < ApplicationModel
belongs_to :referential_suite
- scope :ready, -> { where(ready: true) }
+ scope :pending, -> { where(ready: false, failed_at: nil, archived_at: nil, failed_at: nil) }
+ scope :ready, -> { where(ready: true, failed_at: nil, archived_at: nil) }
+ scope :failed, -> { where.not(failed_at: nil) }
+ scope :archived, -> { where.not(archived_at: nil) }
+
+ scope :ready, -> { where(ready: true, failed_at: nil, archived_at: nil) }
+ scope :ready, -> { where(ready: true, failed_at: nil, archived_at: nil) }
scope :in_periode, ->(periode) { where(id: referential_ids_in_periode(periode)) }
scope :include_metadatas_lines, ->(line_ids) { where('referential_metadata.line_ids && ARRAY[?]::bigint[]', line_ids) }
scope :order_by_validity_period, ->(dir) { joins(:metadatas).order("unnest(periodes) #{dir}") }
@@ -116,6 +122,24 @@ class Referential < ApplicationModel
@_models_with_checksum || []
end
+ def state
+ return :failed if failed_at.present?
+ return :archived if archived_at.present?
+ ready ? :ready : :pending
+ end
+
+ def failed!
+ update ready: false, failed_at: Time.now, archived_at: nil
+ end
+
+ def ready!
+ update ready: true, failed_at: nil, archived_at: nil
+ end
+
+ def archived!
+ update ready: true, failed_at: nil, archived_at: Time.now
+ end
+
def lines
if metadatas.blank?
workbench ? workbench.lines : associated_lines
diff --git a/db/migrate/20180418070400_add_failed_at_to_referentials.rb b/db/migrate/20180418070400_add_failed_at_to_referentials.rb
new file mode 100644
index 000000000..dd9076b3b
--- /dev/null
+++ b/db/migrate/20180418070400_add_failed_at_to_referentials.rb
@@ -0,0 +1,5 @@
+class AddFailedAtToReferentials < ActiveRecord::Migration
+ def change
+ add_column :referentials, :failed_at, :datetime
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 7b77a55d2..eeab0102f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,12 +11,12 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20180416065012) do
+ActiveRecord::Schema.define(version: 20180418070400) 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"
create_table "access_links", id: :bigserial, force: :cascade do |t|
@@ -92,9 +92,9 @@ ActiveRecord::Schema.define(version: 20180416065012) 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
t.jsonb "metadata", default: {}
end
@@ -121,7 +121,6 @@ ActiveRecord::Schema.define(version: 20180416065012) 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
@@ -443,7 +442,7 @@ ActiveRecord::Schema.define(version: 20180416065012) do
add_index "import_messages", ["resource_id"], name: "index_import_messages_on_resource_id", using: :btree
create_table "import_resources", id: :bigserial, force: :cascade do |t|
- t.integer "import_id", limit: 8
+ t.integer "import_id", limit: 8
t.string "status"
t.datetime "created_at"
t.datetime "updated_at"
@@ -451,13 +450,9 @@ ActiveRecord::Schema.define(version: 20180416065012) do
t.string "reference"
t.string "name"
t.hstore "metrics"
- t.integer "referential_id"
- t.integer "parent_id"
end
add_index "import_resources", ["import_id"], name: "index_import_resources_on_import_id", using: :btree
- add_index "import_resources", ["parent_id"], name: "index_import_resources_on_parent_id", using: :btree
- add_index "import_resources", ["referential_id"], name: "index_import_resources_on_referential_id", using: :btree
create_table "imports", id: :bigserial, force: :cascade do |t|
t.string "status"
@@ -742,6 +737,7 @@ ActiveRecord::Schema.define(version: 20180416065012) do
t.integer "referential_suite_id", limit: 8
t.string "objectid_format"
t.datetime "merged_at"
+ t.datetime "failed_at"
end
add_index "referentials", ["created_from_id"], name: "index_referentials_on_created_from_id", using: :btree
@@ -865,8 +861,8 @@ ActiveRecord::Schema.define(version: 20180416065012) do
t.integer "waiting_time"
t.string "kind"
t.jsonb "localized_names"
- t.json "custom_field_values"
t.datetime "confirmed_at"
+ t.jsonb "custom_field_values"
t.jsonb "metadata", default: {}
end
@@ -1066,17 +1062,6 @@ ActiveRecord::Schema.define(version: 20180416065012) do
add_index "vehicle_journeys", ["objectid"], name: "vehicle_journeys_objectid_key", unique: true, using: :btree
add_index "vehicle_journeys", ["route_id"], name: "index_vehicle_journeys_on_route_id", using: :btree
- create_table "versions", id: :bigserial, force: :cascade do |t|
- t.string "item_type", null: false
- t.integer "item_id", null: false
- t.string "event", null: false
- t.string "whodunnit"
- t.text "object"
- t.datetime "created_at"
- end
-
- add_index "versions", ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id", using: :btree
-
create_table "workbenches", id: :bigserial, force: :cascade do |t|
t.string "name"
t.integer "organisation_id", limit: 8
@@ -1123,7 +1108,6 @@ ActiveRecord::Schema.define(version: 20180416065012) do
add_foreign_key "compliance_controls", "compliance_control_blocks"
add_foreign_key "compliance_controls", "compliance_control_sets"
add_foreign_key "group_of_lines_lines", "group_of_lines", name: "groupofline_group_fkey", on_delete: :cascade
- add_foreign_key "import_resources", "referentials"
add_foreign_key "journey_frequencies", "timebands", on_delete: :nullify
add_foreign_key "journey_frequencies", "vehicle_journeys", on_delete: :nullify
add_foreign_key "journey_patterns", "routes", name: "jp_route_fkey", on_delete: :cascade
diff --git a/spec/models/referential_spec.rb b/spec/models/referential_spec.rb
index 5dfab5348..2fb8b5cb0 100644
--- a/spec/models/referential_spec.rb
+++ b/spec/models/referential_spec.rb
@@ -29,6 +29,52 @@ describe Referential, :type => :model do
end
end
+ context ".state" do
+ it "should return the expected values" do
+ referential = build :referential
+ referential.ready = false
+ expect(referential.state).to eq :pending
+ referential.failed_at = Time.now
+ expect(referential.state).to eq :failed
+ referential.ready = true
+ referential.failed_at = nil
+ expect(referential.state).to eq :ready
+ referential.archived_at = Time.now
+ expect(referential.state).to eq :archived
+ end
+
+ context "the scopes" do
+ it "should filter the referentials" do
+ referential = create :referential, ready: false
+ expect(Referential.pending).to include referential
+ expect(Referential.failed).to_not include referential
+ expect(Referential.ready).to_not include referential
+ expect(Referential.archived).to_not include referential
+
+ referential = create :referential
+ referential.failed!
+ expect(Referential.pending).to_not include referential
+ expect(Referential.failed).to include referential
+ expect(Referential.ready).to_not include referential
+ expect(Referential.archived).to_not include referential
+
+ referential = create :referential
+ referential.ready!
+ expect(Referential.pending).to_not include referential
+ expect(Referential.failed).to_not include referential
+ expect(Referential.ready).to include referential
+ expect(Referential.archived).to_not include referential
+
+ referential = create :referential
+ referential.archived!
+ expect(Referential.pending).to_not include referential
+ expect(Referential.failed).to_not include referential
+ expect(Referential.ready).to_not include referential
+ expect(Referential.archived).to include referential
+ end
+ end
+ end
+
context ".referential_ids_in_periode" do
it 'should retrieve referential id in periode range' do
range = ref.metadatas.first.periodes.sample