User's blocked field refactored to use state machine
This commit is contained in:
parent
9a06dd4aa1
commit
0d9a6fe7b1
12 changed files with 40 additions and 33 deletions
|
@ -45,7 +45,7 @@ class Admin::UsersController < Admin::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def unblock
|
def unblock
|
||||||
if admin_user.update_attribute(:blocked, false)
|
if admin_user.activate
|
||||||
redirect_to :back, alert: "Successfully unblocked"
|
redirect_to :back, alert: "Successfully unblocked"
|
||||||
else
|
else
|
||||||
redirect_to :back, alert: "Error occured. User was not unblocked"
|
redirect_to :back, alert: "Error occured. User was not unblocked"
|
||||||
|
|
|
@ -30,7 +30,7 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def reject_blocked!
|
def reject_blocked!
|
||||||
if current_user && current_user.blocked
|
if current_user && current_user.blocked?
|
||||||
sign_out current_user
|
sign_out current_user
|
||||||
flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
|
flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
|
||||||
redirect_to new_user_session_path
|
redirect_to new_user_session_path
|
||||||
|
@ -38,7 +38,7 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_sign_in_path_for resource
|
def after_sign_in_path_for resource
|
||||||
if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked
|
if resource.is_a?(User) && resource.respond_to?(:blocked?) && resource.blocked?
|
||||||
sign_out resource
|
sign_out resource
|
||||||
flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
|
flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
|
||||||
new_user_session_path
|
new_user_session_path
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
# dark_scheme :boolean default(FALSE), not null
|
# dark_scheme :boolean default(FALSE), not null
|
||||||
# theme_id :integer default(1), not null
|
# theme_id :integer default(1), not null
|
||||||
# bio :string(255)
|
# bio :string(255)
|
||||||
# blocked :boolean default(FALSE), not null
|
# state :string(255)
|
||||||
# failed_attempts :integer default(0)
|
# failed_attempts :integer default(0)
|
||||||
# locked_at :datetime
|
# locked_at :datetime
|
||||||
# extern_uid :string(255)
|
# extern_uid :string(255)
|
||||||
|
@ -87,10 +87,27 @@ class User < ActiveRecord::Base
|
||||||
|
|
||||||
delegate :path, to: :namespace, allow_nil: true, prefix: true
|
delegate :path, to: :namespace, allow_nil: true, prefix: true
|
||||||
|
|
||||||
|
state_machine :state, initial: :active do
|
||||||
|
after_transition any => :blocked do |user, transition|
|
||||||
|
# Remove user from all projects and
|
||||||
|
user.users_projects.find_each do |membership|
|
||||||
|
return false unless membership.destroy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
event :block do
|
||||||
|
transition active: :blocked
|
||||||
|
end
|
||||||
|
|
||||||
|
event :activate do
|
||||||
|
transition blocked: :active
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Scopes
|
# Scopes
|
||||||
scope :admins, -> { where(admin: true) }
|
scope :admins, -> { where(admin: true) }
|
||||||
scope :blocked, -> { where(blocked: true) }
|
scope :blocked, -> { with_state(:blocked) }
|
||||||
scope :active, -> { where(blocked: false) }
|
scope :active, -> { with_state(:active) }
|
||||||
scope :alphabetically, -> { order('name ASC') }
|
scope :alphabetically, -> { order('name ASC') }
|
||||||
scope :in_team, ->(team){ where(id: team.member_ids) }
|
scope :in_team, ->(team){ where(id: team.member_ids) }
|
||||||
scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) }
|
scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) }
|
||||||
|
@ -260,17 +277,6 @@ class User < ActiveRecord::Base
|
||||||
MergeRequest.cared(self)
|
MergeRequest.cared(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Remove user from all projects and
|
|
||||||
# set blocked attribute to true
|
|
||||||
def block
|
|
||||||
users_projects.find_each do |membership|
|
|
||||||
return false unless membership.destroy
|
|
||||||
end
|
|
||||||
|
|
||||||
self.blocked = true
|
|
||||||
save
|
|
||||||
end
|
|
||||||
|
|
||||||
def projects_limit_percent
|
def projects_limit_percent
|
||||||
return 100 if projects_limit.zero?
|
return 100 if projects_limit.zero?
|
||||||
(personal_projects.count.to_f / projects_limit) * 100
|
(personal_projects.count.to_f / projects_limit) * 100
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
.span4
|
.span4
|
||||||
- unless @admin_user.new_record?
|
- unless @admin_user.new_record?
|
||||||
.alert.alert-error
|
.alert.alert-error
|
||||||
- if @admin_user.blocked
|
- if @admin_user.blocked?
|
||||||
%p This user is blocked and is not able to login to GitLab
|
%p This user is blocked and is not able to login to GitLab
|
||||||
= link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn btn-small"
|
= link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn btn-small"
|
||||||
- else
|
- else
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
|
|
||||||
= link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn btn-small"
|
= link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn btn-small"
|
||||||
- unless user == current_user
|
- unless user == current_user
|
||||||
- if user.blocked
|
- if user.blocked?
|
||||||
= link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn btn-small success"
|
= link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn btn-small success"
|
||||||
- else
|
- else
|
||||||
= link_to 'Block', block_admin_user_path(user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn btn-small btn-remove"
|
= link_to 'Block', block_admin_user_path(user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn btn-small btn-remove"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
%h3.page_title
|
%h3.page_title
|
||||||
= image_tag gravatar_icon(@admin_user.email, 90), class: "avatar s90"
|
= image_tag gravatar_icon(@admin_user.email, 90), class: "avatar s90"
|
||||||
= @admin_user.name
|
= @admin_user.name
|
||||||
- if @admin_user.blocked
|
- if @admin_user.blocked?
|
||||||
%span.cred (Blocked)
|
%span.cred (Blocked)
|
||||||
- if @admin_user.admin
|
- if @admin_user.admin
|
||||||
%span.cred (Admin)
|
%span.cred (Admin)
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
%span.label This is you!
|
%span.label This is you!
|
||||||
- if @project.namespace_owner == user
|
- if @project.namespace_owner == user
|
||||||
%span.label Owner
|
%span.label Owner
|
||||||
- elsif user.blocked
|
- elsif user.blocked?
|
||||||
%span.label Blocked
|
%span.label Blocked
|
||||||
- elsif allow_admin
|
- elsif allow_admin
|
||||||
= link_to project_team_member_path(@project, user), confirm: remove_from_project_team_message(@project, user), method: :delete, class: "btn-tiny btn btn-remove" do
|
= link_to project_team_member_path(@project, user), confirm: remove_from_project_team_message(@project, user), method: :delete, class: "btn-tiny btn btn-remove" do
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
%span.btn.disabled This is you!
|
%span.btn.disabled This is you!
|
||||||
- if @team.owner == user
|
- if @team.owner == user
|
||||||
%span.btn.disabled Owner
|
%span.btn.disabled Owner
|
||||||
- elsif user.blocked
|
- elsif user.blocked?
|
||||||
%span.btn.disabled.blocked Blocked
|
%span.btn.disabled.blocked Blocked
|
||||||
- elsif allow_admin
|
- elsif allow_admin
|
||||||
= link_to team_member_path(@team, user), confirm: remove_from_user_team_message(@team, user), method: :delete, class: "btn-tiny btn btn-remove", title: "Remove from team" do
|
= link_to team_member_path(@team, user), confirm: remove_from_user_team_message(@team, user), method: :delete, class: "btn-tiny btn btn-remove", title: "Remove from team" do
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended to check this file into your version control system.
|
# It's strongly recommended to check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(:version => 20130220133245) do
|
ActiveRecord::Schema.define(:version => 20130304105317) do
|
||||||
|
|
||||||
create_table "events", :force => true do |t|
|
create_table "events", :force => true do |t|
|
||||||
t.string "target_type"
|
t.string "target_type"
|
||||||
|
@ -261,7 +261,6 @@ ActiveRecord::Schema.define(:version => 20130220133245) do
|
||||||
t.boolean "dark_scheme", :default => false, :null => false
|
t.boolean "dark_scheme", :default => false, :null => false
|
||||||
t.integer "theme_id", :default => 1, :null => false
|
t.integer "theme_id", :default => 1, :null => false
|
||||||
t.string "bio"
|
t.string "bio"
|
||||||
t.boolean "blocked", :default => false, :null => false
|
|
||||||
t.integer "failed_attempts", :default => 0
|
t.integer "failed_attempts", :default => 0
|
||||||
t.datetime "locked_at"
|
t.datetime "locked_at"
|
||||||
t.string "extern_uid"
|
t.string "extern_uid"
|
||||||
|
@ -269,10 +268,10 @@ ActiveRecord::Schema.define(:version => 20130220133245) do
|
||||||
t.string "username"
|
t.string "username"
|
||||||
t.boolean "can_create_group", :default => true, :null => false
|
t.boolean "can_create_group", :default => true, :null => false
|
||||||
t.boolean "can_create_team", :default => true, :null => false
|
t.boolean "can_create_team", :default => true, :null => false
|
||||||
|
t.string "state"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "users", ["admin"], :name => "index_users_on_admin"
|
add_index "users", ["admin"], :name => "index_users_on_admin"
|
||||||
add_index "users", ["blocked"], :name => "index_users_on_blocked"
|
|
||||||
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
|
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
|
||||||
add_index "users", ["extern_uid", "provider"], :name => "index_users_on_extern_uid_and_provider", :unique => true
|
add_index "users", ["extern_uid", "provider"], :name => "index_users_on_extern_uid_and_provider", :unique => true
|
||||||
add_index "users", ["name"], :name => "index_users_on_name"
|
add_index "users", ["name"], :name => "index_users_on_name"
|
||||||
|
|
|
@ -2,11 +2,11 @@ module Gitlab
|
||||||
module Entities
|
module Entities
|
||||||
class User < Grape::Entity
|
class User < Grape::Entity
|
||||||
expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
|
expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
|
||||||
:dark_scheme, :theme_id, :blocked, :created_at, :extern_uid, :provider
|
:dark_scheme, :theme_id, :state, :created_at, :extern_uid, :provider
|
||||||
end
|
end
|
||||||
|
|
||||||
class UserBasic < Grape::Entity
|
class UserBasic < Grape::Entity
|
||||||
expose :id, :username, :email, :name, :blocked, :created_at
|
expose :id, :username, :email, :name, :state, :created_at
|
||||||
end
|
end
|
||||||
|
|
||||||
class UserLogin < UserBasic
|
class UserLogin < UserBasic
|
||||||
|
|
|
@ -41,10 +41,12 @@ module Gitlab
|
||||||
password_confirmation: password,
|
password_confirmation: password,
|
||||||
projects_limit: Gitlab.config.gitlab.default_projects_limit,
|
projects_limit: Gitlab.config.gitlab.default_projects_limit,
|
||||||
}, as: :admin)
|
}, as: :admin)
|
||||||
if Gitlab.config.omniauth['block_auto_created_users'] && !ldap
|
|
||||||
@user.blocked = true
|
|
||||||
end
|
|
||||||
@user.save!
|
@user.save!
|
||||||
|
|
||||||
|
if Gitlab.config.omniauth['block_auto_created_users'] && !ldap
|
||||||
|
@user.block
|
||||||
|
end
|
||||||
|
|
||||||
@user
|
@user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
# dark_scheme :boolean default(FALSE), not null
|
# dark_scheme :boolean default(FALSE), not null
|
||||||
# theme_id :integer default(1), not null
|
# theme_id :integer default(1), not null
|
||||||
# bio :string(255)
|
# bio :string(255)
|
||||||
# blocked :boolean default(FALSE), not null
|
# state :string(255) default(FALSE), not null
|
||||||
# failed_attempts :integer default(0)
|
# failed_attempts :integer default(0)
|
||||||
# locked_at :datetime
|
# locked_at :datetime
|
||||||
# extern_uid :string(255)
|
# extern_uid :string(255)
|
||||||
|
@ -140,7 +140,7 @@ describe User do
|
||||||
|
|
||||||
it "should block user" do
|
it "should block user" do
|
||||||
user.block
|
user.block
|
||||||
user.blocked.should be_true
|
user.blocked?.should be_true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ describe User do
|
||||||
User.delete_all
|
User.delete_all
|
||||||
@user = create :user
|
@user = create :user
|
||||||
@admin = create :user, admin: true
|
@admin = create :user, admin: true
|
||||||
@blocked = create :user, blocked: true
|
@blocked = create :user, state: :blocked
|
||||||
end
|
end
|
||||||
|
|
||||||
it { User.filter("admins").should == [@admin] }
|
it { User.filter("admins").should == [@admin] }
|
||||||
|
|
Loading…
Reference in a new issue