Commit f22488f7262145c1e318db15c0af2091e67d5007

Authored by Dmitriy Zaporozhets
2 parents f9200e11 c6d6bd6a

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

State machine 3
app/controllers/admin/users_controller.rb
@@ -45,7 +45,7 @@ class Admin::UsersController < Admin::ApplicationController @@ -45,7 +45,7 @@ class Admin::UsersController < Admin::ApplicationController
45 end 45 end
46 46
47 def unblock 47 def unblock
48 - if admin_user.update_attribute(:blocked, false) 48 + if admin_user.activate
49 redirect_to :back, alert: "Successfully unblocked" 49 redirect_to :back, alert: "Successfully unblocked"
50 else 50 else
51 redirect_to :back, alert: "Error occured. User was not unblocked" 51 redirect_to :back, alert: "Error occured. User was not unblocked"
app/controllers/application_controller.rb
@@ -30,7 +30,7 @@ class ApplicationController < ActionController::Base @@ -30,7 +30,7 @@ class ApplicationController < ActionController::Base
30 end 30 end
31 31
32 def reject_blocked! 32 def reject_blocked!
33 - if current_user && current_user.blocked 33 + if current_user && current_user.blocked?
34 sign_out current_user 34 sign_out current_user
35 flash[:alert] = "Your account is blocked. Retry when an admin unblock it." 35 flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
36 redirect_to new_user_session_path 36 redirect_to new_user_session_path
@@ -38,7 +38,7 @@ class ApplicationController < ActionController::Base @@ -38,7 +38,7 @@ class ApplicationController < ActionController::Base
38 end 38 end
39 39
40 def after_sign_in_path_for resource 40 def after_sign_in_path_for resource
41 - if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked 41 + if resource.is_a?(User) && resource.respond_to?(:blocked?) && resource.blocked?
42 sign_out resource 42 sign_out resource
43 flash[:alert] = "Your account is blocked. Retry when an admin unblock it." 43 flash[:alert] = "Your account is blocked. Retry when an admin unblock it."
44 new_user_session_path 44 new_user_session_path
app/models/user.rb
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
25 # dark_scheme :boolean default(FALSE), not null 25 # dark_scheme :boolean default(FALSE), not null
26 # theme_id :integer default(1), not null 26 # theme_id :integer default(1), not null
27 # bio :string(255) 27 # bio :string(255)
28 -# blocked :boolean default(FALSE), not null 28 +# state :string(255)
29 # failed_attempts :integer default(0) 29 # failed_attempts :integer default(0)
30 # locked_at :datetime 30 # locked_at :datetime
31 # extern_uid :string(255) 31 # extern_uid :string(255)
@@ -110,10 +110,27 @@ class User < ActiveRecord::Base @@ -110,10 +110,27 @@ class User < ActiveRecord::Base
110 110
111 delegate :path, to: :namespace, allow_nil: true, prefix: true 111 delegate :path, to: :namespace, allow_nil: true, prefix: true
112 112
  113 + state_machine :state, initial: :active do
  114 + after_transition any => :blocked do |user, transition|
  115 + # Remove user from all projects and
  116 + user.users_projects.find_each do |membership|
  117 + return false unless membership.destroy
  118 + end
  119 + end
  120 +
  121 + event :block do
  122 + transition active: :blocked
  123 + end
  124 +
  125 + event :activate do
  126 + transition blocked: :active
  127 + end
  128 + end
  129 +
113 # Scopes 130 # Scopes
114 scope :admins, -> { where(admin: true) } 131 scope :admins, -> { where(admin: true) }
115 - scope :blocked, -> { where(blocked: true) }  
116 - scope :active, -> { where(blocked: false) } 132 + scope :blocked, -> { with_state(:blocked) }
  133 + scope :active, -> { with_state(:active) }
117 scope :alphabetically, -> { order('name ASC') } 134 scope :alphabetically, -> { order('name ASC') }
118 scope :in_team, ->(team){ where(id: team.member_ids) } 135 scope :in_team, ->(team){ where(id: team.member_ids) }
119 scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) } 136 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
283 MergeRequest.cared(self) 300 MergeRequest.cared(self)
284 end 301 end
285 302
286 - # Remove user from all projects and  
287 - # set blocked attribute to true  
288 - def block  
289 - users_projects.find_each do |membership|  
290 - return false unless membership.destroy  
291 - end  
292 -  
293 - self.blocked = true  
294 - save  
295 - end  
296 -  
297 def projects_limit_percent 303 def projects_limit_percent
298 return 100 if projects_limit.zero? 304 return 100 if projects_limit.zero?
299 (personal_projects.count.to_f / projects_limit) * 100 305 (personal_projects.count.to_f / projects_limit) * 100
app/views/admin/users/_form.html.haml
@@ -61,7 +61,7 @@ @@ -61,7 +61,7 @@
61 .span4 61 .span4
62 - unless @admin_user.new_record? 62 - unless @admin_user.new_record?
63 .alert.alert-error 63 .alert.alert-error
64 - - if @admin_user.blocked 64 + - if @admin_user.blocked?
65 %p This user is blocked and is not able to login to GitLab 65 %p This user is blocked and is not able to login to GitLab
66 = link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn btn-small" 66 = link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn btn-small"
67 - else 67 - else
app/views/admin/users/index.html.haml
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53   53  
54 = link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn btn-small" 54 = link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn btn-small"
55 - unless user == current_user 55 - unless user == current_user
56 - - if user.blocked 56 + - if user.blocked?
57 = link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn btn-small success" 57 = link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn btn-small success"
58 - else 58 - else
59 = link_to 'Block', block_admin_user_path(user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn btn-small btn-remove" 59 = link_to 'Block', block_admin_user_path(user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn btn-small btn-remove"
app/views/admin/users/show.html.haml
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 %h3.page_title 3 %h3.page_title
4 = image_tag gravatar_icon(@admin_user.email, 90), class: "avatar s90" 4 = image_tag gravatar_icon(@admin_user.email, 90), class: "avatar s90"
5 = @admin_user.name 5 = @admin_user.name
6 - - if @admin_user.blocked 6 + - if @admin_user.blocked?
7 %span.cred (Blocked) 7 %span.cred (Blocked)
8 - if @admin_user.admin 8 - if @admin_user.admin
9 %span.cred (Admin) 9 %span.cred (Admin)
app/views/team_members/_team_member.html.haml
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 %span.label This is you! 20 %span.label This is you!
21 - if @project.namespace_owner == user 21 - if @project.namespace_owner == user
22 %span.label Owner 22 %span.label Owner
23 - - elsif user.blocked 23 + - elsif user.blocked?
24 %span.label Blocked 24 %span.label Blocked
25 - elsif allow_admin 25 - elsif allow_admin
26 = 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 26 = 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
app/views/teams/members/_show.html.haml
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 %span.btn.disabled This is you! 23 %span.btn.disabled This is you!
24 - if @team.owner == user 24 - if @team.owner == user
25 %span.btn.disabled Owner 25 %span.btn.disabled Owner
26 - - elsif user.blocked 26 + - elsif user.blocked?
27 %span.btn.disabled.blocked Blocked 27 %span.btn.disabled.blocked Blocked
28 - elsif allow_admin 28 - elsif allow_admin
29 = 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 29 = 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
db/migrate/20130304104623_add_state_to_user.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +class AddStateToUser < ActiveRecord::Migration
  2 + def change
  3 + add_column :users, :state, :string
  4 + end
  5 +end
db/migrate/20130304104740_convert_blocked_to_state.rb 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +class ConvertBlockedToState < ActiveRecord::Migration
  2 + def up
  3 + User.transaction do
  4 + User.where(blocked: true).update_all(state: :blocked)
  5 + User.where(blocked: false).update_all(state: :active)
  6 + end
  7 + end
  8 +
  9 + def down
  10 + User.transaction do
  11 + User.where(state: :blocked).update_all(blocked: :true)
  12 + end
  13 + end
  14 +end
db/migrate/20130304105317_remove_blocked_from_user.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +class RemoveBlockedFromUser < ActiveRecord::Migration
  2 + def up
  3 + remove_column :users, :blocked
  4 + end
  5 +
  6 + def down
  7 + add_column :users, :blocked, :boolean
  8 + end
  9 +end
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended to check this file into your version control system. 12 # It's strongly recommended to check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(:version => 20130220133245) do 14 +ActiveRecord::Schema.define(:version => 20130304105317) do
15 15
16 create_table "events", :force => true do |t| 16 create_table "events", :force => true do |t|
17 t.string "target_type" 17 t.string "target_type"
@@ -261,7 +261,6 @@ ActiveRecord::Schema.define(:version =&gt; 20130220133245) do @@ -261,7 +261,6 @@ ActiveRecord::Schema.define(:version =&gt; 20130220133245) do
261 t.boolean "dark_scheme", :default => false, :null => false 261 t.boolean "dark_scheme", :default => false, :null => false
262 t.integer "theme_id", :default => 1, :null => false 262 t.integer "theme_id", :default => 1, :null => false
263 t.string "bio" 263 t.string "bio"
264 - t.boolean "blocked", :default => false, :null => false  
265 t.integer "failed_attempts", :default => 0 264 t.integer "failed_attempts", :default => 0
266 t.datetime "locked_at" 265 t.datetime "locked_at"
267 t.string "extern_uid" 266 t.string "extern_uid"
@@ -269,10 +268,10 @@ ActiveRecord::Schema.define(:version =&gt; 20130220133245) do @@ -269,10 +268,10 @@ ActiveRecord::Schema.define(:version =&gt; 20130220133245) do
269 t.string "username" 268 t.string "username"
270 t.boolean "can_create_group", :default => true, :null => false 269 t.boolean "can_create_group", :default => true, :null => false
271 t.boolean "can_create_team", :default => true, :null => false 270 t.boolean "can_create_team", :default => true, :null => false
  271 + t.string "state"
272 end 272 end
273 273
274 add_index "users", ["admin"], :name => "index_users_on_admin" 274 add_index "users", ["admin"], :name => "index_users_on_admin"
275 - add_index "users", ["blocked"], :name => "index_users_on_blocked"  
276 add_index "users", ["email"], :name => "index_users_on_email", :unique => true 275 add_index "users", ["email"], :name => "index_users_on_email", :unique => true
277 add_index "users", ["extern_uid", "provider"], :name => "index_users_on_extern_uid_and_provider", :unique => true 276 add_index "users", ["extern_uid", "provider"], :name => "index_users_on_extern_uid_and_provider", :unique => true
278 add_index "users", ["name"], :name => "index_users_on_name" 277 add_index "users", ["name"], :name => "index_users_on_name"
lib/api/entities.rb
@@ -2,11 +2,11 @@ module Gitlab @@ -2,11 +2,11 @@ module Gitlab
2 module Entities 2 module Entities
3 class User < Grape::Entity 3 class User < Grape::Entity
4 expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter, 4 expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
5 - :dark_scheme, :theme_id, :blocked, :created_at, :extern_uid, :provider 5 + :dark_scheme, :theme_id, :state, :created_at, :extern_uid, :provider
6 end 6 end
7 7
8 class UserBasic < Grape::Entity 8 class UserBasic < Grape::Entity
9 - expose :id, :username, :email, :name, :blocked, :created_at 9 + expose :id, :username, :email, :name, :state, :created_at
10 end 10 end
11 11
12 class UserLogin < UserBasic 12 class UserLogin < UserBasic
lib/gitlab/auth.rb
@@ -41,10 +41,12 @@ module Gitlab @@ -41,10 +41,12 @@ module Gitlab
41 password_confirmation: password, 41 password_confirmation: password,
42 projects_limit: Gitlab.config.gitlab.default_projects_limit, 42 projects_limit: Gitlab.config.gitlab.default_projects_limit,
43 }, as: :admin) 43 }, as: :admin)
  44 + @user.save!
  45 +
44 if Gitlab.config.omniauth['block_auto_created_users'] && !ldap 46 if Gitlab.config.omniauth['block_auto_created_users'] && !ldap
45 - @user.blocked = true 47 + @user.block
46 end 48 end
47 - @user.save! 49 +
48 @user 50 @user
49 end 51 end
50 52
spec/models/user_spec.rb
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
25 # dark_scheme :boolean default(FALSE), not null 25 # dark_scheme :boolean default(FALSE), not null
26 # theme_id :integer default(1), not null 26 # theme_id :integer default(1), not null
27 # bio :string(255) 27 # bio :string(255)
28 -# blocked :boolean default(FALSE), not null 28 +# state :string(255) default(FALSE), not null
29 # failed_attempts :integer default(0) 29 # failed_attempts :integer default(0)
30 # locked_at :datetime 30 # locked_at :datetime
31 # extern_uid :string(255) 31 # extern_uid :string(255)
@@ -140,7 +140,7 @@ describe User do @@ -140,7 +140,7 @@ describe User do
140 140
141 it "should block user" do 141 it "should block user" do
142 user.block 142 user.block
143 - user.blocked.should be_true 143 + user.blocked?.should be_true
144 end 144 end
145 end 145 end
146 146
@@ -149,7 +149,7 @@ describe User do @@ -149,7 +149,7 @@ describe User do
149 User.delete_all 149 User.delete_all
150 @user = create :user 150 @user = create :user
151 @admin = create :user, admin: true 151 @admin = create :user, admin: true
152 - @blocked = create :user, blocked: true 152 + @blocked = create :user, state: :blocked
153 end 153 end
154 154
155 it { User.filter("admins").should == [@admin] } 155 it { User.filter("admins").should == [@admin] }