aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2016-11-19 19:56:51 +0100
committerAlban Peignier2016-11-19 19:59:24 +0100
commit80b934e7405cc70ec577e9de499bde881020caa4 (patch)
tree4745099db154ba43676c007915e4bccaede0e19f
parentbc1ec22d68233c74cbc93b2810f4e479a5e4b5ff (diff)
downloadchouette-core-80b934e7405cc70ec577e9de499bde881020caa4.tar.bz2
Finalize ReferentialMetadata model support. Refs #1786
-rw-r--r--app/models/referential.rb43
-rw-r--r--app/models/referential_metadata.rb64
-rw-r--r--spec/models/referential_metadata_spec.rb45
-rw-r--r--spec/models/referential_spec.rb67
4 files changed, 204 insertions, 15 deletions
diff --git a/app/models/referential.rb b/app/models/referential.rb
index 8b8df3294..604181c0a 100644
--- a/app/models/referential.rb
+++ b/app/models/referential.rb
@@ -35,8 +35,8 @@ class Referential < ActiveRecord::Base
has_many :group_of_lines, through: :line_referential
has_many :networks, through: :line_referential
- has_many :referential_metadatas,:dependent => :destroy
- accepts_nested_attributes_for :referential_metadatas
+ has_many :metadatas, class_name: "ReferentialMetadata", inverse_of: :referential, dependent: :destroy
+ accepts_nested_attributes_for :metadatas
belongs_to :stop_area_referential
validates_presence_of :stop_area_referential
@@ -44,7 +44,11 @@ class Referential < ActiveRecord::Base
belongs_to :workbench
def lines
- workbench ? workbench.lines : associated_lines
+ if metadatas.blank?
+ workbench ? workbench.lines : associated_lines
+ else
+ metadatas_lines
+ end
end
def slug_excluded_values
@@ -172,15 +176,18 @@ class Referential < ActiveRecord::Base
before_validation :clone_associations, :on => :create, if: :created_from
before_create :create_schema
- after_create :create_referential_metadata, if: :workbench, unless: :created_from
- after_create :clone_referential_metadatas, if: :created_from
+ before_validation :clone_metadatas, on: :create, if: :created_from
after_create :clone_schema, if: :created_from
before_destroy :destroy_schema
before_destroy :destroy_jobs
- def create_referential_metadata
- self.referential_metadatas.create
+ def in_workbench?
+ workbench_id.present?
+ end
+
+ def init_metadatas(attributes = {})
+ metadatas.build attributes if metadatas.blank?
end
def clone_associations
@@ -190,11 +197,23 @@ class Referential < ActiveRecord::Base
self.workbench = created_from.workbench
end
- def clone_referential_metadatas
- self.created_from.referential_metadatas.each do |meta|
- self.referential_metadatas << ReferentialMetadata.new_from(meta)
+ def clone_metadatas
+ created_from.metadatas.each do |meta|
+ self.metadatas << ReferentialMetadata.new_from(meta)
+ end
+ end
+
+ def metadatas_period
+ # FIXME
+ if metadatas.present?
+ metadatas.first.periodes.first
end
- self.save
+ end
+ alias_method :validity_period, :metadatas_period
+
+ def metadatas_lines
+ # FIXME
+ metadatas.present? ? metadatas.first.lines : []
end
def clone_schema
@@ -258,7 +277,7 @@ class Referential < ActiveRecord::Base
GeoRuby::SimpleFeatures::Geometry.from_ewkt(bounds.present? ? bounds : default_bounds ).envelope
end
- # Archive
+ # Archive
def archived?
archived_at != nil
end
diff --git a/app/models/referential_metadata.rb b/app/models/referential_metadata.rb
index e9ebd67f7..3f5ed4db8 100644
--- a/app/models/referential_metadata.rb
+++ b/app/models/referential_metadata.rb
@@ -10,6 +10,70 @@ class ReferentialMetadata < ActiveRecord::Base
scope :include_lines, -> (line_ids) { where('line_ids && ARRAY[?]', line_ids) }
scope :include_dateranges, -> (dateranges) { where('periodes && ARRAY[?]', dateranges) }
+ def first_period
+ periodes.first if periodes
+ end
+
+ def first_period_begin
+ @first_period_begin or first_period.try(:begin)
+ end
+ def first_period_begin=(date)
+ periodes_will_change! unless @first_period_begin == date
+ @first_period_begin = date
+ end
+ def first_period_end
+ if @first_period_end
+ @first_period_end
+ else
+ if first_period
+ date = first_period.end
+ date -= 1 if first_period.exclude_end?
+ date
+ end
+ end
+ end
+ def first_period_end=(date)
+ periodes_will_change! unless @first_period_end == date
+ @first_period_end = date
+ end
+
+ validate :check_first_period_end
+
+ def check_first_period_end
+ if @first_period_begin and @first_period_end and @first_period_begin > @first_period_end
+ errors.add(:first_period_end, :invalid)
+ end
+ end
+
+ before_validation :set_first_period
+
+ def set_first_period
+ if @first_period_begin and @first_period_end and @first_period_begin <= @first_period_end
+ self.periodes ||= []
+ self.periodes[0] = Range.new @first_period_begin, @first_period_end
+ end
+ Rails.logger.debug "set_first_period : #{periodes.inspect}"
+ end
+
+ def column_for_attribute(name)
+ if %i{first_period_begin first_period_end}.include?(name.to_sym)
+ ActiveRecord::ConnectionAdapters::Column.new(name, nil, "date")
+ else
+ super name
+ end
+ end
+
+ # def lines_with_ids_support=(values)
+ # if String === values.first
+ # self.line_values = values
+ # else
+ # self.lines_without_values_support = values
+ # end
+ # end
+ # alias_method_chain :lines, :ids_support
+
+ #delegate :begin, :begin=, :end, :end=, to: :first_period, prefix: :first_period
+
def self.new_from from
from.dup.tap do |metadata|
metadata.referential_id = nil
diff --git a/spec/models/referential_metadata_spec.rb b/spec/models/referential_metadata_spec.rb
index f82edde4a..e31caf8a1 100644
--- a/spec/models/referential_metadata_spec.rb
+++ b/spec/models/referential_metadata_spec.rb
@@ -36,6 +36,51 @@ RSpec.describe ReferentialMetadata, :type => :model do
end
+ describe "#first_period" do
+
+ let(:referential_metadata) { create :referential_metadata }
+
+ describe "begin" do
+ it "should return first period begin" do
+ expect(referential_metadata.first_period_begin).to eq(referential_metadata.first_period.begin)
+ end
+ end
+
+ describe "begin=" do
+ let(:date) { Date.today }
+ it "should change the first period begin" do
+ referential_metadata.first_period_begin = date
+ expect(referential_metadata.first_period_begin).to eq(date)
+ end
+ end
+
+ describe "end" do
+ it "should return first period end" do
+ expect(referential_metadata.first_period_end).to eq(referential_metadata.first_period.end)
+ end
+ end
+
+ describe "end=" do
+ let(:date) { Date.today }
+ it "should change the first period end" do
+ referential_metadata.first_period_end = date
+ expect(referential_metadata.first_period_end).to eq(date)
+ end
+ end
+
+ describe "after_validation" do
+ it "should define first_period with first_period_begin and first_period_end" do
+ referential_metadata.first_period_begin = Date.today
+ referential_metadata.first_period_end = Date.tomorrow
+
+ referential_metadata.valid?
+
+ expect(referential_metadata.first_period).to eq(Range.new(referential_metadata.first_period_begin, referential_metadata.first_period_end))
+ end
+ end
+
+ end
+
describe "#includes_lines" do
let(:referential_metadata) { create :referential_metadata }
diff --git a/spec/models/referential_spec.rb b/spec/models/referential_spec.rb
index c76b157f8..18c77bb92 100644
--- a/spec/models/referential_spec.rb
+++ b/spec/models/referential_spec.rb
@@ -1,14 +1,14 @@
require 'spec_helper'
describe Referential, :type => :model do
- let(:ref) { create :referential }
+ let(:ref) { create :referential, metadatas: [create(:referential_metadata)] }
# it "create a rule_parameter_set" do
# referential = create(:referential)
#expect(referential.rule_parameter_sets.size).to eq(1)
# end
- it { should have_many(:referential_metadatas) }
+ it { should have_many(:metadatas) }
it { should belong_to(:workbench) }
context "Cloning referential" do
@@ -18,8 +18,69 @@ describe Referential, :type => :model do
expect { cloned }.to change{ReferentialCloning.count}.by(1)
end
+ def metadatas_attributes(referential)
+ referential.metadatas.map { |m| [ m.periodes, m.line_ids ] }
+ end
+
it 'should clone referential_metadatas' do
- expect(cloned.referential_metadatas).not_to be_empty
+ expect(metadatas_attributes(cloned)).to eq(metadatas_attributes(ref))
end
end
+
+ describe "metadatas" do
+ context "nested attributes support" do
+ let(:attributes) do
+ {
+ "organisation_id" => first_organisation.id,
+ "name"=>"Test",
+ "slug"=>"test",
+ "prefix"=>"test",
+ "time_zone"=>"American Samoa",
+ "upper_corner"=>"51.1,8.23",
+ "lower_corner"=>"42.25,-5.2",
+ "data_format"=>"neptune",
+ "metadatas_attributes"=> {
+ "0"=> {
+ "first_period_begin(3i)"=>"19",
+ "first_period_begin(2i)"=>"11",
+ "first_period_begin(1i)"=>"2016",
+ "first_period_end(3i)"=>"19",
+ "first_period_end(2i)"=>"12",
+ "first_period_end(1i)"=>"2016",
+ "lines"=> [""] + lines.map { |l| l.id.to_s }
+ }
+ },
+ "workbench_id"=>"1",
+ }
+ end
+
+ let(:lines) { create_list(:line, 3)}
+
+ let(:new_referential) { Referential.new(attributes) }
+ let(:first_metadata) { new_referential.metadatas.first }
+
+ it "should create a metadata" do
+ expect(new_referential.metadatas.size).to eq(1)
+ end
+
+ it "should define first_period_begin" do
+ expect(first_metadata.first_period_begin).to eq(Date.new(2016,11,19))
+ end
+
+ it "should define first_period_end" do
+ expect(first_metadata.first_period_end).to eq(Date.new(2016,12,19))
+ end
+
+ it "should define period" do
+ new_referential.save!
+ expect(first_metadata.first_period).to eq(Range.new(Date.new(2016,11,19), Date.new(2016,12,19)))
+ end
+
+ it "should define period" do
+ new_referential.save!
+ expect(first_metadata.lines).to eq(lines)
+ end
+ end
+ end
+
end