summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNejc Habjan <hab.nejc@gmail.com>2021-10-31 13:26:36 +0100
committerGitHub <noreply@github.com>2021-10-31 13:26:36 +0100
commit5ce3b17f52d9501fea68dee8818e726addb327ac (patch)
tree5006e9b5a2b108dc86aa47190ad3f1a596ec6c08
parent0b53c0a260ab2ec2c5ddb12ca08bfd21a24f7a69 (diff)
parentf0685209f88d1199873c1f27d27f478706908fd3 (diff)
downloadgitlab-5ce3b17f52d9501fea68dee8818e726addb327ac.tar.gz
Merge pull request #1655 from StingRayZA/add-milestone-promote
feat(api): add project milestone promotion
-rw-r--r--docs/gl_objects/milestones.rst4
-rw-r--r--gitlab/v4/objects/milestones.py5
-rw-r--r--tests/functional/api/test_projects.py21
3 files changed, 28 insertions, 2 deletions
diff --git a/docs/gl_objects/milestones.rst b/docs/gl_objects/milestones.rst
index 3830f81..c6b4447 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 0a53e1b..0d6962d 100644
--- a/gitlab/v4/objects/milestones.py
+++ b/gitlab/v4/objects/milestones.py
@@ -2,7 +2,7 @@ from gitlab import cli
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 3da9d2b..0572276 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