From a9be96ce8bd047ef1505863868d922dde4687446 Mon Sep 17 00:00:00 2001 From: albert Date: Tue, 26 Mar 2013 18:13:03 -0400 Subject: [PATCH] implements user name change requests --- .../user_name_change_requests_controller.rb | 17 ++++- app/models/user.rb | 6 +- app/models/user_name_change_request.rb | 25 ++++++++ app/presenters/user_presenter.rb | 4 ++ .../user_name_change_requests/index.html.erb | 24 +++++++ .../user_name_change_requests/new.html.erb | 2 +- .../user_name_change_requests/show.html.erb | 12 +++- app/views/users/_statistics.html.erb | 7 +++ app/views/users/edit.html.erb | 8 ++- app/views/users/upgrade_information.html.erb | 10 ++- ...er_name_change_requests_controller_test.rb | 62 +++++++++++++++++++ test/unit/user_name_change_request_test.rb | 14 ++++- 12 files changed, 179 insertions(+), 12 deletions(-) create mode 100644 app/views/user_name_change_requests/index.html.erb create mode 100644 test/functional/user_name_change_requests_controller_test.rb diff --git a/app/controllers/user_name_change_requests_controller.rb b/app/controllers/user_name_change_requests_controller.rb index 334112c88..91de8d900 100644 --- a/app/controllers/user_name_change_requests_controller.rb +++ b/app/controllers/user_name_change_requests_controller.rb @@ -1,6 +1,6 @@ class UserNameChangeRequestsController < ApplicationController - before_filter :member_only, :only => [:new, :create, :show] - before_filter :admin_only, :only => [:index, :approve, :reject] + before_filter :privileged_only, :only => [:new, :create, :show] + before_filter :admin_only, :only => [:index, :approve, :reject, :destroy] def new end @@ -13,7 +13,12 @@ class UserNameChangeRequestsController < ApplicationController :change_reason => params[:reason], :desired_name => params[:desired_name] ) - redirect_to user_name_change_request_path(@change_request), :notice => "Your request has been submitted and is pending admin review" + + if @change_request.errors.any? + render :action => "new" + else + redirect_to user_name_change_request_path(@change_request), :notice => "Your request has been submitted and is pending admin review" + end end def show @@ -30,6 +35,12 @@ class UserNameChangeRequestsController < ApplicationController redirect_to user_name_change_request_path(@change_request), :notice => "Name change request approved" end + def destroy + @change_request = UserNameChangeRequest.find(params[:id]) + @change_request.destroy + redirect_to user_name_change_requests_path + end + def reject @change_request = UserNameChangeRequest.find(params[:id]) @change_request.reject!(params[:reason]) diff --git a/app/models/user.rb b/app/models/user.rb index ddc8627de..a509c2c90 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -464,9 +464,9 @@ class User < ActiveRecord::Base if is_platinum? nil elsif is_privileged? - 40_000 - else 20_000 + else + 10_000 end end @@ -573,7 +573,7 @@ class User < ActiveRecord::Base if params[:id].present? q = q.where("id = ?", params[:id].to_i) end - + case params[:order] when "name" q = q.order("name") diff --git a/app/models/user_name_change_request.rb b/app/models/user_name_change_request.rb index 6fd271077..853b1d08f 100644 --- a/app/models/user_name_change_request.rb +++ b/app/models/user_name_change_request.rb @@ -4,13 +4,27 @@ class UserNameChangeRequest < ActiveRecord::Base belongs_to :user belongs_to :approver, :class_name => "User" validate :uniqueness_of_desired_name + validate :not_limited validates_length_of :desired_name, :within => 2..100, :on => :create validates_format_of :desired_name, :with => /\A[^\s:]+\Z/, :on => :create, :message => "cannot have whitespace or colons" + before_validation :normalize_name after_create :notify_admins def self.pending where(:status => "pending") end + + def self.approved + where(:status => "approved") + end + + def rejected? + status == "rejected" + end + + def normalize_name + self.desired_name = desired_name.strip.gsub(/ /, "_") + end def feedback UserFeedback.for_user(user_id).order("id desc").all @@ -29,6 +43,8 @@ class UserNameChangeRequest < ActiveRecord::Base user.update_attribute(:name, desired_name) body = "Your name change request has been approved. Be sure to log in with your new user name." Dmail.create_split(: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}") + ModAction.create(:description => "Name changed from #{original_name} to #{desired_name}") end def reject!(reason) @@ -37,6 +53,15 @@ class UserNameChangeRequest < ActiveRecord::Base Dmail.create_split(:title => "Name change request rejected", :body => body, :to_id => user_id) end + def not_limited + if UserNameChangeRequest.where("user_id = ? and created_at >= ?", CurrentUser.user.id, 1.week.ago).exists? + errors.add(:base, "You can only submit one name change request per week") + return false + else + return true + end + end + def uniqueness_of_desired_name if User.find_by_name(desired_name) errors.add(:desired_name, "already exists") diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index e984dc478..b626914e5 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -130,4 +130,8 @@ class UserPresenter user.subscriptions.select {|x| x.is_public?} end end + + def previous_names + UserNameChangeRequest.approved.where("user_id = ?", user.id).map(&:original_name).join(", ") + end end diff --git a/app/views/user_name_change_requests/index.html.erb b/app/views/user_name_change_requests/index.html.erb new file mode 100644 index 000000000..45d9ed1b6 --- /dev/null +++ b/app/views/user_name_change_requests/index.html.erb @@ -0,0 +1,24 @@ +
+

Name Change Requests

+ + + + + + + + + + + <% @change_requests.each do |change_request| %> + + + + + + <% end %> + +
UserDesired
<%= link_to change_request.original_name, user_path(change_request.user_id) %><%= change_request.desired_name %><%= link_to "view", user_name_change_request_path(change_request) %>
+ + <%= numbered_paginator(@change_requests) %> +
\ No newline at end of file diff --git a/app/views/user_name_change_requests/new.html.erb b/app/views/user_name_change_requests/new.html.erb index c112e827e..87f7a577d 100644 --- a/app/views/user_name_change_requests/new.html.erb +++ b/app/views/user_name_change_requests/new.html.erb @@ -16,6 +16,6 @@
- <%= submit_tag %> + <%= submit_tag "Submit" %>
<% end %> \ No newline at end of file diff --git a/app/views/user_name_change_requests/show.html.erb b/app/views/user_name_change_requests/show.html.erb index 9f1d9cd78..eea761650 100644 --- a/app/views/user_name_change_requests/show.html.erb +++ b/app/views/user_name_change_requests/show.html.erb @@ -33,7 +33,11 @@ - <% if CurrentUser.user.is_admin? %> + <% if @change_request.rejected? %> +
+

Request was rejected

+
+ <% elsif CurrentUser.user.is_admin? %>

Options

<%= form_tag(approve_user_name_change_request_path(@change_request)) do %> @@ -52,5 +56,11 @@ <% end %>
<% end %> + +
+ <%= form_tag(user_name_change_request_path(@change_request), :method => :delete) do %> + <%= submit_tag "Delete" %> + <% end %> +
diff --git a/app/views/users/_statistics.html.erb b/app/views/users/_statistics.html.erb index d7367c435..3c94edafc 100644 --- a/app/views/users/_statistics.html.erb +++ b/app/views/users/_statistics.html.erb @@ -97,6 +97,13 @@ + <% if CurrentUser.user.is_janitor? && presenter.previous_names.present? %> + + Previous Names + <%= presenter.previous_names %> + + <% end %> + <% if CurrentUser.user.id == user.id %> API Key diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 08b57b254..4ffae2856 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -5,9 +5,15 @@ <%= simple_form_for @user do |f| %>
Basic Settings +
-

Name changes are not supported. <%= link_to "Read why", name_change_path %>.

+ + <% if CurrentUser.user.is_privileged? %> +

<%= link_to "Request a name change", new_user_name_change_request_path %>

+ <% else %> +

You must <%= link_to "upgrade your account", upgrade_information_users_path %> to request a name change

+ <% end %>
<%= f.input :email, :required => Danbooru.config.enable_email_verification?, :hint => "Used for messages and for password resets", :as => :email %> <%= f.input :time_zone, :include_blank => false %> diff --git a/app/views/users/upgrade_information.html.erb b/app/views/users/upgrade_information.html.erb index 2f179459f..bf0045aeb 100644 --- a/app/views/users/upgrade_information.html.erb +++ b/app/views/users/upgrade_information.html.erb @@ -39,8 +39,8 @@ Favorite Limit + 10,000 20,000 - 40,000 Unlimited @@ -80,7 +80,13 @@ 9 sec - 50 or 100 Posts Per Page + Variable Posts Per Page + No + Yes + Yes + + + Name Changes No Yes Yes diff --git a/test/functional/user_name_change_requests_controller_test.rb b/test/functional/user_name_change_requests_controller_test.rb new file mode 100644 index 000000000..be0547979 --- /dev/null +++ b/test/functional/user_name_change_requests_controller_test.rb @@ -0,0 +1,62 @@ +require 'test_helper' + +class UserNameChangeRequestsControllerTest < ActionController::TestCase + context "The user name change requests controller" do + setup do + @user = FactoryGirl.create(:privileged_user) + @admin = FactoryGirl.create(:admin_user) + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + @change_request = UserNameChangeRequest.create!( + :user_id => @user.id, + :original_name => @user.name, + :desired_name => "abc", + :change_reason => "hello" + ) + end + + context "new action" do + should "render" do + get :new, {}, {:user_id => @user.id} + assert_response :success + end + end + + context "show action" do + should "render" do + get :show, {:id => @change_request.id}, {:user_id => @user.id} + assert_response :success + end + end + + context "for actions restricted to admins" do + context "index action" do + should "render" do + get :index, {}, {:user_id => @admin.id} + assert_response :success + end + end + + context "approve action" do + should "succeed" do + post :approve, {:id => @change_request.id}, {:user_id => @admin.id} + assert_redirected_to(user_name_change_request_path(@change_request)) + end + end + + context "reject action" do + should "succeed" do + post :reject, {:id => @change_request.id}, {:user_id => @admin.id} + assert_redirected_to(user_name_change_request_path(@change_request)) + end + end + + context "destroy action" do + should "destroy" do + post :destroy, {:id => @change_request.id}, {:user_id => @admin.id} + assert_redirected_to(user_name_change_requests_path) + end + end + end + end +end diff --git a/test/unit/user_name_change_request_test.rb b/test/unit/user_name_change_request_test.rb index cbc62206f..93a8079c6 100644 --- a/test/unit/user_name_change_request_test.rb +++ b/test/unit/user_name_change_request_test.rb @@ -20,7 +20,7 @@ class UserNameChangeRequestTest < ActiveSupport::TestCase end should "create a dmail" do - assert_difference("Dmail.count", 2) do + assert_difference("Dmail.count", 4) do @change_request.approve! end end @@ -35,6 +35,18 @@ class UserNameChangeRequestTest < ActiveSupport::TestCase @change_request.approve! assert_equal("abc", Cache.get("uin:#{@requester.id}")) end + + should "create feedback" do + assert_difference("UserFeedback.count", 1) do + @change_request.approve! + end + end + + should "create mod action" do + assert_difference("ModAction.count", 1) do + @change_request.approve! + end + end end context "rejecting a request" do