From f3afe9fea432e994e365bf40fc597ff94b3dbf1b Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Fri, 2 Jan 2026 05:10:15 +0100 Subject: [PATCH 01/10] AO3-6779 log language edits by admins as language edits --- app/controllers/works_controller.rb | 11 +++++++++++ app/helpers/admin_helper.rb | 2 +- features/admins/admin_works.feature | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index b42c7470c4e..c7c8904226a 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -823,6 +823,17 @@ def log_admin_activity if logged_in_as_admin? options = { action: params[:action] } + old_language_id = @work.language_id + new_language_id = params[:work][:language_id].to_i + + if new_language_id && old_language_id != new_language_id + new_language_name = Language.find_by(id: new_language_id).name + summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" + + AdminActivity.log_action(current_admin, @work, action: "edit language", summary: summary) + return + end + if params[:action] == 'update_tags' summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index 1b085c21061..cec45d55eda 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -18,7 +18,7 @@ def admin_activity_target_link(activity) # handled differently from summaries that use item.inspect (and thus contain # angle brackets). def admin_activity_summary(activity) - if activity.action == "edit pseud" || activity.action == "edit profile" + if activity.action == "edit pseud" || activity.action == "edit profile" || activity.action == "edit language" raw sanitize_field(activity, :summary) else activity.summary diff --git a/features/admins/admin_works.feature b/features/admins/admin_works.feature index 2520553933f..ad204fe2052 100644 --- a/features/admins/admin_works.feature +++ b/features/admins/admin_works.feature @@ -381,6 +381,11 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks And I press "Update" Then I should see "Deutsch" And I should not see "English" + When I follow "Activities" + Then I should see "edit language" + When I visit the last activities item + Then I should see "Old language: English" + And I should see "New language: Deutsch" Scenario: Admin can edit language on works when previewing first Given basic languages From 9b2dae1ba8d8f9e7b976db24ee0cc0e50bdb665f Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Mon, 5 Jan 2026 01:30:24 +0000 Subject: [PATCH 02/10] AO3-6779 log both tag and language edits if both happened, don't log tag edits if tags weren't edited, don't log if a preview, small code quality improvements --- app/controllers/works_controller.rb | 36 ++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index c7c8904226a..7b165ce1552 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -820,26 +820,40 @@ def index_page_title end def log_admin_activity - if logged_in_as_admin? - options = { action: params[:action] } + # Don't log if it's just a preview + # TODO: also don't log if the changes can't be saved (e.g. removing all fandoms from a work) + return if params[:preview_button] - old_language_id = @work.language_id - new_language_id = params[:work][:language_id].to_i + return unless logged_in_as_admin? - if new_language_id && old_language_id != new_language_id + if params[:action] == "update_tags" + old_language_id = @work.language_id.to_s + new_language_id = params[:work][:language_id] + + if !new_language_id.empty? && old_language_id != new_language_id new_language_name = Language.find_by(id: new_language_id).name - summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" + edit_language_summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" - AdminActivity.log_action(current_admin, @work, action: "edit language", summary: summary) - return + AdminActivity.log_action(current_admin, @work, action: "edit language", summary: edit_language_summary) end - if params[:action] == 'update_tags' - summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" + # Don't log if nothing changed. + # The category_strings and archive_warning_strings params values + # both start with an empty element which has to be dropped here + if params[:work][:rating_string] == @work.rating_string && + params[:work][:fandom_string] == @work.fandom_string && + params[:work][:relationship_string] == @work.relationship_string && + params[:work][:character_string] == @work.character_string && + params[:work][:freeform_string] == @work.freeform_string && + params[:work][:category_strings].drop(1) == @work.category_strings && + params[:work][:archive_warning_strings].drop(1) == @work.archive_warning_strings + return end - AdminActivity.log_action(current_admin, @work, action: params[:action], summary: summary) + summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" end + + AdminActivity.log_action(current_admin, @work, action: params[:action], summary: summary) end private From 315b392dbec63339c3eccce3a7ddf2cf74b7a551 Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Mon, 5 Jan 2026 03:17:30 +0100 Subject: [PATCH 03/10] Revert previous commit This reverts commit 9b2dae1ba8d8f9e7b976db24ee0cc0e50bdb665f. --- app/controllers/works_controller.rb | 36 +++++++++-------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 7b165ce1552..c7c8904226a 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -820,40 +820,26 @@ def index_page_title end def log_admin_activity - # Don't log if it's just a preview - # TODO: also don't log if the changes can't be saved (e.g. removing all fandoms from a work) - return if params[:preview_button] + if logged_in_as_admin? + options = { action: params[:action] } - return unless logged_in_as_admin? + old_language_id = @work.language_id + new_language_id = params[:work][:language_id].to_i - if params[:action] == "update_tags" - old_language_id = @work.language_id.to_s - new_language_id = params[:work][:language_id] - - if !new_language_id.empty? && old_language_id != new_language_id + if new_language_id && old_language_id != new_language_id new_language_name = Language.find_by(id: new_language_id).name - edit_language_summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" + summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" - AdminActivity.log_action(current_admin, @work, action: "edit language", summary: edit_language_summary) + AdminActivity.log_action(current_admin, @work, action: "edit language", summary: summary) + return end - # Don't log if nothing changed. - # The category_strings and archive_warning_strings params values - # both start with an empty element which has to be dropped here - if params[:work][:rating_string] == @work.rating_string && - params[:work][:fandom_string] == @work.fandom_string && - params[:work][:relationship_string] == @work.relationship_string && - params[:work][:character_string] == @work.character_string && - params[:work][:freeform_string] == @work.freeform_string && - params[:work][:category_strings].drop(1) == @work.category_strings && - params[:work][:archive_warning_strings].drop(1) == @work.archive_warning_strings - return + if params[:action] == 'update_tags' + summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" end - summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" + AdminActivity.log_action(current_admin, @work, action: params[:action], summary: summary) end - - AdminActivity.log_action(current_admin, @work, action: params[:action], summary: summary) end private From c3da8e74fd432b45dd987086c4de3b840cd7dbfa Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:12:26 +0100 Subject: [PATCH 04/10] AO3-6779 log both tag and language edits if both happened, don't log if nothing was edited, small code quality improvements --- app/controllers/works_controller.rb | 41 +++++++++++++++++++++-------- features/admins/admin_works.feature | 35 +++++++++++++++++++++++- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index c7c8904226a..2a14d258d31 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -820,26 +820,45 @@ def index_page_title end def log_admin_activity - if logged_in_as_admin? - options = { action: params[:action] } + return unless logged_in_as_admin? + if params[:action] == "update_tags" old_language_id = @work.language_id new_language_id = params[:work][:language_id].to_i if new_language_id && old_language_id != new_language_id new_language_name = Language.find_by(id: new_language_id).name - summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" + edit_language_summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" - AdminActivity.log_action(current_admin, @work, action: "edit language", summary: summary) - return + AdminActivity.log_action(current_admin, @work, action: "edit language", summary: edit_language_summary) end - if params[:action] == 'update_tags' - summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" - end - - AdminActivity.log_action(current_admin, @work, action: params[:action], summary: summary) - end + # Don't log if nothing changed. + rating_changed = params[:work][:rating_string] != @work.rating_string + fandoms_changed = params[:work][:fandom_string] != @work.fandom_string + relationships_changed = params[:work][:relationship_string] != @work.relationship_string + characters_changed = params[:work][:character_string] != @work.character_string + freeforms_changed = params[:work][:freeform_string] != @work.freeform_string + # The category_strings and archive_warning_strings params values + # both start with an empty element which has to be dropped here + categories_changed = if params[:work][:category_strings].nil? + params[:work][:category_string] != @work.category_string + else + params[:work][:category_strings].drop(1).sort != @work.category_strings.sort + end + warnings_changed = if params[:work][:archive_warning_strings].nil? + params[:work][:archive_warning_string] != @work.archive_warning_string + else + params[:work][:archive_warning_strings].drop(1).sort != @work.archive_warning_strings.sort + end + return unless rating_changed || fandoms_changed || relationships_changed || + characters_changed || freeforms_changed || + categories_changed || warnings_changed + + summary = "Old tags: #{@work.tags.pluck(:name).join(', ')}" + end + + AdminActivity.log_action(current_admin, @work, action: params[:action], summary: summary) end private diff --git a/features/admins/admin_works.feature b/features/admins/admin_works.feature index ad204fe2052..27e43c103b7 100644 --- a/features/admins/admin_works.feature +++ b/features/admins/admin_works.feature @@ -397,9 +397,42 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks And I press "Preview" Then I should see "Preview Tags and Language" When I press "Update" - Then I should see "Deutsch" + Then I should see "Deutsch" And I should not see "English" + Scenario: Admin can edit tags and language at the same time on works + Given basic languages + And the work "Wrong Tags and Language" + When I am logged in as a "policy_and_abuse" admin + And I view the work "Wrong Tags and Language" + And I follow "Edit Tags and Language" + When I select "Mature" from "Rating" + And I select "Deutsch" from "Choose a language" + And I press "Update" + And I follow "Activities" + Then I should see "update_tags" + And I should see "edit language" + + Scenario: When admin does not edit tags or language, no Activities entries are added + Given the work "Nothing Wrong" + When I am logged in as a "policy_and_abuse" admin + And I view the work "Nothing Wrong" + And I follow "Edit Tags and Language" + And I press "Update" + And I follow "Activities" + Then I should not see "update_tags" + And I should not see "edit language" + + Scenario: test thing to see how it works in tests + Given the work "Nothing Wrong" + When I am logged in as a "policy_and_abuse" admin + And I view the work "Nothing Wrong" + And I follow "Edit Tags and Language" + And I press "Update" + And I follow "Activities" + Then I should not see "update_tags" + And I should not see "edit language" + Scenario: can mark a work as spam Given the work "Spammity Spam" And I am logged in as a "policy_and_abuse" admin From f7093f98b351cfed453c4e6c12c299aab0c6b244 Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:20:58 +0100 Subject: [PATCH 05/10] AO3-6779 handle empty languages better --- app/controllers/works_controller.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 2a14d258d31..4fbc44fa7e8 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -823,14 +823,16 @@ def log_admin_activity return unless logged_in_as_admin? if params[:action] == "update_tags" - old_language_id = @work.language_id - new_language_id = params[:work][:language_id].to_i + unless params[:work][:language_id].empty? + old_language_id = @work.language_id + new_language_id = params[:work][:language_id].to_i - if new_language_id && old_language_id != new_language_id - new_language_name = Language.find_by(id: new_language_id).name - edit_language_summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" + if old_language_id != new_language_id + new_language_name = Language.find_by(id: new_language_id).name + edit_language_summary = "

Old language: #{@work.language.name}

New language: #{new_language_name}

" - AdminActivity.log_action(current_admin, @work, action: "edit language", summary: edit_language_summary) + AdminActivity.log_action(current_admin, @work, action: "edit language", summary: edit_language_summary) + end end # Don't log if nothing changed. From 07fc60ca665f9cf694ee01d1cbea9fff21eda697 Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:32:35 +0100 Subject: [PATCH 06/10] AO3-6779 improve the category/warning change check part --- app/controllers/works_controller.rb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 4fbc44fa7e8..72bf63d3818 100755 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -841,18 +841,18 @@ def log_admin_activity relationships_changed = params[:work][:relationship_string] != @work.relationship_string characters_changed = params[:work][:character_string] != @work.character_string freeforms_changed = params[:work][:freeform_string] != @work.freeform_string - # The category_strings and archive_warning_strings params values - # both start with an empty element which has to be dropped here - categories_changed = if params[:work][:category_strings].nil? - params[:work][:category_string] != @work.category_string - else - params[:work][:category_strings].drop(1).sort != @work.category_strings.sort - end - warnings_changed = if params[:work][:archive_warning_strings].nil? - params[:work][:archive_warning_string] != @work.archive_warning_string - else - params[:work][:archive_warning_strings].drop(1).sort != @work.archive_warning_strings.sort - end + # Saving without previewing uses "strings" category and warning parameters + # but previewing and saving uses "string" ones + if params[:work][:category_strings].nil? + categories_changed = params[:work][:category_string] != @work.category_string + warnings_changed = params[:work][:archive_warning_string] != @work.archive_warning_string + else + # The category_strings and archive_warning_strings params values + # both start with an empty element which has to be dropped here + categories_changed = params[:work][:category_strings].drop(1).sort != @work.category_strings.sort + warnings_changed = params[:work][:archive_warning_strings].drop(1).sort != @work.archive_warning_strings.sort + end + return unless rating_changed || fandoms_changed || relationships_changed || characters_changed || freeforms_changed || categories_changed || warnings_changed From 56a9c61a9f7a6f94015f73488e9ede14e05ef90d Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:37:16 +0100 Subject: [PATCH 07/10] AO3-6779 update the admin_activity_summary comment --- app/helpers/admin_helper.rb | 6 +++--- features/admins/admin_works.feature | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index cec45d55eda..d2e94f101c8 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -14,9 +14,9 @@ def admin_activity_target_link(activity) link_to(activity.target_name, url) end - # Summaries for profile and pseud edits, which contain links, need to be - # handled differently from summaries that use item.inspect (and thus contain - # angle brackets). + # Summaries for profile and pseud edits, which contain links, and summaries for + # language edits, which have multiple paragraphs, need to be handled differently + # from summaries that use item.inspect (and thus contain angle brackets). def admin_activity_summary(activity) if activity.action == "edit pseud" || activity.action == "edit profile" || activity.action == "edit language" raw sanitize_field(activity, :summary) diff --git a/features/admins/admin_works.feature b/features/admins/admin_works.feature index 27e43c103b7..07587f8ec89 100644 --- a/features/admins/admin_works.feature +++ b/features/admins/admin_works.feature @@ -397,7 +397,7 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks And I press "Preview" Then I should see "Preview Tags and Language" When I press "Update" - Then I should see "Deutsch" + Then I should see "Deutsch" And I should not see "English" Scenario: Admin can edit tags and language at the same time on works From 14f50b55b7eb20fcd6eb8ed3d6e87d0bd1ab68d9 Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:24:55 +0100 Subject: [PATCH 08/10] AO3-6779 remove the extra test that i didn't mean to add oops --- features/admins/admin_works.feature | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/features/admins/admin_works.feature b/features/admins/admin_works.feature index 07587f8ec89..ea45c4f9a8a 100644 --- a/features/admins/admin_works.feature +++ b/features/admins/admin_works.feature @@ -422,16 +422,6 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks And I follow "Activities" Then I should not see "update_tags" And I should not see "edit language" - - Scenario: test thing to see how it works in tests - Given the work "Nothing Wrong" - When I am logged in as a "policy_and_abuse" admin - And I view the work "Nothing Wrong" - And I follow "Edit Tags and Language" - And I press "Update" - And I follow "Activities" - Then I should not see "update_tags" - And I should not see "edit language" Scenario: can mark a work as spam Given the work "Spammity Spam" From 6d6fe7073a1523483480d157c35469a972c395a4 Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:38:57 +0100 Subject: [PATCH 09/10] AO3-6779 added a test for previewing-then-posting with no changes --- features/admins/admin_works.feature | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/features/admins/admin_works.feature b/features/admins/admin_works.feature index ea45c4f9a8a..bb4a44be63b 100644 --- a/features/admins/admin_works.feature +++ b/features/admins/admin_works.feature @@ -413,7 +413,7 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks Then I should see "update_tags" And I should see "edit language" - Scenario: When admin does not edit tags or language, no Activities entries are added + Scenario: When admin does not edit tags or language and posts without preview, no Activities entries are added Given the work "Nothing Wrong" When I am logged in as a "policy_and_abuse" admin And I view the work "Nothing Wrong" @@ -423,6 +423,17 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks Then I should not see "update_tags" And I should not see "edit language" + Scenario: When admin does not edit tags or language, previews and then posts, no Activities entries are added + Given the work "Nothing Wrong" + When I am logged in as a "policy_and_abuse" admin + And I view the work "Nothing Wrong" + And I follow "Edit Tags and Language" + And I press "Preview" + And I press "Update" + And I follow "Activities" + Then I should not see "update_tags" + And I should not see "edit language" + Scenario: can mark a work as spam Given the work "Spammity Spam" And I am logged in as a "policy_and_abuse" admin From 21b6cd71ce63f21e4884d548cee1648ae4594b14 Mon Sep 17 00:00:00 2001 From: Slava <53832230+slavalamp@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:40:08 +0100 Subject: [PATCH 10/10] AO3-6779 clearer test scenario description --- features/admins/admin_works.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/admins/admin_works.feature b/features/admins/admin_works.feature index bb4a44be63b..2f9f54e0484 100644 --- a/features/admins/admin_works.feature +++ b/features/admins/admin_works.feature @@ -400,7 +400,7 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks Then I should see "Deutsch" And I should not see "English" - Scenario: Admin can edit tags and language at the same time on works + Scenario: When admin edits tags and language on works at the same time, both Activities entries are added Given basic languages And the work "Wrong Tags and Language" When I am logged in as a "policy_and_abuse" admin @@ -413,7 +413,7 @@ Feature: Admin Actions for Works, Comments, Series, Bookmarks Then I should see "update_tags" And I should see "edit language" - Scenario: When admin does not edit tags or language and posts without preview, no Activities entries are added + Scenario: When admin does not edit tags or language and posts without previewing, no Activities entries are added Given the work "Nothing Wrong" When I am logged in as a "policy_and_abuse" admin And I view the work "Nothing Wrong"