aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert2017-10-05 08:51:40 +0200
committerRobert2017-10-05 08:53:48 +0200
commit27b5695fe6be33f23e87242a617ba9bd751fac28 (patch)
treee4d78a34336112360c1a2c9d4217ec2782ab60cd
parent14eb03b2e2485985e6956375a82edbcf71f01bb4 (diff)
downloadchouette-core-0000-proposal-through_if.tar.bz2
Proposal for DB consistency enforcment0000-proposal-through_if
-rw-r--r--app/models/compliance_control.rb18
-rw-r--r--app/models/concerns/u_name_it.rb29
-rw-r--r--config/locales/compliance_controls.en.yml2
-rw-r--r--config/locales/compliance_controls.fr.yml2
-rw-r--r--spec/models/compliance_control_spec.rb2
5 files changed, 42 insertions, 11 deletions
diff --git a/app/models/compliance_control.rb b/app/models/compliance_control.rb
index 52838ef74..124124365 100644
--- a/app/models/compliance_control.rb
+++ b/app/models/compliance_control.rb
@@ -1,7 +1,15 @@
class ComplianceControl < ActiveRecord::Base
extend Enumerize
- belongs_to :compliance_control_set
- belongs_to :compliance_control_block
+ # belongs_to :compliance_control_set
+ # belongs_to :compliance_control_block
+ # validate def coherent_control_set
+ # return true if compliance_control_block_id.nil?
+ # ids = [compliance_control_block.compliance_control_set_id, compliance_control_set_id]
+ # return true if ids.first == ids.last
+ # errors.add(:coherent_control_set, I18n.t('compliance_controls.errors.incoherent_control_sets', indirect_set_id: ids.first, direct_set_id: ids.last))
+ # end
+ extend UNameIt
+ belongs_to_through_if :compliance_control_set, parent: :compliance_control_block, as: :consistent_control_set
enumerize :criticity, in: %i(info warning error), scope: true, default: :info
hstore_accessor :control_attributes, {}
@@ -12,12 +20,6 @@ class ComplianceControl < ActiveRecord::Base
validates :origin_code, presence: true
validates :compliance_control_set, presence: true
- validate def coherent_control_set
- return true if compliance_control_block_id.nil?
- ids = [compliance_control_block.compliance_control_set_id, compliance_control_set_id]
- return true if ids.first == ids.last
- errors.add(:coherent_control_set, I18n.t('compliance_controls.errors.incoherent_control_sets', indirect_set_id: ids.first, direct_set_id: ids.last))
- end
class << self
def create *args
diff --git a/app/models/concerns/u_name_it.rb b/app/models/concerns/u_name_it.rb
new file mode 100644
index 000000000..101887647
--- /dev/null
+++ b/app/models/concerns/u_name_it.rb
@@ -0,0 +1,29 @@
+module UNameIt
+ # Options as e.g. different key names and options for each
+ # belongs_to can be defined on an AS NEEDED basis...
+ def belongs_to_through_if( grand_parent_klass_sym,
+ parent:,
+ as: )
+ belongs_to grand_parent_klass_sym
+ validates grand_parent_klass_sym, presence: true
+ belongs_to parent
+
+ validate do
+ parent_instance = send(parent)
+ unless parent_instance.nil?
+
+ direct_grand_parent_id = self["#{grand_parent_klass_sym}_id"]
+ indirect_grand_parent_id = parent_instance["#{grand_parent_klass_sym}_id"]
+ unless direct_grand_parent_id == indirect_grand_parent_id
+
+ errors.add(
+ as,
+ I18n.t([self.class.name.underscore.pluralize, 'errors', as].join('.'),
+ direct_id: direct_grand_parent_id,
+ indirect_id: indirect_grand_parent_id))
+ end
+ end
+ end
+ end
+
+end
diff --git a/config/locales/compliance_controls.en.yml b/config/locales/compliance_controls.en.yml
index ee98367cf..d583243f3 100644
--- a/config/locales/compliance_controls.en.yml
+++ b/config/locales/compliance_controls.en.yml
@@ -1,7 +1,7 @@
en:
compliance_controls:
errors:
- incoherent_control_sets: "Directly associated control_set (id: %{direct_set_id}) and indirectly associated one (id: %{indirect_set_id}) differ"
+ consistent_control_set: "Directly associated control_set (id: %{direct_id}) and indirectly associated one (id: %{indirect_id}) differ"
show:
title: "Compliance control"
index:
diff --git a/config/locales/compliance_controls.fr.yml b/config/locales/compliance_controls.fr.yml
index 0f3e586bf..7f230f8bb 100644
--- a/config/locales/compliance_controls.fr.yml
+++ b/config/locales/compliance_controls.fr.yml
@@ -1,7 +1,7 @@
fr:
compliance_controls:
errors:
- incoherent_control_sets: "ControlSet associé directement (id: %{direct_set_id}) et indirectement (id: %{indirect_set_id}) ne sont pas égeaux"
+ consistent_control_set: "ControlSet associé directement (id: %{direct_id}) et indirectement (id: %{indirect_id}) ne sont pas égeaux"
show:
title: "Jeu de controle"
index:
diff --git a/spec/models/compliance_control_spec.rb b/spec/models/compliance_control_spec.rb
index 7c58eaf3e..731f84d24 100644
--- a/spec/models/compliance_control_spec.rb
+++ b/spec/models/compliance_control_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe ComplianceControl, type: :model do
compliance_control_set_id: create( :compliance_control_set ).id
expect(compliance_control).to_not be_valid
selected_error_message =
- compliance_control.errors.messages[:coherent_control_set].grep(%r{ControlSet associé})
+ compliance_control.errors.messages[:consistent_control_set].grep(%r{ControlSet associé})
expect( selected_error_message ).to_not be_empty
end
end