mod/core/set/all/name.rb in card-1.91 vs mod/core/set/all/name.rb in card-1.92

- old
+ new

@@ -1,42 +1,43 @@ require "uuid" module ClassMethods def uniquify_name name, rename=:new - return name unless Card.exists?(name) + return name unless Card.exists? name + uniq_name = generate_alternative_name name + return uniq_name unless rename == :old + rename!(name, uniq_name) + name + end + + def generate_alternative_name name uniq_name = "#{name} 1" uniq_name.next! while Card.exists?(uniq_name) - if rename == :old - # name conflict resolved; original name can be used - Card[name].update_attributes! name: uniq_name, - update_referers: true - name - else - uniq_name - end + uniq_name end -end -def name= newname - cardname = newname.to_name - if @supercard - @supercard.subcards.rename key, cardname.key - @contextual_name = cardname.to_s - relparts = cardname.parts - if relparts.size == 2 && - (relparts.first.blank? || relparts.first.to_name.key == @supercard.key) - @superleft = @supercard - end - cardname = cardname.to_absolute_name @supercard.name + def rename! oldname, newname + Card[oldname].update_attributes! name: newname, update_referers: true end +end +def name= newname + cardname = superize_name newname.to_name newkey = cardname.key self.key = newkey if key != newkey update_subcard_names cardname write_attribute :name, cardname.s end +def superize_name cardname + return cardname unless @supercard + @raw_name = cardname.s + @supercard.subcards.rename key, cardname.key + @superleft = @supercard if cardname.field_of? @supercard.name + cardname.absolute_name @supercard.name +end + def key= newkey was_in_cache = Card.cache.soft.delete key write_attribute :key, newkey # keep the soft cache up-to-date Card.write_to_soft_cache self if was_in_cache @@ -69,10 +70,14 @@ def cardname name.to_name end +def codename + super&.to_sym +end + def autoname name if Card.exists?(name) || ActManager.include?(name) autoname name.next else name @@ -86,17 +91,17 @@ def junction? cardname.junction? end -def contextual_name - @contextual_name || name +def raw_name + @raw_name || name end def relative_name context_name=nil context_name ||= @supercard.cardname if @supercard - cardname.relative_name context_name + cardname.name_from context_name end def absolute_name context_name=nil context_name ||= @supercard.cardname if @supercard cardname.absolute_name context_name @@ -104,11 +109,11 @@ def left *args case when simple? then nil when @superleft then @superleft - when name_changed? && name.to_name.trunk_name.key == name_was.to_name.key + when attribute_is_changing?(:name) && name.to_name.trunk_name.key == name_before_act.to_name.key nil # prevent recursion when, eg, renaming A+B to A+B+C else Card.fetch cardname.left, *args end end @@ -238,38 +243,11 @@ else self.left_id = self.right_id = nil end end -event :rename, after: :set_name, on: :update do - if (existing_card = Card.find_by_key_and_trash(cardname.key, true)) && - existing_card != self - existing_card.name = existing_card.name + "*trash" - existing_card.rename_without_callbacks - existing_card.save! - end -end - -def suspend_name name - # move the current card out of the way, in case the new name will require - # re-creating a card with the current name, ie. A -> A+B - Card.expire name - tmp_name = "tmp:" + UUID.new.generate - Card.where(id: id).update_all(name: tmp_name, key: tmp_name) -end - -event :cascade_name_changes, :finalize, on: :update, changed: :name do - des = descendants - @descendants = nil # reset - - des.each do |de| - # here we specifically want NOT to invoke recursive cascades on these - # cards, have to go this low level to avoid callbacks. - Rails.logger.info "cascading name: #{de.name}" - Card.expire de.name # old name - newname = de.cardname.replace name_was, name - Card.where(id: de.id).update_all name: newname.to_s, key: newname.key - de.update_referers = update_referers - de.refresh_references_in - Card.expire newname - end +event :name_change_finalized, :finalize, changed: :name, on: :save do + # The events to update references has to happen after :cascade_name_changes, + # but :cascade_name_changes is defined after the reference events and + # and additionaly it is defined on :update but some of the reference + # events are on :save. Hence we need this additional hook to organize these events. end