Skip to content

Commit 473dc6f

Browse files
esabouraudGauvain Pocentek
authored and
Gauvain Pocentek
committed
Add support for project-level MR approval configuration
1 parent bbefb99 commit 473dc6f

File tree

3 files changed

+81
-2
lines changed

3 files changed

+81
-2
lines changed

docs/gl_objects/mr_approvals.rst

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
##############################################
2+
Project-level merge request approvals settings
3+
##############################################
4+
5+
References
6+
----------
7+
8+
* v4 API:
9+
10+
+ :class:`gitlab.v4.objects.ProjectApproval`
11+
+ :class:`gitlab.v4.objects.ProjectApprovalManager`
12+
+ :attr:`gitlab.v4.objects.Project.approvals`
13+
14+
* GitLab API: https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals
15+
16+
Examples
17+
--------
18+
19+
Get project-level MR approvals settings::
20+
21+
mras = project.approvals.get()
22+
23+
Change project-level MR approvals settings::
24+
25+
mras.approvals_before_merge = 2
26+
mras.save()
27+
28+
Change project-level MR allowed approvers::
29+
30+
project.approvals.set_approvers(approver_ids = [105], approver_group_ids=[653, 654])

gitlab/mixins.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,18 @@ def get_update_attrs(self):
223223
"""
224224
return getattr(self, '_update_attrs', (tuple(), tuple()))
225225

226+
def _get_update_method(self):
227+
"""Return the HTTP method to use.
228+
229+
Returns:
230+
object: http_put (default) or http_post
231+
"""
232+
if getattr(self, '_update_uses_post', False):
233+
http_method = self.gitlab.http_post
234+
else:
235+
http_method = self.gitlab.http_put
236+
return http_method
237+
226238
@exc.on_http_error(exc.GitlabUpdateError)
227239
def update(self, id=None, new_data={}, **kwargs):
228240
"""Update an object on the server.
@@ -265,8 +277,8 @@ def update(self, id=None, new_data={}, **kwargs):
265277
else:
266278
new_data[attr_name] = type_obj.get_for_api()
267279

268-
return self.gitlab.http_put(path, post_data=new_data, files=files,
269-
**kwargs)
280+
http_method = self._get_update_method()
281+
return http_method(path, post_data=new_data, files=files, **kwargs)
270282

271283

272284
class SetMixin(object):

gitlab/v4/objects.py

+37
Original file line numberDiff line numberDiff line change
@@ -2631,6 +2631,42 @@ class ProjectAccessRequestManager(ListMixin, CreateMixin, DeleteMixin,
26312631
_from_parent_attrs = {'project_id': 'id'}
26322632

26332633

2634+
class ProjectApproval(SaveMixin, RESTObject):
2635+
_id_attr = None
2636+
2637+
2638+
class ProjectApprovalManager(GetWithoutIdMixin, UpdateMixin, RESTManager):
2639+
_path = '/projects/%(project_id)s/approvals'
2640+
_obj_cls = ProjectApproval
2641+
_from_parent_attrs = {'project_id': 'id'}
2642+
_update_attrs = (tuple(),
2643+
('approvals_before_merge', 'reset_approvals_on_push',
2644+
'disable_overriding_approvers_per_merge_request'))
2645+
_update_uses_post = True
2646+
2647+
@exc.on_http_error(exc.GitlabUpdateError)
2648+
def set_approvers(self, approver_ids=[], approver_group_ids=[],
2649+
**kwargs):
2650+
"""Change project-level allowed approvers and approver groups.
2651+
2652+
Args:
2653+
approver_ids (list): User IDs that can approve MRs.
2654+
approver_group_ids (list): Group IDs whose members can approve MRs.
2655+
2656+
Raises:
2657+
GitlabAuthenticationError: If authentication is not correct
2658+
GitlabUpdateError: If the server failed to perform the request
2659+
"""
2660+
2661+
path = '/projects/%s/approvers' % self._parent.get_id()
2662+
data = {'approver_ids': approver_ids,
2663+
'approver_group_ids': approver_group_ids}
2664+
try:
2665+
self.gitlab.http_put(path, post_data=data, **kwargs)
2666+
except exc.GitlabHttpError as e:
2667+
raise exc.GitlabUpdateError(e.response_code, e.error_message)
2668+
2669+
26342670
class ProjectDeployment(RESTObject):
26352671
pass
26362672

@@ -2729,6 +2765,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject):
27292765
_short_print_attr = 'path'
27302766
_managers = (
27312767
('accessrequests', 'ProjectAccessRequestManager'),
2768+
('approvals', 'ProjectApprovalManager'),
27322769
('badges', 'ProjectBadgeManager'),
27332770
('boards', 'ProjectBoardManager'),
27342771
('branches', 'ProjectBranchManager'),

0 commit comments

Comments
 (0)