From f0685209f88d1199873c1f27d27f478706908fd3 Mon Sep 17 00:00:00 2001 From: Raimund Hook Date: Wed, 27 Oct 2021 11:52:37 +0100 Subject: [PATCH] feat(api): add project milestone promotion Adds promotion to Project Milestones Signed-off-by: Raimund Hook --- docs/gl_objects/milestones.rst | 4 ++++ gitlab/v4/objects/milestones.py | 5 +++-- tests/functional/api/test_projects.py | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/gl_objects/milestones.rst b/docs/gl_objects/milestones.rst index 3830f8103..c6b4447aa 100644 --- a/docs/gl_objects/milestones.rst +++ b/docs/gl_objects/milestones.rst @@ -66,6 +66,10 @@ Change the state of a milestone (activate / close):: milestone.state_event = 'activate' milestone.save() +Promote a project milestone:: + + milestone.promote() + List the issues related to a milestone:: issues = milestone.issues() diff --git a/gitlab/v4/objects/milestones.py b/gitlab/v4/objects/milestones.py index 0a53e1b07..0d6962d6b 100644 --- a/gitlab/v4/objects/milestones.py +++ b/gitlab/v4/objects/milestones.py @@ -2,7 +2,7 @@ from gitlab import exceptions as exc from gitlab import types from gitlab.base import RequiredOptional, RESTManager, RESTObject, RESTObjectList -from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin +from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, PromoteMixin, SaveMixin from .issues import GroupIssue, GroupIssueManager, ProjectIssue, ProjectIssueManager from .merge_requests import ( @@ -90,8 +90,9 @@ class GroupMilestoneManager(CRUDMixin, RESTManager): _types = {"iids": types.ListAttribute} -class ProjectMilestone(SaveMixin, ObjectDeleteMixin, RESTObject): +class ProjectMilestone(PromoteMixin, SaveMixin, ObjectDeleteMixin, RESTObject): _short_print_attr = "title" + _update_uses_post = True @cli.register_custom_action("ProjectMilestone") @exc.on_http_error(exc.GitlabListError) diff --git a/tests/functional/api/test_projects.py b/tests/functional/api/test_projects.py index 3da9d2b0e..0572276e2 100644 --- a/tests/functional/api/test_projects.py +++ b/tests/functional/api/test_projects.py @@ -199,6 +199,27 @@ def test_project_milestones(project): assert len(milestone.merge_requests()) == 0 +def test_project_milestone_promotion(gl, group): + """ + Milestone promotion requires the project to be a child of a group (not in a user namespace) + + """ + _id = uuid.uuid4().hex + data = { + "name": f"test-project-{_id}", + "namespace_id": group.id, + } + project = gl.projects.create(data) + + milestone_title = "promoteme" + promoted_milestone = project.milestones.create({"title": milestone_title}) + promoted_milestone.promote() + + assert any( + milestone.title == milestone_title for milestone in group.milestones.list() + ) + + def test_project_pages_domains(gl, project): domain = project.pagesdomains.create({"domain": "foo.domain.com"}) assert len(project.pagesdomains.list()) == 1