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_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
1563 1564 1565 1566 1567 1568 1569 1570 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1563 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_extant_children ⇒ Object
1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1504 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
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1370 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
1384 1385 1386 1387 1388 1389 1390 1391 1392 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1384 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
1273 1274 1275 1276 1277 1278 1279 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1273 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
1572 1573 1574 1575 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1572 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_coordinated_names_author ⇒ Object
646 647 648 649 650 651 652 653 654 655 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 646 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
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 939 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
686 687 688 689 690 691 692 693 694 695 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 686 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
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 877 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
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 727 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
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 787 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
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 757 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
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 817 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
847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 847 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
618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 618 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
707 708 709 710 711 712 713 714 715 716 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 707 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
969 970 971 972 973 974 975 976 977 978 979 980 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 969 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
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 583 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
1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1027 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
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 908 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
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 994 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
1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1057 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
664 665 666 667 668 669 670 671 672 673 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 664 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
1632 1633 1634 1635 1636 1637 1638 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1632 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
1604 1605 1606 1607 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1604 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_misspelling_roles_are_not_required ⇒ Object
1588 1589 1590 1591 1592 1593 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1588 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
1618 1619 1620 1621 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1618 def sv_fix_misspelling_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_fix_presence_of_combination ⇒ Object
1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1660 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
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1205 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
1558 1559 1560 1561 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1558 def sv_fix_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_homotypic_synonyms ⇒ Object
1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1326 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
1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1480 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
482 483 484 485 486 487 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 482 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
1459 1460 1461 1462 1463 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1459 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
1623 1624 1625 1626 1627 1628 1629 1630 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1623 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
448 449 450 451 452 453 454 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 448 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
1527 1528 1529 1530 1531 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1527 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
440 441 442 443 444 445 446 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 440 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
434 435 436 437 438 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 434 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
428 429 430 431 432 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 428 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
1595 1596 1597 1598 1599 1600 1601 1602 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1595 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
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1577 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
1609 1610 1611 1612 1613 1614 1615 1616 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1609 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
1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1465 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
1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1307 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
1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1533 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
1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1353 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
1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1394 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
1411 1412 1413 1414 1415 1416 1417 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1411 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
1640 1641 1642 1643 1644 1645 1646 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1640 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
1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1649 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
1223 1224 1225 1226 1227 1228 1229 1230 1231 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1223 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
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1233 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
1519 1520 1521 1522 1523 1524 1525 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1519 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
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1247 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
386 387 388 389 390 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 386 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
489 490 491 492 493 494 495 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 489 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
527 528 529 530 531 532 533 534 535 536 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 527 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
1188 1189 1190 1191 1192 1193 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1188 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
1195 1196 1197 1198 1199 1200 1201 1202 1203 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1195 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
639 640 641 642 643 644 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 639 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
930 931 932 933 934 935 936 937 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 930 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
675 676 677 678 679 680 681 682 683 684 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 675 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
868 869 870 871 872 873 874 875 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 868 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
718 719 720 721 722 723 724 725 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 718 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
778 779 780 781 782 783 784 785 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 778 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
748 749 750 751 752 753 754 755 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 748 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
808 809 810 811 812 813 814 815 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 808 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
838 839 840 841 842 843 844 845 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 838 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
607 608 609 610 611 612 613 614 615 616 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 607 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
697 698 699 700 701 702 703 704 705 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 697 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
960 961 962 963 964 965 966 967 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 960 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
573 574 575 576 577 578 579 580 581 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 573 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
1017 1018 1019 1020 1021 1022 1023 1024 1025 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1017 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
898 899 900 901 902 903 904 905 906 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 898 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
982 983 984 985 986 987 988 989 990 991 992 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 982 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
1048 1049 1050 1051 1052 1053 1054 1055 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1048 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
657 658 659 660 661 662 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 657 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
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 392 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
418 419 420 421 422 423 424 425 426 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 418 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
1549 1550 1551 1552 1553 1554 1555 1556 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1549 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 |