From 2d0c3d16a355ccd27e19ceb8770dcf3962c8c05b Mon Sep 17 00:00:00 2001 From: Toks Date: Sun, 9 Jun 2013 11:40:34 -0400 Subject: [PATCH] fix #1724 for posts --- app/controllers/post_versions_controller.rb | 8 ++++++ app/models/post_version.rb | 27 +++++++++++++++++++++ app/views/post_versions/_listing.html.erb | 3 +++ app/views/post_versions/undo.js.erb | 1 + config/routes.rb | 3 +++ 5 files changed, 42 insertions(+) create mode 100644 app/views/post_versions/undo.js.erb diff --git a/app/controllers/post_versions_controller.rb b/app/controllers/post_versions_controller.rb index 89a606214..ddf634239 100644 --- a/app/controllers/post_versions_controller.rb +++ b/app/controllers/post_versions_controller.rb @@ -13,4 +13,12 @@ class PostVersionsController < ApplicationController def search end + + def undo + @post_version = PostVersion.find(params[:id]) + @post_version.undo! + respond_with(@post_version) do |format| + format.js + end + end end diff --git a/app/models/post_version.rb b/app/models/post_version.rb index 1af723881..017a5a348 100644 --- a/app/models/post_version.rb +++ b/app/models/post_version.rb @@ -112,4 +112,31 @@ class PostVersion < ActiveRecord::Base def truncated_source source.gsub(/^http:\/\//, "").sub(/\/.+/, "") end + + def undo + changes = diff(previous) + added = changes[:added_tags] - changes[:obsolete_added_tags] + removed = changes[:removed_tags] - changes[:obsolete_removed_tags] + + added.each do |tag| + if tag =~ /^source:/ + post.source = "" + else + escaped_tag = Regexp.escape(tag) + post.tag_string = post.tag_string.sub(/(?:\A| )#{escaped_tag}(?:\Z| )/, " ").strip + end + end + removed.each do |tag| + if tag =~ /^source:(.+)$/ + post.source = $1 + else + post.tag_string = "#{post.tag_string} #{tag}".strip + end + end + end + + def undo! + undo + post.save! + end end diff --git a/app/views/post_versions/_listing.html.erb b/app/views/post_versions/_listing.html.erb index e716a6626..fbb61dc26 100644 --- a/app/views/post_versions/_listing.html.erb +++ b/app/views/post_versions/_listing.html.erb @@ -36,6 +36,9 @@ <%= post_version_diff(post_version) %> <% if CurrentUser.is_member? %> + <% if post_version.id != post_version.post.versions.first.id %> + <%= link_to "Undo", undo_post_version_path(post_version), :method => :put, :remote => true %> | + <% end %> <%= link_to "Revert to", revert_post_path(post_version.post_id, :version_id => post_version.id), :method => :put, :remote => true %> <% end %> diff --git a/app/views/post_versions/undo.js.erb b/app/views/post_versions/undo.js.erb new file mode 100644 index 000000000..bcebe9d37 --- /dev/null +++ b/app/views/post_versions/undo.js.erb @@ -0,0 +1 @@ +location.reload(); \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 8886f94b2..1a8d1a1ca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -159,6 +159,9 @@ Danbooru::Application.routes.draw do resources :post_appeals resources :post_flags resources :post_versions, :only => [:index, :search] do + member do + put :undo + end collection do get :search end