diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 0cf7a2fd3..9860f0c8d 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -8,8 +8,7 @@ module Admin def update @user = User.find(params[:id]) - promotion = UserPromotion.new(@user, CurrentUser.user, params[:user][:level], params[:user]) - promotion.promote! + @user.promote_to!(params[:user][:level], params[:user]) redirect_to edit_admin_user_path(@user), :notice => "User updated" end end diff --git a/app/controllers/user_upgrades_controller.rb b/app/controllers/user_upgrades_controller.rb index 4e030a065..54e5cd585 100644 --- a/app/controllers/user_upgrades_controller.rb +++ b/app/controllers/user_upgrades_controller.rb @@ -48,7 +48,7 @@ class UserUpgradesController < ApplicationController :card => params[:stripeToken], :description => params[:desc] ) - @user.promote_to!(level, :skip_feedback => true) + @user.promote_to!(level, is_upgrade: true) flash[:success] = true rescue Stripe::CardError => e flash[:error] = e.message diff --git a/app/logical/user_promotion.rb b/app/logical/user_promotion.rb index 8818f2b84..b3ff3ec89 100644 --- a/app/logical/user_promotion.rb +++ b/app/logical/user_promotion.rb @@ -26,7 +26,7 @@ class UserPromotion user.inviter_id = promoter.id - create_user_feedback unless options[:skip_feedback] + create_user_feedback unless options[:is_upgrade] create_dmail unless options[:skip_dmail] create_mod_actions @@ -43,8 +43,13 @@ private if old_can_upload_free != user.can_upload_free? ModAction.log("\"#{promoter.name}\":/users/#{promoter.id} changed unlimited upload privileges for \"#{user.name}\":/users/#{user.id} from #{old_can_upload_free} to [b]#{user.can_upload_free?}[/b]",:user_upload_privilege) end + + if user.level_changed? + category = options[:is_upgrade] ? :user_account_upgrade : :user_level_change + ModAction.log(%{"#{user.name}":/users/#{user.id} level changed #{user.level_string_was} -> #{user.level_string}}, category) + end end - + def validate # admins can do anything return if promoter.is_admin? diff --git a/app/models/mod_action.rb b/app/models/mod_action.rb index b08f21da4..6fb9034bc 100644 --- a/app/models/mod_action.rb +++ b/app/models/mod_action.rb @@ -19,9 +19,10 @@ class ModAction < ApplicationRecord user_ban: 4, user_unban: 5, user_name_change: 6, - user_level: 7, + user_level_change: 7, user_approval_privilege: 8, user_upload_privilege: 9, + user_account_upgrade: 19, user_feedback_update: 21, user_feedback_delete: 22, post_delete: 42, diff --git a/app/models/user.rb b/app/models/user.rb index f0cefa6c6..35bf6ba0d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -110,7 +110,6 @@ class User < ApplicationRecord has_many :favorite_groups, -> {order(name: :asc)}, foreign_key: :creator_id has_many :favorites, ->(rec) {where("user_id % 100 = #{rec.id % 100} and user_id = #{rec.id}").order("id desc")} belongs_to :inviter, class_name: "User", optional: true - after_update :create_mod_action accepts_nested_attributes_for :dmail_filter module BanMethods @@ -355,10 +354,6 @@ class User < ApplicationRecord level_string.downcase.to_sym end - def level_string_before_last_save - level_string(level_before_last_save) - end - def level_string_was level_string(level_was) end @@ -411,12 +406,6 @@ class User < ApplicationRecord can_approve_posts? end - def create_mod_action - if saved_change_to_level? - ModAction.log(%{"#{name}":/users/#{id} level changed #{level_string_before_last_save} -> #{level_string}},:user_level) - end - end - def set_per_page if per_page.nil? || !is_gold? self.per_page = Danbooru.config.posts_per_page diff --git a/db/populate.rb b/db/populate.rb index 0482e0ca4..bc7199140 100644 --- a/db/populate.rb +++ b/db/populate.rb @@ -54,7 +54,7 @@ if User.count == 0 :password => "password1", :password_confirmation => "password1" ) - newuser.promote_to!(User::Levels.const_get(level), {:skip_feedback => true, :skip_dmail => true}) + newuser.promote_to!(User::Levels.const_get(level), {:is_upgrade => true, :skip_dmail => true}) end newuser = User.create( @@ -69,14 +69,14 @@ if User.count == 0 :password => "password1", :password_confirmation => "password1" ) - newuser.promote_to!(User::Levels::BUILDER, {:can_upload_free => true, :skip_feedback => true, :skip_dmail => true}) + newuser.promote_to!(User::Levels::BUILDER, {:can_upload_free => true, :is_upgrade => true, :skip_dmail => true}) newuser = User.create( :name => "approver", :password => "password1", :password_confirmation => "password1" ) - newuser.promote_to!(User::Levels::BUILDER, {:can_approve_posts => true, :skip_feedback => true, :skip_dmail => true}) + newuser.promote_to!(User::Levels::BUILDER, {:can_approve_posts => true, :is_upgrade => true, :skip_dmail => true}) end diff --git a/script/fixes/054_recategorize_user_level_mod_actions.rb b/script/fixes/054_recategorize_user_level_mod_actions.rb new file mode 100755 index 000000000..5718c480e --- /dev/null +++ b/script/fixes/054_recategorize_user_level_mod_actions.rb @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config', 'environment')) + +CurrentUser.user = User.system +CurrentUser.ip_addr = "127.0.0.1" + +ModAction.transaction do + ModAction.without_timeout do + # Find mod actions where the user changed their own level. + mod_actions = ModAction.where(category: :user_level_change).select do |mod_action| + mod_action.description.match?(%r{".*":/users/#{mod_action.creator_id} level changed \w+ -> (Gold|Platinum)}i) + end + + ModAction.where(id: mod_actions).update_all(category: :user_account_upgrade) + end +end