Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
4e4998423102
Commit
4e499842
authored
Nov 17, 2015
by
Douwe Maan
Browse files
Refactor ability changes
parent
4563cd10d38c
Changes
5
Hide whitespace changes
Inline
Side-by-side
app/models/ability.rb
View file @
4e499842
...
...
@@ -240,11 +240,11 @@
# Only group owner and administrators can admin group
if
group
.
has_owner?
(
user
)
||
user
.
admin?
rules
.
push
(
*
[
:admin_group
,
:admin_namespace
,
:admin_group_member
]
)
rules
+=
[
:admin_group
,
:admin_namespace
,
:admin_group_member
]
end
rules
.
flatten
...
...
@@ -255,12 +255,12 @@
# Only namespace owner and administrators can admin it
if
namespace
.
owner
==
user
||
user
.
admin?
rules
.
push
(
*
[
:create_projects
,
:admin_namespace
]
)
rules
+=
[
:create_projects
,
:admin_namespace
]
end
rules
.
flatten
end
...
...
@@ -262,9 +262,8 @@
end
rules
.
flatten
end
[
:issue
,
:merge_request
].
each
do
|
name
|
define_method
"
#{
name
}
_abilities"
do
|
user
,
subject
|
rules
=
[]
...
...
@@ -305,5 +304,7 @@
rules
=
[]
target_user
=
subject
.
user
group
=
subject
.
group
can_manage
=
group_abilities
(
user
,
group
).
include?
(
:admin_group_member
)
unless
group
.
last_owner?
(
target_user
)
can_manage
=
group_abilities
(
user
,
group
).
include?
(
:admin_group_member
)
...
...
@@ -309,6 +310,6 @@
if
can_manage
&&
(
user
!=
target_user
)
rules
<<
:update_group_member
rules
<<
:destroy_group_member
end
if
can_manage
&&
user
!=
target_user
rules
<<
:update_group_member
rules
<<
:destroy_group_member
end
...
...
@@ -314,6 +315,7 @@
if
!
group
.
last_owner?
(
user
)
&&
(
can_manage
||
(
user
==
target_user
))
rules
<<
:destroy_group_member
if
user
==
target_user
rules
<<
:destroy_group_member
end
end
rules
...
...
@@ -323,5 +325,7 @@
rules
=
[]
target_user
=
subject
.
user
project
=
subject
.
project
can_manage
=
project_abilities
(
user
,
project
).
include?
(
:admin_project_member
)
unless
target_user
==
project
.
owner
can_manage
=
project_abilities
(
user
,
project
).
include?
(
:admin_project_member
)
...
...
@@ -327,6 +331,11 @@
if
can_manage
&&
user
!=
target_user
&&
target_user
!=
project
.
owner
rules
<<
:update_project_member
rules
<<
:destroy_project_member
if
can_manage
&&
user
!=
target_user
rules
<<
:update_project_member
rules
<<
:destroy_project_member
end
if
user
==
target_user
rules
<<
:destroy_project_member
end
end
...
...
@@ -331,8 +340,5 @@
end
if
user
==
target_user
&&
target_user
!=
project
.
owner
rules
<<
:destroy_project_member
end
rules
end
...
...
app/models/concerns/has_owners.rb
deleted
100644 → 0
View file @
4563cd10
# == Owners concern
#
# Contains owners functionality for groups
#
module
HasOwners
extend
ActiveSupport
::
Concern
def
owners
@owners
||=
members
.
owners
.
includes
(
:user
).
map
(
&
:user
)
end
def
members
raise
NotImplementedError
,
"Expected members to be defined in
#{
self
.
class
.
name
}
"
end
def
add_owner
(
user
,
current_user
=
nil
)
add_user
(
user
,
Gitlab
::
Access
::
OWNER
,
current_user
)
end
def
has_owner?
(
user
)
owners
.
include?
(
user
)
end
def
has_master?
(
user
)
members
.
masters
.
where
(
user_id:
user
).
any?
end
def
last_owner?
(
user
)
has_owner?
(
user
)
&&
owners
.
size
==
1
end
end
app/models/group.rb
View file @
4e499842
...
...
@@ -20,8 +20,7 @@
class
Group
<
Namespace
include
Gitlab
::
ConfigHelper
include
Referable
include
HasOwners
has_many
:group_members
,
dependent: :destroy
,
as: :source
,
class_name:
'GroupMember'
alias_method
:members
,
:group_members
has_many
:users
,
through: :group_members
...
...
@@ -66,6 +65,10 @@
end
end
def
owners
@owners
||=
group_members
.
owners
.
includes
(
:user
).
map
(
&
:user
)
end
def
add_users
(
user_ids
,
access_level
,
current_user
=
nil
)
user_ids
.
each
do
|
user_id
|
Member
.
add_user
(
self
.
group_members
,
user_id
,
access_level
,
current_user
)
...
...
@@ -92,6 +95,22 @@
add_user
(
user
,
Gitlab
::
Access
::
MASTER
,
current_user
)
end
def
add_owner
(
user
,
current_user
=
nil
)
add_user
(
user
,
Gitlab
::
Access
::
OWNER
,
current_user
)
end
def
has_owner?
(
user
)
owners
.
include?
(
user
)
end
def
has_master?
(
user
)
members
.
masters
.
where
(
user_id:
user
).
any?
end
def
last_owner?
(
user
)
has_owner?
(
user
)
&&
owners
.
size
==
1
end
def
avatar_type
unless
self
.
avatar
.
image?
self
.
errors
.
add
:avatar
,
"only images allowed"
...
...
app/models/member.rb
View file @
4e499842
...
...
@@ -34,16 +34,18 @@
message:
"already exists in source"
,
allow_nil:
true
}
validates
:access_level
,
inclusion:
{
in:
Gitlab
::
Access
.
all_values
},
presence:
true
validates
:invite_email
,
presence:
{
if: :invite?
},
email:
{
strict_mode:
true
,
allow_nil:
true
},
uniqueness:
{
scope:
[
:source_type
,
:source_id
],
allow_nil:
true
}
validates
:invite_email
,
presence:
{
if: :invite?
},
email:
{
strict_mode:
true
,
allow_nil:
true
},
uniqueness:
{
scope:
[
:source_type
,
:source_id
],
allow_nil:
true
}
scope
:invite
,
->
{
where
(
user_id:
nil
)
}
scope
:non_invite
,
->
{
where
(
"user_id IS NOT NULL"
)
}
...
...
@@ -100,7 +102,9 @@
private
def
can_update_member?
(
current_user
,
member
)
!
current_user
||
current_user
.
can?
(
:update_group_member
,
member
)
||
# There is no current user for bulk actions, in which case anything is allowed
!
current_user
||
current_user
.
can?
(
:update_group_member
,
member
)
||
current_user
.
can?
(
:update_project_member
,
member
)
end
end
...
...
app/models/project.rb
View file @
4e499842
...
...
@@ -42,8 +42,7 @@
include
Sortable
include
AfterCommitQueue
include
CaseSensitivity
include
HasOwners
extend
Gitlab
::
ConfigHelper
extend
Enumerize
...
...
@@ -117,7 +116,6 @@
has_many
:hooks
,
dependent: :destroy
,
class_name:
'ProjectHook'
has_many
:protected_branches
,
dependent: :destroy
has_many
:project_members
,
dependent: :destroy
,
as: :source
,
class_name:
'ProjectMember'
alias_method
:my_members
,
:project_members
has_many
:users
,
through: :project_members
has_many
:deploy_keys_projects
,
dependent: :destroy
has_many
:deploy_keys
,
through: :deploy_keys_projects
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment