diff options
| -rw-r--r-- | app/models/compliance_control.rb | 18 | ||||
| -rw-r--r-- | app/models/concerns/u_name_it.rb | 29 | ||||
| -rw-r--r-- | config/locales/compliance_controls.en.yml | 2 | ||||
| -rw-r--r-- | config/locales/compliance_controls.fr.yml | 2 | ||||
| -rw-r--r-- | spec/models/compliance_control_spec.rb | 2 |
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 |
