Skip to content

Commit f068520

Browse files
committed
feat(api): add project milestone promotion
Adds promotion to Project Milestones Signed-off-by: Raimund Hook <raimund.hook@exfo.com>
1 parent 0b53c0a commit f068520

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

docs/gl_objects/milestones.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ Change the state of a milestone (activate / close)::
6666
milestone.state_event = 'activate'
6767
milestone.save()
6868

69+
Promote a project milestone::
70+
71+
milestone.promote()
72+
6973
List the issues related to a milestone::
7074

7175
issues = milestone.issues()

gitlab/v4/objects/milestones.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from gitlab import exceptions as exc
33
from gitlab import types
44
from gitlab.base import RequiredOptional, RESTManager, RESTObject, RESTObjectList
5-
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
5+
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, PromoteMixin, SaveMixin
66

77
from .issues import GroupIssue, GroupIssueManager, ProjectIssue, ProjectIssueManager
88
from .merge_requests import (
@@ -90,8 +90,9 @@ class GroupMilestoneManager(CRUDMixin, RESTManager):
9090
_types = {"iids": types.ListAttribute}
9191

9292

93-
class ProjectMilestone(SaveMixin, ObjectDeleteMixin, RESTObject):
93+
class ProjectMilestone(PromoteMixin, SaveMixin, ObjectDeleteMixin, RESTObject):
9494
_short_print_attr = "title"
95+
_update_uses_post = True
9596

9697
@cli.register_custom_action("ProjectMilestone")
9798
@exc.on_http_error(exc.GitlabListError)

tests/functional/api/test_projects.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,27 @@ def test_project_milestones(project):
199199
assert len(milestone.merge_requests()) == 0
200200

201201

202+
def test_project_milestone_promotion(gl, group):
203+
"""
204+
Milestone promotion requires the project to be a child of a group (not in a user namespace)
205+
206+
"""
207+
_id = uuid.uuid4().hex
208+
data = {
209+
"name": f"test-project-{_id}",
210+
"namespace_id": group.id,
211+
}
212+
project = gl.projects.create(data)
213+
214+
milestone_title = "promoteme"
215+
promoted_milestone = project.milestones.create({"title": milestone_title})
216+
promoted_milestone.promote()
217+
218+
assert any(
219+
milestone.title == milestone_title for milestone in group.milestones.list()
220+
)
221+
222+
202223
def test_project_pages_domains(gl, project):
203224
domain = project.pagesdomains.create({"domain": "foo.domain.com"})
204225
assert len(project.pagesdomains.list()) == 1

0 commit comments

Comments
 (0)