From 32ad66921e408f6553b9d60b6b4833ed3180f549 Mon Sep 17 00:00:00 2001 From: Max Wittig Date: Fri, 25 Oct 2019 11:13:06 +0200 Subject: [PATCH] feat: add users activate, deactivate functionality These were introduced in GitLab 12.4 --- docs/gl_objects/users.rst | 5 +++++ gitlab/exceptions.py | 8 +++++++ gitlab/tests/test_gitlab.py | 25 ++++++++++++++++++++++ gitlab/v4/objects.py | 42 +++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/docs/gl_objects/users.rst b/docs/gl_objects/users.rst index 1d9fcd2fb..3e71ac4e3 100644 --- a/docs/gl_objects/users.rst +++ b/docs/gl_objects/users.rst @@ -62,6 +62,11 @@ Block/Unblock a user:: user.block() user.unblock() +Activate/Deactivate a user:: + + user.activate() + user.deactivate() + Set the avatar image for a user:: # the avatar image can be passed as data (content of the file) or as a file diff --git a/gitlab/exceptions.py b/gitlab/exceptions.py index d644e0ffe..aff3c87d5 100644 --- a/gitlab/exceptions.py +++ b/gitlab/exceptions.py @@ -157,6 +157,14 @@ class GitlabUnblockError(GitlabOperationError): pass +class GitlabDeactivateError(GitlabOperationError): + pass + + +class GitlabActivateError(GitlabOperationError): + pass + + class GitlabSubscribeError(GitlabOperationError): pass diff --git a/gitlab/tests/test_gitlab.py b/gitlab/tests/test_gitlab.py index c208b313c..f9d4cc82e 100644 --- a/gitlab/tests/test_gitlab.py +++ b/gitlab/tests/test_gitlab.py @@ -695,6 +695,31 @@ def resp_deployment_update(url, request): deployment.save() self.assertEqual(deployment.status, "failed") + def test_user_activate_deactivate(self): + @urlmatch( + scheme="http", + netloc="localhost", + path="/api/v4/users/1/activate", + method="post", + ) + def resp_activate(url, request): + headers = {"content-type": "application/json"} + return response(201, {}, headers, None, 5, request) + + @urlmatch( + scheme="http", + netloc="localhost", + path="/api/v4/users/1/deactivate", + method="post", + ) + def resp_deactivate(url, request): + headers = {"content-type": "application/json"} + return response(201, {}, headers, None, 5, request) + + with HTTMock(resp_activate), HTTMock(resp_deactivate): + self.gl.users.get(1, lazy=True).activate() + self.gl.users.get(1, lazy=True).deactivate() + def test_update_submodule(self): @urlmatch( scheme="http", netloc="localhost", path="/api/v4/projects/1$", method="get" diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 474cc2b37..fcac301da 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -340,6 +340,48 @@ def unblock(self, **kwargs): self._attrs["state"] = "active" return server_data + @cli.register_custom_action("User") + @exc.on_http_error(exc.GitlabDeactivateError) + def deactivate(self, **kwargs): + """Deactivate the user. + + Args: + **kwargs: Extra options to send to the server (e.g. sudo) + + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabDeactivateError: If the user could not be deactivated + + Returns: + bool: Whether the user status has been changed + """ + path = "/users/%s/deactivate" % self.id + server_data = self.manager.gitlab.http_post(path, **kwargs) + if server_data: + self._attrs["state"] = "deactivated" + return server_data + + @cli.register_custom_action("User") + @exc.on_http_error(exc.GitlabActivateError) + def activate(self, **kwargs): + """Activate the user. + + Args: + **kwargs: Extra options to send to the server (e.g. sudo) + + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabActivateError: If the user could not be activated + + Returns: + bool: Whether the user status has been changed + """ + path = "/users/%s/activate" % self.id + server_data = self.manager.gitlab.http_post(path, **kwargs) + if server_data: + self._attrs["state"] = "active" + return server_data + class UserManager(CRUDMixin, RESTManager): _path = "/users"