summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/api-objects.rst1
-rw-r--r--docs/gl_objects/access_requests.py38
-rw-r--r--docs/gl_objects/access_requests.rst45
-rw-r--r--gitlab/__init__.py6
-rw-r--r--gitlab/objects.py67
5 files changed, 154 insertions, 3 deletions
diff --git a/docs/api-objects.rst b/docs/api-objects.rst
index 4050a51..82171d0 100644
--- a/docs/api-objects.rst
+++ b/docs/api-objects.rst
@@ -5,6 +5,7 @@ API objects manipulation
.. toctree::
:maxdepth: 1
+ gl_objects/access_requests
gl_objects/branches
gl_objects/builds
gl_objects/commits
diff --git a/docs/gl_objects/access_requests.py b/docs/gl_objects/access_requests.py
new file mode 100644
index 0000000..2a8c557
--- /dev/null
+++ b/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
diff --git a/docs/gl_objects/access_requests.rst b/docs/gl_objects/access_requests.rst
new file mode 100644
index 0000000..a9e6d9b
--- /dev/null
+++ b/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
diff --git a/gitlab/__init__.py b/gitlab/__init__.py
index 82f4918..14e4a5b 100644
--- a/gitlab/__init__.py
+++ b/gitlab/__init__.py
@@ -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
@@ -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
@@ -159,6 +163,7 @@ class Gitlab(object):
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)
@@ -167,6 +172,7 @@ class Gitlab(object):
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)
diff --git a/gitlab/objects.py b/gitlab/objects.py
index a3f5277..bf46f87 100644
--- a/gitlab/objects.py
+++ b/gitlab/objects.py
@@ -768,6 +768,34 @@ 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'}
@@ -775,9 +803,12 @@ class Group(GitlabObject):
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
@@ -1803,6 +1834,34 @@ class ProjectServiceManager(BaseManager):
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'}
@@ -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')]),