diff options
| author | Alban Peignier | 2016-11-19 19:56:51 +0100 |
|---|---|---|
| committer | Alban Peignier | 2016-11-19 19:59:24 +0100 |
| commit | 80b934e7405cc70ec577e9de499bde881020caa4 (patch) | |
| tree | 4745099db154ba43676c007915e4bccaede0e19f | |
| parent | bc1ec22d68233c74cbc93b2810f4e479a5e4b5ff (diff) | |
| download | chouette-core-80b934e7405cc70ec577e9de499bde881020caa4.tar.bz2 | |
Finalize ReferentialMetadata model support. Refs #1786
| -rw-r--r-- | app/models/referential.rb | 43 | ||||
| -rw-r--r-- | app/models/referential_metadata.rb | 64 | ||||
| -rw-r--r-- | spec/models/referential_metadata_spec.rb | 45 | ||||
| -rw-r--r-- | spec/models/referential_spec.rb | 67 |
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 |
