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
1561 1562 1563 1564 1565 1566 1567 1568 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1561 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
1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1502 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
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1368 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
1382 1383 1384 1385 1386 1387 1388 1389 1390 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1382 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
1271 1272 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1271 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
1570 1571 1572 1573 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1570 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_coordinated_names_author ⇒ Object
644 645 646 647 648 649 650 651 652 653 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 644 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
937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 937 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
684 685 686 687 688 689 690 691 692 693 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 684 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
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 875 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
725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 725 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
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 785 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
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 755 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
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 815 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
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 845 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
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 616 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
705 706 707 708 709 710 711 712 713 714 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 705 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
967 968 969 970 971 972 973 974 975 976 977 978 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 967 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
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 581 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
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1025 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
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 906 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
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 992 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
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1055 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
662 663 664 665 666 667 668 669 670 671 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 662 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
1630 1631 1632 1633 1634 1635 1636 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1630 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
1602 1603 1604 1605 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1602 def self.update_column(:verbatim_author, nil) return true end |
#sv_fix_misspelling_roles_are_not_required ⇒ Object
1586 1587 1588 1589 1590 1591 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1586 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
1616 1617 1618 1619 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1616 def sv_fix_misspelling_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_fix_presence_of_combination ⇒ Object
1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1658 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
1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1203 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
1556 1557 1558 1559 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1556 def sv_fix_year_is_not_required self.update_column(:year_of_publication, nil) return true end |
#sv_homotypic_synonyms ⇒ Object
1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1324 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
1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1478 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
480 481 482 483 484 485 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 480 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
1457 1458 1459 1460 1461 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1457 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
1621 1622 1623 1624 1625 1626 1627 1628 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1621 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
446 447 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 446 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
1525 1526 1527 1528 1529 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1525 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
438 439 440 441 442 443 444 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 438 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
432 433 434 435 436 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 432 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
426 427 428 429 430 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 426 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
1593 1594 1595 1596 1597 1598 1599 1600 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1593 def if self. && self.source && (has_misspelling_relationship? || name_is_misapplied?) 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
1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1575 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_AUTHOR_STRING).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
1607 1608 1609 1610 1611 1612 1613 1614 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1607 def sv_misspelling_year_is_not_required if self.year_of_publication && self.source && (has_misspelling_relationship? || name_is_misapplied?) 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
1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1463 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
1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1305 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
1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1531 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
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 1351 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
1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1392 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
1409 1410 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1409 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
1638 1639 1640 1641 1642 1643 1644 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1638 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
1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1647 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
1221 1222 1223 1224 1225 1226 1227 1228 1229 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1221 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
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1231 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
1517 1518 1519 1520 1521 1522 1523 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1517 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
1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1245 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
384 385 386 387 388 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 384 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
487 488 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 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 487 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
525 526 527 528 529 530 531 532 533 534 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 525 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
1186 1187 1188 1189 1190 1191 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1186 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
1193 1194 1195 1196 1197 1198 1199 1200 1201 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1193 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
637 638 639 640 641 642 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 637 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
928 929 930 931 932 933 934 935 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 928 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
673 674 675 676 677 678 679 680 681 682 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 673 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
866 867 868 869 870 871 872 873 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 866 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
716 717 718 719 720 721 722 723 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 716 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
776 777 778 779 780 781 782 783 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 776 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
746 747 748 749 750 751 752 753 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 746 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
806 807 808 809 810 811 812 813 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 806 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
836 837 838 839 840 841 842 843 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 836 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
605 606 607 608 609 610 611 612 613 614 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 605 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
695 696 697 698 699 700 701 702 703 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 695 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
958 959 960 961 962 963 964 965 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 958 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
571 572 573 574 575 576 577 578 579 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 571 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
1015 1016 1017 1018 1019 1020 1021 1022 1023 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1015 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
896 897 898 899 900 901 902 903 904 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 896 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
980 981 982 983 984 985 986 987 988 989 990 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 980 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
1046 1047 1048 1049 1050 1051 1052 1053 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1046 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
655 656 657 658 659 660 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 655 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
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 390 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
416 417 418 419 420 421 422 423 424 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 416 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
1547 1548 1549 1550 1551 1552 1553 1554 |
# File 'app/models/protonym/soft_validation_extensions.rb', line 1547 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 |