diff --git a/app/models/name.rb b/app/models/name.rb index cd84c60f..11bf39a1 100644 --- a/app/models/name.rb +++ b/app/models/name.rb @@ -24,7 +24,10 @@ class Name < ApplicationRecord alias :correspondences :name_correspondences has_many(:checks, dependent: :destroy) has_many(:check_users, -> { distinct }, through: :checks, source: :user) - has_many(:placements, -> { includes(:parent) }, dependent: :destroy) + has_many( + :placements, -> { includes(:parent) }, + dependent: :destroy, inverse_of: :name + ) has_many( :child_placements, -> { includes(:name) }, class_name: 'Placement', foreign_key: 'parent_id', dependent: :destroy @@ -39,7 +42,7 @@ class Name < ApplicationRecord :combinational_derivatives, class_name: 'Name', foreign_key: 'basonym_id', dependent: :nullify # Inverse of basonym ) - has_many(:curations) + has_many(:curations, dependent: :destroy) has_many(:name_paratypes, dependent: :destroy) has_many( :paratype_publications, through: :name_paratypes, source: :publication @@ -1478,9 +1481,16 @@ def harmonize_register_and_status end def ensure_consistent_placement - if parent_id.present? || incertae_sedis.present? + placement_incertae_sedis = + if saved_change_to_incertae_sedis? + self[:incertae_sedis] + else + incertae_sedis + end + + if parent_id.present? || placement_incertae_sedis.present? pp = placements.where( - parent_id: parent_id, incertae_sedis: incertae_sedis + parent_id: parent_id, incertae_sedis: placement_incertae_sedis ).first if pp.present? if pp.preferred? @@ -1491,8 +1501,11 @@ def ensure_consistent_placement else placements.update(preferred: false) && Placement.new( - name_id: id, parent_id: parent_id, incertae_sedis: incertae_sedis, - incertae_sedis_text: incertae_sedis_text, preferred: true + name_id: id, + parent_id: parent_id, + incertae_sedis: placement_incertae_sedis, + incertae_sedis_text: incertae_sedis_text, + preferred: true ).save end else diff --git a/app/models/tutorial/batch.rb b/app/models/tutorial/batch.rb index e115b03d..74766280 100644 --- a/app/models/tutorial/batch.rb +++ b/app/models/tutorial/batch.rb @@ -77,7 +77,19 @@ def param_names def ephemeral_names @ephemeral_names ||= param_names.map do |i| - Name.new(i) + name_attributes = i.except('parent', 'incertae_sedis') + placement_attributes = { + parent: i['parent'], + incertae_sedis: i['incertae_sedis'], + preferred: true + } + if i['incertae_sedis'].present? + placement_attributes[:incertae_sedis_text] = i['description'] + end + + Name.new(name_attributes).tap do |name| + name.placements.build(placement_attributes) + end rescue => e $stderr.puts e nil @@ -113,15 +125,20 @@ def check_ephemeral_names(user) @check_ephemeral_names ||= :pending return ephemeral_names if @check_ephemeral_names == :done - name_names = ephemeral_names.map(&:name) ephemeral_names.each do |name| + placement = name.placements.first + # Is the information complete? Tutorial::Batch.name_keys_base.each do |i| + next if i == :parent + unless name.send(i).present? name.errors.add(i, :missing, message: 'is missing') end end + placement.validate # Populate placement.errors for the review step + # Is the etymology present? unless name.etymology? name.errors.add( @@ -139,8 +156,8 @@ def check_ephemeral_names(user) end # Is the parent already registered? - if name.parent && !name_exists?(name.parent.name) - name.errors.add( + if placement.parent && !name_exists?(placement.parent.name) + placement.errors.add( :parent, :does_not_exist, message: 'does not exist and is not proposed in this list' ) @@ -305,7 +322,8 @@ def batch_step_01(params, user) # Remove foreign keys in first pass par = par_ori.dup %w[ - parent nomenclatural_type_entry nomenclatural_type_type + parent incertae_sedis + nomenclatural_type_entry nomenclatural_type_type nomenclatural_type_id nomenclatural_type ].each { |i| par.delete(i) } @@ -333,12 +351,17 @@ def batch_step_01(params, user) # Parents if par['parent'] - new_par[:parent] = Name.find_by_variants(par['parent'].name) - unless new_par[:parent] - name = Name.new(default_pars.merge(name: par['parent'].name)) - name.save! - new_par[:parent_id] = name.id + parent = Name.find_by_variants(par['parent'].name) + unless parent + parent = Name.new(default_pars.merge(name: par['parent'].name)) + parent.save! end + new_par[:parent] = parent + new_par[:incertae_sedis] = nil + elsif par['incertae_sedis'] + new_par[:parent] = nil + new_par[:incertae_sedis] = par['incertae_sedis'] + new_par[:incertae_sedis_text] = par['description'] end # Nomenclatural types @@ -359,7 +382,9 @@ def batch_step_01(params, user) end end - Name.find_by_variants(par['name']).update!(new_par) + name = Name.find_by_variants(par['name']) + name.update!(new_par) + name.update_column(:incertae_sedis, nil) if par['incertae_sedis'] end # If all is good, go to next step diff --git a/app/views/tutorials/batch/_01.html.erb b/app/views/tutorials/batch/_01.html.erb index c854a844..2867f341 100644 --- a/app/views/tutorials/batch/_01.html.erb +++ b/app/views/tutorials/batch/_01.html.erb @@ -9,6 +9,7 @@