user name changes: remove unused reason, status fields.

Remove all infrastructure around approving or rejecting user name
changes. Name changes haven't been moderated for several years.

* Remove status, approver_id, change_reason, and rejection_reason fields.
* Remove approve and reject controller actions.
This commit is contained in:
evazion
2019-09-25 19:21:36 -05:00
parent 8d1874d309
commit 3b63f94968
10 changed files with 44 additions and 218 deletions

View File

@@ -1,47 +1,29 @@
class UserNameChangeRequestsController < ApplicationController class UserNameChangeRequestsController < ApplicationController
before_action :member_only, :only => [:index, :show] before_action :member_only, :only => [:index, :show]
before_action :gold_only, :only => [:new, :create] before_action :gold_only, :only => [:new, :create]
before_action :admin_only, :only => [:approve, :reject]
respond_to :html, :json, :xml respond_to :html, :json, :xml
def new def new
@change_request = UserNameChangeRequest.new(change_request_params) @change_request = UserNameChangeRequest.new(change_request_params)
respond_with(@change_request) respond_with(@change_request)
end end
def create def create
@change_request = UserNameChangeRequest.create(change_request_params) @change_request = UserNameChangeRequest.create_with(user: CurrentUser.user, original_name: CurrentUser.name).create(change_request_params)
flash[:notice] = "Your name has been changed"
if @change_request.errors.any? respond_with(@change_request, location: profile_path)
render :action => "new"
else
@change_request.approve!
redirect_to user_name_change_request_path(@change_request), :notice => "Your name has been changed"
end
end end
def show def show
@change_request = UserNameChangeRequest.find(params[:id]) @change_request = UserNameChangeRequest.find(params[:id])
check_privileges!(@change_request) check_privileges!(@change_request)
respond_with(@change_request) respond_with(@change_request)
end end
def index def index
@change_requests = UserNameChangeRequest.visible.order("id desc").paginate(params[:page], :limit => params[:limit]) @change_requests = UserNameChangeRequest.visible.order("id desc").paginate(params[:page], :limit => params[:limit])
respond_with(@change_requests) respond_with(@change_requests)
end end
def approve
@change_request = UserNameChangeRequest.find(params[:id])
@change_request.approve!
redirect_to user_name_change_request_path(@change_request), :notice => "Name change request approved"
end
def reject
@change_request = UserNameChangeRequest.find(params[:id])
@change_request.reject!(params[:reason])
redirect_to user_name_change_request_path(@change_request), :notice => "Name change request rejected"
end
private private
@@ -51,6 +33,6 @@ class UserNameChangeRequestsController < ApplicationController
end end
def change_request_params def change_request_params
params.fetch(:user_name_change_request, {}).permit(%i[desired_name change_reason]) params.fetch(:user_name_change_request, {}).permit(%i[desired_name])
end end
end end

View File

@@ -1,75 +1,34 @@
class UserNameChangeRequest < ApplicationRecord class UserNameChangeRequest < ApplicationRecord
after_initialize :initialize_attributes, if: :new_record?
validates_presence_of :original_name, :desired_name
validates_inclusion_of :status, :in => %w(pending approved rejected)
belongs_to :user belongs_to :user
belongs_to :approver, :class_name => "User", optional: true belongs_to :approver, class_name: "User", optional: true
validate :not_limited, :on => :create
validate :not_limited, on: :create
validates :desired_name, user_name: true validates :desired_name, user_name: true
validates_presence_of :original_name, :desired_name
def initialize_attributes after_create :approve!
self.user_id ||= CurrentUser.user.id
self.original_name ||= CurrentUser.user.name
end
def self.pending
where(:status => "pending")
end
def self.approved
where(:status => "approved")
end
def self.visible(viewer = CurrentUser.user) def self.visible(viewer = CurrentUser.user)
if viewer.is_admin? if viewer.is_admin?
all all
elsif viewer.is_member? elsif viewer.is_member?
joins(:user).merge(User.undeleted).where("user_name_change_requests.status = 'approved' OR user_name_change_requests.user_id = ?", viewer.id) joins(:user).merge(User.undeleted).where("user_name_change_requests.user_id = ?", viewer.id)
else else
none none
end end
end end
def rejected?
status == "rejected"
end
def approved?
status == "approved"
end
def pending?
status == "pending"
end
def feedback
user.feedback.order("id desc")
end
def approve! def approve!
update(status: "approved", approver_id: CurrentUser.user.id)
user.update_attribute(:name, desired_name) user.update_attribute(:name, desired_name)
body = "Your name change request has been approved. Be sure to log in with your new user name." body = "Your name change request has been approved. Be sure to log in with your new user name."
Dmail.create_automated(:title => "Name change request approved", :body => body, :to_id => user_id) Dmail.create_automated(:title => "Name change request approved", :body => body, :to_id => user_id)
UserFeedback.create(:user_id => user_id, :category => "neutral", :body => "Name changed from #{original_name} to #{desired_name}") UserFeedback.create(:user_id => user_id, :category => "neutral", :body => "Name changed from #{original_name} to #{desired_name}")
ModAction.log("Name changed from #{original_name} to #{desired_name}",:user_name_change) ModAction.log("Name changed from #{original_name} to #{desired_name}",:user_name_change)
end end
def reject!(reason)
update(status: "rejected", rejection_reason: reason)
body = "Your name change request has been rejected for the following reason: #{rejection_reason}"
Dmail.create_automated(:title => "Name change request rejected", :body => body, :to_id => user_id)
end
def not_limited def not_limited
if UserNameChangeRequest.where("user_id = ? and created_at >= ?", CurrentUser.user.id, 1.week.ago).exists? if UserNameChangeRequest.unscoped.where(user: user).where("created_at >= ?", 1.week.ago).exists?
errors.add(:base, "You can only submit one name change request per week") errors[:base] << "You can only submit one name change request per week"
end end
end end
def api_attributes
attributes = super
attributes -= [:change_reason, :rejection_reason] unless CurrentUser.is_admin? || user == CurrentUser.user
attributes
end
end end

View File

@@ -6,9 +6,8 @@
<thead> <thead>
<tr> <tr>
<th>User</th> <th>User</th>
<th>Request</th> <th>Old Name</th>
<th>Reason</th> <th>New Name</th>
<th>Status</th>
<th>Date</th> <th>Date</th>
<th></th> <th></th>
</tr> </tr>
@@ -17,23 +16,8 @@
<% @change_requests.each do |change_request| %> <% @change_requests.each do |change_request| %>
<tr> <tr>
<td><%= link_to_user change_request.user %></td> <td><%= link_to_user change_request.user %></td>
<td> <td><%= change_request.original_name %></td>
<strong><%= change_request.original_name %></strong> -> <td><%= change_request.desired_name %></td>
<strong><%= change_request.desired_name %></strong>
</td>
<td>
<% if CurrentUser.is_admin? || CurrentUser.user == change_request.user %>
<%= change_request.change_reason %>
<% end %>
</td>
<td>
<%= change_request.status %>
<% if change_request.approved? %>
by <%= link_to_user change_request.approver %>
<% elsif change_request.rejected? %>
for reason: <%= link_to change_request.rejection_reason %>
<% end %>
</td>
<td><%= compact_time change_request.created_at %></td> <td><%= compact_time change_request.created_at %></td>
<td><%= link_to "view", user_name_change_request_path(change_request) %></td> <td><%= link_to "view", user_name_change_request_path(change_request) %></td>
</tr> </tr>

View File

@@ -22,66 +22,8 @@
<strong><%= @change_request.desired_name %></strong> <strong><%= @change_request.desired_name %></strong>
</td> </td>
</tr> </tr>
<tr>
<th>Reason</th>
<td><%= @change_request.change_reason %></td>
</tr>
<tr>
<th>Status</th>
<td>
<%= @change_request.status %>
<% if @change_request.approved? %>
by <%= link_to_user @change_request.approver %>
<% elsif @change_request.rejected? %>
for reason: <%= link_to @change_request.rejection_reason %>
<% end %>
</td>
</tr>
</tbody> </tbody>
</table> </table>
<% if @change_request.pending? && CurrentUser.user.is_admin? %>
<section>
<h2>Feedback</h2>
<ul>
<% @change_request.feedback.each do |feedback| %>
<li class="feedback-category-<%= feedback.category %>">
<p><%= feedback.body %></p>
<p class="fineprint">Submitted by <%= link_to_user feedback.creator.name %> <%= time_ago_in_words_tagged feedback.created_at %></p>
</li>
<% end %>
</ul>
</section>
<section>
<h2>Statistics</h2>
<ul>
<li>Level: <%= @change_request.user.level_string %></li>
<li>Uploads: <%= link_to @change_request.user.post_upload_count, posts_path("user:#{@change_request.user.name}") %></li>
<li>Updates: <%= link_to @change_request.user.post_update_count, post_versions_path(:search => {:updater_id => @change_request.user.id}) %></li>
<li>Notes: <%= link_to @change_request.user.note_update_count, note_versions_path(:search => {:updater_id => @change_request.user.id}) %></li>
<li>Favorites: <%= @change_request.user.favorite_count %></li>
</ul>
</section>
<section>
<h2>Options</h2>
<%= form_tag(approve_user_name_change_request_path(@change_request)) do %>
<%= submit_tag "Approve" %>
<% end %>
<%= form_tag(reject_user_name_change_request_path(@change_request), :class => "simple_form") do %>
<div class="input">
<label>Reason</label>
<%= text_field_tag "reason" %>
</div>
<div class="input">
<%= submit_tag "Reject" %>
</div>
<% end %>
</section>
<% end %>
</div> </div>
</div> </div>

View File

@@ -300,12 +300,7 @@ Rails.application.routes.draw do
get :search get :search
end end
end end
resources :user_name_change_requests do resources :user_name_change_requests, only: [:new, :create, :show, :index]
member do
post :approve
post :reject
end
end
resource :user_revert, :only => [:new, :create] resource :user_revert, :only => [:new, :create]
resources :wiki_pages do resources :wiki_pages do
member do member do

View File

@@ -0,0 +1,8 @@
class RemoveReasonAndStatusFromUserNameChangeRequests < ActiveRecord::Migration[6.0]
def change
remove_column :user_name_change_requests, :change_reason, :text
remove_column :user_name_change_requests, :rejection_reason, :text
remove_column :user_name_change_requests, :approver_id, :integer
remove_column :user_name_change_requests, :status, :string, null: false, default: "pending"
end
end

View File

@@ -3010,13 +3010,9 @@ ALTER SEQUENCE public.user_feedback_id_seq OWNED BY public.user_feedback.id;
CREATE TABLE public.user_name_change_requests ( CREATE TABLE public.user_name_change_requests (
id integer NOT NULL, id integer NOT NULL,
status character varying DEFAULT 'pending'::character varying NOT NULL,
user_id integer NOT NULL, user_id integer NOT NULL,
approver_id integer,
original_name character varying, original_name character varying,
desired_name character varying, desired_name character varying,
change_reason text,
rejection_reason text,
created_at timestamp without time zone, created_at timestamp without time zone,
updated_at timestamp without time zone updated_at timestamp without time zone
); );
@@ -7340,6 +7336,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('20190908031103'), ('20190908031103'),
('20190908035317'), ('20190908035317'),
('20190919175836'), ('20190919175836'),
('20190923071044'); ('20190923071044'),
('20190926000912');

View File

@@ -1,6 +1,7 @@
FactoryBot.define do FactoryBot.define do
factory(:user_name_change_request) do factory(:user_name_change_request) do
user
original_name {FFaker::Internet.user_name}
desired_name {FFaker::Internet.user_name} desired_name {FFaker::Internet.user_name}
change_reason {FFaker::Lorem.sentence}
end end
end end

View File

@@ -5,16 +5,8 @@ class UserNameChangeRequestsControllerTest < ActionDispatch::IntegrationTest
setup do setup do
@user = create(:gold_user) @user = create(:gold_user)
@admin = create(:admin_user) @admin = create(:admin_user)
as(@user) do
@change_request = UserNameChangeRequest.create!(
:user_id => @user.id,
:original_name => @user.name,
:desired_name => "abc",
:change_reason => "hello"
)
end
end end
context "new action" do context "new action" do
should "render" do should "render" do
get_auth new_user_name_change_request_path, @user get_auth new_user_name_change_request_path, @user
@@ -25,13 +17,19 @@ class UserNameChangeRequestsControllerTest < ActionDispatch::IntegrationTest
context "create action" do context "create action" do
should "work" do should "work" do
post_auth user_name_change_requests_path, @user, params: { user_name_change_request: { desired_name: "zun" }} post_auth user_name_change_requests_path, @user, params: { user_name_change_request: { desired_name: "zun" }}
assert_response :success
assert_response :redirect
assert_equal("zun", @user.reload.name)
end end
end end
context "show action" do context "show action" do
setup do
@change_request = as(@user) { create(:user_name_change_request, user_id: @user.id) }
end
should "render" do should "render" do
get_auth user_name_change_request_path(@change_request), @user get_auth user_name_change_request_path(@change_request), @admin
assert_response :success assert_response :success
end end
@@ -43,7 +41,7 @@ class UserNameChangeRequestsControllerTest < ActionDispatch::IntegrationTest
end end
end end
end end
context "for actions restricted to admins" do context "for actions restricted to admins" do
context "index action" do context "index action" do
should "render" do should "render" do
@@ -51,20 +49,6 @@ class UserNameChangeRequestsControllerTest < ActionDispatch::IntegrationTest
assert_response :success assert_response :success
end end
end end
context "approve action" do
should "succeed" do
post_auth approve_user_name_change_request_path(@change_request), @admin
assert_redirected_to(user_name_change_request_path(@change_request))
end
end
context "reject action" do
should "succeed" do
post_auth reject_user_name_change_request_path(@change_request), @admin
assert_redirected_to(user_name_change_request_path(@change_request))
end
end
end end
end end
end end

View File

@@ -19,7 +19,6 @@ class UserNameChangeRequestTest < ActiveSupport::TestCase
@change_request = UserNameChangeRequest.create( @change_request = UserNameChangeRequest.create(
:user_id => @requester.id, :user_id => @requester.id,
:original_name => @requester.name, :original_name => @requester.name,
:status => "pending",
:desired_name => "abc" :desired_name => "abc"
) )
CurrentUser.user = @admin CurrentUser.user = @admin
@@ -50,37 +49,12 @@ class UserNameChangeRequestTest < ActiveSupport::TestCase
end end
end end
context "rejecting a request" do
setup do
@change_request = UserNameChangeRequest.create(
:user_id => @requester.id,
:original_name => @requester.name,
:status => "pending",
:desired_name => "abc"
)
CurrentUser.user = @admin
end
should "create a dmail" do
assert_difference("Dmail.count", 1) do
@change_request.reject!("msg")
end
end
should "preserve the username" do
@change_request.reject!("msg")
@requester.reload
assert_not_equal("abc", @requester.name)
end
end
context "creating a new request" do context "creating a new request" do
should "not validate if the desired name already exists" do should "not validate if the desired name already exists" do
assert_difference("UserNameChangeRequest.count", 0) do assert_difference("UserNameChangeRequest.count", 0) do
req = UserNameChangeRequest.create( req = UserNameChangeRequest.create(
:user_id => @requester.id, :user_id => @requester.id,
:original_name => @requester.name, :original_name => @requester.name,
:status => "pending",
:desired_name => @requester.name :desired_name => @requester.name
) )
assert_equal(["Desired name already exists"], req.errors.full_messages) assert_equal(["Desired name already exists"], req.errors.full_messages)