diff --git a/Gemfile b/Gemfile index 16dc0761a..e6167fe80 100644 --- a/Gemfile +++ b/Gemfile @@ -12,3 +12,4 @@ gem "rails", "3.0.0.rc2" gem "pg" gem "memcache-client", :require => "memcache" gem "imagesize", :require => "image_size" +gem "delayed_job" diff --git a/Gemfile.lock b/Gemfile.lock index 2446add35..4c69a0f98 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,6 +31,9 @@ GEM arel (1.0.0.rc1) activesupport (>= 3.0.0.beta) builder (2.1.2) + daemons (1.1.0) + delayed_job (2.0.3) + daemons erubis (2.6.6) abstract (>= 1.0.0) factory_girl (1.3.1) @@ -76,6 +79,7 @@ PLATFORMS ruby DEPENDENCIES + delayed_job factory_girl faker imagesize diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb deleted file mode 100644 index 50e8eef0e..000000000 --- a/app/controllers/jobs_controller.rb +++ /dev/null @@ -1,16 +0,0 @@ -class JobsController < ApplicationController - def edit - end - - def index - end - - def show - end - - def destroy - end - - def update - end -end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 696a79d3d..439f79801 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -17,14 +17,14 @@ class PostsController < ApplicationController def update @post = Post.find(params[:id]) - @post.update_attributes(params[:post].merge(:updater_id => @current_user.id, :updater_ip_addr => request.remote_ip)) + @post.update_attributes(params[:post]) respond_with(@post) end def revert @post = Post.find(params[:id]) @version = PostVersion.find(params[:version_id]) - @post.revert_to!(@version, @current_user.id, request.remote_ip) + @post.revert_to!(@version) respond_width(@post) end diff --git a/app/helpers/jobs_helper.rb b/app/helpers/jobs_helper.rb deleted file mode 100644 index 44c7bf621..000000000 --- a/app/helpers/jobs_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module JobsHelper -end diff --git a/app/logical/current_user.rb b/app/logical/current_user.rb index 19aa6d606..88551f0ae 100644 --- a/app/logical/current_user.rb +++ b/app/logical/current_user.rb @@ -1,4 +1,19 @@ class CurrentUser + def self.scoped(user, ip_addr) + old_user = self.user + old_ip_addr = self.ip_addr + + self.user = user + self.ip_addr = ip_addr + + begin + yield + ensure + self.user = old_user + self.ip_addr = old_ip_addr + end + end + def self.user=(user) Thread.current[:current_user] = user end diff --git a/app/logical/download.rb b/app/logical/download.rb index 89abbeab0..9aa2c3062 100644 --- a/app/logical/download.rb +++ b/app/logical/download.rb @@ -7,7 +7,7 @@ class Download @source = source @file_path = file_path end - + # Downloads to @file_path def download! http_get_streaming(@source) do |response| @@ -18,8 +18,8 @@ class Download end @source = fix_image_board_sources(@source) end - -# private + + # private def handle_pixiv(source, headers) if source =~ /pixiv\.net/ headers["Referer"] = "http://www.pixiv.net" @@ -33,7 +33,7 @@ class Download source end - + def http_get_streaming(source, options = {}) max_size = options[:max_size] || Danbooru.config.max_file_size max_size = nil if max_size == 0 # unlimited @@ -77,7 +77,7 @@ class Download end # http.start end # while end # def - + def fix_image_board_sources(source) if source =~ /\/src\/\d{12,}|urnc\.yi\.org|yui\.cynthia\.bne\.jp/ "Image board" diff --git a/app/logical/post_set.rb b/app/logical/post_set.rb index 24dbfba68..305b0b985 100644 --- a/app/logical/post_set.rb +++ b/app/logical/post_set.rb @@ -1,13 +1,12 @@ class PostSet class Error < Exception ; end - attr_accessor :tags, :page, :current_user, :before_id, :errors, :count + attr_accessor :tags, :page, :before_id, :errors, :count attr_accessor :wiki_page, :artist, :posts, :suggestions - def initialize(tags, page, current_user, before_id = nil) + def initialize(tags, page, before_id = nil) @tags = Tag.normalize(tags) @page = page.to_i - @current_user = current_user @before_id = before_id @errors = [] load_associations @@ -60,16 +59,14 @@ class PostSet end def tag_array - @tag_arary ||= Tag.scan_query(tags) + @tag_array ||= Tag.scan_query(tags) end def validate - begin - validate_page - validate_query_count - rescue Error => x - @errors << x.to_s - end + validate_page + validate_query_count + rescue Error => x + @errors << x.to_s end def validate_page @@ -79,7 +76,7 @@ class PostSet end def validate_query_count - if !current_user.is_privileged? && tag_array.size > 2 + if !CurrentUser.user.is_privileged? && tag_array.size > 2 raise Error.new("You can only search up to two tags at once with a basic account") end diff --git a/app/models/janitor_trial.rb b/app/models/janitor_trial.rb index a1e4bff40..04f0cae6d 100644 --- a/app/models/janitor_trial.rb +++ b/app/models/janitor_trial.rb @@ -1,3 +1,16 @@ class JanitorTrial < ActiveRecord::Base belongs_to :user + after_create :send_dmail + + def send_dmail + body = "You have been selected as a test janitor. You can now approve pending posts and have access to the moderation interface.\n\nOver the next several weeks your approvals will be monitored. If the majority of them are quality uploads, then you will be promoted to full janitor status which grants you the ability to delete and undelete posts, ban users, and revert tag changes from vandals. If you fail the trial period, you will be demoted back to your original level and you'll receive a negative user record indicating you previously attempted and failed a test janitor trial.\n\nThere is a minimum quota of 5 approvals a week to indicate that you are being active. Remember, the goal isn't to approve as much as possible. It's to filter out borderline-quality art.\n\nIf you have any questions please respond to this message." + + dmail = Dmail.new( + :title => "Test Janitor Trial Period", + :body => body + ) + dmail.from_id = User.admins.first.id + dmail.to_id = user_id + Dmail.create_new(dmail) + end end diff --git a/app/models/job.rb b/app/models/job.rb deleted file mode 100644 index 57f322371..000000000 --- a/app/models/job.rb +++ /dev/null @@ -1,168 +0,0 @@ -class Job < ActiveRecord::Base - CATEGORIES = %w(mass_tag_edit approve_tag_alias approve_tag_implication calculate_tag_subscriptions calculate_related_tags s3_backup upload_processing) - STATUSES = %w(pending processing finished error) - - validates_inclusion_of :category, :in => CATEGORIES - validates_inclusion_of :status, :in => STATUSES - - def data - JSON.parse(data_as_json) - end - - def data=(text) - self.data_as_json = text.to_json - end - - def execute! - if repeat_count > 0 - count = repeat_count - 1 - else - count = repeat_count - end - - begin - execute_sql("SET statement_timeout = 0") - update_attribute(:status, "processing") - __send__("execute_#{task_type}") - - if count == 0 - update_attribute(:status, "finished") - else - update_attributes(:status => "pending", :repeat_count => count) - end - rescue SystemExit => x - update_attribute(:status, "pending") - rescue Exception => x - update_attributes(:status => "error", :status_message => "#{x.class}: #{x}") - end - end - - def execute_upload_processing - Upload.where("status = ?", "pending").each do |upload| - upload.process! - end - end - - def execute_mass_tag_edit - start_tags = data["start_tags"] - result_tags = data["result_tags"] - updater_id = data["updater_id"] - updater_ip_addr = data["updater_ip_addr"] - Tag.mass_edit(start_tags, result_tags, updater_id, updater_ip_addr) - end - - def execute_approve_tag_alias - ta = TagAlias.find(data["id"]) - updater_id = data["updater_id"] - updater_ip_addr = data["updater_ip_addr"] - ta.approve(updater_id, updater_ip_addr) - end - - def execute_approve_tag_implication - ti = TagImplication.find(data["id"]) - updater_id = data["updater_id"] - updater_ip_addr = data["updater_ip_addr"] - ti.approve(updater_id, updater_ip_addr) - end - - def execute_calculate_tag_subscriptions - last_run = Time.parse(data["last_run"]) - if last_run.nil? || last_run < 20.minutes.ago - TagSubscription.process_all - update_attributes(:data => {:last_run => Time.now.strftime("%Y-%m-%d %H:%M")}) - end - end - - def execute_calculate_related_tags - tag_id = data["id"].to_i - tag = Tag.find_by_id(tag_id) - if tag - tag.commit_related(Tag.calculate_related(tag.name)) - end - end - - def execute_s3_backup - last_id = data["last_id"].to_i - - begin - Post.where("id > ?", last_id).each do |post| - AWS::S3::Base.establish_connection!( - :access_key_id => Danbooru.config.amazon_s3_access_key_id, - :secret_access_key => Danbooru.config.amazon_s3_secret_access_key - ) - if File.exists?(post.file_path) - AWS::S3::S3Object.store( - post.file_name, - open(post.file_path, "rb"), - Danbooru.config.amazon_s3_bucket_name, - "Content-MD5" => Base64.encode64(post.md5) - ) - end - if post.image? && File.exists?(post.preview_path) - AWS::S3::S3Object.store( - "preview/#{post.md5}.jpg", - open(post.preview_path, "rb"), - Danbooru.config.amazon_s3_bucket_name - ) - end - - update_attributes(:data => {:last_id => post.id}) - end - - rescue Exception => x - # probably some network error, retry next time - end - end - - def pretty_data - begin - case task_type - when "mass_tag_edit" - start = data["start_tags"] - result = data["result_tags"] - user = User.id_to_name(data["updater_id"]) - "start:#{start} result:#{result} user:#{user}" - - when "approve_tag_alias" - ta = TagAlias.find(data["id"]) - "start:#{ta.name} result:#{ta.alias_name}" - - when "approve_tag_implication" - ti = TagImplication.find(data["id"]) - "start:#{ti.predicate.name} result:#{ti.consequent.name}" - - when "calculate_tag_subscriptions" - last_run = data["last_run"] - "last run:#{last_run}" - - when "calculate_related_tags" - tag = Tag.find_by_id(data["id"]) - if tag - "tag:#{tag.name}" - else - "tag:UNKNOWN" - end - - when "bandwidth_throttle" - "" - - when "s3_backup" - "last_id:" + data["last_id"].to_s - - end - rescue Exception - "ERROR" - end - end - - def self.pending_count(task_type) - where("task_type = ? and status = 'pending'", task_type).count - end - - def self.execute_once - where("status = ?", "pending").each do |task| - task.execute! - sleep 1 - end - end -end diff --git a/app/models/jobs/backup_to_s3.rb b/app/models/jobs/backup_to_s3.rb new file mode 100644 index 000000000..3675ac649 --- /dev/null +++ b/app/models/jobs/backup_to_s3.rb @@ -0,0 +1,27 @@ +module Jobs + class BackupToS3 < Struct.new(:last_id) + def perform + Post.find(:all, :conditions => ["id > ?", last_id], :limit => 200, :order => "id").each do |post| + AWS::S3::Base.establish_connection!(:access_key_id => CONFIG["amazon_s3_access_key_id"], :secret_access_key => CONFIG["amazon_s3_secret_access_key"]) + if File.exists?(post.file_path) + base64_md5 = Base64.encode64(Digest::MD5.digest(File.read(post.file_path))) + AWS::S3::S3Object.store(post.file_name, open(post.file_path, "rb"), CONFIG["amazon_s3_bucket_name"], "Content-MD5" => base64_md5) + end + + if post.image? && File.exists?(post.preview_path) + AWS::S3::S3Object.store("preview/#{post.md5}.jpg", open(post.preview_path, "rb"), CONFIG["amazon_s3_bucket_name"]) + end + + if File.exists?(post.sample_path) + AWS::S3::S3Object.store("sample/" + CONFIG["sample_filename_prefix"] + "#{post.md5}.jpg", open(post.sample_path, "rb"), CONFIG["amazon_s3_bucket_name"]) + end + + self.last_id = post.id + end + + Delayed::Job.enqueue(BackupToS3.new(last_id)) + rescue Exception => x + # probably some network error, retry next time + end + end +end \ No newline at end of file diff --git a/app/models/jobs/calculate_post_count.rb b/app/models/jobs/calculate_post_count.rb new file mode 100644 index 000000000..24653b04a --- /dev/null +++ b/app/models/jobs/calculate_post_count.rb @@ -0,0 +1,7 @@ +module Jobs + class CalculatePostCount < Struct.new(:tag_name) + def perform + Tag.recalculate_post_count(tag_name) + end + end +end diff --git a/app/models/jobs/calculate_related_tags.rb b/app/models/jobs/calculate_related_tags.rb new file mode 100644 index 000000000..161faabb4 --- /dev/null +++ b/app/models/jobs/calculate_related_tags.rb @@ -0,0 +1,12 @@ +module Jobs + class CalculateRelatedTags < Struct.new(:tag_id) + def perform + tag = Tag.find_by_id(tag_id) + + if tag + tag.update_related + tag.save + end + end + end +end diff --git a/app/models/jobs/calculate_uploaded_tags.rb b/app/models/jobs/calculate_uploaded_tags.rb new file mode 100644 index 000000000..28db8725a --- /dev/null +++ b/app/models/jobs/calculate_uploaded_tags.rb @@ -0,0 +1,13 @@ +module Jobs + class CalculateUploadedTags < Struct.new(:user_id) + def perform + tags = [] + user = User.find(user_id) + 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")) + end + end +end + diff --git a/app/models/jobs/create_tag_alias.rb b/app/models/jobs/create_tag_alias.rb new file mode 100644 index 000000000..1e1d4dfbc --- /dev/null +++ b/app/models/jobs/create_tag_alias.rb @@ -0,0 +1,12 @@ +module Jobs + class CreateTagAlias < Struct.new(:antecedent_name, :consequent_name, :creator_id, :creator_ip_addr) + def execute + TagAlias.create( + :antecedent_name => antecedent_name, + :consequent_name => consequent_name, + :creator_id => creator_id, + :creator_ip_addr => creator_ip_addr + ) + end + end +end diff --git a/app/models/jobs/create_tag_implication.rb b/app/models/jobs/create_tag_implication.rb new file mode 100644 index 000000000..860582c9d --- /dev/null +++ b/app/models/jobs/create_tag_implication.rb @@ -0,0 +1,12 @@ +module Jobs + class CreateTagImplication < Struct.new(:antecedent_name, :consequent_name, :creator_id, :creator_ip_addr) + def perform + TagImplication.create( + :antecedent_name => antecedent_name, + :consequent_name => consequent_name, + :creator_id => creator_id, + :creator_ip_addr => creator_ip_addr + ) + end + end +end diff --git a/app/models/jobs/fix_pixiv_uploads.rb b/app/models/jobs/fix_pixiv_uploads.rb new file mode 100644 index 000000000..3e9dd09dc --- /dev/null +++ b/app/models/jobs/fix_pixiv_uploads.rb @@ -0,0 +1,13 @@ +module Jobs + class FixPixivUploads < Struct.new(:last_post_id) + def perform + post_id = nil + + Post.find_each(:conditions => ["GREATEST(width, height) IN (150, 600) AND source LIKE ? AND id > ?", "%pixiv%", last_post_id]) do |post| + post_id = post.id + end + + update_attributes(:data => {:last_post_id => post_id}) + end + end +end diff --git a/app/models/jobs/mass_tag_edit.rb b/app/models/jobs/mass_tag_edit.rb new file mode 100644 index 000000000..c10102a7d --- /dev/null +++ b/app/models/jobs/mass_tag_edit.rb @@ -0,0 +1,7 @@ +module Jobs + class MassTagEdit < Struct.new(:start_tags, :result_tags, :updater_id, :updater_ip_addr) + def perform + Tag.mass_edit(start_tags, result_tags, updater_id, updater_ip_addr) + end + end +end diff --git a/app/models/jobs/process_tag_subscriptions.rb b/app/models/jobs/process_tag_subscriptions.rb new file mode 100644 index 000000000..e6e21f265 --- /dev/null +++ b/app/models/jobs/process_tag_subscriptions.rb @@ -0,0 +1,10 @@ +module Jobs + class ProcessTagSubscriptions < Struct.new(:last_run) + def perform + if last_run.nil? || last_run < 20.minutes.ago + TagSubscription.process_all + Delayed::Job.enqueue(ProcessTagSubscriptions.new(Time.now)) + end + end + end +end diff --git a/app/models/jobs/process_uploads.rb b/app/models/jobs/process_uploads.rb new file mode 100644 index 000000000..c7ba63ae3 --- /dev/null +++ b/app/models/jobs/process_uploads.rb @@ -0,0 +1,9 @@ +module Jobs + class ProcessUploads + def perform + Upload.find_each(:conditions => ["status = ?", "pending"]) do |upload| + upload.process! + end + end + end +end diff --git a/app/models/tag.rb b/app/models/tag.rb index a015cfc33..632bc797b 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -108,13 +108,14 @@ class Tag < ActiveRecord::Base module UpdateMethods def mass_edit(start_tags, result_tags, updater_id, updater_ip_addr) - raise NotImplementedError - + updater = User.find(updater_id) Post.find_by_tags(start_tags).each do |p| start = TagAlias.to_aliased(scan_tags(start_tags)) result = TagAlias.to_aliased(scan_tags(result_tags)) - tags = (p.cached_tags.scan(/\S+/) - start + result).join(" ") - p.update_attributes(:updater_user_id => updater_id, :updater_ip_addr => updater_ip_addr, :tags => tags) + tags = (p.tag_array - start + result).join(" ") + CurrentUser.scoped(updater, updater_ip_addr) do + p.update_attributes(:tag_string => tags) + end end end end diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index f67f5fd9a..1897bd9f2 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -1,11 +1,10 @@ class TagAlias < ActiveRecord::Base - attr_accessor :updater_id, :updater_ip_addr + attr_accessor :creator_ip_addr after_save :update_posts after_destroy :clear_cache - validates_presence_of :updater_id, :updater_ip_addr + validates_presence_of :creator_id, :creator_ip_addr validates_uniqueness_of :antecedent_name validate :absence_of_transitive_relation - belongs_to :updater, :class_name => "User" belongs_to :creator, :class_name => "User" def self.to_aliased(names) @@ -41,11 +40,12 @@ class TagAlias < ActiveRecord::Base Post.find_by_tags(antecedent_name).find_each do |post| escaped_antecedent_name = Regexp.escape(antecedent_name) fixed_tags = post.tag_string.sub(/(?:\A| )#{escaped_antecedent_name}(?:\Z| )/, " #{consequent_name} ").strip - post.update_attributes( - :tag_string => fixed_tags, - :updater_id => updater_id, - :updater_ip_addr => updater_ip_addr - ) + + CurrentUser.scoped(creator, creator_ip_addr) do + post.update_attributes( + :tag_string => fixed_tags + ) + end end end end diff --git a/app/models/tag_implication.rb b/app/models/tag_implication.rb index 154a6fda3..5d5fa2dff 100644 --- a/app/models/tag_implication.rb +++ b/app/models/tag_implication.rb @@ -1,13 +1,12 @@ class TagImplication < ActiveRecord::Base - attr_accessor :updater_id, :updater_ip_addr + attr_accessor :creator_ip_addr before_save :clear_cache before_save :update_descendant_names after_save :update_descendant_names_for_parent after_destroy :clear_cache after_save :update_posts belongs_to :creator, :class_name => "User" - belongs_to :updater, :class_name => "User" - validates_presence_of :updater_id, :updater_ip_addr, :creator_id + validates_presence_of :creator_id, :creator_ip_addr validates_uniqueness_of :antecedent_name, :scope => :consequent_name validate :absence_of_circular_relation @@ -30,15 +29,16 @@ class TagImplication < ActiveRecord::Base end def descendants - all = [] - children = [consequent_name] + @descendants ||= begin + [].tap do |all| + children = [consequent_name] - until children.empty? - all += children - children = self.class.where(["antecedent_name IN (?)", children]).all.map(&:consequent_name) + until children.empty? + all += children + children = self.class.where(["antecedent_name IN (?)", children]).all.map(&:consequent_name) + end + end end - - all end def descendant_names_array @@ -51,16 +51,14 @@ class TagImplication < ActiveRecord::Base self.descendant_names = descendants.join(" ") end - def update_descendant_names!(updater_id, updater_ip_addr) + def update_descendant_names! update_descendant_names - self.updater_id = updater_id - self.updater_ip_addr = updater_ip_addr save! end def update_descendant_names_for_parent if parent - parent.update_descendant_names!(updater_id, updater_ip_addr) + parent.update_descendant_names! end end @@ -72,17 +70,22 @@ class TagImplication < ActiveRecord::Base Post.find_by_tags(antecedent_name).find_each do |post| escaped_antecedent_name = Regexp.escape(antecedent_name) fixed_tags = post.tag_string.sub(/(?:\A| )#{escaped_antecedent_name}(?:\Z| )/, " #{antecedent_name} #{descendant_names} ").strip - post.update_attributes( - :tag_string => fixed_tags, - :updater_id => updater_id, - :updater_ip_addr => updater_ip_addr - ) + CurrentUser.scoped(creator, creator_ip_addr) do + post.update_attributes( + :tag_string => fixed_tags + ) + end end end def reload(options = {}) super clear_parent_cache + clear_descendants_cache + end + + def clear_descendants_cache + @descendants = nil end def clear_parent_cache diff --git a/app/models/upload.rb b/app/models/upload.rb index cb2c7d12b..2b49f32a2 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -49,33 +49,28 @@ class Upload < ActiveRecord::Base module ConversionMethods def process! - CurrentUser.user = uploader - CurrentUser.ip_addr = uploader_ip_addr - - update_attribute(:status, "processing") - if is_downloadable? - download_from_source(temp_file_path) + CurrentUser.scoped(uploader, uploader_ip_addr) do + update_attribute(:status, "processing") + if is_downloadable? + download_from_source(temp_file_path) + end + validate_file_exists + self.file_ext = content_type_to_file_ext(content_type) + validate_file_content_type + calculate_hash(file_path) + validate_md5_uniqueness + validate_md5_confirmation + calculate_file_size(file_path) + calculate_dimensions(file_path) if has_dimensions? + generate_resizes(file_path) + move_file + post = convert_to_post + if post.save + update_attributes(:status => "completed", :post_id => post.id) + else + update_attribute(:status, "error: " + post.errors.full_messages.join(", ")) + end end - validate_file_exists - self.file_ext = content_type_to_file_ext(content_type) - validate_file_content_type - calculate_hash(file_path) - validate_md5_uniqueness - validate_md5_confirmation - calculate_file_size(file_path) - calculate_dimensions(file_path) if has_dimensions? - generate_resizes(file_path) - move_file - post = convert_to_post - if post.save - update_attributes(:status => "completed", :post_id => post.id) - else - update_attribute(:status, "error: " + post.errors.full_messages.join(", ")) - end - rescue RuntimeError => x - ensure - CurrentUser.user = nil - CurrentUser.ip_addr = nil end def convert_to_post @@ -85,8 +80,6 @@ class Upload < ActiveRecord::Base p.file_ext = file_ext p.image_width = image_width p.image_height = image_height - p.uploader_id = uploader_id - p.uploader_ip_addr = uploader_ip_addr p.rating = rating p.source = source p.file_size = file_size diff --git a/app/models/user.rb b/app/models/user.rb index 45d99cbee..b69be08a0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -22,7 +22,8 @@ class User < ActiveRecord::Base has_many :feedback, :class_name => "UserFeedback", :dependent => :destroy has_one :ban belongs_to :inviter, :class_name => "User" - scope :named, lambda {|name| where(["lower(name) = ?", name])} + scope :named, lambda {|name| where(["lower(name) = ?", name])} + scope :admins, where("is_admin = TRUE") module BanMethods def validate_ip_addr_is_not_banned diff --git a/db/migrate/20100211191709_create_tag_aliases.rb b/db/migrate/20100211191709_create_tag_aliases.rb index eb3aac2c3..329fa58b4 100644 --- a/db/migrate/20100211191709_create_tag_aliases.rb +++ b/db/migrate/20100211191709_create_tag_aliases.rb @@ -4,7 +4,7 @@ class CreateTagAliases < ActiveRecord::Migration t.column :antecedent_name, :string, :null => false t.column :consequent_name, :string, :null => false t.column :creator_id, :integer, :null => false - t.column :request_ids, :string + t.column :forum_topic_id, :integer t.timestamps end diff --git a/db/migrate/20100211191716_create_tag_implications.rb b/db/migrate/20100211191716_create_tag_implications.rb index 9d2f2eb75..8db2a6975 100644 --- a/db/migrate/20100211191716_create_tag_implications.rb +++ b/db/migrate/20100211191716_create_tag_implications.rb @@ -5,7 +5,7 @@ class CreateTagImplications < ActiveRecord::Migration t.column :consequent_name, :string, :null => false t.column :descendant_names, :text, :null => false t.column :creator_id, :integer, :null => false - t.column :request_ids, :string + t.column :forum_topic_id, :integer t.timestamps end diff --git a/db/migrate/20100221012656_create_jobs.rb b/db/migrate/20100221012656_create_jobs.rb deleted file mode 100644 index 0edc8fe55..000000000 --- a/db/migrate/20100221012656_create_jobs.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CreateJobs < ActiveRecord::Migration - def self.up - create_table :jobs do |t| - t.column :category, :string, :null => false - t.column :status, :string, :null => false - t.column :message, :text, :null => false - t.column :data_as_json, :text, :null => false - t.column :repeat_count, :integer, :null => false - t.timestamps - end - end - - def self.down - drop_table :jobs - end -end diff --git a/db/migrate/20100826232512_create_delayed_jobs.rb b/db/migrate/20100826232512_create_delayed_jobs.rb new file mode 100644 index 000000000..9e3475a4a --- /dev/null +++ b/db/migrate/20100826232512_create_delayed_jobs.rb @@ -0,0 +1,21 @@ +class CreateDelayedJobs < ActiveRecord::Migration + def self.up + create_table :delayed_jobs, :force => true do |table| + table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue + table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually. + table.text :handler # YAML-encoded string of the object that will do work + table.text :last_error # reason for last failure (See Note below) + table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. + table.datetime :locked_at # Set when a client is working on this object + table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) + table.string :locked_by # Who is working on this object (if locked) + table.timestamps + end + + add_index :delayed_jobs, :run_at + end + + def self.down + drop_table :delayed_jobs + end +end diff --git a/test/functional/jobs_controller_test.rb b/test/functional/jobs_controller_test.rb deleted file mode 100644 index 52f3e3f71..000000000 --- a/test/functional/jobs_controller_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class JobsControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/current_user_test.rb b/test/unit/current_user_test.rb index a78da30a6..b6d05c108 100644 --- a/test/unit/current_user_test.rb +++ b/test/unit/current_user_test.rb @@ -1,6 +1,11 @@ require_relative "../test_helper" class ArtistTest < ActiveSupport::TestCase + setup do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + end + context "The current user" do should "be set only within the scope of the block" do user = Factory.create(:user) @@ -16,4 +21,29 @@ class ArtistTest < ActiveSupport::TestCase assert_equal("1.2.3.4", CurrentUser.ip_addr) end end + + context "A scoped current user" do + should "reset the current user after the block has exited" do + user1 = Factory.create(:user) + user2 = Factory.create(:user) + CurrentUser.user = user1 + CurrentUser.scoped(user2, nil) do + assert_equal(user2.id, CurrentUser.user.id) + end + assert_equal(user1.id, CurrentUser.user.id) + end + + should "reset the current user even if an exception is thrown" do + user1 = Factory.create(:user) + user2 = Factory.create(:user) + CurrentUser.user = user1 + assert_raises(RuntimeError) do + CurrentUser.scoped(user2, nil) do + assert_equal(user2.id, CurrentUser.user.id) + raise "ERROR" + end + end + assert_equal(user1.id, CurrentUser.user.id) + end + end end \ No newline at end of file diff --git a/test/unit/helpers/jobs_helper_test.rb b/test/unit/helpers/jobs_helper_test.rb deleted file mode 100644 index 7c4a3fdda..000000000 --- a/test/unit/helpers/jobs_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class JobsHelperTest < ActionView::TestCase -end diff --git a/test/unit/janitor_trial_test.rb b/test/unit/janitor_trial_test.rb index cbc7b1d94..5fd5c6938 100644 --- a/test/unit/janitor_trial_test.rb +++ b/test/unit/janitor_trial_test.rb @@ -1,8 +1,23 @@ require_relative '../test_helper' class JanitorTrialTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true + setup do + user = Factory.create(:user) + CurrentUser.user = user + CurrentUser.ip_addr = "127.0.0.1" + MEMCACHE.flush_all + end + + teardown do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + end + + should "create a dmail when testing a new janitor" do + admin = Factory.create(:admin_user) + user = Factory.create(:user) + assert_difference("Dmail.count", 2) do + JanitorTrial.create(:user_id => user.id) + end end end diff --git a/test/unit/job_test.rb b/test/unit/job_test.rb deleted file mode 100644 index 77b31a0b8..000000000 --- a/test/unit/job_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require_relative '../test_helper' - -class JobTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end