Skip to content

Commit 40db4cd

Browse files
author
Gauvain Pocentek
committed
Add support for access requests
1 parent 8257400 commit 40db4cd

File tree

5 files changed

+154
-3
lines changed

5 files changed

+154
-3
lines changed

docs/api-objects.rst

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ API objects manipulation
55
.. toctree::
66
:maxdepth: 1
77

8+
gl_objects/access_requests
89
gl_objects/branches
910
gl_objects/builds
1011
gl_objects/commits

docs/gl_objects/access_requests.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# list
2+
p_ars = gl.project_accessrequests.list(project_id=1)
3+
g_ars = gl.group_accessrequests.list(group_id=1)
4+
# or
5+
p_ars = project.accessrequests.list()
6+
g_ars = group.accessrequests.list()
7+
# end list
8+
9+
# get
10+
p_ar = gl.project_accessrequests.get(user_id, project_id=1)
11+
g_ar = gl.group_accessrequests.get(user_id, group_id=1)
12+
# or
13+
p_ar = project.accessrequests.get(user_id)
14+
g_ar = group.accessrequests.get(user_id)
15+
# end get
16+
17+
# create
18+
p_ar = gl.project_accessrequests.create({}, project_id=1)
19+
g_ar = gl.group_accessrequests.create({}, group_id=1)
20+
# or
21+
p_ar = project.accessrequests.create({})
22+
g_ar = group.accessrequests.create({})
23+
# end create
24+
25+
# approve
26+
ar.approve() # defaults to DEVELOPER level
27+
ar.approve(access_level=gitlab.MASTER_ACCESS) # explicitly set access level
28+
# approve
29+
30+
# delete
31+
gl.project_accessrequests.delete(user_id, project_id=1)
32+
gl.group_accessrequests.delete(user_id, group_id=1)
33+
# or
34+
project.accessrequests.delete(user_id)
35+
group.accessrequests.delete(user_id)
36+
# or
37+
ar.delete()
38+
# end delete

docs/gl_objects/access_requests.rst

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
###############
2+
Access requests
3+
###############
4+
5+
Use :class:`~gitlab.objects.ProjectAccessRequest` and
6+
:class:`~gitlab.objects.GroupAccessRequest` objects to manipulate access
7+
requests for projects and groups. The
8+
:attr:`gitlab.Gitlab.project_accessrequests`,
9+
:attr:`gitlab.Gitlab.group_accessrequests`, :attr:`Project.accessrequests
10+
<gitlab.objects.Project.accessrequests>` and :attr:`Group.accessrequests
11+
<gitlab.objects.Group.accessrequests>` manager objects provide helper
12+
functions.
13+
14+
Examples
15+
--------
16+
17+
List access requests from projects and groups:
18+
19+
.. literalinclude:: access_requests.py
20+
:start-after: # list
21+
:end-before: # end list
22+
23+
Get a single request:
24+
25+
.. literalinclude:: access_requests.py
26+
:start-after: # get
27+
:end-before: # end get
28+
29+
Create an access request:
30+
31+
.. literalinclude:: access_requests.py
32+
:start-after: # create
33+
:end-before: # end create
34+
35+
Approve an access request:
36+
37+
.. literalinclude:: access_requests.py
38+
:start-after: # approve
39+
:end-before: # end approve
40+
41+
Deny (delete) an access request:
42+
43+
.. literalinclude:: access_requests.py
44+
:start-after: # delete
45+
:end-before: # end delete

gitlab/__init__.py

+6
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class Gitlab(object):
7070
user_keys (UserKeyManager): Manager for GitLab users' SSH keys.
7171
users (UserManager): Manager for GitLab users
7272
keys (DeployKeyManager): Manager for deploy keys
73+
group_accessrequests (GroupAccessRequestManager): Manager for GitLab
74+
groups access requests
7375
group_issues (GroupIssueManager): Manager for GitLab group issues
7476
group_projects (GroupProjectManager): Manager for GitLab group projects
7577
group_members (GroupMemberManager): Manager for GitLab group members
@@ -78,6 +80,8 @@ class Gitlab(object):
7880
issues (IssueManager): Manager for GitLab issues
7981
licenses (LicenseManager): Manager for licenses
8082
namespaces (NamespaceManager): Manager for namespaces
83+
project_accessrequests (ProjectAccessRequestManager): Manager for
84+
GitLab projects access requests
8185
project_branches (ProjectBranchManager): Manager for GitLab projects
8286
branches
8387
project_builds (ProjectBuildManager): Manager for GitLab projects
@@ -159,6 +163,7 @@ def __init__(self, url, private_token=None, email=None, password=None,
159163
self.user_keys = UserKeyManager(self)
160164
self.users = UserManager(self)
161165
self.keys = KeyManager(self)
166+
self.group_accessrequests = GroupAccessRequestManager(self)
162167
self.group_issues = GroupIssueManager(self)
163168
self.group_projects = GroupProjectManager(self)
164169
self.group_members = GroupMemberManager(self)
@@ -167,6 +172,7 @@ def __init__(self, url, private_token=None, email=None, password=None,
167172
self.issues = IssueManager(self)
168173
self.licenses = LicenseManager(self)
169174
self.namespaces = NamespaceManager(self)
175+
self.project_accessrequests = ProjectAccessRequestManager(self)
170176
self.project_branches = ProjectBranchManager(self)
171177
self.project_builds = ProjectBuildManager(self)
172178
self.project_commits = ProjectCommitManager(self)

gitlab/objects.py

+64-3
Original file line numberDiff line numberDiff line change
@@ -768,16 +768,47 @@ class GroupProjectManager(BaseManager):
768768
obj_cls = GroupProject
769769

770770

771+
class GroupAccessRequest(GitlabObject):
772+
_url = '/groups/%(group_id)s/access_requests'
773+
canGet = 'from_list'
774+
canUpdate = False
775+
776+
def approve(self, access_level=gitlab.DEVELOPER_ACCESS, **kwargs):
777+
"""Approve an access request.
778+
779+
Attrs:
780+
access_level (int): The access level for the user.
781+
782+
Raises:
783+
GitlabConnectionError: If the server cannot be reached.
784+
GitlabUpdateError: If the server fails to perform the request.
785+
"""
786+
787+
url = ('/groups/%(group_id)s/access_requests/%(id)s/approve' %
788+
{'group_id': self.group_id, 'id': self.id})
789+
data = {'access_level': access_level}
790+
r = self.gitlab._raw_put(url, data=data, **kwargs)
791+
raise_error_from_response(r, GitlabUpdateError, 201)
792+
self._set_from_dict(r.json())
793+
794+
795+
class GroupAccessRequestManager(BaseManager):
796+
obj_cls = GroupAccessRequest
797+
798+
771799
class Group(GitlabObject):
772800
_url = '/groups'
773801
_constructorTypes = {'projects': 'Project'}
774802
requiredCreateAttrs = ['name', 'path']
775803
optionalCreateAttrs = ['description', 'visibility_level']
776804
optionalUpdateAttrs = ['name', 'path', 'description', 'visibility_level']
777805
shortPrintAttr = 'name'
778-
managers = [('members', GroupMemberManager, [('group_id', 'id')]),
779-
('projects', GroupProjectManager, [('group_id', 'id')]),
780-
('issues', GroupIssueManager, [('group_id', 'id')])]
806+
managers = [
807+
('accessrequests', GroupAccessRequestManager, [('group_id', 'id')]),
808+
('members', GroupMemberManager, [('group_id', 'id')]),
809+
('projects', GroupProjectManager, [('group_id', 'id')]),
810+
('issues', GroupIssueManager, [('group_id', 'id')])
811+
]
781812

782813
GUEST_ACCESS = gitlab.GUEST_ACCESS
783814
REPORTER_ACCESS = gitlab.REPORTER_ACCESS
@@ -1803,6 +1834,34 @@ def available(self, **kwargs):
18031834
return json.dumps(ProjectService._service_attrs.keys())
18041835

18051836

1837+
class ProjectAccessRequest(GitlabObject):
1838+
_url = '/projects/%(project_id)s/access_requests'
1839+
canGet = 'from_list'
1840+
canUpdate = False
1841+
1842+
def approve(self, access_level=gitlab.DEVELOPER_ACCESS, **kwargs):
1843+
"""Approve an access request.
1844+
1845+
Attrs:
1846+
access_level (int): The access level for the user.
1847+
1848+
Raises:
1849+
GitlabConnectionError: If the server cannot be reached.
1850+
GitlabUpdateError: If the server fails to perform the request.
1851+
"""
1852+
1853+
url = ('/projects/%(project_id)s/access_requests/%(id)s/approve' %
1854+
{'project_id': self.project_id, 'id': self.id})
1855+
data = {'access_level': access_level}
1856+
r = self.gitlab._raw_put(url, data=data, **kwargs)
1857+
raise_error_from_response(r, GitlabUpdateError, 201)
1858+
self._set_from_dict(r.json())
1859+
1860+
1861+
class ProjectAccessRequestManager(BaseManager):
1862+
obj_cls = ProjectAccessRequest
1863+
1864+
18061865
class Project(GitlabObject):
18071866
_url = '/projects'
18081867
_constructorTypes = {'owner': 'User', 'namespace': 'Group'}
@@ -1822,6 +1881,8 @@ class Project(GitlabObject):
18221881
'public_builds']
18231882
shortPrintAttr = 'path'
18241883
managers = [
1884+
('accessrequests', ProjectAccessRequestManager,
1885+
[('project_id', 'id')]),
18251886
('branches', ProjectBranchManager, [('project_id', 'id')]),
18261887
('builds', ProjectBuildManager, [('project_id', 'id')]),
18271888
('commits', ProjectCommitManager, [('project_id', 'id')]),

0 commit comments

Comments
 (0)