Module: Concept::Validations

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
app/models/concept/validations.rb

Instance Method Summary collapse

Instance Method Details

#exclusive_broader_and_narrower_conceptsObject



129
130
131
132
133
134
135
136
137
# File 'app/models/concept/validations.rb', line 129

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_pref_and_alt_labels_per_conceptObject



90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/models/concept/validations.rb', line 90

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_termObject

top term and broader relations are mutually exclusive



21
22
23
24
25
26
27
# File 'app/models/concept/validations.rb', line 21

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_relationObject



139
140
141
142
143
144
145
146
# File 'app/models/concept/validations.rb', line 139

def no_self_reference_concept_relation
  if validatable_for_publishing?
    # check all related concepts (e.g. skos:broader, skos:narrower, skos:related)
    if related_concepts.include?(self)
      errors.add :base, I18n.t('txt.models.concept.no_self_reference')
    end
  end
end

#pref_label_in_primary_thesaurus_languageObject



40
41
42
43
44
45
46
47
48
49
# File 'app/models/concept/validations.rb', line 40

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_termsObject

top terms must never be used as descendants (narrower relation targets) NB: for top terms themselves, this is covered by ‘ensure_exclusive_top_term`



31
32
33
34
35
36
37
38
# File 'app/models/concept/validations.rb', line 31

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_labelsObject



104
105
106
107
108
109
110
111
112
113
114
115
# File 'app/models/concept/validations.rb', line 104

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_languageObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/models/concept/validations.rb', line 51

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_labelsObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'app/models/concept/validations.rb', line 69

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_relationsObject



117
118
119
120
121
122
123
124
125
126
127
# File 'app/models/concept/validations.rb', line 117

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