diff options
-rw-r--r-- | docs/api-objects.rst | 1 | ||||
-rw-r--r-- | docs/gl_objects/access_requests.py | 38 | ||||
-rw-r--r-- | docs/gl_objects/access_requests.rst | 45 | ||||
-rw-r--r-- | gitlab/__init__.py | 6 | ||||
-rw-r--r-- | gitlab/objects.py | 67 |
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')]), |