Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
TuckerJD committed Feb 6, 2014
2 parents c317715 + 6a1495e commit 4abede5
Show file tree
Hide file tree
Showing 5 changed files with 186 additions and 92 deletions.
57 changes: 50 additions & 7 deletions app/models/protonym.rb
Expand Up @@ -13,7 +13,7 @@ class Protonym < TaxonName
where("taxon_name_relationships.type LIKE 'TaxonNameRelationship::OriginalCombination::%'")
}, class_name: 'TaxonNameRelationship', foreign_key: :object_taxon_name_id

has_many :type_material
has_many :type_materials, class_name: 'TypeMaterial'

# subject object
# Aus original_genus of bus
Expand Down Expand Up @@ -64,10 +64,13 @@ class Protonym < TaxonName
scope :without_taxon_name_classification, -> (taxon_name_class_name) { where('id not in (SELECT taxon_name_id FROM taxon_name_classifications WHERE type LIKE ?)', "#{taxon_name_class_name}")}
scope :without_taxon_name_classification_array, -> (taxon_name_class_name_array) { where('id not in (SELECT taxon_name_id FROM taxon_name_classifications WHERE type in (?))', taxon_name_class_name_array) }
scope :without_taxon_name_classifications, -> { includes(:taxon_name_classifications).where(taxon_name_classifications: {taxon_name_id: nil}) }
scope :with_type_material_array, -> (type_material_array) { joins('LEFT OUTER JOIN "type_materials" ON "type_materials"."protonym_id" = "taxon_names"."id"').where("type_materials.biological_object_id in (?) AND type_materials.type_type in ('holotype', 'neotype', 'lectotype', 'syntype', 'syntypes')", type_material_array) }
scope :with_type_of_taxon_names, -> (type_id) { includes(:related_taxon_name_relationships).where("taxon_name_relationships.type LIKE 'TaxonNameRelationship::Typification%' AND taxon_name_relationships.subject_taxon_name_id = ?", type_id).references(:related_taxon_name_relationships) }
scope :not_self, -> (id) {where('taxon_names.id <> ?', id )}

scope :that_is_valid, -> {
joins('LEFT OUTER JOIN taxon_name_relationships tnr ON taxon_names.id = tnr.subject_taxon_name_id').
where('taxon_names.id NOT IN (SELECT subject_taxon_name_id FROM taxon_name_relationships WHERE type LIKE "TaxonNameRelationship::Iczn::Invalidating%" OR type LIKE "TaxonNameRelationship::Icn::Unaccepting%")')
where("taxon_names.id NOT IN (SELECT subject_taxon_name_id FROM taxon_name_relationships WHERE type LIKE 'TaxonNameRelationship::Iczn::Invalidating%' OR type LIKE 'TaxonNameRelationship::Icn::Unaccepting%')")
}

soft_validate(:sv_validate_parent_rank, set: :validate_parent_rank)
Expand All @@ -77,6 +80,8 @@ class Protonym < TaxonName
soft_validate(:sv_validate_coordinated_names, set: :validate_coordinated_names)
soft_validate(:sv_single_sub_taxon, set: :single_sub_taxon)
soft_validate(:sv_parent_priority, set: :parent_priority)
soft_validate(:sv_homotypic_synonyms, set: :homotypic_synonyms)
soft_validate(:sv_potential_homonyms, set: :potential_homonyms)

before_validation :check_format_of_name,
:validate_rank_class_class,
Expand Down Expand Up @@ -140,8 +145,8 @@ def self.family_group_base(name_string)

def get_primary_type
return [] unless self.rank_class.parent.to_s =~ /Species/
s = self.type_material.syntypes
p = self.type_material.primary
s = self.type_materials.syntypes
p = self.type_materials.primary
if s.empty? && p.count == 1
p
elsif p.empty? && s.empty?
Expand Down Expand Up @@ -289,7 +294,7 @@ def sv_fix_coordinated_names
types2.each do |t|
new_type_material.push({type_type: t.type_type, protonym_id: t.protonym_id, biological_object_id: t.biological_object_id, source_id: t.source_id})
end
self.type_material.build(new_type_material)
self.type_materials.build(new_type_material)
fixed = true
end

Expand Down Expand Up @@ -330,9 +335,9 @@ def sv_type_placement

def sv_primary_types
if self.rank_class.parent.to_s =~ /Species/
if self.type_material.primary.empty? && self.type_material.syntypes.empty?
if self.type_materials.primary.empty? && self.type_materials.syntypes.empty?
soft_validations.add(:base, 'Primary type is not selected')
elsif self.type_material.primary.count > 1 || (!self.type_material.primary.empty? && !self.type_material.syntypes.empty?)
elsif self.type_materials.primary.count > 1 || (!self.type_materials.primary.empty? && !self.type_materials.syntypes.empty?)
soft_validations.add(:base, 'More than one primary type are selected')
end
end
Expand Down Expand Up @@ -406,6 +411,44 @@ def sv_parent_priority
end
end

def sv_homotypic_synonyms
unless self.unavailable_or_invalid?
if self.id == self.lowest_rank_coordinated_taxon.id
possible_synonyms = []
if self.rank_class.to_s =~ /Species/
primary_types = self.get_primary_type
unless primary_types.empty?
p = primary_types.collect!{|t| t.biological_object_id}
possible_synonyms = Protonym.with_type_material_array(p).that_is_valid.not_self(self.id)
end
else
type = self.type_taxon_name
unless type.nil?
possible_synonyms = Protonym.with_type_of_taxon_names(type.id).that_is_valid.not_self(self.id)
end
end
unless possible_synonyms.empty?
possible_synonyms.select!{|s| s.id == s.lowest_rank_coordinated_taxon.id}
end
date1 = self.nomenclature_date unless possible_synonyms.empty?
possible_synonyms.each do |s|
date2 = s.nomenclature_date
if date1.nil? || date2.nil? || (not date1 < date2)
soft_validations.add(:base, "Taxon should be a synonym of #{s.cached_name + ' ' + s.cached_author_year} since they share the same type")
end
end
end
end
end

def sv_potential_homonyms
if self.id == self.lowest_rank_coordinated_taxon
if self.rank_class.to_s =~ /Species/
else
end
end
end

#endregion

end
126 changes: 72 additions & 54 deletions app/models/taxon_name.rb
Expand Up @@ -276,26 +276,26 @@ def get_full_name
(self.ancestors + [self]).each do |i|
if GENUS_AND_SPECIES_RANK_NAMES.include?(i.rank_class.to_s)
case i.rank_class.rank_name
when 'genus' then genus = i.name + ' '
when 'subgenus' then subgenus += i.name + ' '
when 'section' then subgenus += 'sect. ' + i.name + ' '
when 'subsection' then subgenus += 'subsect. ' + i.name + ' '
when 'series' then subgenus += 'ser. ' + i.name + ' '
when 'subseries' then subgenus += 'subser. ' + i.name + ' '
when 'species group' then superspecies += i.name + ' '
when 'species' then species += i.name + ' '
when 'subspecies' then species += i.name + ' '
when 'variety' then species += 'var. ' + i.name + ' '
when 'subvariety' then species += 'subvar. ' + i.name + ' '
when 'form' then species += 'f. ' + i.name + ' '
when 'subform' then species += 'subf. ' + i.name + ' '
when 'genus' then genus = '<em>' + i.name + '</em> '
when 'subgenus' then subgenus += '<em>' + i.name + '</em> '
when 'section' then subgenus += 'sect. <em>' + i.name + '</em> '
when 'subsection' then subgenus += 'subsect. <em>' + i.name + '</em> '
when 'series' then subgenus += 'ser. <em>' + i.name + '</em> '
when 'subseries' then subgenus += 'subser. <em>' + i.name + '</em> '
when 'species group' then superspecies += '<em>' + i.name + '</em> '
when 'species' then species += '<em>' + i.name + '</em> '
when 'subspecies' then species += '<em>' + i.name + '</em> '
when 'variety' then species += 'var. <em>' + i.name + '</em> '
when 'subvariety' then species += 'subvar. <em>' + i.name + '</em> '
when 'form' then species += 'f. <em>' + i.name + '</em> '
when 'subform' then species += 'subf. <em>' + i.name + '</em> '
else
end
end
end
subgenus = '(' + subgenus.squish + ') ' unless subgenus.empty?
superspecies = '(' + superspecies.squish + ') ' unless superspecies.empty?
cached_name = (genus + subgenus + superspecies + species).squish
cached_name = (genus + subgenus + superspecies + species).squish.gsub('</em> <em>', ' ')
end
end

Expand All @@ -311,32 +311,32 @@ def get_original_combination
species = ''
relationships.each do |i|
case i.type_class.object_relationship_name
when 'original genus' then genus = i.subject_taxon_name.name + ' '
when 'original subgenus' then subgenus += i.subject_taxon_name.name + ' '
when 'original section' then subgenus += 'sect. ' + i.subject_taxon_name.name + ' '
when 'original subsection' then subgenus += 'subsect. ' + i.subject_taxon_name.name + ' '
when 'original series' then subgenus += 'ser. ' + i.subject_taxon_name.name + ' '
when 'original subseries' then subgenus += 'subser. ' + i.subject_taxon_name.name + ' '
when 'original species' then species += i.subject_taxon_name.name + ' '
when 'original subspecies' then species += i.subject_taxon_name.name + ' '
when 'original variety' then species += 'var. ' + i.subject_taxon_name.name + ' '
when 'original subvariety' then species += 'subvar. ' + i.subject_taxon_name.name + ' '
when 'original form' then species += 'f. ' + i.subject_taxon_name.name + ' '
when 'original genus' then genus = '<em>' + i.subject_taxon_name.name + '</em> '
when 'original subgenus' then subgenus += '<em>' + i.subject_taxon_name.name + '</em> '
when 'original section' then subgenus += 'sect. <em>' + i.subject_taxon_name.name + '</em> '
when 'original subsection' then subgenus += 'subsect. <em>' + i.subject_taxon_name.name + '</em> '
when 'original series' then subgenus += 'ser. <em>' + i.subject_taxon_name.name + '</em> '
when 'original subseries' then subgenus += 'subser. <em>' + i.subject_taxon_name.name + '</em> '
when 'original species' then species += '<em>' + i.subject_taxon_name.name + '</em> '
when 'original subspecies' then species += '<em>' + i.subject_taxon_name.name + '</em> '
when 'original variety' then species += 'var. <em>' + i.subject_taxon_name.name + '</em> '
when 'original subvariety' then species += 'subvar. <em>' + i.subject_taxon_name.name + '</em> '
when 'original form' then species += 'f. <em>' + i.subject_taxon_name.name + '</em> '
else
end
end
if self.rank_class.to_s =~ /Genus/
if genus.blank?
genus += self.name + ' '
genus += '<em>' + self.name + '</em> '
else
subgenus += self.name + ' '
subgenus += '<em>' + self.name + '</em> '
end
elsif self.rank_class.to_s =~ /Species/
species += self.name + ' '
genus = self.ancestor_at_rank('genus').name + ' ' if genus.empty? && !self.ancestor_at_rank('genus').nil?
species += '<em>' + self.name + '</em> '
genus = '<em>' + self.ancestor_at_rank('genus').name + '</em> ' if genus.empty? && !self.ancestor_at_rank('genus').nil?
end
subgenus = '(' + subgenus.squish + ') ' unless subgenus.empty?
cached_name = (genus + subgenus + superspecies + species).squish
cached_name = (genus + subgenus + superspecies + species).squish.gsub('</em> <em>', ' ')
end
end

Expand All @@ -352,40 +352,40 @@ def get_combination
species = ''
relationships.each do |i|
case i.type_class.object_relationship_name
when 'genus' then genus = i.subject_taxon_name.name + ' '
when 'subgenus' then subgenus += i.subject_taxon_name.name + ' '
when 'section' then subgenus += 'sect. ' + i.subject_taxon_name.name + ' '
when 'subsection' then subgenus += 'subsect. ' + i.subject_taxon_name.name + ' '
when 'series' then subgenus += 'ser. ' + i.subject_taxon_name.name + ' '
when 'subseries' then subgenus += 'subser. ' + i.subject_taxon_name.name + ' '
when 'species' then species += i.subject_taxon_name.name + ' '
when 'subspecies' then species += i.subject_taxon_name.name + ' '
when 'variety' then species += 'var. ' + i.subject_taxon_name.name + ' '
when 'subvariety' then species += 'subvar. ' + i.subject_taxon_name.name + ' '
when 'form' then species += 'f. ' + i.subject_taxon_name.name + ' '
when 'subform' then species += 'subf. ' + i.subject_taxon_name.name + ' '
when 'genus' then genus = '<em>' + i.subject_taxon_name.name + '</em> '
when 'subgenus' then subgenus += '<em>' + i.subject_taxon_name.name + '</em> '
when 'section' then subgenus += 'sect. <em>' + i.subject_taxon_name.name + '</em> '
when 'subsection' then subgenus += 'subsect. <em>' + i.subject_taxon_name.name + '</em> '
when 'series' then subgenus += 'ser. <em>' + i.subject_taxon_name.name + '</em> '
when 'subseries' then subgenus += 'subser. <em>' + i.subject_taxon_name.name + '</em> '
when 'species' then species += '<em>' + i.subject_taxon_name.name + '</em> '
when 'subspecies' then species += '<em>' + i.subject_taxon_name.name + '</em> '
when 'variety' then species += 'var. <em>' + i.subject_taxon_name.name + '</em> '
when 'subvariety' then species += 'subvar. <em>' + i.subject_taxon_name.name + '</em> '
when 'form' then species += 'f. <em>' + i.subject_taxon_name.name + '</em> '
when 'subform' then species += 'subf. <em>' + i.subject_taxon_name.name + '</em> '
else
end
end

parent_rank = self.parent.rank_class.to_s
if parent_rank =~ /Genus/
if genus.blank?
genus += self.parent.name + ' '
genus += '<em>' + self.parent.name + '</em> '
else # if self.('combination_' + self.parent.rank_class.rank_name).to_sym.nil?
subgenus += self.parent.name + ' '
subgenus += '<em>' + self.parent.name + '</em> '
end
elsif parent_rank =~ /Species/
species += self.parent.name + ' ' # if self.('combination_' + self.parent.rank_class.rank_name).to_sym.nil?
species += '<em>' + self.parent.name + '</em> ' # if self.('combination_' + self.parent.rank_class.rank_name).to_sym.nil?
end
subgenus = '(' + subgenus.squish + ') ' unless subgenus.empty?
cached_name = (genus + subgenus + superspecies + species).squish
cached_name = (genus + subgenus + superspecies + species).squish.gsub('</em> <em>', ' ')
end
end

def get_genus_species(genus_option, self_option)
genus = nil
name = nil
name1 = nil
if self.rank_class.nil?
return nil
elsif genus_option == :original
Expand All @@ -398,11 +398,11 @@ def get_genus_species(genus_option, self_option)
if self.rank_class.to_s =~ /Species/ && genus.blank?
return nil
elsif self_option == :self
name = self.name
name1 = self.name
elsif self_option == :alternative
name = self.name_with_alternative_spelling
name1 = self.name_with_alternative_spelling
end
(genus.to_s + ' ' + name.to_s).squish
(genus.to_s + ' ' + name1.to_s).squish
end

#TODO: check homotypic synonyms
Expand Down Expand Up @@ -616,9 +616,7 @@ def sv_fix_parent_is_valid_name
def sv_cached_names
# if updated, update also set_cached_names
cached = true
if self.cached_name.blank?
cached = false
elsif self.cached_author_year != get_author_and_year
if self.cached_author_year != get_author_and_year
cached = false
elsif self.class.to_s == 'Protonym'
if self.cached_name != get_full_name || self.cached_original_combination != get_original_combination || self.cached_higher_classification != get_higher_classification || self.primary_homonym != get_genus_species(:original, :self) || self.primary_homonym_alt != get_genus_species(:original, :alternative)
Expand All @@ -635,10 +633,21 @@ def sv_cached_names
end
unless cached
soft_validations.add(:base, 'Cached values should be updated',
fix: :set_cached_names, success_message: 'Cached values were updated')
fix: :sv_fix_cached_names, success_message: 'Cached values were updated')
end
end

def sv_fix_cached_names
begin
TaxonName.transaction do
self.save
return true
end
rescue
end
false
end

def sv_validate_parent_rank
true # see validation in Protonym.rb
end
Expand Down Expand Up @@ -667,6 +676,15 @@ def sv_parent_priority
true # see validation in Protonym.rb
end

def sv_homotypic_synonyms
true # see validation in Protonym.rb
end

def sv_potential_homonyms
true # see validation in Protonym.rb
end


#endregion

end
Expand Down
8 changes: 4 additions & 4 deletions spec/models/combination_spec.rb
Expand Up @@ -63,18 +63,18 @@
@combination1 = FactoryGirl.create(:combination, parent: @species)
end
specify 'empty' do
expect(@combination1.get_combination).to eq('vitis')
expect(@combination1.get_combination).to eq('<em>vitis</em>')
end
specify 'genus' do
@combination1.combination_genus = @genus
@combination1.reload
expect(@combination1.get_combination).to eq('Erythroneura vitis')
expect(@combination1.get_combination).to eq('<em>Erythroneura vitis</em>')
@combination1.combination_subgenus = @genus
@combination1.reload
expect(@combination1.get_combination).to eq('Erythroneura (Erythroneura) vitis')
expect(@combination1.get_combination).to eq('<em>Erythroneura</em> (<em>Erythroneura</em>) <em>vitis</em>')
@combination1.combination_species = @species2
@combination1.reload
expect(@combination1.get_combination).to eq('Erythroneura (Erythroneura) comes vitis')
expect(@combination1.get_combination).to eq('<em>Erythroneura</em> (<em>Erythroneura</em>) <em>comes vitis</em>')
end
end
end
Expand Down

0 comments on commit 4abede5

Please sign in to comment.