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 @@