Module: Concept::Validations
Instance Method Summary collapse
- #exclusive_broader_and_narrower_concepts ⇒ Object
- #exclusive_hidden_labels_per_concept ⇒ Object
- #exclusive_pref_and_alt_labels_per_concept ⇒ Object
-
#exclusive_top_term ⇒ Object
top term and broader relations are mutually exclusive.
- #no_self_reference_concept_relation ⇒ Object
- #pref_label_in_primary_thesaurus_language ⇒ Object
-
#rooted_top_terms ⇒ Object
top terms must never be used as descendants (narrower relation targets) NB: for top terms themselves, this is covered by
ensure_exclusive_top_term. - #unique_alt_labels ⇒ Object
- #unique_pref_label_language ⇒ Object
- #unique_pref_labels ⇒ Object
- #valid_rank_for_ranked_relations ⇒ Object
Instance Method Details
#exclusive_broader_and_narrower_concepts ⇒ Object
143 144 145 146 147 148 149 150 151 |
# File 'app/models/concept/validations.rb', line 143 def exclusive_broader_and_narrower_concepts if validatable_for_publishing? relations_union = broader_relations.map { |b| b.target } & narrower_relations.map { |n| n.target } if relations_union.any? errors.add :base, I18n.t('txt.models.concept.no_narrower_and_broader_relations', concepts: relations_union.each { |u| u.narrower_relations.map{ |r| r.owner.pref_labels.first } }.flatten.join(', ')) end end end |
#exclusive_hidden_labels_per_concept ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'app/models/concept/validations.rb', line 105 def exclusive_hidden_labels_per_concept if self.validatable_for_publishing? relevant_labels = self.labelings.reject { |lbl| lbl.is_a?(Iqvoc::Concept.hidden_labeling_class) }.collect(&:target) self.hidden_labels.each do |hidden_label| if relevant_labels.include? hidden_label errors.add :base, I18n.t('txt.models.concept.hidden_label_defined_in_other_labels', label: hidden_label.value) end end end end |
#exclusive_pref_and_alt_labels_per_concept ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'app/models/concept/validations.rb', line 91 def exclusive_pref_and_alt_labels_per_concept if validatable_for_publishing? alt_labels = alt_labelings.collect { |l| l.target } pref_labels.each do |pref_label| if alt_labels.include? pref_label errors.add :base, I18n.t('txt.models.concept.pref_label_defined_in_alt_labels', label: pref_label.value) end end end end |
#exclusive_top_term ⇒ Object
top term and broader relations are mutually exclusive
22 23 24 25 26 27 28 |
# File 'app/models/concept/validations.rb', line 22 def exclusive_top_term if validatable_for_publishing? if top_term? && broader_relations.any? errors.add :base, I18n.t('txt.models.concept.top_term_exclusive_error') end end end |
#no_self_reference_concept_relation ⇒ Object
153 154 155 156 157 158 159 160 |
# File 'app/models/concept/validations.rb', line 153 def no_self_reference_concept_relation if validatable_for_publishing? # check all related concepts (e.g. skos:broader, skos:narrower, skos:related) if .include?(self) errors.add :base, I18n.t('txt.models.concept.no_self_reference') end end end |
#pref_label_in_primary_thesaurus_language ⇒ Object
41 42 43 44 45 46 47 48 49 50 |
# File 'app/models/concept/validations.rb', line 41 def pref_label_in_primary_thesaurus_language if validatable_for_publishing? labels = pref_labels.select{ |l| l.published? } if labels.none? errors.add :base, I18n.t('txt.models.concept.no_pref_label_error') elsif not labels.map(&:language).map(&:to_s).include?(Iqvoc::Concept.pref_labeling_languages.first.to_s) errors.add :base, I18n.t('txt.models.concept.main_pref_label_language_missing_error') end end end |
#rooted_top_terms ⇒ Object
top terms must never be used as descendants (narrower relation targets)
NB: for top terms themselves, this is covered by ensure_exclusive_top_term
32 33 34 35 36 37 38 39 |
# File 'app/models/concept/validations.rb', line 32 def rooted_top_terms if validatable_for_publishing? if narrower_relations.includes(:target). # XXX: inefficient? select { |rel| rel.target && rel.target.top_term? }.any? errors.add :base, I18n.t('txt.models.concept.top_term_rooted_error') end end end |
#unique_alt_labels ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'app/models/concept/validations.rb', line 118 def unique_alt_labels if validatable_for_publishing? alt_labels = alt_labelings.collect { |l| l.target } duplicate = alt_labels.detect { |e| alt_labels.select {|al| al.published? }.count(e) > 1 } if duplicate errors.add :base, I18n.t('txt.models.concept.alt_labels_not_unique', label: duplicate.value) end end end |
#unique_pref_label_language ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'app/models/concept/validations.rb', line 52 def unique_pref_label_language # We have many sources a prefLabel can be defined in pls = pref_labelings.map(&:target) + send(Iqvoc::Concept.pref_labeling_class_name.to_relation_name).map(&:target) + labelings.select{ |l| l.is_a?(Iqvoc::Concept.pref_labeling_class) }.map(&:target) languages = {} pls.compact.each do |pref_label| lang = pref_label.language.to_s origin = (pref_label.origin || pref_label.id || pref_label.value).to_s if (languages.keys.include?(lang) && languages[lang] != origin) # there are at least two pref labels for one specific language errors.add :pref_labelings, I18n.t('txt.models.concept.pref_labels_with_same_languages_error') break end languages[lang] = origin end end |
#unique_pref_labels ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'app/models/concept/validations.rb', line 70 def unique_pref_labels if validatable_for_publishing? # checks if any other concept already owns the chosen pref labels conflicting_pref_labels = pref_labels.select do |l| Iqvoc::Concept.base_class.joins(:pref_labels).where(labels: { value: l.value, language: l.language }).where('labelings.owner_id != ?', id).where('concepts.origin != ?', origin).any? end if conflicting_pref_labels.any? if conflicting_pref_labels.one? errors.add :base, I18n.t('txt.models.concept.pref_label_not_unique', label: conflicting_pref_labels.last.value) else errors.add :base, I18n.t('txt.models.concept.pref_labels_not_unique', label: conflicting_pref_labels.map(&:value).join(', ')) end end end end |
#valid_rank_for_ranked_relations ⇒ Object
131 132 133 134 135 136 137 138 139 140 141 |
# File 'app/models/concept/validations.rb', line 131 def valid_rank_for_ranked_relations if validatable_for_publishing? relations.each do |relation| if relation.class.rankable? && !(0..100).include?(relation.rank) errors.add :base, I18n.t('txt.models.concept.invalid_rank_for_ranked_relations', relation: relation.class.model_name.human.downcase, relation_target_label: relation.target.pref_label.to_s) end end end end |