diff --git a/app/controllers/user_reverts_controller.rb b/app/controllers/user_reverts_controller.rb new file mode 100644 index 000000000..8dbc3ff13 --- /dev/null +++ b/app/controllers/user_reverts_controller.rb @@ -0,0 +1,15 @@ +class UserRevertsController < ApplicationController + before_filter :janitor_only + + def new + @user = User.find(params[:user_id]) + end + + def create + user = User.find(params[:user_id]) + revert = UserRevert.new(user.id) + revert.process + redirect_to(user_path(user.id)) + end +end + diff --git a/app/logical/user_revert.rb b/app/logical/user_revert.rb new file mode 100644 index 000000000..b1d11a066 --- /dev/null +++ b/app/logical/user_revert.rb @@ -0,0 +1,28 @@ +# reverts all changes made by a user +class UserRevert + THRESHOLD = 1_000 + class TooManyChangesError < RuntimeError ; end + + attr_reader :user_id + + def initialize(user_id) + @user_id = user_id + end + + def process + validate! + revert_post_changes + end + + def validate! + if PostVersion.where(updater_id: user_id).count > THRESHOLD + raise TooManyChangesError.new("This user has too many changes to be reverted") + end + end + + def revert_post_changes + PostVersion.where(updater_id: user_id).find_each do |x| + x.undo! + end + end +end diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index e226e6aa9..da8587a2c 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -149,7 +149,7 @@ class UserPresenter end def post_version_count(template) - template.link_to(user.post_update_count, template.post_versions_path(:search => {:updater_id => user.id})) + template.link_to(user.post_update_count, template.post_versions_path(:lr => user.id, :search => {:updater_id => user.id})) end def note_version_count(template) diff --git a/app/views/post_versions/index.html.erb b/app/views/post_versions/index.html.erb index 61937fd30..c249f7329 100644 --- a/app/views/post_versions/index.html.erb +++ b/app/views/post_versions/index.html.erb @@ -7,6 +7,10 @@ <% else %> <%= render "listing", :post_versions => @post_versions %> + <% if params[:lr] && CurrentUser.is_janitor? %> +
<%= link_to "Revert this user's changes", new_user_revert_path(:user_id => params[:lr]) %>
+ <% end %> + <%= numbered_paginator(@post_versions) %> <% end %> diff --git a/app/views/user_reverts/new.html.erb b/app/views/user_reverts/new.html.erb new file mode 100644 index 000000000..265560da1 --- /dev/null +++ b/app/views/user_reverts/new.html.erb @@ -0,0 +1,19 @@ +You are about to revert all changes made by <%= link_to_user @user %>. Continue?
+ + <%= form_tag(user_revert_path) do %> + <%= hidden_field_tag :user_id, params[:user_id] %> + + <%= submit_tag "Yes" %> + <% end %> +