Module: Protonym::SoftValidationExtensions::Instance
- Included in:
- Protonym
- Defined in:
- app/models/protonym/soft_validation_extensions.rb
Instance Method Summary collapse
- #sv_author_is_not_required ⇒ Object
- #sv_duplicate_nomen_nudum ⇒ Object
- #sv_extant_children ⇒ Object
- #sv_family_is_invalid ⇒ Object
- #sv_family_is_invalid_no_substitute ⇒ Object
- #sv_fix_add_nominotypical_sub ⇒ Object
- #sv_fix_author_is_not_required ⇒ Object
- #sv_fix_coordinated_names_author ⇒ Object
- #sv_fix_coordinated_names_etymology ⇒ Object
- #sv_fix_coordinated_names_gender ⇒ Object
- #sv_fix_coordinated_names_original_form ⇒ Object
- #sv_fix_coordinated_names_original_genus ⇒ Object
- #sv_fix_coordinated_names_original_species ⇒ Object
- #sv_fix_coordinated_names_original_subgenus ⇒ Object
- #sv_fix_coordinated_names_original_subspecies ⇒ Object
- #sv_fix_coordinated_names_original_variety ⇒ Object
- #sv_fix_coordinated_names_page ⇒ Object
- #sv_fix_coordinated_names_part_of_speech ⇒ Object
- #sv_fix_coordinated_names_roles ⇒ Object
- #sv_fix_coordinated_names_source ⇒ Object
- #sv_fix_coordinated_names_type_genus ⇒ Object
- #sv_fix_coordinated_names_type_species ⇒ Object
- #sv_fix_coordinated_names_type_species_type ⇒ Object
- #sv_fix_coordinated_names_type_specimen ⇒ Object
- #sv_fix_coordinated_names_year ⇒ Object
- #sv_fix_missing_otu ⇒ Object
- #sv_fix_misspelling_author_is_not_required ⇒ Object
- #sv_fix_misspelling_roles_are_not_required ⇒ Object
- #sv_fix_misspelling_year_is_not_required ⇒ Object
- #sv_fix_presence_of_combination ⇒ Object
- #sv_fix_type_placement1 ⇒ Object
- #sv_fix_year_is_not_required ⇒ Object
- #sv_homotypic_synonyms ⇒ Object
- #sv_missing_etymology ⇒ Object
- #sv_missing_gender ⇒ Object
- #sv_missing_original_genus ⇒ Object
- #sv_missing_otu ⇒ Object
- #sv_missing_part_of_speech ⇒ Object
- #sv_missing_roles ⇒ Object
- #sv_missing_substitute_name ⇒ Object
- #sv_missing_type_genus ⇒ Object
- #sv_missing_type_species ⇒ Object
- #sv_misspelling_author_is_not_required ⇒ Object
- #sv_misspelling_roles_are_not_required ⇒ Object
- #sv_misspelling_year_is_not_required ⇒ Object
- #sv_original_combination_relationships ⇒ Object
- #sv_parent_priority ⇒ Object
- #sv_person_vs_year_of_publication ⇒ Object
- #sv_potential_family_homonyms ⇒ Object
- #sv_potential_genus_homonyms ⇒ Object
- #sv_potential_species_homonyms ⇒ Object
- #sv_potential_usage_duplicates ⇒ Object
- #sv_presence_of_combination ⇒ Object
- #sv_primary_types ⇒ Object
- #sv_primary_types_repository ⇒ Object
- #sv_protonym_to_combination ⇒ Object
- #sv_single_sub_taxon ⇒ Object
- #sv_source_not_older_then_description ⇒ Object
- #sv_species_gender_agreement ⇒ Object
- #sv_species_gender_agreement_not_required ⇒ Object
-
#sv_type_placement ⇒ Object
def sv_fix_coordinated_names fixed = false gender = self.gender_class speech = self.part_of_speech_class.
- #sv_type_placement1 ⇒ Object
- #sv_validate_coordinated_names_author ⇒ Object
- #sv_validate_coordinated_names_etymology ⇒ Object
- #sv_validate_coordinated_names_gender ⇒ Object
- #sv_validate_coordinated_names_original_form ⇒ Object
- #sv_validate_coordinated_names_original_genus ⇒ Object
- #sv_validate_coordinated_names_original_species ⇒ Object
- #sv_validate_coordinated_names_original_subgenus ⇒ Object
- #sv_validate_coordinated_names_original_subspecies ⇒ Object
- #sv_validate_coordinated_names_original_variety ⇒ Object
- #sv_validate_coordinated_names_page ⇒ Object
- #sv_validate_coordinated_names_part_of_speech ⇒ Object
- #sv_validate_coordinated_names_roles ⇒ Object
-
#sv_validate_coordinated_names_source ⇒ Object
def sv_validate_coordinated_names return true unless is_available? r = self.iczn_set_as_incorrect_original_spelling_of_relationship list_of_coordinated_names.each do |t| soft_validations.add(:base, “The original publication does not match with the original publication of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Original publication was updated’) if self.source && t.source && self.source.id != t.source.id soft_validations.add(:verbatim_author, “The author does not match with the author of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Author was updated’) unless self.verbatim_author == t.verbatim_author soft_validations.add(:year_of_publication, “The year of publication does not match with the year of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Year was updated’) unless self.year_of_publication == t.year_of_publication soft_validations.add(:base, “The gender status does not match with the gender of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Gender was updated’) if rank_string =~ /Genus/ && self.gender_class != t.gender_class && !has_misspelling_relationship? soft_validations.add(:base, “The part of speech status does not match with the part of speech of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Gender was updated’) if rank_string =~ /Species/ && self.part_of_speech_class != t.part_of_speech_class && !has_misspelling_relationship? soft_validations.add(:base, “The original genus does not match with the original genus of coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Original genus was updated’) if self.original_genus != t.original_genus && r.blank? soft_validations.add(:base, “The original subgenus does not match with the original subgenus of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Original subgenus was updated’) if self.original_subgenus != t.original_subgenus && r.blank? soft_validations.add(:base, “The original species does not match with the original species of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Original species was updated’) if self.original_species != t.original_species && r.blank? soft_validations.add(:base, “The type species does not match with the type species of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Type species was updated’) if self.type_species != t.type_species && !has_misspelling_relationship? soft_validations.add(:base, “The type genus does not match with the type genus of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Type genus was updated’) if self.type_genus != t.type_genus && !has_misspelling_relationship? soft_validations.add(:base, “The type specimen does not match with the type specimen of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Type specimen was updated’) if !self.has_same_primary_type(t) && !has_misspelling_relationship? sttnr = self.type_taxon_name_relationship tttnr = t.type_taxon_name_relationship unless sttnr.nil? || tttnr.nil? soft_validations.add(:base, “The type species relationship does not match with the type species relationship of the coordinated #tt.rank_classt.rank_class.rank_name”, fix: :sv_fix_coordinated_names, success_message: ‘Type species relationship was updated’) unless sttnr.type == tttnr.type end end end.
- #sv_validate_coordinated_names_type_genus ⇒ Object
- #sv_validate_coordinated_names_type_species ⇒ Object
- #sv_validate_coordinated_names_type_species_type ⇒ Object
- #sv_validate_coordinated_names_type_specimen ⇒ Object
- #sv_validate_coordinated_names_year ⇒ Object
- #sv_validate_name ⇒ Object
- #sv_validate_parent_rank ⇒ Object
- #sv_year_is_not_required ⇒ Object
Instance Method Details
#sv_author_is_not_required ⇒ Object
1570 1571 1572 1573 1574 1575 1576 1577 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1570 def if self. && (!self..empty? || (self.source && self. == self.source.)) soft_validations.add( :verbatim_author, 'Verbatim author is not required, it is derived from the source and taxon name author roles', success_message: 'Verbatim author was deleted', failure_message: 'Failed to delete verbatim author') end end |
#sv_duplicate_nomen_nudum ⇒ Object
1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1655 def sv_duplicate_nomen_nudum if self.id == self.cached_valid_taxon_name_id && self.cached_is_valid == false if !self.cached_secondary_homonym_alternative_spelling.nil? possible_available = Protonym.where(cached_secondary_homonym_alternative_spelling: self.cached_secondary_homonym_alternative_spelling).not_self(self).with_project(self.project_id).any? soft_validations.add(:base, "An available protonym with the same original combination, #{self.cached_html}, exits.") if possible_available elsif !self.cached_primary_homonym_alternative_spelling.nil? possible_available = Protonym.where(cached_primary_homonym_alternative_spelling: self.cached_primary_homonym_alternative_spelling).not_self(self).with_project(self.project_id).any? soft_validations.add(:base, "An available protonym with the same name, #{self.cached_html}, exits.") if possible_available end end end |
#sv_extant_children ⇒ Object
1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1511 def sv_extant_children unless self.parent_id.blank? if self.is_fossil? taxa = Protonym.where(parent_id: self.id) z = 0 unless taxa.empty? taxa.each do |t| soft_validations.add(:base, "Extinct taxon #{self.cached_html} has extant children") if !t.is_fossil? && t.id == t.cached_valid_taxon_name_id && z == 0 z = 1 end end end end end |
#sv_family_is_invalid ⇒ Object
1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1377 def sv_family_is_invalid if persisted? && is_family_rank? && is_available? tg = type_genus if tg && (!TaxonNameRelationship.where_subject_is_taxon_name(tg).homonym_or_suppressed.empty? || !TaxonNameClassification.where_taxon_name(tg).with_type_string('TaxonNameClassification::Iczn::Available::Invalid::Homonym').empty? ) if self.id == self.lowest_rank_coordinated_taxon.id if TaxonNameClassification.where_taxon_name(self).with_type_base('TaxonNameClassification::Iczn::Available::Invalid').empty? soft_validations.add(:base, "Missing relationship: #{self.} is invalid due to the homonymy or suppression of its type genus") end end end end end |
#sv_family_is_invalid_no_substitute ⇒ Object
1391 1392 1393 1394 1395 1396 1397 1398 1399 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1391 def sv_family_is_invalid_no_substitute if persisted? && is_family_rank? && self.id == self.lowest_rank_coordinated_taxon.id if !TaxonNameClassification.where_taxon_name(self).with_type_base('TaxonNameClassification::Iczn::Available::Invalid').empty? if self.iczn_set_as_synonym_of.nil? soft_validations.add(:base, 'Missing relationship: The name is invalid, but a substitute name is not selected') end end end end |
#sv_fix_add_nominotypical_sub ⇒ Object
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1280 def sv_fix_add_nominotypical_sub return false if list_of_coordinated_names.collect{|r| r.id}.include?(parent_id) rank = rank_string p = self.parent prank = p.rank_string if (rank =~ /Family/ && prank =~ /Family/) || (rank =~ /Genus/ && prank =~ /Genus/) || (rank =~ /Species/ && prank =~ /Species/) begin Protonym.transaction do if rank =~ /Family/ && prank =~ /Family/ name = Protonym.family_group_base(self.parent.name) case self.rank_class.rank_name when 'subfamily' name += 'inae' when 'tribe' name += 'ini' when 'subtribe' name += 'ina' end else name = p.name end t = Protonym.new(name: name, rank_class: rank, verbatim_author: p., year_of_publication: p.year_of_publication, source: p.source, parent: p) t.save t.soft_validate t.fix_soft_validations end rescue ActiveRecord::RecordInvalid # naked rescue is very bad return false end return true end end |
#sv_fix_author_is_not_required ⇒ Object
1579 1580 1581 1582 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1579 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_coordinated_names_author ⇒ Object
653 654 655 656 657 658 659 660 661 662 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 653 def return false if !self..nil? || !self..empty? list_of_coordinated_names.each do |t| if self..nil? && !t..nil? self.update_column(:verbatim_author, t.) return true end end return false end |
#sv_fix_coordinated_names_etymology ⇒ Object
946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 946 def sv_fix_coordinated_names_etymology fixed = false return false unless self.etymology.blank? list_of_coordinated_names.each do |t| if !t.etymology.blank? self.etymology = t.etymology fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_gender ⇒ Object
693 694 695 696 697 698 699 700 701 702 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 693 def sv_fix_coordinated_names_gender return false unless self.gender_class.nil? list_of_coordinated_names.each do |t| unless t.gender_class.nil? c = self.taxon_name_classifications.create(type: t.gender_class.to_s) return true if c.id end end return false end |
#sv_fix_coordinated_names_original_form ⇒ Object
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 884 def sv_fix_coordinated_names_original_form fixed = false return false unless self.original_form.nil? list_of_coordinated_names.each do |t| if !t.original_form.nil? self.original_form = t.original_form fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_original_genus ⇒ Object
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 734 def sv_fix_coordinated_names_original_genus fixed = false return false unless self.original_genus.nil? list_of_coordinated_names.each do |t| if !t.original_genus.nil? self.original_genus = t.original_genus fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_original_species ⇒ Object
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 794 def sv_fix_coordinated_names_original_species fixed = false return false unless self.original_species.nil? list_of_coordinated_names.each do |t| if !t.original_species.nil? self.original_species = t.original_species fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_original_subgenus ⇒ Object
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 764 def sv_fix_coordinated_names_original_subgenus fixed = false return false unless self.original_subgenus.nil? list_of_coordinated_names.each do |t| if !t.original_subgenus.nil? self.original_subgenus = t.original_subgenus fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_original_subspecies ⇒ Object
824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 824 def sv_fix_coordinated_names_original_subspecies fixed = false return false unless self.original_subspecies.nil? list_of_coordinated_names.each do |t| if !t.original_subspecies.nil? self.original_subspecies = t.original_subspecies fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_original_variety ⇒ Object
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 854 def sv_fix_coordinated_names_original_variety fixed = false return false unless self.original_variety.nil? list_of_coordinated_names.each do |t| if !t.original_variety.nil? self.original_variety = t.original_variety fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_page ⇒ Object
625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 625 def sv_fix_coordinated_names_page fixed = false return false if self.origin_citation.nil? || !self.origin_citation.pages.nil? list_of_coordinated_names.each do |t| if !t.origin_citation.nil? && !t.origin_citation.pages.nil? && self.origin_citation.source_id == t.origin_citation.source_id self.origin_citation.pages = t.origin_citation.pages fixed = true end end if fixed begin Protonym.transaction do self.origin_citation.save end return true rescue return false end end end |
#sv_fix_coordinated_names_part_of_speech ⇒ Object
714 715 716 717 718 719 720 721 722 723 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 714 def sv_fix_coordinated_names_part_of_speech return false unless self.part_of_speech_class.nil? list_of_coordinated_names.each do |t| unless t.part_of_speech_class.nil? c = self.taxon_name_classifications.create(type: t.part_of_speech_class.to_s) return true if c.id end end return false end |
#sv_fix_coordinated_names_roles ⇒ Object
976 977 978 979 980 981 982 983 984 985 986 987 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 976 def sv_fix_coordinated_names_roles return false unless self..empty? list_of_coordinated_names.each do |t| if !t..empty? t..each do |r| TaxonNameAuthor.create(person_id: r.person_id, role_object: self, position: r.position) end return true end end return false end |
#sv_fix_coordinated_names_source ⇒ Object
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 590 def sv_fix_coordinated_names_source fixed = false pg = nil return false unless self.source.nil? list_of_coordinated_names.each do |t| if !t.source.nil? self.source = t.source pg = t.origin_citation.pages fixed = true end end if fixed begin Protonym.transaction do self.source.save self.origin_citation.update_column(:pages, pg) end return true rescue return false end end end |
#sv_fix_coordinated_names_type_genus ⇒ Object
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1034 def sv_fix_coordinated_names_type_genus fixed = false return false unless self.type_genus.nil? list_of_coordinated_names.each do |t| if !t.type_genus.nil? self.type_genus = t.type_genus fixed = true end end if fixed begin Protonym.transaction do self.type_genus.save end return true rescue return false end end end |
#sv_fix_coordinated_names_type_species ⇒ Object
915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 915 def sv_fix_coordinated_names_type_species fixed = false tr = nil return false unless self.type_species.nil? list_of_coordinated_names.each do |t| if !t.type_species.nil? && fixed == false tr = TaxonNameRelationship.new(type: t.type_species_relationship.type, subject_taxon_name_id: t.type_species_relationship.subject_taxon_name_id, object_taxon_name_id: self.id) fixed = true end end if fixed begin TaxonNameRelationship.transaction do tr.save end return true rescue return false end end end |
#sv_fix_coordinated_names_type_species_type ⇒ Object
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1001 def sv_fix_coordinated_names_type_species_type sttnr = self.type_taxon_name_relationship return false if sttnr.nil? fixed = false list_of_coordinated_names.each do |t| tttnr = t.type_taxon_name_relationship if !tttnr.nil? && sttnr.type != tttnr.type && sttnr.type.safe_constantize.descendants.collect{|i| i.to_s}.include?(tttnr.type.to_s) self.type_taxon_name_relationship.type = t.type_taxon_name_relationship.type fixed = true end end if fixed begin Protonym.transaction do self.type_taxon_name_relationship.save end return true rescue return false end end end |
#sv_fix_coordinated_names_type_specimen ⇒ Object
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1064 def sv_fix_coordinated_names_type_specimen fixed = false return false unless self.get_primary_type.empty? list_of_coordinated_names.each do |t1| types2 = t1.get_primary_type if !types2.empty? new_type_material = [] types2.each do |t| new_type_material.push({type_type: t.type_type, protonym_id: self.id, collection_object_id: t.collection_object_id, source: t.source}) end self.type_materials.build(new_type_material) fixed = true end end if fixed begin Protonym.transaction do self.save end return true rescue return false end end end |
#sv_fix_coordinated_names_year ⇒ Object
671 672 673 674 675 676 677 678 679 680 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 671 def sv_fix_coordinated_names_year return false if !self.year_of_publication.nil? || !self.source.try(:year).nil? list_of_coordinated_names.each do |t| if self.year_of_publication.nil? && !t.year_of_publication.nil? self.update_column(:year_of_publication, t.year_of_publication) return true end end return false end |
#sv_fix_missing_otu ⇒ Object
1639 1640 1641 1642 1643 1644 1645 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1639 def sv_fix_missing_otu if is_available? && otus.empty? otus.create(taxon_name_id: id) return true end return false end |
#sv_fix_misspelling_author_is_not_required ⇒ Object
1611 1612 1613 1614 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1611 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_misspelling_roles_are_not_required ⇒ Object
1595 1596 1597 1598 1599 1600 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1595 def sv_fix_misspelling_roles_are_not_required self..each do |r| r.destroy end return true end |
#sv_fix_misspelling_year_is_not_required ⇒ Object
1625 1626 1627 1628 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1625 def sv_fix_misspelling_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_fix_presence_of_combination ⇒ Object
1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1678 def sv_fix_presence_of_combination begin TaxonName.transaction do c = Combination.new safe_self_and_ancestors.each do |i| case i.rank when 'genus' c.genus = i when 'subgenus' c.subgenus = i when 'species' c.species = i when 'subspecies' c.subspecies = i end end c.save end rescue end end |
#sv_fix_type_placement1 ⇒ Object
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1212 def sv_fix_type_placement1 self.type_of_taxon_names.each do |t| coordinated = t.lowest_rank_coordinated_taxon if self.parent_id != coordinated.id # if t.id != coordinated.id && self.parent_id != coordinated.id begin Protonym.transaction do self.parent_id = coordinated.id self.save end return true rescue return false end end end end |
#sv_fix_year_is_not_required ⇒ Object
1565 1566 1567 1568 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1565 def sv_fix_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_homotypic_synonyms ⇒ Object
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1333 def sv_homotypic_synonyms unless !is_valid? # unavailable_or_invalid? if self.id == self.lowest_rank_coordinated_taxon.id possible_synonyms = [] if rank_string =~ /Species/ primary_types = self.get_primary_type unless primary_types.empty? p = primary_types.collect {|t| t.collection_object_id} possible_synonyms = Protonym.with_type_material_array(p).without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).not_self(self).with_project(self.project_id) end elsif rank_string =~ /Family/ && self.name == Protonym.family_group_base(self.name) # do nothing else type = self.type_taxon_name unless type.nil? possible_synonyms = Protonym.with_type_of_taxon_names(type.id).not_self(self).with_project(self.project_id) end end possible_synonyms = reduce_list_of_synonyms(possible_synonyms) possible_synonyms.each do |s| soft_validations.add(:base, "Missing relationship: #{self.rank_class.rank_name} #{self.cached_html} should be a synonym of #{s.cached_html} #{s.} since they share the same type") end end end end |
#sv_missing_etymology ⇒ Object
1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1487 def sv_missing_etymology if self.etymology.nil? && self.rank_string =~ /(Genus|Species)/ && is_available? z = TaxonName. where(name: name, project_id: project_id).where.not(etymology: nil). group(:etymology). count(:etymology) if z.empty? z = TaxonName.where(name: name).where.not(etymology: nil).group(:etymology).count(:etymology) other_project = ' in different projects' else other_project = '' end if z.empty? soft_validations.add(:etymology, 'Etymology is missing') else z1 = z.sort_by {|k, v| -v} t = z1[0][1] == 1 ? 'time' : 'times' soft_validations.add(:etymology, "Etymology is missing. Previously used etymology for similar name#{other_project}: '#{z1[0][0]}' (#{z1[0][1]} #{t})") end end end |
#sv_missing_gender ⇒ Object
489 490 491 492 493 494 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 489 def sv_missing_gender if is_genus_rank? && self.gender_class.nil? && !self.cached_misspelling && is_available? g = genus_suggested_gender soft_validations.add(:base, "Gender is not specified#{ g.nil? ? '' : ' (possible gender is ' + g + ')'}") end end |
#sv_missing_original_genus ⇒ Object
1466 1467 1468 1469 1470 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1466 def sv_missing_original_genus if is_genus_or_species_rank? && self.original_genus.nil? && !not_binominal? soft_validations.add(:base, 'Missing relationship: Original genus is not selected') end end |
#sv_missing_otu ⇒ Object
1630 1631 1632 1633 1634 1635 1636 1637 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1630 def sv_missing_otu if is_available? && otus.empty? && rank_string != 'NomenclaturalRank' soft_validations.add( :year_of_publication, 'Missing OTU', success_message: 'OTU was created', failure_message: 'Failed to create OTU') end end |
#sv_missing_part_of_speech ⇒ Object
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 455 def sv_missing_part_of_speech if is_species_rank? && self.part_of_speech_class.nil? && !has_misspelling_relationship? && is_available? z = TaxonNameClassification. joins(:taxon_name). where(taxon_names: { name: name, project_id: project_id }). where("taxon_name_classifications.type LIKE 'TaxonNameClassification::Latinized::PartOfSpeech%'"). group(:type). count(:type) if z.empty? z = TaxonNameClassification. joins(:taxon_name). where(taxon_names: { name: name}). where("taxon_name_classifications.type LIKE 'TaxonNameClassification::Latinized::PartOfSpeech%'"). group(:type). count(:type) other_project = ' in different projects' else other_project = '' end if z.empty? soft_validations.add(:base, 'Part of speech is not specified. Please select if the name is a noun or an adjective.') else l = [] z.each do |key, value| l << (value == 1 ? " as '#{key.constantize.label}' #{value.to_s} time" : " as '#{key.constantize.label}' #{value.to_s} times") end soft_validations.add(:base, "Part of speech is not specified. The name was previously used#{other_project}" + l.join('; ')) end end end |
#sv_missing_roles ⇒ Object
1534 1535 1536 1537 1538 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1534 def sv_missing_roles if self..empty? && !has_misspelling_relationship? && !name_is_misapplied? && is_family_or_genus_or_species_rank? soft_validations.add(:base, 'Taxon name author role is not selected') end end |
#sv_missing_substitute_name ⇒ Object
447 448 449 450 451 452 453 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 447 def sv_missing_substitute_name if !self.iczn_set_as_homonym_of.nil? || !TaxonNameClassification.where_taxon_name(self).with_type_string('TaxonNameClassification::Iczn::Available::Invalid::Homonym').empty? if self.iczn_set_as_synonym_of.nil? && is_available? soft_validations.add(:base, 'Missing relationship: The name is a homonym, but a substitute name is not selected') end end end |
#sv_missing_type_genus ⇒ Object
441 442 443 444 445 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 441 def sv_missing_type_genus if is_family_rank? && self.type_genus.nil? && is_available? soft_validations.add(:base, 'Missing relationship: Type genus is not selected') end end |
#sv_missing_type_species ⇒ Object
435 436 437 438 439 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 435 def sv_missing_type_species if is_genus_rank? && self.type_species.nil? && is_available? soft_validations.add(:base, 'Missing relationship: Type species is not selected') end end |
#sv_misspelling_author_is_not_required ⇒ Object
1602 1603 1604 1605 1606 1607 1608 1609 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1602 def if self. && self.source && taxon_name_relationships.with_type_array(TAXON_NAME_RELATIONSHIP_NAMES_MISSPELLING_AND_MISAPPLICATION).any? soft_validations.add( :verbatim_author, 'Verbatim author is not required for misspellings and misapplications', success_message: 'Verbatim author was deleted', failure_message: 'Failed to delete verbatim author') end end |
#sv_misspelling_roles_are_not_required ⇒ Object
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1584 def sv_misspelling_roles_are_not_required #DD: do not use .has_misspelling_relationship? misspellings = taxon_name_relationships.with_type_array(TAXON_NAME_RELATIONSHIP_NAMES_MISSPELLING_AND_MISAPPLICATION).any? if !self..empty? && self.source && misspellings soft_validations.add( :base, 'Taxon name author role is not required for misspellings and misapplications', success_message: 'Roles were deleted', failure_message: 'Fail to delete roles') end end |
#sv_misspelling_year_is_not_required ⇒ Object
1616 1617 1618 1619 1620 1621 1622 1623 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1616 def sv_misspelling_year_is_not_required if self.year_of_publication && taxon_name_relationships.with_type_array(TAXON_NAME_RELATIONSHIP_NAMES_MISSPELLING_AND_MISAPPLICATION).any? soft_validations.add( :year_of_publication, 'Year is not required for misspellings and misapplications', success_message: 'Year was deleted', failure_message: 'Failed to delete year') end end |
#sv_original_combination_relationships ⇒ Object
1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1472 def sv_original_combination_relationships relationships = self.original_combination_relationships unless relationships.empty? relationships = relationships.sort_by{|r| r.type_class.order_index } ids = relationships.collect{|r| r.subject_taxon_name_id} if !ids.include?(self.id) if (list_of_coordinated_names.collect{|r| r.id} & ids).empty? soft_validations.add(:base, "Missing relationship: The original rank of #{self.cached_html} is not specified in the original combination.") end elsif ids.last != self.id soft_validations.add(:base, "Invalid original combination relationship: #{self.cached_html} should be moved to the lowest rank") end end end |
#sv_parent_priority ⇒ Object
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1314 def sv_parent_priority if self.rank_class rank_group = self.rank_class.parent parent = self.parent if !is_higher_rank? && parent && rank_group == parent.rank_class.parent unless !is_valid? # unavailable_or_invalid? date1 = self.cached_nomenclature_date date2 = parent.cached_nomenclature_date unless date1.nil? || date2.nil? if date1 < date2 soft_validations.add(:base, "#{self.rank_class.rank_name.capitalize} #{self.} should not be older than parent #{parent.rank_class.rank_name} #{parent.}") end end end end end end |
#sv_person_vs_year_of_publication ⇒ Object
1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1540 def sv_person_vs_year_of_publication if self.cached_nomenclature_date year = self.cached_nomenclature_date&.year self..each do |r| person = r.person if person.year_died && year > person.year_died + 2 soft_validations.add(:base, "The year of description does not fit the years of #{person.last_name}'s life (#{person.year_born}–#{person.year_died})") elsif person.year_born && year > person.year_born + 105 soft_validations.add(:base, "The year of description does not fit the years of #{person.last_name}'s life (#{person.year_born}–#{person.year_died})") elsif person.year_born && year < person.year_born + 10 soft_validations.add(:base, "The year of description does not fit the years of #{person.last_name}'s life (#{person.year_born}–#{person.year_died})") end end end end |
#sv_potential_family_homonyms ⇒ Object
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1360 def sv_potential_family_homonyms if persisted? && is_family_rank? && is_available? if TaxonNameRelationship.where_subject_is_taxon_name(self).homonym_or_suppressed.empty? if self.id == self.lowest_rank_coordinated_taxon.id name2 = self.cached_primary_homonym_alternative_spelling ? self.cached_primary_homonym_alternative_spelling : nil possible_primary_homonyms_alternative_spelling = name2 ? Protonym.with_primary_homonym_alternative_spelling(name2).without_homonym_or_suppressed.without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).not_self(self).with_base_of_rank_class('NomenclaturalRank::Iczn::FamilyGroup').with_project(self.project_id) : [] list2 = reduce_list_of_synonyms(possible_primary_homonyms_alternative_spelling) if !list2.empty? list2.each do |s| soft_validations.add(:base, "Missing relationship: #{self.} should be a homonym or duplicate of #{s.}") end end end end end end |
#sv_potential_genus_homonyms ⇒ Object
1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1401 def sv_potential_genus_homonyms if persisted? && is_genus_rank? && is_available? if TaxonNameRelationship.where_subject_is_taxon_name(self).homonym_or_suppressed.empty? if self.id == self.lowest_rank_coordinated_taxon.id name1 = self.cached_primary_homonym ? self.cached_primary_homonym : nil possible_primary_homonyms = name1 ? Protonym.with_primary_homonym(name1).without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).without_homonym_or_suppressed.not_self(self).with_base_of_rank_class('NomenclaturalRank::Iczn::GenusGroup').with_project(self.project_id) : [] list1 = reduce_list_of_synonyms(possible_primary_homonyms) if !list1.empty? list1.each do |s| soft_validations.add(:base, "Missing relationship: #{self.} should be a homonym or duplicate of #{s.}") if s.nomenclatural_code == self.nomenclatural_code end end end end end end |
#sv_potential_species_homonyms ⇒ Object
1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1418 def sv_potential_species_homonyms if persisted? && is_species_rank? && is_available? if TaxonNameRelationship.where_subject_is_taxon_name(self).homonym_or_suppressed.empty? if self.id == self.lowest_rank_coordinated_taxon.id name1 = self.cached_primary_homonym ? self.cached_primary_homonym : nil possible_primary_homonyms = name1 ? Protonym.with_primary_homonym(name1).without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).without_homonym_or_suppressed.not_self(self).with_base_of_rank_class('NomenclaturalRank::Iczn::SpeciesGroup').with_project(self.project_id) : [] list1 = reduce_list_of_synonyms(possible_primary_homonyms) if !list1.empty? list1.each do |s| soft_validations.add( :base, "Missing relationship: #{self.} should be a primary homonym or duplicate of #{s.}") # fix: :sv_fix_add_relationship('iczn_set_as_primary_homonym_of'.to_sym, s.id), # success_message: 'Primary homonym relationship was added', # failure_message: 'Fail to add a relationship') end else name2 = self.cached_primary_homonym_alternative_spelling ? self.cached_primary_homonym_alternative_spelling : nil possible_primary_homonyms_alternative_spelling = name2 ? Protonym.with_primary_homonym_alternative_spelling(name2).without_homonym_or_suppressed.without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).not_self(self).with_base_of_rank_class('NomenclaturalRank::Iczn::SpeciesGroup').with_project(self.project_id) : [] list2 = reduce_list_of_synonyms(possible_primary_homonyms_alternative_spelling) if !list2.empty? list2.each do |s| soft_validations.add(:base, "Missing relationship: #{self.} could be a primary homonym of #{s.} (alternative spelling)") end else name3 = self.cached_secondary_homonym ? self.cached_secondary_homonym : nil possible_secondary_homonyms = name3 ? Protonym.with_secondary_homonym(name3).without_homonym_or_suppressed.without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).not_self(self).with_base_of_rank_class('NomenclaturalRank::Iczn::SpeciesGroup').with_project(self.project_id) : [] list3 = reduce_list_of_synonyms(possible_secondary_homonyms) if !list3.empty? list3.each do |s| soft_validations.add(:base, "Missing relationship: #{self.} should be a secondary homonym or duplicate of #{s.}") end else name4 = self.cached_secondary_homonym ? self.cached_secondary_homonym_alternative_spelling : nil possible_secondary_homonyms_alternative_spelling = name4 ? Protonym.with_secondary_homonym_alternative_spelling(name4).without_homonym_or_suppressed.without_taxon_name_classification_array(TAXON_NAME_CLASS_NAMES_UNAVAILABLE_AND_INVALID).not_self(self).with_base_of_rank_class('NomenclaturalRank::Iczn::SpeciesGroup').with_project(self.project_id) : [] list4 = reduce_list_of_synonyms(possible_secondary_homonyms_alternative_spelling) if !list4.empty? list4.each do |s| soft_validations.add(:base, "Missing relationship: #{self.} could be a secondary homonym of #{s.} (alternative spelling)") end end end end end end end end end |
#sv_potential_usage_duplicates ⇒ Object
1647 1648 1649 1650 1651 1652 1653 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1647 def sv_potential_usage_duplicates usage = TaxonNameRelationship::Iczn::Invalidating::Usage.where(subject_taxon_name_id: self.id).first return true if usage.nil? TaxonNameRelationship::Iczn::Invalidating::Usage.where(object_taxon_name_id: usage.object_taxon_name_id).not_self(usage).each do |tr| soft_validations.add(:base, "'#{name}' is a duplicate #{usage.subject_status + ' ' + usage.subject_status_connector_to_object} #{tr.object_taxon_name.cached_html}",) if usage.subject_taxon_name.name == tr.subject_taxon_name.name end end |
#sv_presence_of_combination ⇒ Object
1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1667 def sv_presence_of_combination if is_genus_or_species_rank? && is_valid? && self.id == self.lowest_rank_coordinated_taxon.id && !cached_original_combination.nil? && cached != cached_original_combination unless Combination.where("cached = ? AND cached_valid_taxon_name_id = ?", cached, cached_valid_taxon_name_id).any? soft_validations.add( :base, "Protonym #{self.cached_html} missing corresponding subsequent combination. Current classification of the taxon is different from original combination. (Fix will try to create a new combination if possible)", success_message: "Combination #{self.cached_html} was successfully create", failure_message: 'Failed to create a new combination') end end end |
#sv_primary_types ⇒ Object
1230 1231 1232 1233 1234 1235 1236 1237 1238 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1230 def sv_primary_types if is_species_rank? && is_available? if self.type_materials.primary.empty? && self.type_materials.syntypes.empty? soft_validations.add(:base, 'Primary type is not selected') elsif self.type_materials.primary.count > 1 || (!self.type_materials.primary.empty? && !self.type_materials.syntypes.empty?) soft_validations.add(:base, 'More than one of primary types are selected. Uncheck the specimens which are not primary types for this taxon') end end end |
#sv_primary_types_repository ⇒ Object
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1240 def sv_primary_types_repository if is_species_rank? s = self.type_materials unless s.empty? s.primary.each do |t| soft_validations.add(:base, 'Primary type repository is not set') if t.collection_object.try(:repository).nil? end s.syntypes.each do |t| soft_validations.add(:base, 'Syntype repository is not set') if t.collection_object.try(:repository).nil? end end end end |
#sv_protonym_to_combination ⇒ Object
1526 1527 1528 1529 1530 1531 1532 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1526 def sv_protonym_to_combination if convertable_to_combination? soft_validations.add( :base, "Unavailable or Invalid #{self.cached_original_combination_html} could potentially be converted into a combination (Fix will try to convert protonym into combination)", success_message: "Protonym #{self.cached_original_combination_html} was successfully converted into a combination", failure_message: 'Failed to convert protonym into combination') end end |
#sv_single_sub_taxon ⇒ Object
1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1254 def sv_single_sub_taxon if self.rank_class rank = rank_string if rank != 'potentially_validating rank' && self.rank_class.nomenclatural_code == :iczn && %w(subspecies subgenus subtribe tribe subfamily).include?(self.rank_class.rank_name) sisters = self.parent.descendants.with_rank_class(rank).select{|t| t.id == t.cached_valid_taxon_name_id} if rank =~ /Family/ z = Protonym.family_group_base(self.name) search_name = z.nil? ? nil : Protonym::FAMILY_GROUP_ENDINGS.collect{|i| z+i} a = sisters.collect{|i| Protonym.family_group_base(i.name) } sister_names = a.collect{|z| Protonym::FAMILY_GROUP_ENDINGS.collect{|i| z+i} }.flatten else search_name = [self.name] sister_names = sisters.collect{|i| i.name } end if search_name.include?(self.parent.name) && sisters.count == 1 soft_validations.add(:base, "#{self.cached_html} is a single #{self.rank_class.rank_name} in the nominal #{self.parent.rank_class.rank_name} #{self.parent.cached_html}") elsif !sister_names.include?(self.parent.name) && !sisters.empty? && self.parent.name == Protonym.family_group_base(self.parent.name) && rank =~ /Family/ # do nothing elsif !sister_names.include?(self.parent.name) && !sisters.empty? soft_validations.add(:base, "The parent #{self.parent.rank_class.rank_name} #{self.parent.cached_html} of this #{self.rank_class.rank_name} does not contain nominotypical #{self.rank_class.rank_name} #{Protonym.family_group_name_at_rank(self.parent.name, self.rank_class.rank_name)}", success_message: "Nominotypical #{self.rank_class.rank_name} was added to nominal #{self.parent.rank_class.rank_name} #{self.parent.cached_html}", failure_message: 'Failed to create nomynotypical taxon') end end end end |
#sv_source_not_older_then_description ⇒ Object
393 394 395 396 397 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 393 def sv_source_not_older_then_description if self.source && self.year_of_publication soft_validations.add(:base, 'The year of publication of the taxon and the year in the original reference do not match') if self.try(:source).try(:year) != self.year_of_publication end end |
#sv_species_gender_agreement ⇒ Object
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 496 def sv_species_gender_agreement if is_species_rank? s = part_of_speech_name if !s.nil? && is_available? if %w{adjective participle}.include?(s) if !feminine_name.blank? && !masculine_name.blank? && !neuter_name.blank? && name != masculine_name && name != feminine_name && name != neuter_name soft_validations.add(:base, 'Species name does not match with either of three alternative forms') else forms = predict_three_forms if feminine_name.blank? soft_validations.add(:feminine_name, "The species name is marked as #{part_of_speech_name}, but the name spelling in feminine is not provided") else # e = species_questionable_ending(TaxonNameClassification::Latinized::Gender::Feminine, feminine_name) # soft_validations.add(:feminine_name, "Name has a non feminine ending: -#{e}") unless e.nil? soft_validations.add(:feminine_name, "Feminine form does not match with predicted: #{forms[:feminine_name]}") if feminine_name != forms[:feminine_name] end if masculine_name.blank? soft_validations.add(:masculine_name, "The species name is marked as #{part_of_speech_name}, but the name spelling in masculine is not provided") else # e = species_questionable_ending(TaxonNameClassification::Latinized::Gender::Masculine, masculine_name) # soft_validations.add(:masculine_name, "Name has a non masculine ending: -#{e}") unless e.nil? soft_validations.add(:masculine_name, "Masculine form does not match with predicted: #{forms[:masculine_name]}") if masculine_name != forms[:masculine_name] end if neuter_name.blank? soft_validations.add(:neuter_name, "The species name is marked as #{part_of_speech_name}, but the name spelling in neuter is not provided") else # e = species_questionable_ending(TaxonNameClassification::Latinized::Gender::Neuter, neuter_name) # soft_validations.add(:neuter_name, "Name has a non neuter ending: -#{e}") unless e.nil? soft_validations.add(:neuter_name, "Neuter form does not match with predicted: #{forms[:neuter_name]}") if neuter_name != forms[:neuter_name] end end end end end end |
#sv_species_gender_agreement_not_required ⇒ Object
534 535 536 537 538 539 540 541 542 543 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 534 def sv_species_gender_agreement_not_required if is_species_rank? && ((!feminine_name.blank? || !masculine_name.blank? || !neuter_name.blank?)) && is_available? s = part_of_speech_name if !s.nil? && !%w{adjective participle}.include?(s) soft_validations.add(:feminine_name, 'Alternative spelling is not required for the name which is not adjective or participle.') unless feminine_name.blank? soft_validations.add(:masculine_name, 'Alternative spelling is not required for the name which is not adjective or participle.') unless masculine_name.blank? soft_validations.add(:neuter_name, 'Alternative spelling is not required for the name which is not adjective or participle.') unless neuter_name.blank? end end end |
#sv_type_placement ⇒ Object
def sv_fix_coordinated_names
fixed = false
gender = self.gender_class
speech = self.part_of_speech_class
list_of_coordinated_names.each do |t|
if t.source.nil? && !t.source.nil?
self.source = t.source
fixed = true
end
if self.verbatim_author.nil? && !t.verbatim_author.nil?
self.verbatim_author = t.verbatim_author
fixed = true
end
if self.year_of_publication.nil? && !t.year_of_publication.nil?
self.year_of_publication = t.year_of_publication
fixed = true
end
t_gender = t.gender_class
if gender.nil? && !t_gender.nil?
self.taxon_name_classifications.build(type: t_gender.to_s)
fixed = true
end
t_speech = t.part_of_speech_class
if speech.nil? && speech != t_speech
self.taxon_name_classifications.build(type: t_speech.to_s)
fixed = true
end
if self.gender_class.nil? && !t.gender_class.nil?
self.taxon_name_classifications.build(type: t.gender_class.to_s)
fixed = true
end
if self.original_genus.nil? && !t.original_genus.nil?
self.original_genus = t.original_genus
fixed = true
end
if self.original_subgenus.nil? && !t.original_subgenus.nil?
self.original_subgenus = t.original_subgenus
fixed = true
end
if self.original_species.nil? && !t.original_species.nil?
self.original_species = t.original_species
fixed = true
end
if self.original_subspecies.nil? && !t.original_subspecies.nil?
self.original_subspecies = t.original_subspecies
fixed = true
end
if self.type_species.nil? && !t.type_species.nil?
self.type_species = t.type_species
fixed = true
end
if self.type_genus.nil? && !t.type_genus.nil?
self.type_genus = t.type_genus
fixed = true
end
types1 = self.get_primary_type
types2 = t.get_primary_type
if types1.empty? && !types2.empty?
new_type_material = []
types2.each do |t|
new_type_material.push({type_type: t.type_type, protonym_id: t.protonym_id, collection_object_id: t.collection_object_id, source: t.source})
end
self.type_materials.build(new_type_material)
fixed = true
end
sttnr = self.type_taxon_name_relationship
tttnr = t.type_taxon_name_relationship
unless sttnr.nil? || tttnr.nil?
if sttnr.type != tttnr.type && sttnr.type.safe_constantize.descendants.collect{|i| i.to_s}.include?(tttnr.type.to_s)
self.type_taxon_name_relationship.type = t.type_taxon_name_relationship.type
fixed = true
end
end
end
if fixed
begin
Protonym.transaction do
self.save
end
rescue
return false
end
end
return fixed
end
1195 1196 1197 1198 1199 1200 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1195 def sv_type_placement # type of this taxon is not included in this taxon if !!self.type_taxon_name soft_validations.add(:base, "#{self.rank_class.rank_name} #{self.cached_html} has the type #{self.type_taxon_name.rank_class.rank_name} #{self.type_taxon_name.cached_html} classified outside of this taxon") unless self.type_taxon_name.get_valid_taxon_name.ancestors.include?(TaxonName.find(self.cached_valid_taxon_name_id)) end end |
#sv_type_placement1 ⇒ Object
1202 1203 1204 1205 1206 1207 1208 1209 1210 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1202 def sv_type_placement1 # this taxon is a type, but not included in nominal taxon if !!self.type_of_taxon_names self.type_of_taxon_names.each do |t| soft_validations.add(:base, "#{self.rank_class.rank_name.capitalize} #{self.cached_html} is the type of #{t.rank_class.rank_name} #{t.cached_html} but it has a parent outside of #{t.cached_html}", success_message: 'Parent for type species was updated', failure_message: 'Parent for type species was not updated') unless self.get_valid_taxon_name.ancestors.include?(TaxonName.find(t.cached_valid_taxon_name_id)) end end end |
#sv_validate_coordinated_names_author ⇒ Object
646 647 648 649 650 651 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 646 def s = self. list_of_coordinated_names.each do |t| soft_validations.add(:verbatim_author, "The author does not match with the author of the coordinate #{t.rank_class.rank_name}", success_message: 'Author was updated', failure_message: 'Failed to update author') unless s == t. end end |
#sv_validate_coordinated_names_etymology ⇒ Object
937 938 939 940 941 942 943 944 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 937 def sv_validate_coordinated_names_etymology return true unless is_available? list_of_coordinated_names.each do |t| if self.etymology != t.etymology soft_validations.add(:etymology, "The etymology does not match with the etymology of the coordinate #{t.rank_class.rank_name}", success_message: 'Etymology was updated', failure_message: 'Etymology was not updated') end end end |
#sv_validate_coordinated_names_gender ⇒ Object
682 683 684 685 686 687 688 689 690 691 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 682 def sv_validate_coordinated_names_gender return true unless is_available? return true unless is_genus_rank? s = self.gender_class list_of_coordinated_names.each do |t| if s != t.gender_class soft_validations.add(:base, "The gender status does not match with that of the coordinate #{t.rank_class.rank_name}", success_message: 'Gender was updated', failure_message: 'Failed to update gender') end end end |
#sv_validate_coordinated_names_original_form ⇒ Object
875 876 877 878 879 880 881 882 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 875 def sv_validate_coordinated_names_original_form return true if !is_species_rank? || has_misspelling_relationship? list_of_coordinated_names.each do |t| if self.original_form.try(:name) != t.original_form.try(:name) soft_validations.add(:base, "The original form does not match with the original form of coordinate #{t.rank_class.rank_name}", success_message: 'Original form was updated', failure_message: 'Failed to update original form') end end end |
#sv_validate_coordinated_names_original_genus ⇒ Object
725 726 727 728 729 730 731 732 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 725 def sv_validate_coordinated_names_original_genus return true if !is_genus_or_species_rank? || !is_valid? list_of_coordinated_names.each do |t| if self.original_genus.try(:name) != t.original_genus.try(:name) soft_validations.add(:base, "The original genus does not match with the original genus of coordinate #{t.rank_class.rank_name}", success_message: 'Original genus was updated', failure_message: 'Failed to update original genus') end end end |
#sv_validate_coordinated_names_original_species ⇒ Object
785 786 787 788 789 790 791 792 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 785 def sv_validate_coordinated_names_original_species return true if !is_species_rank? || has_misspelling_relationship? list_of_coordinated_names.each do |t| if self.original_species.try(:name) != t.original_species.try(:name) soft_validations.add(:base, "The original species does not match with the original species of coordinate #{t.rank_class.rank_name}", success_message: 'Original species was updated', failure_message: 'Failed to update original species') end end end |
#sv_validate_coordinated_names_original_subgenus ⇒ Object
755 756 757 758 759 760 761 762 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 755 def sv_validate_coordinated_names_original_subgenus return true if !is_genus_or_species_rank? || has_misspelling_relationship? list_of_coordinated_names.each do |t| if self.original_subgenus.try(:name) != t.original_subgenus.try(:name) soft_validations.add(:base, "The original subgenus does not match with the original subgenus of coordinate #{t.rank_class.rank_name}", success_message: 'Original subgenus was updated', failure_message: 'Failed to update original subgenus') end end end |
#sv_validate_coordinated_names_original_subspecies ⇒ Object
815 816 817 818 819 820 821 822 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 815 def sv_validate_coordinated_names_original_subspecies return true if !is_species_rank? || has_misspelling_relationship? list_of_coordinated_names.each do |t| if self.original_subspecies.try(:name) != t.original_subspecies.try(:name) soft_validations.add(:base, "The original subspecies does not match with the original subspecies of coordinate #{t.rank_class.rank_name}", success_message: 'Original subspecies was updated', failure_message: 'Failed to update original subspecies') end end end |
#sv_validate_coordinated_names_original_variety ⇒ Object
845 846 847 848 849 850 851 852 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 845 def sv_validate_coordinated_names_original_variety return true if !is_species_rank? || has_misspelling_relationship? list_of_coordinated_names.each do |t| if self.original_variety.try(:name) != t.original_variety.try(:name) soft_validations.add(:base, "The original variety does not match with the original variety of coordinate #{t.rank_class.rank_name}", success_message: 'Original variety was updated', failure_message: 'Failed to update original variety') end end end |
#sv_validate_coordinated_names_page ⇒ Object
614 615 616 617 618 619 620 621 622 623 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 614 def sv_validate_coordinated_names_page return true unless is_valid? s = self.origin_citation list_of_coordinated_names.each do |t| ts = t.origin_citation if s && ts && s.source_id == ts.source_id && (s.pages != ts.pages || (s.pages.nil? && !ts.pages.nil?)) soft_validations.add(:base, "The original publication page does not match with the original publication page of the coordinate #{t.rank_class.rank_name}", success_message: 'Original publication pages were updated', failure_message: 'Original publication pages were not updated') end end end |
#sv_validate_coordinated_names_part_of_speech ⇒ Object
704 705 706 707 708 709 710 711 712 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 704 def sv_validate_coordinated_names_part_of_speech return true unless is_available? return true unless is_species_rank? list_of_coordinated_names.each do |t| if self.part_of_speech_class != t.part_of_speech_class soft_validations.add(:base, "The part of speech status does not match with that of the coordinate #{t.rank_class.rank_name}", success_message: 'Part of speech was updated', failure_message: 'Failed to update part of speech') end end end |
#sv_validate_coordinated_names_roles ⇒ Object
967 968 969 970 971 972 973 974 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 967 def sv_validate_coordinated_names_roles return true unless is_valid? list_of_coordinated_names.each do |t| if self..collect{|i| i.person_id} != t..collect{|i| i.person_id} soft_validations.add(:base, "The author roles do not match with the author roles of the coordinate #{t.rank_class.rank_name}", success_message: 'Author roles were updated', failure_message: 'Author roles were not updated') end end end |
#sv_validate_coordinated_names_source ⇒ Object
def sv_validate_coordinated_names
return true unless is_available?
r = self.iczn_set_as_incorrect_original_spelling_of_relationship
list_of_coordinated_names.each do |t|
soft_validations.add(:base, "The original publication does not match with the original publication of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Original publication was updated') if self.source && t.source && self.source.id != t.source.id
soft_validations.add(:verbatim_author, "The author does not match with the author of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Author was updated') unless self.verbatim_author == t.verbatim_author
soft_validations.add(:year_of_publication, "The year of publication does not match with the year of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Year was updated') unless self.year_of_publication == t.year_of_publication
soft_validations.add(:base, "The gender status does not match with the gender of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Gender was updated') if rank_string =~ /Genus/ && self.gender_class != t.gender_class && !has_misspelling_relationship?
soft_validations.add(:base, "The part of speech status does not match with the part of speech of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Gender was updated') if rank_string =~ /Species/ && self.part_of_speech_class != t.part_of_speech_class && !has_misspelling_relationship?
soft_validations.add(:base, "The original genus does not match with the original genus of coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Original genus was updated') if self.original_genus != t.original_genus && r.blank?
soft_validations.add(:base, "The original subgenus does not match with the original subgenus of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Original subgenus was updated') if self.original_subgenus != t.original_subgenus && r.blank?
soft_validations.add(:base, "The original species does not match with the original species of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Original species was updated') if self.original_species != t.original_species && r.blank?
soft_validations.add(:base, "The type species does not match with the type species of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Type species was updated') if self.type_species != t.type_species && !has_misspelling_relationship?
soft_validations.add(:base, "The type genus does not match with the type genus of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Type genus was updated') if self.type_genus != t.type_genus && !has_misspelling_relationship?
soft_validations.add(:base, "The type specimen does not match with the type specimen of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Type specimen was updated') if !self.has_same_primary_type(t) && !has_misspelling_relationship?
sttnr = self.type_taxon_name_relationship
tttnr = t.type_taxon_name_relationship
unless sttnr.nil? || tttnr.nil?
soft_validations.add(:base, "The type species relationship does not match with the type species relationship of the coordinated #{t.rank_class.rank_name}",
fix: :sv_fix_coordinated_names, success_message: 'Type species relationship was updated') unless sttnr.type == tttnr.type
end
end
end
580 581 582 583 584 585 586 587 588 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 580 def sv_validate_coordinated_names_source return true unless is_valid? s = self.source list_of_coordinated_names.each do |t| if ((s && t.source && s.id != t.source.id) || (s.nil? && t.source)) soft_validations.add(:base, "The original publication does not match with the original publication of the coordinate #{t.rank_class.rank_name}", success_message: 'Original publication was updated', failure_message: 'Failed to update original publication') end end end |
#sv_validate_coordinated_names_type_genus ⇒ Object
1024 1025 1026 1027 1028 1029 1030 1031 1032 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1024 def sv_validate_coordinated_names_type_genus return true unless is_valid? return true unless is_family_rank? list_of_coordinated_names.each do |t| if self.type_genus != t.type_genus soft_validations.add(:base, "The type genus does not match with the type genus of the coordinate #{t.rank_class.rank_name}", success_message: 'Type genus was updated', failure_message: 'Failed to update type genus') end end end |
#sv_validate_coordinated_names_type_species ⇒ Object
905 906 907 908 909 910 911 912 913 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 905 def sv_validate_coordinated_names_type_species return true unless is_valid? return true unless is_genus_rank? list_of_coordinated_names.each do |t| if self.type_species != t.type_species soft_validations.add(:base, "The type species does not match with the type species of the coordinate #{t.rank_class.rank_name}", success_message: 'Type species was updated', failure_message: 'Failed to update type species') end end end |
#sv_validate_coordinated_names_type_species_type ⇒ Object
989 990 991 992 993 994 995 996 997 998 999 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 989 def sv_validate_coordinated_names_type_species_type return true unless is_genus_rank? sttnr = self.type_taxon_name_relationship return true if sttnr.nil? list_of_coordinated_names.each do |t| tttnr = t.type_taxon_name_relationship if !tttnr.nil? && sttnr.type != tttnr.type soft_validations.add(:base, "The type species relationship does not match with the type species relationship of the coordinate #{t.rank_class.rank_name}", success_message: 'Type species relationship was updated', failure_message: 'Failed to update type species relationship') end end end |
#sv_validate_coordinated_names_type_specimen ⇒ Object
1055 1056 1057 1058 1059 1060 1061 1062 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1055 def sv_validate_coordinated_names_type_specimen return true if !is_species_rank? || !is_valid? list_of_coordinated_names.each do |t| if !self.has_same_primary_type(t) soft_validations.add(:base, "The type specimen does not match with the type specimen of the coordinate #{t.rank_class.rank_name}", success_message: 'Type specimen was updated', failure_message: 'Failed to update type specimen') end end end |
#sv_validate_coordinated_names_year ⇒ Object
664 665 666 667 668 669 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 664 def sv_validate_coordinated_names_year s = self.year_of_publication list_of_coordinated_names.each do |t| soft_validations.add(:year_of_publication, "The year of publication does not match with the year of the coordinate #{t.rank_class.rank_name}", success_message: 'Year was updated', failure_message: 'Failed to update year') unless s == t.year_of_publication end end |
#sv_validate_name ⇒ Object
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 399 def sv_validate_name correct_name_format = false if rank_class # TODO: name these Regexp somewhere # TODO: move pertinent checks to base of nomenclature Classes to manage them there if (name =~ /^[a-zA-Z]*$/) || # !! should reference NOT_LATIN (nomenclatural_code == :iczn && name =~ /^[a-zA-Z]-[a-zA-Z]*$/) || (nomenclatural_code == :icnp && name =~ /^[a-zA-Z]-[a-zA-Z]*$/) || (nomenclatural_code == :icn && name =~ /^[a-zA-Z]*-[a-zA-Z]*$/) || (nomenclatural_code == :icn && name =~ /^[a-zA-Z]*\s×\s[a-zA-Z]*$/) || (nomenclatural_code == :icn && name =~ /^[a-zA-Z]*\s×[a-zA-Z]*$/) || (nomenclatural_code == :icn && name =~ /^×[a-zA-Z]*$/) || (nomenclatural_code == :icvcn) correct_name_format = true end unless correct_name_format icvcn_species = (nomenclatural_code == :icvcn && self.rank_string =~ /Species/) ? true : nil if is_available? && icvcn_species.nil? soft_validations.add(:name, 'Name should not have spaces or special characters, unless it has a status of misspelling or original misspelling') end end end end |
#sv_validate_parent_rank ⇒ Object
425 426 427 428 429 430 431 432 433 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 425 def sv_validate_parent_rank if self.rank_class && self.id == self.cached_valid_taxon_name_id if rank_string == 'NomenclaturalRank' || self.parent&.rank_string == 'NomenclaturalRank' || !!self.iczn_uncertain_placement_relationship true elsif !self.rank_class&.valid_parents.include?(self.parent&.rank_string) soft_validations.add(:rank_class, "The rank #{self.rank_class&.rank_name} is not compatible with the rank of parent (#{self.parent&.rank_class&.rank_name}). The name should be marked as 'Incertae sedis'") end end end |
#sv_year_is_not_required ⇒ Object
1556 1557 1558 1559 1560 1561 1562 1563 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1556 def sv_year_is_not_required if !self.year_of_publication.nil? && self.source && self.year_of_publication == self.source.year soft_validations.add( :year_of_publication, 'Year of publication is not required, it is derived from the source', success_message: 'Year was deleted', failure_message: 'Failed to delete year') end end |