summaryrefslogtreecommitdiff
path: root/gitlab
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab')
-rw-r--r--gitlab/exceptions.py4
-rw-r--r--gitlab/mixins.py47
-rw-r--r--gitlab/v4/objects/labels.py5
3 files changed, 55 insertions, 1 deletions
diff --git a/gitlab/exceptions.py b/gitlab/exceptions.py
index 6f2d4c4..66b1ee0 100644
--- a/gitlab/exceptions.py
+++ b/gitlab/exceptions.py
@@ -111,6 +111,10 @@ class GitlabProjectDeployKeyError(GitlabOperationError):
pass
+class GitlabPromoteError(GitlabOperationError):
+ pass
+
+
class GitlabCancelError(GitlabOperationError):
pass
diff --git a/gitlab/mixins.py b/gitlab/mixins.py
index 0c2cd94..62ff6dc 100644
--- a/gitlab/mixins.py
+++ b/gitlab/mixins.py
@@ -926,3 +926,50 @@ class BadgeRenderMixin(_RestManagerBase):
if TYPE_CHECKING:
assert not isinstance(result, requests.Response)
return result
+
+
+class PromoteMixin(_RestObjectBase):
+ _id_attr: Optional[str]
+ _attrs: Dict[str, Any]
+ _module: ModuleType
+ _parent_attrs: Dict[str, Any]
+ _updated_attrs: Dict[str, Any]
+ _update_uses_post: bool = False
+ manager: base.RESTManager
+
+ def _get_update_method(
+ self,
+ ) -> Callable[..., Union[Dict[str, Any], requests.Response]]:
+ """Return the HTTP method to use.
+
+ Returns:
+ object: http_put (default) or http_post
+ """
+ if self._update_uses_post:
+ http_method = self.manager.gitlab.http_post
+ else:
+ http_method = self.manager.gitlab.http_put
+ return http_method
+
+ @exc.on_http_error(exc.GitlabPromoteError)
+ def promote(self, **kwargs: Any) -> Dict[str, Any]:
+ """Promote the item.
+
+ Args:
+ **kwargs: Extra options to send to the server (e.g. sudo)
+
+ Raises:
+ GitlabAuthenticationError: If authentication is not correct
+ GitlabPromoteError: If the item could not be promoted
+ GitlabParsingError: If the json data could not be parsed
+
+ Returns:
+ dict: The updated object data (*not* a RESTObject)
+ """
+
+ path = "%s/%s/promote" % (self.manager.path, self.id)
+ http_method = self._get_update_method()
+ result = http_method(path, **kwargs)
+ if TYPE_CHECKING:
+ assert not isinstance(result, requests.Response)
+ return result
diff --git a/gitlab/v4/objects/labels.py b/gitlab/v4/objects/labels.py
index 544c3cd..99da06a 100644
--- a/gitlab/v4/objects/labels.py
+++ b/gitlab/v4/objects/labels.py
@@ -5,6 +5,7 @@ from gitlab.mixins import (
DeleteMixin,
ListMixin,
ObjectDeleteMixin,
+ PromoteMixin,
RetrieveMixin,
SaveMixin,
SubscribableMixin,
@@ -83,7 +84,9 @@ class GroupLabelManager(ListMixin, CreateMixin, UpdateMixin, DeleteMixin, RESTMa
self.gitlab.http_delete(self.path, query_data={"name": name}, **kwargs)
-class ProjectLabel(SubscribableMixin, SaveMixin, ObjectDeleteMixin, RESTObject):
+class ProjectLabel(
+ PromoteMixin, SubscribableMixin, SaveMixin, ObjectDeleteMixin, RESTObject
+):
_id_attr = "name"
# Update without ID, but we need an ID to get from list.