fixing tests

This commit is contained in:
albert
2011-07-16 19:20:02 -04:00
parent 7d80057e20
commit 58c3d2af13
49 changed files with 896 additions and 488 deletions

View File

@@ -1006,3 +1006,36 @@ div#c-static {
}
}
}
/*** moderator dashboard ***/
div#moderator-dashboard {
div#comment-activity {
width: 45%;
float: left;
}
div#post-activity {
width: 45%;
float: left;
margin-left: 2em;
}
div#ip-addr-search {
margin-bottom: 2em;
}
div#activity-search {
margin-bottom: 2em;
}
table {
margin-bottom: 2em;
}
caption {
font-weight: bold;
font-size: 1.5em;
}
}

View File

@@ -1,5 +1,5 @@
class IpBansController < ApplicationController
before_filter :admin_only
before_filter :janitor_only
def new
@ip_ban = IpBan.new

View File

@@ -0,0 +1,9 @@
module Moderator
class DashboardsController < ApplicationController
before_filter :janitor_only
def show
@dashboard = ModeratorDashboard.new(params[:min_date] || 2.days.ago.to_date, params[:max_level] || 20)
end
end
end

View File

@@ -37,7 +37,7 @@ class NotesController < ApplicationController
def destroy
@note = Note.find(params[:id])
@note.update_attribute(:is_active, false)
@note.update_column(:is_active, false)
respond_with(@note)
end

View File

@@ -0,0 +1,17 @@
module Moderator
module DashboardsHelper
def user_level_select_tag(name, options = {})
choices = [
["", ""],
["Member", 0],
["Privileged", 100],
["Contributor", 200],
["Janitor", 300],
["Moderator", 400],
["Admin", 500]
]
select_tag(name, options_for_select(choices, params[name].to_i), options)
end
end
end

View File

@@ -0,0 +1,14 @@
module Moderator
module Dashboard
module Queries
class Comment
attr_reader :comment, :count
def initialize(hash)
@comment = Comment.find(hash["comment_id"])
@count = hash["count"]
end
end
end
end
end

View File

@@ -0,0 +1,14 @@
module Moderator
module Dashboard
module Queries
class Post
attr_reader :post, :count
def initialize(hash)
@post = Post.find(hash["post_id"])
@count = hash["count"]
end
end
end
end
end

View File

@@ -0,0 +1,30 @@
module Moderator
module Dashboard
module Queries
class PostAppeal
attr_reader :post, :reason
def self.all(min_date)
sql = <<-EOS
SELECT post_appeals.post_id, count(*)
FROM post_appeals
JOIN posts ON posts.id = post_appeals.post_id
WHERE
post_appeals.created_at > ?
and posts.status <> ?
GROUP BY post_appeals.post_id
ORDER BY count(*) DESC
LIMIT 10
EOS
ActiveRecord::Base.select_all_sql(sql, min_date).map {|x| new(x)}
end
def initialize(hash)
@post = Post.find(hash["post_id"])
@reason = hash["reason"]
end
end
end
end
end

View File

@@ -0,0 +1,31 @@
module Moderator
module Dashboard
module Queries
class PostFlag
attr_reader :post, :count
def self.all(min_date)
sql = <<-EOS
SELECT post_flags.post_id, count(*)
FROM post_flags
JOIN posts ON posts.id = post_flags.post_id
WHERE
post_flags.created_at > ?
AND post_flags.reason <> ?
AND posts.status <> 'deleted'
GROUP BY post_flags.post_id
ORDER BY count(*) DESC
LIMIT 10
EOS
ActiveRecord::Base.select_all_sql(sql, min_date, "Unapproved in three days").map {|x| new(x)}
end
def initialize(hash)
@post = Post.find(hash["post_id"])
@count = hash["count"]
end
end
end
end
end

View File

@@ -0,0 +1,13 @@
module Moderator
module Dashboard
module Queries
class Upload
def self.all(min_date)
ActiveRecord::Base.without_timeout do
@upload_activity = ActiveRecord::Base.select_all_sql("select posts.uploader_string, count(*) from posts join users on posts.user_id = users.id where posts.created_at > ? and users.level <= ? group by posts.user_id order by count(*) desc limit 10", min_date, max_level).map {|x| UserActivity.new(x)}
end
end
end
end
end
end

View File

@@ -0,0 +1,14 @@
module Moderator
module Dashboard
module Queries
class User
attr_reader :user, :count
def initialize(hash)
@user = User.find(hash["user_id"])
@count = hash["count"]
end
end
end
end
end

View File

@@ -0,0 +1,6 @@
module Moderator
module Dashboard
class Report
end
end
end

View File

@@ -0,0 +1,54 @@
class ModeratorDashboard
attr_reader :min_date, :max_level
def initialize(min_date, max_level)
@min_date = min_date
@max_level = max_level
end
def upload_activity
@upload_activity
end
def comment_activity(positive = false)
if positive
ActiveRecord::Base.select_all_sql("SELECT comment_votes.comment_id, count(*) FROM comment_votes JOIN comments ON comments.id = comment_votes.comment_id JOIN users ON users.id = comments.user_id WHERE comment_votes.created_at > ? AND comments.score > 0 AND users.level <= ? GROUP BY comment_votes.comment_id HAVING count(*) >= 3 ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| CommentActivity.new(x)}
else
ActiveRecord::Base.select_all_sql("SELECT comment_votes.comment_id, count(*) FROM comment_votes JOIN comments ON comments.id = comment_votes.comment_id JOIN users ON users.id = comments.user_id WHERE comment_votes.created_at > ? AND comments.score < 0 AND users.level <= ? GROUP BY comment_votes.comment_id HAVING count(*) >= 3 ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| CommentActivity.new(x)}
end
end
def post_activity(positive = false)
ActiveRecord::Base.without_timeout do
if positive
@post_activity = ActiveRecord::Base.select_all_sql("SELECT post_votes.post_id, count(*) FROM post_votes JOIN posts ON posts.id = post_votes.post_id JOIN users ON users.id = posts.user_id WHERE post_votes.created_at > ? AND posts.score > 0 AND users.level <= ? GROUP BY post_votes.post_id HAVING count(*) >= 3 ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| PostActivity.new(x)}
else
@post_activity = ActiveRecord::Base.select_all_sql("SELECT post_votes.post_id, count(*) FROM post_votes JOIN posts ON posts.id = post_votes.post_id JOIN users ON users.id = posts.user_id WHERE post_votes.created_at > ? AND posts.score < 0 AND users.level <= ? AND posts.status <> 'deleted' GROUP BY post_votes.post_id HAVING count(*) >= 3 ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| PostActivity.new(x)}
end
end
@post_activity
end
def tag_activity
ActiveRecord::Base.without_timeout do
@tag_activity = ActiveRecord::Base.select_all_sql("SELECT post_tag_histories.user_id, count(*) FROM post_tag_histories JOIN users ON users.id = post_tag_histories.user_id WHERE post_tag_histories.created_at > ? AND users.level <= ? GROUP BY post_tag_histories.user_id ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| UserActivity.new(x)}
end
@tag_activity
end
def note_activity
ActiveRecord::Base.select_all_sql("SELECT note_versions.user_id, count(*) FROM note_versions JOIN users ON users.id = note_versions.user_id WHERE note_versions.created_at > ? AND users.level <= ? GROUP BY note_versions.user_id ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| UserActivity.new(x)}
end
def wiki_page_activity
ActiveRecord::Base.select_all_sql("SELECT wiki_page_versions.user_id, count(*) FROM wiki_page_versions JOIN users ON users.id = wiki_page_versions.user_id WHERE wiki_page_versions.created_at > ? AND users.level <= ? GROUP BY wiki_page_versions.user_id ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| UserActivity.new(x)}
end
def artist_activity
ActiveRecord::Base.select_all_sql("SELECT artist_versions.updater_id AS user_id, count(*) FROM artist_versions JOIN users ON users.id = artist_versions.updater_id WHERE artist_versions.created_at > ? AND users.level <= ? GROUP BY artist_versions.updater_id ORDER BY count(*) DESC LIMIT 10", min_date, max_level).map {|x| UserActivity.new(x)}
end
end

View File

@@ -2,7 +2,7 @@ module PostSets
class Favorite < Base
attr_reader :user, :page, :favorites
def initialize(user_id, page)
def initialize(user_id, page = 1)
@user = ::User.find(user_id)
@favorites = ::Favorite.model_for(user.id).for_user(user.id).paginate(page)
end

View File

@@ -4,15 +4,11 @@ module PostSets
attr_accessor :total_pages, :current_page
end
attr_reader :pool, :page, :posts
attr_reader :pool, :page
def initialize(pool, page)
def initialize(pool, page = 1)
@pool = pool
@page = page
@posts = pool.posts(:offset => offset, :limit => limit)
@posts.extend(ActiveRecordExtension)
@posts.total_pages = total_pages
@posts.current_page = current_page
end
def offset
@@ -27,6 +23,16 @@ module PostSets
["pool:#{pool.id}"]
end
def posts
@posts ||= begin
x = pool.posts(:offset => offset, :limit => limit)
x.extend(ActiveRecordExtension)
x.total_pages = total_pages
x.current_page = current_page
x
end
end
def tag_string
tag_array.join("")
end

View File

@@ -1,11 +1,13 @@
module PostSets
class SearchError < Exception
end
class Post < Base
attr_reader :tag_array, :page, :posts
attr_reader :tag_array, :page
def initialize(params)
@tag_array = Tag.scan_query(params[:tags])
@page = params[:page]
@posts = ::Post.tag_match(tag_string).paginate(page)
def initialize(tags, page = 1)
@tag_array = Tag.scan_query(tags)
@page = page
end
def tag_string
@@ -24,6 +26,14 @@ module PostSets
end
end
def posts
if tag_array.size > 2 && !CurrentUser.is_privileged?
raise SearchError
end
@posts ||= ::Post.tag_match(tag_string).paginate(page)
end
def has_artist?
tag_array.any? && ::Artist.name_equals(tag_string).exists?
end
@@ -36,6 +46,10 @@ module PostSets
tag_array.size == 1
end
def current_page
[page.to_i, 1].max
end
def presenter
@presenter ||= ::PostSetPresenters::Post.new(self)
end

View File

@@ -14,6 +14,7 @@ class Artist < ActiveRecord::Base
attr_accessible :name, :url_string, :other_names, :group_name, :wiki_page_attributes, :notes
scope :url_match, lambda {|string| where(["id in (?)", Artist.find_all_by_url(string).map(&:id)])}
scope :other_names_match, lambda {|string| where(["other_names_index @@ to_tsquery('danbooru', ?)", Artist.normalize_name(string)])}
scope :name_equals, lambda {|string| where("name = ?", string)}
search_methods :url_match, :other_names_match
module UrlMethods

View File

@@ -89,15 +89,15 @@ class Dmail < ActiveRecord::Base
end
def mark_as_read!
update_attribute(:is_read, true)
update_column(:is_read, true)
unless Dmail.exists?(["to_id = ? AND is_read = false", to_id])
to.update_attribute(:has_mail, false)
to.update_column(:has_mail, false)
end
end
def update_recipient
to.update_attribute(:has_mail, true)
to.update_column(:has_mail, true)
end
def visible_to?(user)

View File

@@ -39,7 +39,7 @@ class ForumPost < ActiveRecord::Base
def update_topic_updated_at
if topic
topic.update_attribute(:updater_id, CurrentUser.id)
topic.update_column(:updater_id, CurrentUser.id)
topic.touch
end
end

View File

@@ -5,11 +5,16 @@ class JanitorTrial < ActiveRecord::Base
after_destroy :create_feedback
validates_presence_of :user
before_validation :initialize_creator
before_validation :initialize_original_level
def initialize_creator
self.creator_id = CurrentUser.id
end
def initialize_original_level
self.original_level = user.level
end
def user_name=(name)
self.user_id = User.name_to_id(name)
end
@@ -21,7 +26,7 @@ class JanitorTrial < ActiveRecord::Base
end
def promote_user
user.update_attribute(:is_janitor, true)
user.update_column(:level, User::Levels::JANITOR)
end
def create_feedback
@@ -36,7 +41,7 @@ class JanitorTrial < ActiveRecord::Base
end
def demote!
user.update_attribute(:is_janitor, false)
user.update_column(:level, original_level)
destroy
end
end

View File

@@ -6,7 +6,7 @@ module Jobs
CONFIG["tag_types"].values.uniq.each do |tag_type|
tags += user.calculate_uploaded_tags(tag_type)
end
user.update_attribute(:uploaded_tags, tags.join("\n"))
user.update_column(:uploaded_tags, tags.join("\n"))
end
end
end

View File

@@ -91,7 +91,6 @@ class Pool < ActiveRecord::Base
offset = options[:offset] || 0
limit = options[:limit] || Danbooru.config.posts_per_page
slice = post_id_array.slice(offset, limit)
puts slice.inspect
if slice && slice.any?
Post.where("id in (?)", slice).order(arbitrary_sql_order_clause(slice, "posts"))
else
@@ -150,7 +149,7 @@ class Pool < ActiveRecord::Base
last_version = versions.last
if last_version && CurrentUser.ip_addr == last_version.updater_ip_addr && CurrentUser.id == last_version.updater_id
last_version.update_attribute(:post_ids, post_ids)
last_version.update_column(:post_ids, post_ids)
else
versions.create(:post_ids => post_ids)
end

View File

@@ -15,6 +15,7 @@ class Post < ActiveRecord::Base
before_validation :initialize_uploader, :on => :create
belongs_to :updater, :class_name => "User"
belongs_to :approver, :class_name => "User"
belongs_to :uploader, :class_name => "User"
belongs_to :parent, :class_name => "Post"
has_one :upload, :dependent => :destroy
has_many :flags, :class_name => "PostFlag", :dependent => :destroy
@@ -36,7 +37,7 @@ class Post < ActiveRecord::Base
scope :visible, lambda {|user| Danbooru.config.can_user_see_post_conditions(user)}
scope :commented_before, lambda {|date| where("last_commented_at < ?", date).order("last_commented_at DESC")}
scope :has_notes, where("last_noted_at is not null")
scope :for_user, lambda {|user_id| where(["uploader_string = ?", "uploader:#{user_id}"])}
scope :for_user, lambda {|user_id| where(["uploader_id = ?", user_id])}
scope :available_for_moderation, lambda {where(["id NOT IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])}
scope :hidden_from_moderation, lambda {where(["id IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])}
scope :tag_match, lambda {|query| Post.tag_match_helper(query)}
@@ -233,7 +234,7 @@ class Post < ActiveRecord::Base
module ApprovalMethods
def is_approvable?
(is_pending? || is_flagged? || is_deleted?) && approver_string != "approver:#{CurrentUser.name}"
(is_pending? || is_flagged? || is_deleted?) && approver_id != CurrentUser.id
end
def flag!(reason)
@@ -243,7 +244,7 @@ class Post < ActiveRecord::Base
raise PostFlag::Error.new(flag.errors.full_messages.join("; "))
end
update_attribute(:is_flagged, true)
update_column(:is_flagged, true)
end
def appeal!(reason)
@@ -255,13 +256,13 @@ class Post < ActiveRecord::Base
end
def approve!
raise ApprovalError.new("You have previously approved this post and cannot approve it again") if approver_string == "approver:#{CurrentUser.name}"
raise ApprovalError.new("You have previously approved this post and cannot approve it again") if approver_id == CurrentUser.id
flags.each {|x| x.resolve!}
self.is_flagged = false
self.is_pending = false
self.is_deleted = false
self.approver_string = "approver:#{CurrentUser.name}"
self.approver_id = CurrentUser.id
save!
end
end
@@ -295,7 +296,7 @@ class Post < ActiveRecord::Base
end
def create_tags
set_tag_string(tag_array.map {|x| Tag.find_or_create_by_name(x).name}.join(" "))
set_tag_string(tag_array.map {|x| Tag.find_or_create_by_name(x).name}.uniq.join(" "))
end
def increment_tag_post_counts
@@ -373,11 +374,12 @@ class Post < ActiveRecord::Base
normalized_tags = TagAlias.to_aliased(normalized_tags)
normalized_tags = TagImplication.with_descendants(normalized_tags)
normalized_tags = filter_metatags(normalized_tags)
normalized_tags = %w(tagme) if normalized_tags.empty?
set_tag_string(normalized_tags.uniq.join(" "))
end
def filter_metatags(tags)
tags.reject {|tag| tag =~ /\A(?:pool|rating|fav|approver|uploader):/}
tags.reject {|tag| tag =~ /\A(?:pool|rating|fav):/}
end
def has_tag?(tag)
@@ -395,7 +397,7 @@ class Post < ActiveRecord::Base
end
def append_user_to_fav_string(user_id)
update_attribute(:fav_string, (fav_string + " fav:#{user_id}").strip)
update_column(:fav_string, (fav_string + " fav:#{user_id}").strip)
end
def add_favorite!(user)
@@ -405,7 +407,7 @@ class Post < ActiveRecord::Base
end
def delete_user_from_fav_string(user_id)
update_attribute(:fav_string, fav_string.gsub(/(?:\A| )fav:#{user_id}(?:\Z| )/, " ").strip)
update_column(:fav_string, fav_string.gsub(/(?:\A| )fav:#{user_id}(?:\Z| )/, " ").strip)
end
def remove_favorite!(user)
@@ -542,6 +544,22 @@ class Post < ActiveRecord::Base
relation = add_tag_string_search_relation(q[:tags], relation)
if q[:uploader_id_neg]
relation = relation.where("posts.uploader_id not in (?)", q[:uploader_id_neg])
end
if q[:uploader_id]
relation = relation.where("posts.uploader_id = ?", q[:uploader_id])
end
if q[:approver_id_neg]
relation = relation.where("posts.approver_id not in (?)", q[:approver_id_neg])
end
if q[:approver_id]
relation = relation.where("posts.approver_id = ?", q[:approver_id])
end
if q[:rating] == "q"
relation = relation.where("posts.rating = 'q'")
elsif q[:rating] == "s"
@@ -601,29 +619,15 @@ class Post < ActiveRecord::Base
module UploaderMethods
def initialize_uploader
self.uploader = CurrentUser.user
self.uploader_ip_addr = CurrentUser.ip_addr
end
def uploader_id=(user_id)
self.uploader = User.find(user_id)
end
def uploader_id
uploader_string[9..-1].to_i
if uploader_id.blank?
self.uploader_id = CurrentUser.id
self.uploader_ip_addr = CurrentUser.ip_addr
end
end
def uploader_name
User.id_to_name(uploader_id)
end
def uploader
User.find(uploader_id)
end
def uploader=(user)
self.uploader_string = "uploader:#{user.id}"
end
end
module PoolMethods
@@ -640,13 +644,15 @@ class Post < ActiveRecord::Base
def add_pool!(pool)
return if belongs_to_pool?(pool)
update_attribute(:pool_string, "#{pool_string} pool:#{pool.id}".strip)
self.pool_string = "#{pool_string} pool:#{pool.id}".strip
update_column(:pool_string, pool_string)
pool.add!(self)
end
def remove_pool!(pool)
return unless belongs_to_pool?(pool)
update_attribute(:pool_string, pool_string.gsub(/(?:\A| )pool:#{pool.id}(?:\Z| )/, " ").strip)
self.pool_string = pool_string.gsub(/(?:\A| )pool:#{pool.id}(?:\Z| )/, " ").strip
update_column(:pool_string, pool_string)
pool.remove!(self)
end
end
@@ -762,13 +768,11 @@ class Post < ActiveRecord::Base
if children.size == 0
# do nothing
elsif children.size == 1
children.first.update_attribute(:parent_id, nil)
children.first.update_column(:parent_id, nil)
else
cached_children = children
cached_children[1..-1].each do |child|
child.update_attribute(:parent_id, cached_children[0].id)
end
cached_children[0].update_attribute(:parent_id, nil)
Post.update_all({:parent_id => cached_children[0].id}, :id => cached_children[1..-1].map(&:id))
cached_children[0].update_column(:parent_id, nil)
end
end
@@ -800,14 +804,14 @@ class Post < ActiveRecord::Base
update_children_on_destroy
delete_favorites
decrement_tag_post_counts
update_attribute(:is_deleted, true)
update_column(:is_deleted, true)
update_parent_on_destroy
tag_array.each {|x| expire_cache(x)}
end
end
def undelete!
update_attribute(:is_deleted, false)
update_column(:is_deleted, false)
tag_array.each {|x| expire_cache(x)}
update_parent_on_save
end
@@ -822,7 +826,7 @@ class Post < ActiveRecord::Base
:add_tags => tag_string,
:parent_id => parent_id
)
else
elsif rating_changed? || source_changed? || parent_id_changed? || tag_string_changed?
versions.create(
:rating => rating_changed? ? rating : nil,
:source => source_changed? ? source : nil,

View File

@@ -13,7 +13,7 @@ class PostFlag < ActiveRecord::Base
scope :unresolved, where(["is_resolved = ?", false])
def update_post
post.update_attribute(:is_flagged, true)
post.update_column(:is_flagged, true)
end
def validate_creator_is_not_limited
@@ -40,7 +40,7 @@ class PostFlag < ActiveRecord::Base
end
def resolve!
update_attribute(:is_resolved, true)
update_column(:is_resolved, true)
end
def flag_count_for_creator

View File

@@ -88,15 +88,15 @@ class Tag < ActiveRecord::Base
if tag
if category > 0 && !(options[:user] && !options[:user].is_privileged? && tag.post_count > 10)
tag.update_attribute(:category, category)
tag.update_column(:category, category)
end
tag
else
Tag.new.tap do |tag|
tag.name = name
tag.category = category
tag.save
Tag.new.tap do |t|
t.name = name
t.category = category
t.save
end
end
end
@@ -216,13 +216,21 @@ class Tag < ActiveRecord::Base
}
scan_query(query).each do |token|
if token =~ /\A(-uploader|uploader|-pool|pool|-fav|fav|sub|md5|-rating|rating|width|height|mpixels|score|filesize|source|id|date|order|status|tagcount|gentags|arttags|chartags|copytags):(.+)\Z/
if token =~ /\A(-uploader|uploader|-approver|approver|-pool|pool|-fav|fav|sub|md5|-rating|rating|width|height|mpixels|score|filesize|source|id|date|order|status|tagcount|gentags|arttags|chartags|copytags):(.+)\Z/
case $1
when "-uploader"
q[:tags][:exclude] << "uploader:#{User.name_to_id($2)}"
q[:uploader_id_neg] ||= []
q[:uploader_id_neg] << User.name_to_id($2)
when "uploader"
q[:tags][:related] << "uploader:#{User.name_to_id($2)}"
q[:uploader_id] = User.name_to_id($2)
when "-approver"
q[:approver_id_neg] ||= []
q[:approver_id_neg] << User.name.to_id($2)
when "approver"
q[:approver_id] = User.name.to_id($2)
when "-pool"
q[:tags][:exclude] << "pool:#{Pool.name_to_id($2)}"

View File

@@ -17,7 +17,7 @@ class Upload < ActiveRecord::Base
module ValidationMethods
def uploader_is_not_limited
if !uploader.can_upload?
update_attribute(:status, "error: uploader has reached their daily limit")
update_column(:status, "error: uploader has reached their daily limit")
end
end
@@ -29,19 +29,19 @@ class Upload < ActiveRecord::Base
def validate_file_exists
unless File.exists?(file_path)
update_attribute(:status, "error: file does not exist")
update_column(:status, "error: file does not exist")
end
end
def validate_file_content_type
unless is_valid_content_type?
update_attribute(:status, "error: invalid content type (#{file_ext} not allowed)")
update_column(:status, "error: invalid content type (#{file_ext} not allowed)")
end
end
def validate_md5_confirmation
if !md5_confirmation.blank? && md5_confirmation != md5
update_attribute(:status, "error: md5 mismatch")
update_column(:status, "error: md5 mismatch")
end
end
end
@@ -49,7 +49,7 @@ class Upload < ActiveRecord::Base
module ConversionMethods
def process!
CurrentUser.scoped(uploader, uploader_ip_addr) do
update_attribute(:status, "processing")
update_column(:status, "processing")
if is_downloadable?
download_from_source(temp_file_path)
end
@@ -67,12 +67,12 @@ class Upload < ActiveRecord::Base
if post.save
update_attributes(:status => "completed", :post_id => post.id)
else
update_attribute(:status, "error: " + post.errors.full_messages.join(", "))
update_column(:status, "error: " + post.errors.full_messages.join(", "))
end
end
rescue Exception => x
raise
update_attribute(:status, "error: #{x} - #{x.message}")
update_column(:status, "error: #{x} - #{x.message}")
ensure
delete_temp_file
end
@@ -87,6 +87,8 @@ class Upload < ActiveRecord::Base
p.rating = rating
p.source = source
p.file_size = file_size
p.uploader_id = uploader_id
p.uploader_ip_addr = uploader_ip_addr
unless uploader.is_contributor?
p.is_pending = true
@@ -97,7 +99,7 @@ class Upload < ActiveRecord::Base
def merge_tags(post)
post.tag_string += " #{tag_string}"
post.save
update_attribute(:status, "duplicate: #{post.id}")
update_column(:status, "duplicate: #{post.id}")
end
end

View File

@@ -28,6 +28,7 @@ class User < ActiveRecord::Base
after_save :update_cache
before_create :promote_to_admin_if_first_user
has_many :feedback, :class_name => "UserFeedback", :dependent => :destroy
has_many :posts, :foreign_key => "uploader_id"
has_one :ban
has_many :subscriptions, :class_name => "TagSubscription"
has_many :note_versions, :foreign_key => "updater_id"
@@ -46,7 +47,7 @@ class User < ActiveRecord::Base
end
def unban!
update_attribute(:is_banned, false)
update_column(:is_banned, false)
ban.destroy
end
end
@@ -218,7 +219,7 @@ class User < ActiveRecord::Base
def verify!(key)
if email_verification_key == key
self.update_attribute(:email_verification_key, nil)
self.update_column(:email_verification_key, nil)
else
raise User::Error.new("Verification key does not match")
end
@@ -293,12 +294,6 @@ class User < ActiveRecord::Base
end
end
module PostMethods
def posts
Post.where("uploader_string = ?", "uploader:#{id}")
end
end
include BanMethods
include NameMethods
include PasswordMethods
@@ -309,7 +304,6 @@ class User < ActiveRecord::Base
include BlacklistMethods
include ForumMethods
include LimitMethods
include PostMethods
def initialize_default_image_size
self.default_image_size = "Medium"

View File

@@ -42,6 +42,9 @@
<%= nav_link_to("Pools", pools_path) %>
<%= nav_link_to("Wiki", wiki_pages_path(:title => "help:home")) %>
<%= nav_link_to("Forum", forum_topics_path, :class => (CurrentUser.user.has_forum_been_updated? ? "forum-updated" : nil)) %>
<% if CurrentUser.is_moderator? %>
<%= nav_link_to("Dashboard", moderator_dashboard_path) %>
<% end %>
<%= nav_link_to("&raquo;".html_safe, site_map_path) %>
</menu>
<%= yield :secondary_links %>

View File

@@ -0,0 +1,222 @@
<div id="moderator-dashboard">
<h1>Moderator Dashboard</h1>
<div id="ip-addr-search">
<% form_tag(moderator_ip_addrs_path, :method => :get) do %>
<label for="user_ids">Search IPs</label>
<%= text_field_tag "search[ip_addr_eq]", params[:ip_addrs] %>
<%= submit_tag "Search" %>
<% end %>
<% form_tag(moderator_ip_addrs_path, :method => :get) do %>
<label for="user_ids">Search User IDs</label>
<%= text_field_tag "search[user_id_eq]", params[:user_ids] %>
<%= submit_tag "Search" %>
<% end %>
</div>
<div id="activity-search">
<% form_tag(moderator_dashboard_path, :method => :get) do %>
<label for="min_date">Minimum Date</label>
<%= text_field_tag :min_date, @dashboard.min_date %><br>
<label for="max_level">Max Level</label>
<%= user_level_select_tag(:max_level) %><br>
<%= submit_tag "Search" %>
<% end %>
</div>
<div id="comment-activity">
<table width="100%" class="striped">
<caption>Uploads</caption>
<thead>
<tr>
<th>User</th>
<th>Count</th>
</tr>
</thead>
<tbody>
<% @dashboard.upload_activity.each do |activity| %>
<tr>
<td><%= admin_link_to_user(activity.user, :positive) %></td>
<td><%= link_to activity.count, {:controller => "post", :action => "index", :tags => "user:#{activity.user.name}"} %></td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>Note Updates</caption>
<thead>
<tr>
<th>User</th>
<th>Count</th>
</tr>
</thead>
<tbody>
<% @dashboard.note_activity.each do |activity| %>
<tr>
<td><%= admin_link_to_user(activity.user, :positive) %></td>
<td><%= link_to activity.count, {:controller => "note", :action => "history", :user_id => activity.user.id} %></td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>Tag Updates</caption>
<thead>
<tr>
<th>User</th>
<th>Count</th>
</tr>
</thead>
<tbody>
<% @dashboard.tag_activity.each do |activity| %>
<tr>
<td><%= admin_link_to_user(activity.user, :positive) %></td>
<td><%= link_to activity.count, {:controller => "post_tag_history", :action => "index", :user_id => activity.user.id} %></td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>Wiki Page Updates</caption>
<thead>
<tr>
<th>User</th>
<th>Count</th>
</tr>
</thead>
<tbody>
<% @dashboard.wiki_page_activity.each do |activity| %>
<tr>
<td><%= admin_link_to_user(activity.user, :positive) %></td>
<td><%= link_to activity.count, {:controller => "wiki", :action => "recent_changes", :user_id => activity.user.id} %></td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>Artist Updates</caption>
<thead>
<tr>
<th>User</th>
<th>Count</th>
</tr>
</thead>
<tbody>
<% @dashboard.artist_activity.each do |activity| %>
<tr>
<td><%= admin_link_to_user(activity.user, :positive) %></td>
<td><%= link_to activity.count, {:controller => "artist", :action => "recent_changes", :user_id => activity.user.id} %></td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>Comment Activity (Negative)</caption>
<thead>
<tr>
<th>Comment</th>
<th>User</th>
<th>Votes</th>
<th>Score</th>
</tr>
</thead>
<tbody>
<% @dashboard.comment_activity.each do |activity| %>
<tr>
<td><%= link_to activity.comment.body, :controller => "post", :action => "show", :id => activity.comment.post_id %></td>
<td><%= admin_link_to_user(activity.comment.user, :negative) %></td>
<td><%= activity.count %></td>
<td><%= activity.comment.score %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<div id="post-activity">
<table width="100%" class="striped">
<caption>Appealed Posts</caption>
<thead>
<tr>
<th>Post</th>
<th>User</th>
<th>Flags</th>
<th>Appeals</th>
<th>Score</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="5"><%= link_to "View all posts", :controller => "post_appeal", :action => "index" %></td>
</tr>
</tfoot>
<tbody>
<% @dashboard.appealed_posts.each do |appeal| %>
<tr>
<td><%= link_to image_tag(appeal.post.preview_url), :controller => "post", :action => "show", :id => appeal.post.id %></td>
<td><%= admin_link_to_user appeal.post.user, :negative %></td>
<td><%= post_flag_summary(appeal.post) %></td>
<td><%= post_appeal_summary(appeal.post) %></td>
<td><%= appeal.post.score %></td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>User Records</caption>
<thead>
<tr>
<th>User</th>
<th>Message</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<% UserRecord.recent(@dashboard.min_date).all(:order => "id desc").each do |record| %>
<tr class="user-record-score-<%= record.score %>">
<td><%= link_to(record.user.name, :controller => "user", :action => "show", :id => record.user_id) %></td>
<td><%= format_text(record.body) %></td>
<td><%= time_ago_in_words(record.created_at) %> ago</td>
</tr>
<% end %>
</tbody>
</table>
<table width="100%" class="striped">
<caption>Mod Actions</caption>
<thead>
<tr>
<th>Moderator</th>
<th>Description</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><%= link_to "View all actions", :controller => "mod_action", :action => "index" %></td>
</tr>
</tfoot>
<tbody>
<% ModAction.all(:order => "id desc", :limit => 10).each do |mod_action| %>
<tr>
<td><%= link_to mod_action.user.name, :controller => "user", :action => "show", :id => mod_action.user_id %></td>
<td><%= format_text(mod_action.description) %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>