diff options
| author | Alban Peignier | 2016-11-20 15:42:19 +0100 | 
|---|---|---|
| committer | Alban Peignier | 2016-11-20 16:40:57 +0100 | 
| commit | 6fb74042430b89bbc3713e629b75ab5d70c5cd38 (patch) | |
| tree | d21d5fd105cacd5c2639432f43af3269d2c7e813 | |
| parent | 033676f30c687002aadb9555a3bd6c71fadd5b27 (diff) | |
| download | chouette-core-6fb74042430b89bbc3713e629b75ab5d70c5cd38.tar.bz2 | |
Referential#overlapped_referential_ids find other referentials with overlapped metadatas. Use it in Referential validation. Refs #1864
| -rw-r--r-- | app/models/referential.rb | 26 | ||||
| -rw-r--r-- | app/models/workbench.rb | 2 | ||||
| -rw-r--r-- | app/views/referential_lines/show.html.slim | 2 | ||||
| -rw-r--r-- | app/views/referentials/_form.html.slim | 6 | ||||
| -rw-r--r-- | config/locales/referentials.fr.yml | 1 | 
5 files changed, 35 insertions, 2 deletions
| diff --git a/app/models/referential.rb b/app/models/referential.rb index 604181c0a..af39f4fc8 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -216,6 +216,32 @@ class Referential < ActiveRecord::Base      metadatas.present? ? metadatas.first.lines : []    end +  def overlapped_referential_ids +    return [] unless metadatas.present? + +    line_ids = metadatas.first.line_ids +    period = metadatas.first.periodes.first + +    not_myself = "and referential_id != #{id}" if persisted? + +    query = "SELECT distinct(referential_id) FROM +    (SELECT unnest(public.referential_metadata.line_ids) as line, unnest(public.referential_metadata.periodes) as period, public.referential_metadata.referential_id +     FROM public.referential_metadata +     INNER JOIN public.referentials ON public.referential_metadata.referential_id = public.referentials.id +     WHERE public.referentials.workbench_id = 1 and public.referentials.archived_at is null) as metadatas +    WHERE line in (#{line_ids.join(',')}) and period && '#{ActiveRecord::ConnectionAdapters::PostgreSQLColumn.range_to_string(period)}' #{not_myself};" + +    self.class.connection.select_values(query).map(&:to_i) +  end + +  validate :detect_overlapped_referentials + +  def detect_overlapped_referentials +    self.class.where(id: overlapped_referential_ids).each do |referential| +      errors.add :metadatas, I18n.t("referentials.errors.overlapped_referential", :referential => referential.name) +    end +  end +    def clone_schema      ReferentialCloning.create(source_referential: self.created_from, target_referential: self)    end diff --git a/app/models/workbench.rb b/app/models/workbench.rb index b5ab37222..419790edb 100644 --- a/app/models/workbench.rb +++ b/app/models/workbench.rb @@ -13,5 +13,5 @@ class Workbench < ActiveRecord::Base    validates :organisation, presence: true    has_many :referentials -  has_many :referential_metadatas, through: :referentials +  has_many :referential_metadatas, through: :referentials, source: :metadatas  end diff --git a/app/views/referential_lines/show.html.slim b/app/views/referential_lines/show.html.slim index afb5903e0..e32978b20 100644 --- a/app/views/referential_lines/show.html.slim +++ b/app/views/referential_lines/show.html.slim @@ -51,7 +51,7 @@ h2          = " " + t("enumerize.line.transport_mode.#{@line.transport_mode}")        - else          = " -" -         +      p        label = "#{@line.human_attribute_name('transport_submode')} : "        - if @line.transport_submode diff --git a/app/views/referentials/_form.html.slim b/app/views/referentials/_form.html.slim index 2061d02ff..a4342bc8e 100644 --- a/app/views/referentials/_form.html.slim +++ b/app/views/referentials/_form.html.slim @@ -23,6 +23,12 @@      = form.input :lower_corner, input_html: { title: t("formtastic.titles.referential.lower_corner") }      / = form.input :data_format, label: true, include_blank: false + +    - if @referential.errors.has_key? :metadatas +      ul.errors +        - @referential.errors[:metadatas].each do |message| +          li = message +      = form.semantic_fields_for :metadatas do |subform|        = subform.input :first_period_begin, as: :date_select        = subform.input :first_period_end, as: :date_select diff --git a/config/locales/referentials.fr.yml b/config/locales/referentials.fr.yml index d9a9fc4ce..02848ec64 100644 --- a/config/locales/referentials.fr.yml +++ b/config/locales/referentials.fr.yml @@ -29,6 +29,7 @@ fr:        pg_excluded: "ne peut pas commencer par pg_ (valeurs réservées)"        public_excluded: "public est une valeur réservée"        user_excluded: "%{user} est une valeur réservée" +      overlapped_referential: "%{referential} couvre le même périmètre d'offre"    activerecord:      models:        referential: | 
