Support for ban reasons and ban times. Fixes Retrospring/bugs#26 and Retrospring/bugs#25
This commit is contained in:
parent
c8747fea44
commit
be04d3528c
63
Rakefile
63
Rakefile
|
@ -94,11 +94,67 @@ namespace :justask do
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Hits an user with the banhammer."
|
desc "Hits an user with the banhammer."
|
||||||
task :ban, [:screen_name] => :environment do |t, args|
|
task :permanently_ban, [:screen_name, :reason] => :environment do |t, args|
|
||||||
fail "screen name required" if args[:screen_name].nil?
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
user = User.find_by_screen_name(args[:screen_name])
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
fail "user #{args[:screen_name]} not found" if user.nil?
|
fail "user #{args[:screen_name]} not found" if user.nil?
|
||||||
user.banned = true
|
user.permanently_banned = true
|
||||||
|
user.ban_reason = args[:reason]
|
||||||
|
user.save!
|
||||||
|
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Hits an user with the banhammer for one day."
|
||||||
|
task :ban, [:screen_name, :reason] => :environment do |t, args|
|
||||||
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
|
user.permanently_banned = false
|
||||||
|
user.banned_until = DateTime.now + 1
|
||||||
|
user.ban_reason = args[:reason]
|
||||||
|
user.save!
|
||||||
|
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Hits an user with the banhammer for one week."
|
||||||
|
task :week_ban, [:screen_name, :reason] => :environment do |t, args|
|
||||||
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
|
user.permanently_banned = false
|
||||||
|
user.banned_until = DateTime.now + 7
|
||||||
|
user.ban_reason = args[:reason]
|
||||||
|
user.save!
|
||||||
|
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Hits an user with the banhammer for one month."
|
||||||
|
task :month_ban, [:screen_name, :reason] => :environment do |t, args|
|
||||||
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
|
user.permanently_banned = false
|
||||||
|
user.banned_until = DateTime.now + 30
|
||||||
|
user.ban_reason = args[:reason]
|
||||||
|
user.save!
|
||||||
|
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Hits an user with the banhammer for one year."
|
||||||
|
task :year_ban, [:screen_name, :reason] => :environment do |t, args|
|
||||||
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
|
user.permanently_banned = false
|
||||||
|
user.banned_until = DateTime.now + 365
|
||||||
|
user.ban_reason = args[:reason]
|
||||||
|
user.save!
|
||||||
|
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Hits an user with the banhammer for one aeon."
|
||||||
|
task :aeon_ban, [:screen_name, :reason] => :environment do |t, args|
|
||||||
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
|
user.permanently_banned = false
|
||||||
|
user.banned_until = DateTime.now + 365_000_000_000
|
||||||
|
user.ban_reason = args[:reason]
|
||||||
user.save!
|
user.save!
|
||||||
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
puts "#{user.screen_name} got hit by\033[5m YE OLDE BANHAMMER\033[0m!!1!"
|
||||||
end
|
end
|
||||||
|
@ -108,7 +164,8 @@ namespace :justask do
|
||||||
fail "screen name required" if args[:screen_name].nil?
|
fail "screen name required" if args[:screen_name].nil?
|
||||||
user = User.find_by_screen_name(args[:screen_name])
|
user = User.find_by_screen_name(args[:screen_name])
|
||||||
fail "user #{args[:screen_name]} not found" if user.nil?
|
fail "user #{args[:screen_name]} not found" if user.nil?
|
||||||
user.banned = false
|
user.permanently_banned = false
|
||||||
|
user.banned_until = DateTime.now - 0.00001
|
||||||
user.save!
|
user.save!
|
||||||
puts "#{user.screen_name} is no longer banned."
|
puts "#{user.screen_name} is no longer banned."
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,7 +41,8 @@ $(document).on "click", "button#create-account", ->
|
||||||
Turbolinks.visit "/sign_up"
|
Turbolinks.visit "/sign_up"
|
||||||
|
|
||||||
_ready = ->
|
_ready = ->
|
||||||
sweetAlertInitialize()
|
if typeof sweetAlertInitialize != "undefined"
|
||||||
|
sweetAlertInitialize()
|
||||||
|
|
||||||
$(document).ready _ready
|
$(document).ready _ready
|
||||||
$(document).on 'page:load', _ready
|
$(document).on 'page:load', _ready
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
#= require_tree ./moderation
|
#= require_tree ./moderation
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
$(document).on "DOMContentLoaded", ->
|
||||||
|
parent = $ "#ban-control-super"
|
||||||
|
parent.find('#_ban').on "change", (event) ->
|
||||||
|
$t = $ this
|
||||||
|
if $t.is(":checked")
|
||||||
|
$("#ban-controls").show()
|
||||||
|
else
|
||||||
|
$("#ban-controls").hide()
|
||||||
|
parent.find('#_permaban').on "change", (event) ->
|
||||||
|
$t = $ this
|
||||||
|
if $t.is(":checked")
|
||||||
|
$("#ban-controls-time").hide()
|
||||||
|
else
|
||||||
|
$("#ban-controls-time").show()
|
||||||
|
|
||||||
|
parent.parent()[0].addEventListener "submit", (event) ->
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
$("#modal-ban").modal "hide"
|
||||||
|
|
||||||
|
checktostr = (selector) ->
|
||||||
|
if $(selector)[0].checked
|
||||||
|
"1"
|
||||||
|
else
|
||||||
|
"0"
|
||||||
|
|
||||||
|
data = {
|
||||||
|
ban: checktostr "#_ban"
|
||||||
|
permaban: checktostr "#_permaban"
|
||||||
|
until: $("#until")[0].value
|
||||||
|
reason: $("#reason")[0].value
|
||||||
|
user: $("#_user")[0].value
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajax
|
||||||
|
url: '/ajax/mod/ban'
|
||||||
|
type: 'POST'
|
||||||
|
data: data
|
||||||
|
success: (data, status, jqxhr) ->
|
||||||
|
showNotification data.message, data.success
|
||||||
|
error: (jqxhr, status, error) ->
|
||||||
|
console.log jqxhr, status, error
|
||||||
|
showNotification "An error occurred, a developer should check the console for details", false
|
||||||
|
complete: (jqxhr, status) ->
|
|
@ -21,4 +21,4 @@
|
||||||
console.log jqxhr, status, error
|
console.log jqxhr, status, error
|
||||||
showNotification "An error occurred, a developer should check the console for details", false
|
showNotification "An error occurred, a developer should check the console for details", false
|
||||||
complete: (jqxhr, status) ->
|
complete: (jqxhr, status) ->
|
||||||
box.removeAttr "disabled"
|
box.removeAttr "disabled"
|
||||||
|
|
|
@ -105,6 +105,45 @@ class Ajax::ModerationController < ApplicationController
|
||||||
@success = true
|
@success = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ban
|
||||||
|
@status = :err
|
||||||
|
@message = "Weird..."
|
||||||
|
@success = false
|
||||||
|
|
||||||
|
params.require :user
|
||||||
|
params.require :ban
|
||||||
|
params.require :permaban
|
||||||
|
|
||||||
|
reason = params[:reason]
|
||||||
|
target = User.find_by_screen_name(params[:user])
|
||||||
|
unban = params[:ban] == "0"
|
||||||
|
perma = params[:permaban] == "1"
|
||||||
|
|
||||||
|
buntil = DateTime.strptime params[:until], "%Y-%m-%dT%H:%M" unless unban or perma
|
||||||
|
|
||||||
|
if not unban and target.admin?
|
||||||
|
@status = :nopriv
|
||||||
|
@message = "You cannot ban an administrator!"
|
||||||
|
@success = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if unban
|
||||||
|
target.unban
|
||||||
|
@message = "Unbanned user."
|
||||||
|
@success = true
|
||||||
|
elsif perma
|
||||||
|
target.ban nil, reason
|
||||||
|
@message = "Permanently banned user."
|
||||||
|
else
|
||||||
|
target.ban buntil, reason
|
||||||
|
@message = "Banned user until #{buntil.to_s}"
|
||||||
|
end
|
||||||
|
target.save!
|
||||||
|
|
||||||
|
@status = :okay
|
||||||
|
@success = target.banned? == !unban
|
||||||
|
end
|
||||||
|
|
||||||
def privilege
|
def privilege
|
||||||
@status = :err
|
@status = :err
|
||||||
@success = false
|
@success = false
|
||||||
|
@ -118,10 +157,9 @@ class Ajax::ModerationController < ApplicationController
|
||||||
target_user = User.find_by_screen_name(params[:user])
|
target_user = User.find_by_screen_name(params[:user])
|
||||||
|
|
||||||
@message = "nope!"
|
@message = "nope!"
|
||||||
return unless %w(banned blogger supporter moderator admin contributor).include? params[:type].downcase
|
return unless %w(blogger supporter moderator admin contributor).include? params[:type].downcase
|
||||||
|
|
||||||
if (%w(supporter moderator admin).include?(params[:type].downcase) and !current_user.admin?) or
|
if %w(supporter moderator admin).include?(params[:type].downcase) and !current_user.admin?
|
||||||
(params[:type].downcase == 'banned' and target_user.admin?)
|
|
||||||
@status = :nopriv
|
@status = :nopriv
|
||||||
@message = "You'd better check YOUR privileges first!"
|
@message = "You'd better check YOUR privileges first!"
|
||||||
@success = false
|
@success = false
|
||||||
|
|
|
@ -12,6 +12,13 @@ class ApplicationController < ActionController::Base
|
||||||
name = current_user.screen_name
|
name = current_user.screen_name
|
||||||
# obligatory '2001: A Space Odyssey' reference
|
# obligatory '2001: A Space Odyssey' reference
|
||||||
flash[:notice] = "I'm sorry, #{name}, I'm afraid I can't do that."
|
flash[:notice] = "I'm sorry, #{name}, I'm afraid I can't do that."
|
||||||
|
if current_user.ban_reason.nil?
|
||||||
|
flash[:notice] += "\nBan reason: #{current_user.ban_reason}"
|
||||||
|
end
|
||||||
|
if not current_user.permanently_banned?
|
||||||
|
# TODO format banned_until
|
||||||
|
flash[:notice] += "\nBanned until: #{current_user.banned_until}"
|
||||||
|
end
|
||||||
sign_out current_user
|
sign_out current_user
|
||||||
redirect_to new_user_session_path
|
redirect_to new_user_session_path
|
||||||
end
|
end
|
||||||
|
|
|
@ -196,4 +196,21 @@ class User < ActiveRecord::Base
|
||||||
def cropping?
|
def cropping?
|
||||||
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
|
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# forwards fill
|
||||||
|
def banned?
|
||||||
|
self.permanently_banned? or ((not self.banned_until.nil?) and self.banned_until > DateTime.now)
|
||||||
|
end
|
||||||
|
|
||||||
|
def unban
|
||||||
|
self.update(permanently_banned: false, ban_reason: nil, banned_until: nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def ban(buntil=nil, reason=nil)
|
||||||
|
if buntil == nil
|
||||||
|
self.update(permanently_banned: true, ban_reason: reason)
|
||||||
|
else
|
||||||
|
self.update(permanently_banned: false, banned_until: buntil, ban_reason: reason)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
json.partial! 'ajax/shared/status'
|
|
@ -35,4 +35,12 @@
|
||||||
Check
|
Check
|
||||||
= succeed "'s" do
|
= succeed "'s" do
|
||||||
= user.screen_name
|
= user.screen_name
|
||||||
privileges
|
privileges
|
||||||
|
%li
|
||||||
|
%a{href: '#', data: { target: "#modal-ban", toggle: :modal }}
|
||||||
|
%i.fa.fa-wrench
|
||||||
|
- if user.banned?
|
||||||
|
Unban or extend ban duration
|
||||||
|
- else
|
||||||
|
Ban
|
||||||
|
= user.screen_name
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#modal-ban.modal.fade{"aria-hidden" => "true", "aria-labelledby" => "modal-ban-label", :role => "dialog", :tabindex => "-1"}
|
||||||
|
.modal-dialog
|
||||||
|
.modal-content
|
||||||
|
.modal-header
|
||||||
|
%button.close{"data-dismiss" => "modal", :type => "button"}
|
||||||
|
%span{"aria-hidden" => "true"} ×
|
||||||
|
%span.sr-only Close
|
||||||
|
%h4#modal-ban-label.modal-title
|
||||||
|
Ban Control Center
|
||||||
|
= bootstrap_form_tag(url: '/mod/ban', html: { method: :post, novalidate: "novalidate" }) do |f|
|
||||||
|
= f.hidden_field :user, value: @user.screen_name
|
||||||
|
#ban-control-super.modal-body
|
||||||
|
= f.check_box :ban, label: "Ban?", checked: @user.banned?
|
||||||
|
#ban-controls{style: "#{"display: none" unless @user.banned?}"}
|
||||||
|
= f.check_box :permaban, label: "Permanently?", checked: @user.permanently_banned?
|
||||||
|
#ban-controls-time{style: "#{"display: none" unless not @user.permanently_banned?}"}
|
||||||
|
= f.datetime_local_field :until, label: "", required: true, value: (@user.banned_until || DateTime.now).strftime("%Y-%m-%dT%H:%M")
|
||||||
|
= f.text_field :reason, placeholder: "Reason", value: @user.ban_reason
|
||||||
|
.modal-footer
|
||||||
|
%button.btn.btn-default{name: 'stop-time', type: :button, data: { dismiss: :modal }} Close
|
||||||
|
= f.submit "Hammer Time", class: "btn btn-primary", name: 'hammer-time'
|
|
@ -11,8 +11,6 @@
|
||||||
= @user.screen_name
|
= @user.screen_name
|
||||||
privileges
|
privileges
|
||||||
%ul.list-group.groups--list
|
%ul.list-group.groups--list
|
||||||
- unless @user.admin?
|
|
||||||
= render 'user/modal_privileges_item', privilege: 'banned', description: 'Hit the user with ye olde banhammer', user: @user
|
|
||||||
= render 'user/modal_privileges_item', privilege: 'blogger', description: 'The user gets that privilege if they blogged something (nice) about Retrospring.', user: @user
|
= render 'user/modal_privileges_item', privilege: 'blogger', description: 'The user gets that privilege if they blogged something (nice) about Retrospring.', user: @user
|
||||||
= render 'user/modal_privileges_item', privilege: 'contributor', description: "This user has contributed to justask#{" (the software behind #{APP_CONFIG['site_name']})" unless APP_CONFIG['site_name'] == 'justask'}.", user: @user
|
= render 'user/modal_privileges_item', privilege: 'contributor', description: "This user has contributed to justask#{" (the software behind #{APP_CONFIG['site_name']})" unless APP_CONFIG['site_name'] == 'justask'}.", user: @user
|
||||||
- if current_user.admin?
|
- if current_user.admin?
|
||||||
|
|
|
@ -18,4 +18,5 @@
|
||||||
- if user_signed_in?
|
- if user_signed_in?
|
||||||
= render 'user/modal_group_memberships'
|
= render 'user/modal_group_memberships'
|
||||||
- if current_user.mod? and @user != current_user
|
- if current_user.mod? and @user != current_user
|
||||||
= render 'user/modal_privileges'
|
= render 'user/modal_privileges'
|
||||||
|
= render 'user/modal_ban'
|
||||||
|
|
|
@ -21,6 +21,7 @@ Rails.application.routes.draw do
|
||||||
match '/mod/create_vote', to: 'moderation#vote', via: :post, as: :mod_create_vote
|
match '/mod/create_vote', to: 'moderation#vote', via: :post, as: :mod_create_vote
|
||||||
match '/mod/destroy_vote', to: 'moderation#destroy_vote', via: :post, as: :mod_destroy_vote
|
match '/mod/destroy_vote', to: 'moderation#destroy_vote', via: :post, as: :mod_destroy_vote
|
||||||
match '/mod/privilege', to: 'moderation#privilege', via: :post, as: :mod_privilege
|
match '/mod/privilege', to: 'moderation#privilege', via: :post, as: :mod_privilege
|
||||||
|
match '/mod/ban', to: 'moderation#ban', via: :post, as: :mod_ban
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
class RenameBannedToPermanentlyBannedInUsers < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
rename_column :users, :banned, :permanently_banned
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
rename_column :users, :permanently_banned, :banned
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,6 @@
|
||||||
|
class AddBanReasonAndBannedUntilToUsers < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :users, :ban_reason, :string, default: nil
|
||||||
|
add_column :users, :banned_until, :datetime, default: nil
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue