diff --git a/config/locales/views/admin/en.yml b/config/locales/views/admin/en.yml
index be414eb60..6872ed877 100644
--- a/config/locales/views/admin/en.yml
+++ b/config/locales/views/admin/en.yml
@@ -365,6 +365,15 @@ en:
Open: Open
Resolved: Resolved
Invalid: Invalid
+ reputation:
+ change: Change reputation modifier
+ change_note: Reason for change
+ desc_html: This changes the points awarded to reactions given by the user, increasing or decreasing their impact on article and comment score. The user's current's reputation modifier is %{reputation_modifier}.
+ heading: Change reputation modifier
+ reputation_modifier: New reputation modifier
+ submit: Change reputation modifier
+ success: Successfully changed user's reputation modifier to %{reputation_modifier}.
+ error: Failed to change user's reptuation modifier (select between 0 and 5)
unpublish_logs:
subtitle_html: Unpublished by %{user} on %{time}
posts: "Posts:"
diff --git a/config/locales/views/admin/fr.yml b/config/locales/views/admin/fr.yml
index 83858e84f..fd4aace31 100644
--- a/config/locales/views/admin/fr.yml
+++ b/config/locales/views/admin/fr.yml
@@ -363,6 +363,15 @@ fr:
Open: Open
Resolved: Resolved
Invalid: Invalid
+ reputation:
+ change: Changer le modificateur de réputation
+ change_note: Raison du changement
+ desc_html: Cela modifie les points attribués aux réactions données par l'utilisateur, augmentant ou diminuant leur impact sur le score de l'article et du commentaire. Le modificateur de réputation actuel de l'utilisateur est %{reputation_modifier}.
+ heading: Changer le modificateur de réputation
+ reputation_modifier: Nouveau modificateur de réputation
+ submit: Changer le modificateur de réputation
+ success: Modification réussie du modificateur de réputation de l'utilisateur en %{reputation_modifier}.
+ error: Échec de la modification du modificateur de réputation de l'utilisateur (sélectionnez entre 0 et 5).
unpublish_logs:
subtitle_html: Unpublished by %{user} on %{time}
posts: "Posts:"
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 38e446e4f..c6043a5db 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -48,6 +48,7 @@ namespace :admin do
member do
post "banish"
+ patch "reputation_modifier"
post "export_data"
post "full_delete"
patch "user_status"
diff --git a/spec/requests/admin/users/users_change_reputation_modifier_spec.rb b/spec/requests/admin/users/users_change_reputation_modifier_spec.rb
new file mode 100644
index 000000000..4382114d6
--- /dev/null
+++ b/spec/requests/admin/users/users_change_reputation_modifier_spec.rb
@@ -0,0 +1,73 @@
+require "rails_helper"
+
+RSpec.describe "/admin/member_manager/users" do
+ let!(:user) { create(:user) }
+ let!(:admin) { create(:user, :super_admin) }
+
+ before do
+ sign_in(admin)
+ end
+
+ describe "PATCH /admin/member_manager/users/:id/reputation_modifier" do
+ let(:new_reputation_modifier) { 1.5 }
+ let(:note_content) { "Improvement in community engagement" }
+
+ it "updates the user's reputation modifier" do
+ patch reputation_modifier_admin_user_path(user.id), params: {
+ user: {
+ reputation_modifier: new_reputation_modifier,
+ new_note: note_content
+ }
+ }
+
+ user.reload
+ expect(user.reputation_modifier).to eq(new_reputation_modifier)
+ expect(flash[:success]).to be_present
+ end
+
+ it "creates a note with the reason for the change" do
+ expect do
+ patch reputation_modifier_admin_user_path(user.id), params: {
+ user: {
+ reputation_modifier: new_reputation_modifier,
+ new_note: note_content
+ }
+ }
+ end.to change(Note, :count).by(1)
+
+ note = Note.last
+ expect(note.content).to include("Changed user's reputation modifier to #{new_reputation_modifier}")
+ expect(note.content).to include("Reason: #{note_content}")
+ expect(note.reason).to eq("reputation_modifier_change")
+ expect(note.author_id).to eq(admin.id)
+ expect(note.noteable_id).to eq(user.id)
+ end
+
+ it "redirects to the user admin page" do
+ patch reputation_modifier_admin_user_path(user.id), params: {
+ user: {
+ reputation_modifier: new_reputation_modifier,
+ new_note: ""
+ }
+ }
+
+ expect(response).to redirect_to(admin_user_path(user))
+ end
+
+ context "when the update fails" do
+ let(:invalid_reputation_modifier) { "6" }
+
+ it "sets a flash error message" do
+ patch reputation_modifier_admin_user_path(user.id), params: {
+ user: {
+ reputation_modifier: invalid_reputation_modifier,
+ new_note: note_content
+ }
+ }
+
+ expect(flash[:error]).to be_present
+ expect(response).to redirect_to(admin_user_path(user))
+ end
+ end
+ end
+end