summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/gl_objects/users.rst5
-rw-r--r--gitlab/exceptions.py8
-rw-r--r--gitlab/tests/test_gitlab.py25
-rw-r--r--gitlab/v4/objects.py42
4 files changed, 80 insertions, 0 deletions
diff --git a/docs/gl_objects/users.rst b/docs/gl_objects/users.rst
index 1d9fcd2..3e71ac4 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 d644e0f..aff3c87 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 c208b31..f9d4cc8 100644
--- a/gitlab/tests/test_gitlab.py
+++ b/gitlab/tests/test_gitlab.py
@@ -695,6 +695,31 @@ class TestGitlab(unittest.TestCase):
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 474cc2b..fcac301 100644
--- a/gitlab/v4/objects.py
+++ b/gitlab/v4/objects.py
@@ -340,6 +340,48 @@ class User(SaveMixin, ObjectDeleteMixin, RESTObject):
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"