From 2cef2bb40b1f37b97bb2ee9894ab3b9970cef231 Mon Sep 17 00:00:00 2001 From: Srikanth Chelluri Date: Wed, 23 Oct 2019 16:51:10 -0400 Subject: [PATCH 1/2] fix(projects): support `approval_rules` endpoint for projects The `approvers` API endpoint is deprecated [1]. GitLab instead uses the `approval_rules` API endpoint to modify approval settings for merge requests. This adds the functionality for project-level merge request approval settings. Note that there does not exist an endpoint to 'get' a single approval rule at this moment - only 'list'. [1] https://docs.gitlab.com/ee/api/merge_request_approvals.html --- docs/gl_objects/mr_approvals.rst | 15 +++++++++++++++ gitlab/v4/objects.py | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/docs/gl_objects/mr_approvals.rst b/docs/gl_objects/mr_approvals.rst index e1a5d7b86..b5de88c28 100644 --- a/docs/gl_objects/mr_approvals.rst +++ b/docs/gl_objects/mr_approvals.rst @@ -12,6 +12,8 @@ References + :class:`gitlab.v4.objects.ProjectApproval` + :class:`gitlab.v4.objects.ProjectApprovalManager` + + :class:`gitlab.v4.objects.ProjectApprovalRule` + + :class:`gitlab.v4.objects.ProjectApprovalRuleManager` + :attr:`gitlab.v4.objects.Project.approvals` + :class:`gitlab.v4.objects.ProjectMergeRequestApproval` + :class:`gitlab.v4.objects.ProjectMergeRequestApprovalManager` @@ -22,6 +24,19 @@ References Examples -------- +List project-level MR approval rules:: + + p_mras = project.approvalrules.list() + +Change project-level MR approval rule:: + + p_approvalrule.user_ids = [234] + p_approvalrule.save() + +Delete project-level MR approval rule:: + + p_approvalrule.delete() + Get project-level or MR-level MR approvals settings:: p_mras = project.approvals.get() diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index fcac301da..7b9c8f3f4 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -3777,6 +3777,19 @@ def set_approvers(self, approver_ids=None, approver_group_ids=None, **kwargs): self.gitlab.http_put(path, post_data=data, **kwargs) +class ProjectApprovalRule(SaveMixin, ObjectDeleteMixin, RESTObject): + _id_attr = "id" + + +class ProjectApprovalRuleManager( + ListMixin, CreateMixin, UpdateMixin, DeleteMixin, RESTManager +): + _path = "/projects/%(project_id)s/approval_rules" + _obj_cls = ProjectApprovalRule + _from_parent_attrs = {"project_id": "id"} + _create_attrs = (("name", "approvals_required"), ("user_ids", "group_ids")) + + class ProjectDeployment(RESTObject, SaveMixin): pass @@ -3888,6 +3901,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): _managers = ( ("accessrequests", "ProjectAccessRequestManager"), ("approvals", "ProjectApprovalManager"), + ("approvalrules", "ProjectApprovalRuleManager"), ("badges", "ProjectBadgeManager"), ("boards", "ProjectBoardManager"), ("branches", "ProjectBranchManager"), From 94bac4494353e4f597df0251f0547513c011e6de Mon Sep 17 00:00:00 2001 From: Srikanth Chelluri Date: Sun, 27 Oct 2019 15:40:20 -0400 Subject: [PATCH 2/2] test(projects): support `approval_rules` endpoint for projects --- tools/ee-test.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/ee-test.py b/tools/ee-test.py index 24a9b3535..82adf5cc1 100755 --- a/tools/ee-test.py +++ b/tools/ee-test.py @@ -53,6 +53,22 @@ def end_log(): mr.approvals.set_approvers([1], []) approval = mr.approvals.get() assert approval.approvers[0]["user"]["id"] == 1 + +ars = project1.approvalrules.list(all=True) +assert len(ars) == 0 +project.approvalrules.create( + {"name": "approval-rule", "approvals_required": 1, "group_ids": [group1.id]} +) +ars = project1.approvalrules.list(all=True) +assert len(ars) == 1 +ars[0].approvals_required == 2 +ars[0].save() +ars = project1.approvalrules.list(all=True) +assert len(ars) == 1 +assert ars[0].approvals_required == 2 +ars[0].delete() +ars = project1.approvalrules.list(all=True) +assert len(ars) == 0 end_log() start_log("geo nodes")