Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AO3-6783 Fix that removing a tag nomination would result in a blank tag nomination #4888

Merged
merged 6 commits into from
Aug 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/controllers/autocomplete_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def noncanonical_tag
raise "Redshirt: Attempted to constantize invalid class initialize noncanonical_tag #{params[:type].classify}" unless Tag::TYPES.include?(params[:type].classify)

tag_class = params[:type].classify.constantize
one_tag = tag_class.find_by(canonical: false, name: params[:term])
one_tag = tag_class.find_by(canonical: false, name: params[:term]) if params[:term].present?
# If there is an exact match in the database, ensure it is the first thing suggested.
match = if one_tag
[one_tag.name]
Expand Down
2 changes: 1 addition & 1 deletion app/models/tagset_models/cast_nomination.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class CastNomination < TagNomination
has_one :owned_tag_set, through: :tag_set_nomination
belongs_to :fandom_nomination

validate :known_fandom
validate :known_fandom, unless: :blank_tagname?
def known_fandom
return true if (!parent_tagname.blank? || self.fandom_nomination || from_fandom_nomination)
return true if (tag = Tag.find_by_name(self.tagname)) && tag.parents.any? {|p| p.is_a?(Fandom)}
Expand Down
32 changes: 17 additions & 15 deletions app/models/tagset_models/tag_nomination.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
with: /\A[^,*<>^{}=`\\%]+\z/,
message: ts("^Tag nominations cannot include the following restricted characters: , &#94; * < > { } = ` \\ %")

validate :type_validity
validate :type_validity, unless: :blank_tagname?
def type_validity
if !tagname.blank? && (tag = Tag.find_by_name(tagname)) && "#{tag.type}Nomination" != self.type
errors.add(:base, ts("^The tag %{tagname} is already in the archive as a #{tag.type} tag. (All tags have to be unique.) Try being more specific, for instance tacking on the medium or the fandom.", tagname: self.tagname))
end
return unless (tag = Tag.find_by_name(tagname)) && "#{tag.type}Nomination" != self.type

errors.add(:base, ts("^The tag %{tagname} is already in the archive as a #{tag.type} tag. (All tags have to be unique.) Try being more specific, for instance tacking on the medium or the fandom.", tagname: self.tagname))

Check warning on line 20 in app/models/tagset_models/tag_nomination.rb

View workflow job for this annotation

GitHub Actions / Rubocop

[rubocop] reported by reviewdog 🐶 Prefer Rails built-in `t` helper over `ts`: the latter is not actually translatable. For more information, refer to https://github.com/otwcode/otwarchive/wiki/Internationalization-(i18n)-Standards Raw Output: app/models/tagset_models/tag_nomination.rb:20:23: C: I18n/DeprecatedHelper: Prefer Rails built-in `t` helper over `ts`: the latter is not actually translatable. For more information, refer to https://github.com/otwcode/otwarchive/wiki/Internationalization-(i18n)-Standards
end

validate :not_already_reviewed, on: :update
Expand All @@ -32,7 +32,7 @@
end

# This makes sure no tagnames are nominated for different parents in this tag set
validate :require_unique_tagname_with_parent
validate :require_unique_tagname_with_parent, unless: :blank_tagname?
def require_unique_tagname_with_parent
query = TagNomination.for_tag_set(get_owned_tag_set).where(tagname: self.tagname).where("parent_tagname != ?", (self.get_parent_tagname || ''))
# let people change their own!
Expand All @@ -43,18 +43,15 @@
end
end

after_save :destroy_if_blank
def destroy_if_blank
if tagname.blank?
self.destroy
end
end

def get_owned_tag_set
@tag_set || self.tag_set_nomination.owned_tag_set
end

before_save :set_tag_status
def blank_tagname?
tagname.blank?
end

before_save :set_tag_status, unless: :blank_tagname?
def set_tag_status
if (tag = Tag.find_by_name(tagname))
self.exists = true
Expand All @@ -69,7 +66,7 @@
true
end

before_save :set_parented
before_save :set_parented, unless: :blank_tagname?
def set_parented
if type == "FreeformNomination"
# skip freeforms
Expand All @@ -88,7 +85,7 @@

# sneaky bit: if the tag set moderator has already rejected or approved this tag, don't
# show it to them again.
before_save :set_approval_status
before_save :set_approval_status, unless: :blank_tagname?
def set_approval_status
set_noms = tag_set_nomination
set_noms = fandom_nomination.tag_set_nomination if !set_noms && from_fandom_nomination
Expand All @@ -105,6 +102,11 @@
true
end

after_save :destroy_if_blank
def destroy_if_blank
self.destroy if blank_tagname?
end

def self.for_tag_set(tag_set)
joins(tag_set_nomination: :owned_tag_set).
where("owned_tag_sets.id = ?", tag_set.id)
Expand Down
20 changes: 20 additions & 0 deletions features/other_a/autocomplete.feature
Original file line number Diff line number Diff line change
Expand Up @@ -217,3 +217,23 @@ Feature: Display autocomplete for tags
Then I should see "日月" in the autocomplete
But I should not see "大小" in the autocomplete

@javascript
Scenario: Zero width space tag doesn't appear in the autocomplete for space
Given a canonical character "Gold"
And a zero width space tag exists
And I am logged in as a tag wrangler
When I go to the "Gold" tag edit page
Then I should see "This is the official name for the Character"
When I enter " " in the "tag_merger_string_autocomplete" autocomplete field
Then I should see "No suggestions found" in the autocomplete

@javascript
Scenario: Zero width space tag appears in the autocomplete for zero width space
Given a canonical character "Gold"
And a zero width space tag exists
And I am logged in as a tag wrangler
When I go to the "Gold" tag edit page
Then I should see "This is the official name for the Character"
# Zero width space tag
When I enter "​" in the "tag_merger_string_autocomplete" autocomplete field
Then I should not see "No suggestions found" in the autocomplete
5 changes: 5 additions & 0 deletions features/step_definitions/tag_steps.rb
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,11 @@
tag.destroy if tag.present?
end

Given "a zero width space tag exists" do
blank_tag = FactoryBot.build(:character, name: ["200B".hex].pack("U"))
blank_tag.save!(validate: true) # TODO: Change to validate: false when AO3-6777 is fixed
end

### WHEN

When /^the periodic tag count task is run$/i do
Expand Down
2 changes: 0 additions & 2 deletions features/support/paths.rb
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,6 @@ def path_to(page_name)
edit_tag_set_path(OwnedTagSet.find_by(title: $1))
when /^the "(.*)" tag ?set page$/i
tag_set_path(OwnedTagSet.find_by(title: $1))
when /^the "(.*)" tag ?set nominations page$/i
tag_set_nominations_path(OwnedTagSet.find_by(title: Regexp.last_match(1)))
when /^the Open Doors tools page$/i
opendoors_tools_path
when /^the Open Doors external authors page$/i
Expand Down
65 changes: 62 additions & 3 deletions features/tag_sets/tag_set_nominations.feature
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,25 @@ Feature: Nominating and reviewing nominations for a tag set
And I should see "My Favorite Character/Their Worst Enemy"
But I should not see "Their Best Friend"

Scenario: You should be able to delete a nominated character and its fandom at once
when the tagset doesn't allow fandom nominations
Given a canonical character "Common Character" in fandom "Canon"
And I am logged in as "tagsetter"
And I set up the nominated tag set "Nominated Tags" with 0 fandom noms and 3 character noms
When I follow "Nominate"
And I fill in "Character 1" with "Obscure Character"
And I fill in "Fandom?" with "Canon"
And I press "Submit"
Then I should see "Your nominations were successfully submitted."
And I should see "Obscure Character"
When I follow "Edit"
And I fill in "Character 1" with ""
And I fill in "Fandom?" with ""
And I press "Submit"
Then I should see "Your nominations were successfully updated."
And I should see "None nominated in this category."
But I should not see "We need to know what fandom belongs in."

Scenario: Owner of a tag set can clear all nominations
Given I am logged in as "tagsetter"
And I set up the nominated tag set "Nominated Tags" with 3 fandom noms and 3 character noms
Expand Down Expand Up @@ -240,7 +259,7 @@ Feature: Nominating and reviewing nominations for a tag set
When I follow "My Nominations"
Then I should see "My Nominations for bad"
And I should see "rel tag"
When I go to the "bad" tag set nominations page
When I review nominations for "bad"
Then I should see "Fandoms (1 left to review)"
And I should see "rel tag"
# canonical tag
Expand All @@ -249,7 +268,7 @@ Feature: Nominating and reviewing nominations for a tag set
When I follow "My Nominations"
Then I should see "My Nominations for bad"
And I should see "rel tag"
When I go to the "bad" tag set nominations page
When I review nominations for "bad"
Then I should see "Fandoms (1 left to review)"
And I should see "rel tag"
# synonym tag
Expand All @@ -260,6 +279,46 @@ Feature: Nominating and reviewing nominations for a tag set
When I follow "My Nominations"
Then I should see "My Nominations for bad"
And I should see "rel tag"
When I go to the "bad" tag set nominations page
When I review nominations for "bad"
Then I should see "Fandoms (1 left to review)"
And I should see "rel tag (canon tag)"

Scenario: The zero width space tag doesn't replace deleted tag nominations
Given a canonical fandom "Treasure Chest"
And a zero width space tag exists
And I am logged in as "tagsetter"
And I set up the nominated tag set "Nominated Tags" with 2 fandom noms and 3 character noms
And I nominate fandom "Treasure Chest" and character "Gold" in "Nominated Tags"
And I go to the "Nominated Tags" tag set page
And I follow "My Nominations"
Then I should see "Not Yet Reviewed (may be edited or deleted)"
When I follow "Edit"
And I fill in "Character" with ""
And I press "Submit"
Then I should see "Your nominations were successfully updated."
And I should see "Treasure Chest"
But I should not see "Gold"
And I should see "None nominated in this fandom."

Scenario: A tag nomination with the zero width space tag doesn't prevent removing other tag nominations
Given a canonical fandom "First"
And a canonical fandom "Treasure Chest"
And a zero width space tag exists
And I am logged in as "tagsetter"
And I set up the nominated tag set "Nominated Tags" with 2 fandom noms and 1 character noms
# Zero width space character tag in first fandom
And I nominate fandom "First,Treasure Chest" and character "​,Gold" in "Nominated Tags"
And I go to the "Nominated Tags" tag set page
And I follow "My Nominations"
Then I should see "First"
And I should not see "None nominated in this fandom."
And I should see "Treasure Chest"
And I should see "Gold"
When I follow "Edit"
# Empty second fandom character field
And I fill in "tag_set_nomination_fandom_nominations_attributes_1_character_nominations_attributes_0_tagname" with ""
And I press "Submit"
Then I should see "Your nominations were successfully updated."
And I should not see "Someone else has already nominated the tag for this set but in fandom First."
And I should not see "Gold"
And I should see "None nominated in this fandom."
Loading