diff options
Diffstat (limited to 'gitlab')
-rw-r--r-- | gitlab/exceptions.py | 4 | ||||
-rw-r--r-- | gitlab/mixins.py | 47 | ||||
-rw-r--r-- | gitlab/v4/objects/labels.py | 5 |
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. |