diff --git a/app/controllers/moderator/bulk_reverts_controller.rb b/app/controllers/moderator/bulk_reverts_controller.rb new file mode 100644 index 000000000..3d708f5a9 --- /dev/null +++ b/app/controllers/moderator/bulk_reverts_controller.rb @@ -0,0 +1,24 @@ +module Moderator + class BulkRevertsController < ApplicationController + before_filter :moderator_only + helper PostVersionsHelper + + def new + @constraints = params[:constraints] || {} + end + + def create + @constraints = params[:constraints] || {} + @bulk_revert = BulkRevert.new(@constraints) + + if params[:commit] == "Test" + @bulk_revert.preview + render action: "new" + else + @bulk_revert.process! + flash[:notice] = "Reverts queued" + redirect_to new_bulk_revert_path + end + end + end +end diff --git a/app/logical/bulk_revert.rb b/app/logical/bulk_revert.rb new file mode 100644 index 000000000..148569b09 --- /dev/null +++ b/app/logical/bulk_revert.rb @@ -0,0 +1,41 @@ +class BulkRevert + attr_reader :constraints + + def initialize(constraints) + @constraints = constraints + end + + def preview + @_preview ||= find_post_versions + end + + def find_post_versions + q = PostVersion.where("true") + + if constraints[:user_name] + constraints[:user_id] = User.find_by_name(constraints[:user_name]).try(:id) + end + + if constraints[:user_id] + q = q.where("post_versions.updater_id = ?", constraints[:user_id]) + + if constraints[:added_tags] || constraints[:removed_tags] + hash = CityHash.hash64("#{constraints[:added_tags]} #{constraints{removed_tags}}").to_s(36) + sub_ids = Cache.get("br/fpv/#{hash}", 300) do + sub_ids = GoogleBigQuery::PostVersion.new.find(constraints[:user_id], constraints[:added_tags], constraints[:removed_tags]) + end + q = q.where("post_versions.id in (?)", sub_ids) + end + end + + if constraints[:min_version_id].present? + q = q.where("post_versions.id >= ?", constraints[:min_version_id]) + end + + if constraints[:max_version_id].present? + q = q.where("post_versions.id <= ?", constraints[:max_version_id]) + end + + q + end +end diff --git a/app/logical/google_big_query/post_version.rb b/app/logical/google_big_query/post_version.rb index b3d675741..be0424f55 100644 --- a/app/logical/google_big_query/post_version.rb +++ b/app/logical/google_big_query/post_version.rb @@ -11,5 +11,35 @@ module GoogleBigQuery limit = limit.to_i query("select id, post_id, updated_at, updater_id, updater_ip_addr, tags, added_tags, removed_tags, parent_id, rating, source from [#{data_set}.post_versions] where regexp_match(added_tags, \"(?:^| )#{tag}(?:$| )\") order by updated_at desc limit #{limit}") end + + def find(user_id, added_tags, removed_tags, limit = 1_000) + constraints = [] + + constraints << "updater_id = #{user_id.to_i}" + + if added_tags + added_tags.scan(/\S+/).each do |tag| + escaped = escape(tag) + constraints << "regexp_match(added_tags, \"(?:^| )#{escaped}(?:$| )\")" + end + end + + if removed_tags + removed_tags.scan(/\S+/).each do |tag| + escaped = escape(tag) + constraints << "not regexp_match(added_tags, \"(?:^| )#{escaped}(?:$| )\")" + end + end + + limit = limit.to_i + sql = "select id from [#{data_set}.post_versions] where " + constraints.join(" and ") + " order by updated_at desc limit #{limit}" + result = query(sql) + + if result["rows"] + result["rows"].map {|x| x["f"][0]["v"].to_i} + else + [] + end + end end end diff --git a/app/models/post_approval.rb b/app/models/post_approval.rb index 395401011..7fbfe741f 100644 --- a/app/models/post_approval.rb +++ b/app/models/post_approval.rb @@ -1,12 +1,12 @@ class PostApproval < ActiveRecord::Base - belongs_to :user - belongs_to :post + belongs_to :user + belongs_to :post - def self.prune! - where("created_at < ?", 1.month.ago).delete_all - end + def self.prune! + where("created_at < ?", 1.month.ago).delete_all + end - def self.approved?(user_id, post_id) - where(user_id: user_id, post_id: post_id).exists? - end + def self.approved?(user_id, post_id) + where(user_id: user_id, post_id: post_id).exists? + end end diff --git a/app/views/moderator/bulk_reverts/new.html.erb b/app/views/moderator/bulk_reverts/new.html.erb new file mode 100644 index 000000000..af8caf1c6 --- /dev/null +++ b/app/views/moderator/bulk_reverts/new.html.erb @@ -0,0 +1,92 @@ +
Preview limited to 200 changes
+ +| Post | +Date | +User | +Changes | +
|---|---|---|---|
| <%= link_to("#{post_version.post_id}.#{post_version.id}", post_path(post_version.post_id)) %> | +<%= compact_time(post_version.updated_at) %> | ++ <% if post_version.updater %> + <%= link_to_user(post_version.updater) %> + <% end %> + | +<%= post_version_diff(post_version) %> | +