summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sabouraud <esabouraud@users.noreply.github.com>2018-06-08 19:11:11 +0200
committerGauvain Pocentek <gauvain@pocentek.net>2018-06-08 19:11:11 +0200
commit473dc6f50d27b2e5349bb2e7c8bc07b48e9834d1 (patch)
treea7dc99880bf03fd036a548e133d0992c8f57aa2f
parentbbefb9936a18909d28d0f81b6ce99d4981ab8148 (diff)
downloadgitlab-473dc6f50d27b2e5349bb2e7c8bc07b48e9834d1.tar.gz
Add support for project-level MR approval configuration
-rw-r--r--docs/gl_objects/mr_approvals.rst30
-rw-r--r--gitlab/mixins.py16
-rw-r--r--gitlab/v4/objects.py37
3 files changed, 81 insertions, 2 deletions
diff --git a/docs/gl_objects/mr_approvals.rst b/docs/gl_objects/mr_approvals.rst
new file mode 100644
index 0000000..69d44a5
--- /dev/null
+++ b/docs/gl_objects/mr_approvals.rst
@@ -0,0 +1,30 @@
+##############################################
+Project-level merge request approvals settings
+##############################################
+
+References
+----------
+
+* v4 API:
+
+ + :class:`gitlab.v4.objects.ProjectApproval`
+ + :class:`gitlab.v4.objects.ProjectApprovalManager`
+ + :attr:`gitlab.v4.objects.Project.approvals`
+
+* GitLab API: https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals
+
+Examples
+--------
+
+Get project-level MR approvals settings::
+
+ mras = project.approvals.get()
+
+Change project-level MR approvals settings::
+
+ mras.approvals_before_merge = 2
+ mras.save()
+
+Change project-level MR allowed approvers::
+
+ project.approvals.set_approvers(approver_ids = [105], approver_group_ids=[653, 654])
diff --git a/gitlab/mixins.py b/gitlab/mixins.py
index 966a647..59fcf1b 100644
--- a/gitlab/mixins.py
+++ b/gitlab/mixins.py
@@ -223,6 +223,18 @@ class UpdateMixin(object):
"""
return getattr(self, '_update_attrs', (tuple(), tuple()))
+ def _get_update_method(self):
+ """Return the HTTP method to use.
+
+ Returns:
+ object: http_put (default) or http_post
+ """
+ if getattr(self, '_update_uses_post', False):
+ http_method = self.gitlab.http_post
+ else:
+ http_method = self.gitlab.http_put
+ return http_method
+
@exc.on_http_error(exc.GitlabUpdateError)
def update(self, id=None, new_data={}, **kwargs):
"""Update an object on the server.
@@ -265,8 +277,8 @@ class UpdateMixin(object):
else:
new_data[attr_name] = type_obj.get_for_api()
- return self.gitlab.http_put(path, post_data=new_data, files=files,
- **kwargs)
+ http_method = self._get_update_method()
+ return http_method(path, post_data=new_data, files=files, **kwargs)
class SetMixin(object):
diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py
index 13c9995..d6ae6c5 100644
--- a/gitlab/v4/objects.py
+++ b/gitlab/v4/objects.py
@@ -2631,6 +2631,42 @@ class ProjectAccessRequestManager(ListMixin, CreateMixin, DeleteMixin,
_from_parent_attrs = {'project_id': 'id'}
+class ProjectApproval(SaveMixin, RESTObject):
+ _id_attr = None
+
+
+class ProjectApprovalManager(GetWithoutIdMixin, UpdateMixin, RESTManager):
+ _path = '/projects/%(project_id)s/approvals'
+ _obj_cls = ProjectApproval
+ _from_parent_attrs = {'project_id': 'id'}
+ _update_attrs = (tuple(),
+ ('approvals_before_merge', 'reset_approvals_on_push',
+ 'disable_overriding_approvers_per_merge_request'))
+ _update_uses_post = True
+
+ @exc.on_http_error(exc.GitlabUpdateError)
+ def set_approvers(self, approver_ids=[], approver_group_ids=[],
+ **kwargs):
+ """Change project-level allowed approvers and approver groups.
+
+ Args:
+ approver_ids (list): User IDs that can approve MRs.
+ approver_group_ids (list): Group IDs whose members can approve MRs.
+
+ Raises:
+ GitlabAuthenticationError: If authentication is not correct
+ GitlabUpdateError: If the server failed to perform the request
+ """
+
+ path = '/projects/%s/approvers' % self._parent.get_id()
+ data = {'approver_ids': approver_ids,
+ 'approver_group_ids': approver_group_ids}
+ try:
+ self.gitlab.http_put(path, post_data=data, **kwargs)
+ except exc.GitlabHttpError as e:
+ raise exc.GitlabUpdateError(e.response_code, e.error_message)
+
+
class ProjectDeployment(RESTObject):
pass
@@ -2729,6 +2765,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject):
_short_print_attr = 'path'
_managers = (
('accessrequests', 'ProjectAccessRequestManager'),
+ ('approvals', 'ProjectApprovalManager'),
('badges', 'ProjectBadgeManager'),
('boards', 'ProjectBoardManager'),
('branches', 'ProjectBranchManager'),