Skip to content

Commit

Permalink
Add support for access requests
Browse files Browse the repository at this point in the history
  • Loading branch information
Gauvain Pocentek committed Aug 27, 2016
1 parent 8257400 commit 40db4cd
Show file tree
Hide file tree
Showing 5 changed files with 154 additions and 3 deletions.
1 change: 1 addition & 0 deletions docs/api-objects.rst
Expand Up @@ -5,6 +5,7 @@ API objects manipulation
.. toctree::
:maxdepth: 1

gl_objects/access_requests
gl_objects/branches
gl_objects/builds
gl_objects/commits
Expand Down
38 changes: 38 additions & 0 deletions docs/gl_objects/access_requests.py
@@ -0,0 +1,38 @@
# list
p_ars = gl.project_accessrequests.list(project_id=1)
g_ars = gl.group_accessrequests.list(group_id=1)
# or
p_ars = project.accessrequests.list()
g_ars = group.accessrequests.list()
# end list

# get
p_ar = gl.project_accessrequests.get(user_id, project_id=1)
g_ar = gl.group_accessrequests.get(user_id, group_id=1)
# or
p_ar = project.accessrequests.get(user_id)
g_ar = group.accessrequests.get(user_id)
# end get

# create
p_ar = gl.project_accessrequests.create({}, project_id=1)
g_ar = gl.group_accessrequests.create({}, group_id=1)
# or
p_ar = project.accessrequests.create({})
g_ar = group.accessrequests.create({})
# end create

# approve
ar.approve() # defaults to DEVELOPER level
ar.approve(access_level=gitlab.MASTER_ACCESS) # explicitly set access level
# approve

# delete
gl.project_accessrequests.delete(user_id, project_id=1)
gl.group_accessrequests.delete(user_id, group_id=1)
# or
project.accessrequests.delete(user_id)
group.accessrequests.delete(user_id)
# or
ar.delete()
# end delete
45 changes: 45 additions & 0 deletions docs/gl_objects/access_requests.rst
@@ -0,0 +1,45 @@
###############
Access requests
###############

Use :class:`~gitlab.objects.ProjectAccessRequest` and
:class:`~gitlab.objects.GroupAccessRequest` objects to manipulate access
requests for projects and groups. The
:attr:`gitlab.Gitlab.project_accessrequests`,
:attr:`gitlab.Gitlab.group_accessrequests`, :attr:`Project.accessrequests
<gitlab.objects.Project.accessrequests>` and :attr:`Group.accessrequests
<gitlab.objects.Group.accessrequests>` manager objects provide helper
functions.

Examples
--------

List access requests from projects and groups:

.. literalinclude:: access_requests.py
:start-after: # list
:end-before: # end list

Get a single request:

.. literalinclude:: access_requests.py
:start-after: # get
:end-before: # end get

Create an access request:

.. literalinclude:: access_requests.py
:start-after: # create
:end-before: # end create

Approve an access request:

.. literalinclude:: access_requests.py
:start-after: # approve
:end-before: # end approve

Deny (delete) an access request:

.. literalinclude:: access_requests.py
:start-after: # delete
:end-before: # end delete
6 changes: 6 additions & 0 deletions gitlab/__init__.py
Expand Up @@ -70,6 +70,8 @@ class Gitlab(object):
user_keys (UserKeyManager): Manager for GitLab users' SSH keys.
users (UserManager): Manager for GitLab users
keys (DeployKeyManager): Manager for deploy keys
group_accessrequests (GroupAccessRequestManager): Manager for GitLab
groups access requests
group_issues (GroupIssueManager): Manager for GitLab group issues
group_projects (GroupProjectManager): Manager for GitLab group projects
group_members (GroupMemberManager): Manager for GitLab group members
Expand All @@ -78,6 +80,8 @@ class Gitlab(object):
issues (IssueManager): Manager for GitLab issues
licenses (LicenseManager): Manager for licenses
namespaces (NamespaceManager): Manager for namespaces
project_accessrequests (ProjectAccessRequestManager): Manager for
GitLab projects access requests
project_branches (ProjectBranchManager): Manager for GitLab projects
branches
project_builds (ProjectBuildManager): Manager for GitLab projects
Expand Down Expand Up @@ -159,6 +163,7 @@ def __init__(self, url, private_token=None, email=None, password=None,
self.user_keys = UserKeyManager(self)
self.users = UserManager(self)
self.keys = KeyManager(self)
self.group_accessrequests = GroupAccessRequestManager(self)
self.group_issues = GroupIssueManager(self)
self.group_projects = GroupProjectManager(self)
self.group_members = GroupMemberManager(self)
Expand All @@ -167,6 +172,7 @@ def __init__(self, url, private_token=None, email=None, password=None,
self.issues = IssueManager(self)
self.licenses = LicenseManager(self)
self.namespaces = NamespaceManager(self)
self.project_accessrequests = ProjectAccessRequestManager(self)
self.project_branches = ProjectBranchManager(self)
self.project_builds = ProjectBuildManager(self)
self.project_commits = ProjectCommitManager(self)
Expand Down
67 changes: 64 additions & 3 deletions gitlab/objects.py
Expand Up @@ -768,16 +768,47 @@ class GroupProjectManager(BaseManager):
obj_cls = GroupProject


class GroupAccessRequest(GitlabObject):
_url = '/groups/%(group_id)s/access_requests'
canGet = 'from_list'
canUpdate = False

def approve(self, access_level=gitlab.DEVELOPER_ACCESS, **kwargs):
"""Approve an access request.
Attrs:
access_level (int): The access level for the user.
Raises:
GitlabConnectionError: If the server cannot be reached.
GitlabUpdateError: If the server fails to perform the request.
"""

url = ('/groups/%(group_id)s/access_requests/%(id)s/approve' %
{'group_id': self.group_id, 'id': self.id})
data = {'access_level': access_level}
r = self.gitlab._raw_put(url, data=data, **kwargs)
raise_error_from_response(r, GitlabUpdateError, 201)
self._set_from_dict(r.json())


class GroupAccessRequestManager(BaseManager):
obj_cls = GroupAccessRequest


class Group(GitlabObject):
_url = '/groups'
_constructorTypes = {'projects': 'Project'}
requiredCreateAttrs = ['name', 'path']
optionalCreateAttrs = ['description', 'visibility_level']
optionalUpdateAttrs = ['name', 'path', 'description', 'visibility_level']
shortPrintAttr = 'name'
managers = [('members', GroupMemberManager, [('group_id', 'id')]),
('projects', GroupProjectManager, [('group_id', 'id')]),
('issues', GroupIssueManager, [('group_id', 'id')])]
managers = [
('accessrequests', GroupAccessRequestManager, [('group_id', 'id')]),
('members', GroupMemberManager, [('group_id', 'id')]),
('projects', GroupProjectManager, [('group_id', 'id')]),
('issues', GroupIssueManager, [('group_id', 'id')])
]

GUEST_ACCESS = gitlab.GUEST_ACCESS
REPORTER_ACCESS = gitlab.REPORTER_ACCESS
Expand Down Expand Up @@ -1803,6 +1834,34 @@ def available(self, **kwargs):
return json.dumps(ProjectService._service_attrs.keys())


class ProjectAccessRequest(GitlabObject):
_url = '/projects/%(project_id)s/access_requests'
canGet = 'from_list'
canUpdate = False

def approve(self, access_level=gitlab.DEVELOPER_ACCESS, **kwargs):
"""Approve an access request.
Attrs:
access_level (int): The access level for the user.
Raises:
GitlabConnectionError: If the server cannot be reached.
GitlabUpdateError: If the server fails to perform the request.
"""

url = ('/projects/%(project_id)s/access_requests/%(id)s/approve' %
{'project_id': self.project_id, 'id': self.id})
data = {'access_level': access_level}
r = self.gitlab._raw_put(url, data=data, **kwargs)
raise_error_from_response(r, GitlabUpdateError, 201)
self._set_from_dict(r.json())


class ProjectAccessRequestManager(BaseManager):
obj_cls = ProjectAccessRequest


class Project(GitlabObject):
_url = '/projects'
_constructorTypes = {'owner': 'User', 'namespace': 'Group'}
Expand All @@ -1822,6 +1881,8 @@ class Project(GitlabObject):
'public_builds']
shortPrintAttr = 'path'
managers = [
('accessrequests', ProjectAccessRequestManager,
[('project_id', 'id')]),
('branches', ProjectBranchManager, [('project_id', 'id')]),
('builds', ProjectBuildManager, [('project_id', 'id')]),
('commits', ProjectCommitManager, [('project_id', 'id')]),
Expand Down

0 comments on commit 40db4cd

Please sign in to comment.