Commit f22488f7 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge pull request #3143 from Undev/state-machine-3

State machine 3
parents f9200e11 c6d6bd6a
...@@ -45,7 +45,7 @@ class Admin::UsersController < Admin::ApplicationController ...@@ -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 ...@@ -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 ...@@ -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 @@ ...@@ -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)
...@@ -110,10 +110,27 @@ class User < ActiveRecord::Base ...@@ -110,10 +110,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) }
...@@ -283,17 +300,6 @@ class User < ActiveRecord::Base ...@@ -283,17 +300,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 @@ ...@@ -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 @@ ...@@ -53,7 +53,7 @@
&nbsp; &nbsp;
= 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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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
......
class AddStateToUser < ActiveRecord::Migration
def change
add_column :users, :state, :string
end
end
class ConvertBlockedToState < ActiveRecord::Migration
def up
User.transaction do
User.where(blocked: true).update_all(state: :blocked)
User.where(blocked: false).update_all(state: :active)
end
end
def down
User.transaction do
User.where(state: :blocked).update_all(blocked: :true)
end
end
end
class RemoveBlockedFromUser < ActiveRecord::Migration
def up
remove_column :users, :blocked
end
def down
add_column :users, :blocked, :boolean
end
end
...@@ -11,7 +11,7 @@ ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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)
@user.save!
if Gitlab.config.omniauth['block_auto_created_users'] && !ldap if Gitlab.config.omniauth['block_auto_created_users'] && !ldap
@user.blocked = true @user.block
end end
@user.save!
@user @user
end end
......
...@@ -25,7 +25,7 @@ ...@@ -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 ...@@ -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 ...@@ -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] }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment