aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2016-11-20 15:42:19 +0100
committerAlban Peignier2016-11-20 16:40:57 +0100
commit6fb74042430b89bbc3713e629b75ab5d70c5cd38 (patch)
treed21d5fd105cacd5c2639432f43af3269d2c7e813
parent033676f30c687002aadb9555a3bd6c71fadd5b27 (diff)
downloadchouette-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.rb26
-rw-r--r--app/models/workbench.rb2
-rw-r--r--app/views/referential_lines/show.html.slim2
-rw-r--r--app/views/referentials/_form.html.slim6
-rw-r--r--config/locales/referentials.fr.yml1
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: