Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
8a40e0ef
Commit
8a40e0ef
authored
Sep 14, 2016
by
Rémy Coutable
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://dev.gitlab.org/gitlab/gitlabhq
parents
cbf47885
1b200b19
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
11 deletions
+64
-11
app/models/member.rb
app/models/member.rb
+25
-8
spec/models/member_spec.rb
spec/models/member_spec.rb
+39
-3
No files found.
app/models/member.rb
View file @
8a40e0ef
...
...
@@ -28,17 +28,34 @@ class Member < ActiveRecord::Base
allow_nil:
true
}
# This scope encapsulates (most of) the conditions a row in the member table
# must satisfy if it is a valid permission. Of particular note:
#
# * Access requests must be excluded
# * Blocked users must be excluded
# * Invitations take effect immediately
# * expires_at is not implemented. A background worker purges expired rows
scope
:active
,
->
do
is_external_invite
=
arel_table
[
:user_id
].
eq
(
nil
).
and
(
arel_table
[
:invite_token
].
not_eq
(
nil
))
user_is_active
=
User
.
arel_table
[
:state
].
eq
(
:active
)
includes
(
:user
).
references
(
:users
)
.
where
(
is_external_invite
.
or
(
user_is_active
))
.
where
(
requested_at:
nil
)
end
scope
:invite
,
->
{
where
.
not
(
invite_token:
nil
)
}
scope
:non_invite
,
->
{
where
(
invite_token:
nil
)
}
scope
:request
,
->
{
where
.
not
(
requested_at:
nil
)
}
scope
:has_access
,
->
{
where
(
'access_level > 0'
)
}
scope
:guests
,
->
{
where
(
access_level:
GUEST
)
}
scope
:reporters
,
->
{
where
(
access_level:
REPORTER
)
}
scope
:developers
,
->
{
where
(
access_level:
DEVELOPER
)
}
scope
:masters
,
->
{
where
(
access_level:
MASTER
)
}
scope
:owners
,
->
{
where
(
access_level:
OWNER
)
}
scope
:owners_and_masters
,
->
{
where
(
access_level:
[
OWNER
,
MASTER
])
}
scope
:has_access
,
->
{
active
.
where
(
'access_level > 0'
)
}
scope
:guests
,
->
{
active
.
where
(
access_level:
GUEST
)
}
scope
:reporters
,
->
{
active
.
where
(
access_level:
REPORTER
)
}
scope
:developers
,
->
{
active
.
where
(
access_level:
DEVELOPER
)
}
scope
:masters
,
->
{
active
.
where
(
access_level:
MASTER
)
}
scope
:owners
,
->
{
active
.
where
(
access_level:
OWNER
)
}
scope
:owners_and_masters
,
->
{
active
.
where
(
access_level:
[
OWNER
,
MASTER
])
}
before_validation
:generate_invite_token
,
on: :create
,
if:
->
(
member
)
{
member
.
invite_email
.
present?
}
...
...
spec/models/member_spec.rb
View file @
8a40e0ef
...
...
@@ -57,7 +57,7 @@ describe Member, models: true do
describe
'Scopes & finders'
do
before
do
project
=
create
(
:project
)
project
=
create
(
:
empty_
project
)
group
=
create
(
:group
)
@owner_user
=
create
(
:user
).
tap
{
|
u
|
group
.
add_owner
(
u
)
}
@owner
=
group
.
members
.
find_by
(
user_id:
@owner_user
.
id
)
...
...
@@ -65,6 +65,15 @@ describe Member, models: true do
@master_user
=
create
(
:user
).
tap
{
|
u
|
project
.
team
<<
[
u
,
:master
]
}
@master
=
project
.
members
.
find_by
(
user_id:
@master_user
.
id
)
@blocked_user
=
create
(
:user
).
tap
do
|
u
|
project
.
team
<<
[
u
,
:master
]
project
.
team
<<
[
u
,
:developer
]
u
.
block!
end
@blocked_master
=
project
.
members
.
find_by
(
user_id:
@blocked_user
.
id
,
access_level:
Gitlab
::
Access
::
MASTER
)
@blocked_developer
=
project
.
members
.
find_by
(
user_id:
@blocked_user
.
id
,
access_level:
Gitlab
::
Access
::
DEVELOPER
)
Member
.
add_user
(
project
.
members
,
'toto1@example.com'
,
...
...
@@ -73,7 +82,7 @@ describe Member, models: true do
)
@invited_member
=
project
.
members
.
invite
.
find_by_invite_email
(
'toto1@example.com'
)
accepted_invite_user
=
build
(
:user
)
accepted_invite_user
=
build
(
:user
,
state: :active
)
Member
.
add_user
(
project
.
members
,
'toto2@example.com'
,
...
...
@@ -91,7 +100,7 @@ describe Member, models: true do
describe
'.access_for_user_ids'
do
it
'returns the right access levels'
do
users
=
[
@owner_user
.
id
,
@master_user
.
id
]
users
=
[
@owner_user
.
id
,
@master_user
.
id
,
@blocked_user
.
id
]
expected
=
{
@owner_user
.
id
=>
Gitlab
::
Access
::
OWNER
,
@master_user
.
id
=>
Gitlab
::
Access
::
MASTER
...
...
@@ -125,6 +134,19 @@ describe Member, models: true do
it
{
expect
(
described_class
.
request
).
not_to
include
@accepted_request_member
}
end
describe
'.developers'
do
subject
{
described_class
.
developers
.
to_a
}
it
{
is_expected
.
not_to
include
@owner
}
it
{
is_expected
.
not_to
include
@master
}
it
{
is_expected
.
to
include
@invited_member
}
it
{
is_expected
.
to
include
@accepted_invite_member
}
it
{
is_expected
.
not_to
include
@requested_member
}
it
{
is_expected
.
to
include
@accepted_request_member
}
it
{
is_expected
.
not_to
include
@blocked_master
}
it
{
is_expected
.
not_to
include
@blocked_developer
}
end
describe
'.owners_and_masters'
do
it
{
expect
(
described_class
.
owners_and_masters
).
to
include
@owner
}
it
{
expect
(
described_class
.
owners_and_masters
).
to
include
@master
}
...
...
@@ -132,6 +154,20 @@ describe Member, models: true do
it
{
expect
(
described_class
.
owners_and_masters
).
not_to
include
@accepted_invite_member
}
it
{
expect
(
described_class
.
owners_and_masters
).
not_to
include
@requested_member
}
it
{
expect
(
described_class
.
owners_and_masters
).
not_to
include
@accepted_request_member
}
it
{
expect
(
described_class
.
owners_and_masters
).
not_to
include
@blocked_master
}
end
describe
'.has_access'
do
subject
{
described_class
.
has_access
.
to_a
}
it
{
is_expected
.
to
include
@owner
}
it
{
is_expected
.
to
include
@master
}
it
{
is_expected
.
to
include
@invited_member
}
it
{
is_expected
.
to
include
@accepted_invite_member
}
it
{
is_expected
.
not_to
include
@requested_member
}
it
{
is_expected
.
to
include
@accepted_request_member
}
it
{
is_expected
.
not_to
include
@blocked_master
}
it
{
is_expected
.
not_to
include
@blocked_developer
}
end
end
...
...
Write
Preview
Markdown
is supported
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