Skip to content

Commit b2c6cf2

Browse files
committed
AO3-7135 Record canonized/decanonized dates on tags
1 parent 45ab45c commit b2c6cf2

10 files changed

Lines changed: 127 additions & 3 deletions

File tree

app/models/search/tag_indexer.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def self.mapping
2323
},
2424
tag_type: { type: "keyword" },
2525
sortable_name: { type: "keyword" },
26+
canonized_at: { type: "date" },
27+
decanonized_at: { type: "date" },
2628
uses: { type: "integer" },
2729
unwrangled: { type: "boolean" }
2830
}
@@ -72,7 +74,7 @@ def document(object)
7274
root: false,
7375
only: [
7476
:id, :name, :sortable_name, :merger_id, :canonical, :created_at,
75-
:unwrangleable
77+
:canonized_at, :decanonized_at, :unwrangleable
7678
]
7779
).merge(
7880
has_posted_works: object.has_posted_works?,

app/models/search/tag_query.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,19 @@ def sort
5252
when "created_at"
5353
column = "created_at"
5454
direction ||= "desc"
55+
when "canonized_at"
56+
column = "canonized_at"
57+
direction ||= "desc"
58+
when "decanonized_at"
59+
column = "decanonized_at"
60+
direction ||= "desc"
5561
else
5662
column = "name.keyword"
5763
direction ||= "asc"
5864
end
5965
sort_hash = { column => { order: direction } }
6066

61-
if column == "created_at"
67+
if %w[created_at canonized_at decanonized_at].include?(column)
6268
sort_hash[column][:unmapped_type] = "date"
6369
end
6470

app/models/search/tag_search_form.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,13 @@ def sort_options
6868
[
6969
%w[Name name],
7070
["Date Created", "created_at"],
71+
["Date Canonized", "canonized_at"],
72+
["Date Decanonized", "decanonized_at"],
7173
%w[Uses uses]
7274
]
7375
end
7476

7577
def default_sort_direction
76-
%w[created_at uses].include?(sort_column) ? "desc" : "asc"
78+
%w[created_at canonized_at decanonized_at uses].include?(sort_column) ? "desc" : "asc"
7779
end
7880
end

app/models/tag.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,15 @@ def update_wrangler(tag)
255255
end
256256
end
257257

258+
before_save :set_canonization_date, if: :will_save_change_to_canonical?
259+
def set_canonization_date
260+
if canonical?
261+
self.canonized_at = Time.current
262+
else
263+
self.decanonized_at = Time.current
264+
end
265+
end
266+
258267
after_save :check_type_changes, if: :saved_change_to_type?
259268
def check_type_changes
260269
return if type_before_last_save.nil?

app/views/tags/edit.html.erb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313

1414
<% if logged_in_as_admin? %>
1515
<p class="notes"><%= ts("Last updated by %{wrangler} on %{date}", wrangler: @tag.last_wrangler.try(:login) || '---', date: @tag.updated_at) %></p>
16+
<% if @tag.canonized_at || @tag.decanonized_at %>
17+
<p class="notes">
18+
<% if @tag.canonized_at %>
19+
<%= t(".last_canonized", date: @tag.canonized_at.utc.strftime("%Y-%m-%d %H:%M:%S")) %>
20+
<% end %>
21+
<% if @tag.decanonized_at %>
22+
<%= t(".last_decanonized", date: @tag.decanonized_at.utc.strftime("%Y-%m-%d %H:%M:%S")) %>
23+
<% end %>
24+
</p>
25+
<% end %>
1626
<% end %>
1727

1828
<%= form_for @tag, as: :tag, url: { action: "update", id: @tag}, html: { method: :put } do |f| %>

config/locales/views/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3078,6 +3078,8 @@ en:
30783078
wrangling_tools: Wrangling Tools
30793079
tags:
30803080
edit:
3081+
last_canonized: Last canonized on %{date} UTC.
3082+
last_decanonized: Last decanonized on %{date} UTC.
30813083
save_changes: Save changes
30823084
submit_legend: Submit
30833085
index:
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class AddCanonizationDatesToTags < ActiveRecord::Migration[8.1]
2+
uses_departure! if Rails.env.staging? || Rails.env.production?
3+
4+
def change
5+
change_table :tags, bulk: true do |t|
6+
t.datetime :canonized_at, default: nil, null: true
7+
t.datetime :decanonized_at, default: nil, null: true
8+
end
9+
end
10+
end

features/tags_and_wrangling/tag_wrangling_admin.feature

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,36 @@ Feature: Tag wrangling
3232
Then I should not see "Amelie"
3333
And I should see "Amélie"
3434

35+
Scenario: Admin can see when a tag was last canonized and decanonized
36+
37+
Given I am logged in as a "tag_wrangling" admin
38+
And a fandom exists with name: "Amelie", canonical: false
39+
When I edit the tag "Amelie"
40+
Then I should not see "Last canonized on"
41+
And I should not see "Last decanonized on"
42+
When I check "Canonical"
43+
And I press "Save changes"
44+
And I edit the tag "Amelie"
45+
Then I should see "Last canonized on"
46+
And I should not see "Last decanonized on"
47+
When I uncheck "Canonical"
48+
And I press "Save changes"
49+
And I edit the tag "Amelie"
50+
Then I should see "Last canonized on"
51+
And I should see "Last decanonized on"
52+
53+
Scenario: Tag wrangler cannot see when a tag was last canonized or decanonized
54+
55+
Given I am logged in as a "tag_wrangling" admin
56+
And a fandom exists with name: "Amelie", canonical: true
57+
When I edit the tag "Amelie"
58+
And I uncheck "Canonical"
59+
And I press "Save changes"
60+
And I am logged in as a tag wrangler
61+
And I edit the tag "Amelie"
62+
Then I should not see "Last canonized on"
63+
And I should not see "Last decanonized on"
64+
3565
Scenario: Admin can rename a tag using Eastern characters
3666

3767
Given I am logged in as a "tag_wrangling" admin

spec/models/search/tag_query_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,16 @@
197197
expect(q.generated_query[:sort]).to eq([{ "created_at" => { order: "asc", unmapped_type: "date" } }, { id: { order: "asc" } }])
198198
end
199199

200+
it "allows you to sort by Date Canonized" do
201+
q = TagQuery.new(sort_column: "canonized_at")
202+
expect(q.generated_query[:sort]).to eq([{ "canonized_at" => { order: "desc", unmapped_type: "date" } }, { id: { order: "desc" } }])
203+
end
204+
205+
it "allows you to sort by Date Decanonized" do
206+
q = TagQuery.new(sort_column: "decanonized_at")
207+
expect(q.generated_query[:sort]).to eq([{ "decanonized_at" => { order: "desc", unmapped_type: "date" } }, { id: { order: "desc" } }])
208+
end
209+
200210
it "allows you to sort by Uses" do
201211
q = TagQuery.new(sort_column: "uses")
202212
expect(q.generated_query[:sort]).to eq([{ "uses" => { order: "desc" } }, { "name.keyword" => { order: "asc" } }, { id: { order: "desc" } }])

spec/models/tag_wrangling_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,42 @@
1818
end.to(add_to_reindex_queue(work, :background) &
1919
not_add_to_reindex_queue(work, :main))
2020
end
21+
22+
it "sets canonized_at" do
23+
freeze_time do
24+
fandom.update!(canonical: true)
25+
expect(fandom.canonized_at).to eq(Time.current)
26+
expect(fandom.decanonized_at).to be_nil
27+
end
28+
end
29+
end
30+
31+
context "when a tag is created as canonical" do
32+
it "sets canonized_at" do
33+
freeze_time do
34+
fandom = create(:canonical_fandom)
35+
expect(fandom.canonized_at).to eq(Time.current)
36+
expect(fandom.decanonized_at).to be_nil
37+
end
38+
end
39+
end
40+
41+
context "when a tag is created as non-canonical" do
42+
it "does not set canonized_at or decanonized_at" do
43+
fandom = create(:fandom)
44+
expect(fandom.canonized_at).to be_nil
45+
expect(fandom.decanonized_at).to be_nil
46+
end
47+
end
48+
49+
context "when canonical does not change" do
50+
it "does not change canonized_at or decanonized_at" do
51+
fandom = create(:canonical_fandom)
52+
expect do
53+
fandom.update!(unwrangleable: false)
54+
end.to avoid_changing { fandom.reload.canonized_at } &
55+
avoid_changing { fandom.reload.decanonized_at }
56+
end
2157
end
2258

2359
context "when canonical becomes false" do
@@ -37,6 +73,13 @@
3773
not_add_to_reindex_queue(work, :main))
3874
end
3975

76+
it "sets decanonized_at" do
77+
freeze_time do
78+
fandom.update!(canonical: false)
79+
expect(fandom.decanonized_at).to eq(Time.current)
80+
end
81+
end
82+
4083
it "removes favorite tags" do
4184
user = create(:user)
4285
user.favorite_tags.create(tag: fandom)

0 commit comments

Comments
 (0)