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: |
