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_etymology ⇒ 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_infrasubspecific_status ⇒ 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
1598 1599 1600 1601 1602 1603 1604 1605 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1598 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
1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1684 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
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1538 def sv_extant_children if parent_id.present? if 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
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1385 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
1399 1400 1401 1402 1403 1404 1405 1406 1407 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1399 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
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 1313 1314 1315 1316 1317 1318 1319 1320 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1288 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
1607 1608 1609 1610 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1607 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_coordinated_names_author ⇒ Object
661 662 663 664 665 666 667 668 669 670 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 661 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
954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 954 def sv_fix_coordinated_names_etymology fixed = false return false if self.etymology.present? list_of_coordinated_names.each do |t| if t.etymology.present? 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
701 702 703 704 705 706 707 708 709 710 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 701 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
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 892 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
742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 742 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
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 802 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
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 772 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
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 832 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
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 862 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
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 633 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
722 723 724 725 726 727 728 729 730 731 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 722 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
984 985 986 987 988 989 990 991 992 993 994 995 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 984 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
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 598 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
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1042 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
923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 923 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
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1009 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
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1072 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
679 680 681 682 683 684 685 686 687 688 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 679 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_etymology ⇒ Object
1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1526 def sv_fix_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) z = TaxonName.where(name: name).where.not(etymology: nil).group(:etymology).count(:etymology) if z.empty? if !z.empty? z1 = z.sort_by {|k, v| -v} self.etymology = z1[0][0] self.save end end end |
#sv_fix_missing_otu ⇒ Object
1668 1669 1670 1671 1672 1673 1674 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1668 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
1640 1641 1642 1643 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1640 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_misspelling_roles_are_not_required ⇒ Object
1624 1625 1626 1627 1628 1629 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1624 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
1654 1655 1656 1657 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1654 def sv_fix_misspelling_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_fix_presence_of_combination ⇒ Object
1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1707 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
1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1220 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
1593 1594 1595 1596 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1593 def sv_fix_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_homotypic_synonyms ⇒ Object
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1341 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
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1501 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', success_message: 'Etymology is updated', failure_message: 'Failed to update etymology') 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})", success_message: 'Etymology is updated', failure_message: 'Failed to update etymology') end end end |
#sv_missing_gender ⇒ Object
497 498 499 500 501 502 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 497 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_infrasubspecific_status ⇒ Object
1480 1481 1482 1483 1484 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1480 def sv_missing_infrasubspecific_status if nomenclatural_code == :iczn && (self.cached_original_combination&.include?(' var. ') || self.cached_original_combination&.include?(' f. ')) && self.cached_nomenclature_date&.year.to_i > 1960 && is_available? soft_validations.add(:base, 'Missing status. The name described as variety or form after 1960 should be treated as infrasubspecific (it is nevertheless deemed to be subspecific if, before 1985, it was either adopted as the valid name or was treated as a senior homonym).') end end |
#sv_missing_original_genus ⇒ Object
1474 1475 1476 1477 1478 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1474 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
1659 1660 1661 1662 1663 1664 1665 1666 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1659 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
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 488 489 490 491 492 493 494 495 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 463 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} time" : " as '#{key.constantize.label}' #{value} 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
1561 1562 1563 1564 1565 1566 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1561 def sv_missing_roles misspelling = TaxonNameRelationship.where_subject_is_taxon_name(self).with_type_array(TAXON_NAME_RELATIONSHIP_NAMES_MISSPELLING_AND_MISAPPLICATION).any? if self..empty? && !misspelling && 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
455 456 457 458 459 460 461 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 455 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
449 450 451 452 453 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 449 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
443 444 445 446 447 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 443 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
1631 1632 1633 1634 1635 1636 1637 1638 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1631 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
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1612 def sv_misspelling_roles_are_not_required # DD: do not use .has_misspelling_relationship? # MJY Why? 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
1645 1646 1647 1648 1649 1650 1651 1652 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1645 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
1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1486 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
1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1322 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
1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1568 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
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1368 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
1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1409 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
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 1465 1466 1467 1468 1469 1470 1471 1472 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1426 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
1676 1677 1678 1679 1680 1681 1682 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1676 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
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1696 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_original_combination_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
1238 1239 1240 1241 1242 1243 1244 1245 1246 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1238 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
1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1248 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
1553 1554 1555 1556 1557 1558 1559 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1553 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
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1262 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
401 402 403 404 405 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 401 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
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 533 534 535 536 537 538 539 540 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 504 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.present? && masculine_name.present? && neuter_name.present? && 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 = Utilities::Nomenclature.predict_three_forms(name) 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
542 543 544 545 546 547 548 549 550 551 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 542 def sv_species_gender_agreement_not_required if is_species_rank? && ((feminine_name.present? || masculine_name.present? || neuter_name.present?)) && 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.') if feminine_name.present? soft_validations.add(:masculine_name, 'Alternative spelling is not required for the name which is not adjective or participle.') if masculine_name.present? soft_validations.add(:neuter_name, 'Alternative spelling is not required for the name which is not adjective or participle.') if neuter_name.present? 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
1203 1204 1205 1206 1207 1208 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1203 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
1210 1211 1212 1213 1214 1215 1216 1217 1218 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1210 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
654 655 656 657 658 659 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 654 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
945 946 947 948 949 950 951 952 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 945 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
690 691 692 693 694 695 696 697 698 699 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 690 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
883 884 885 886 887 888 889 890 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 883 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
733 734 735 736 737 738 739 740 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 733 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
793 794 795 796 797 798 799 800 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 793 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
763 764 765 766 767 768 769 770 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 763 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
823 824 825 826 827 828 829 830 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 823 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
853 854 855 856 857 858 859 860 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 853 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
622 623 624 625 626 627 628 629 630 631 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 622 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
712 713 714 715 716 717 718 719 720 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 712 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
975 976 977 978 979 980 981 982 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 975 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
588 589 590 591 592 593 594 595 596 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 588 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
1032 1033 1034 1035 1036 1037 1038 1039 1040 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1032 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
913 914 915 916 917 918 919 920 921 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 913 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
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 997 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
1063 1064 1065 1066 1067 1068 1069 1070 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1063 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
672 673 674 675 676 677 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 672 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
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 407 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
433 434 435 436 437 438 439 440 441 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 433 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
1584 1585 1586 1587 1588 1589 1590 1591 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1584 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 |