summaryrefslogtreecommitdiff
path: root/gitlab/v4/objects/user.py
diff options
context:
space:
mode:
authorMax Wittig <max.wittig@siemens.com>2020-01-21 22:01:40 +0100
committerMax Wittig <max.wittig95@gmail.com>2020-01-22 21:27:03 +0100
commit5650db9fd2ddcfef9da4ec972fefd82a7bfdef03 (patch)
tree3698384ade48dd7ff1e19b7c344474e090b51ec9 /gitlab/v4/objects/user.py
parentafdc43f401e20550ed181d4b87829739791d2ee3 (diff)
downloadgitlab-5650db9fd2ddcfef9da4ec972fefd82a7bfdef03.tar.gz
refactor: structure python objects in a reasonable way
Diffstat (limited to 'gitlab/v4/objects/user.py')
-rw-r--r--gitlab/v4/objects/user.py318
1 files changed, 318 insertions, 0 deletions
diff --git a/gitlab/v4/objects/user.py b/gitlab/v4/objects/user.py
new file mode 100644
index 0000000..e324cc1
--- /dev/null
+++ b/gitlab/v4/objects/user.py
@@ -0,0 +1,318 @@
+from gitlab.base import * # noqa
+from gitlab.exceptions import * # noqa
+from gitlab.mixins import * # noqa
+from gitlab import types
+from gitlab import utils
+
+
+class UserActivities(RESTObject):
+ _id_attr = "username"
+
+
+class UserStatus(RESTObject):
+ _id_attr = None
+ _short_print_attr = "message"
+
+
+class UserStatusManager(GetWithoutIdMixin, RESTManager):
+ _path = "/users/%(user_id)s/status"
+ _obj_cls = UserStatus
+ _from_parent_attrs = {"user_id": "id"}
+
+
+class UserActivitiesManager(ListMixin, RESTManager):
+ _path = "/user/activities"
+ _obj_cls = UserActivities
+
+
+class UserCustomAttribute(ObjectDeleteMixin, RESTObject):
+ _id_attr = "key"
+
+
+class UserCustomAttributeManager(RetrieveMixin, SetMixin, DeleteMixin, RESTManager):
+ _path = "/users/%(user_id)s/custom_attributes"
+ _obj_cls = UserCustomAttribute
+ _from_parent_attrs = {"user_id": "id"}
+
+
+class UserEmail(ObjectDeleteMixin, RESTObject):
+ _short_print_attr = "email"
+
+
+class UserEmailManager(RetrieveMixin, CreateMixin, DeleteMixin, RESTManager):
+ _path = "/users/%(user_id)s/emails"
+ _obj_cls = UserEmail
+ _from_parent_attrs = {"user_id": "id"}
+ _create_attrs = (("email",), tuple())
+
+
+class UserEvent(Event):
+ pass
+
+
+class UserEventManager(EventManager):
+ _path = "/users/%(user_id)s/events"
+ _obj_cls = UserEvent
+ _from_parent_attrs = {"user_id": "id"}
+
+
+class UserGPGKey(ObjectDeleteMixin, RESTObject):
+ pass
+
+
+class UserGPGKeyManager(RetrieveMixin, CreateMixin, DeleteMixin, RESTManager):
+ _path = "/users/%(user_id)s/gpg_keys"
+ _obj_cls = UserGPGKey
+ _from_parent_attrs = {"user_id": "id"}
+ _create_attrs = (("key",), tuple())
+
+
+class UserKey(ObjectDeleteMixin, RESTObject):
+ pass
+
+
+class UserKeyManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
+ _path = "/users/%(user_id)s/keys"
+ _obj_cls = UserKey
+ _from_parent_attrs = {"user_id": "id"}
+ _create_attrs = (("title", "key"), tuple())
+
+
+class UserImpersonationToken(ObjectDeleteMixin, RESTObject):
+ pass
+
+
+class UserImpersonationTokenManager(NoUpdateMixin, RESTManager):
+ _path = "/users/%(user_id)s/impersonation_tokens"
+ _obj_cls = UserImpersonationToken
+ _from_parent_attrs = {"user_id": "id"}
+ _create_attrs = (("name", "scopes"), ("expires_at",))
+ _list_filters = ("state",)
+
+
+class UserProject(RESTObject):
+ pass
+
+
+class UserProjectManager(ListMixin, CreateMixin, RESTManager):
+ _path = "/projects/user/%(user_id)s"
+ _obj_cls = UserProject
+ _from_parent_attrs = {"user_id": "id"}
+ _create_attrs = (
+ ("name",),
+ (
+ "default_branch",
+ "issues_enabled",
+ "wall_enabled",
+ "merge_requests_enabled",
+ "wiki_enabled",
+ "snippets_enabled",
+ "public",
+ "visibility",
+ "description",
+ "builds_enabled",
+ "public_builds",
+ "import_url",
+ "only_allow_merge_if_build_succeeds",
+ ),
+ )
+ _list_filters = (
+ "archived",
+ "visibility",
+ "order_by",
+ "sort",
+ "search",
+ "simple",
+ "owned",
+ "membership",
+ "starred",
+ "statistics",
+ "with_issues_enabled",
+ "with_merge_requests_enabled",
+ )
+
+ def list(self, **kwargs):
+ """Retrieve a list of objects.
+
+ Args:
+ all (bool): If True, return all the items, without pagination
+ per_page (int): Number of items to retrieve per request
+ page (int): ID of the page to return (starts with page 1)
+ as_list (bool): If set to False and no pagination option is
+ defined, return a generator instead of a list
+ **kwargs: Extra options to send to the server (e.g. sudo)
+
+ Returns:
+ list: The list of objects, or a generator if `as_list` is False
+
+ Raises:
+ GitlabAuthenticationError: If authentication is not correct
+ GitlabListError: If the server cannot perform the request
+ """
+ if self._parent:
+ path = "/users/%s/projects" % self._parent.id
+ else:
+ path = "/users/%s/projects" % kwargs["user_id"]
+ return ListMixin.list(self, path=path, **kwargs)
+
+
+class User(SaveMixin, ObjectDeleteMixin, RESTObject):
+ _short_print_attr = "username"
+ _managers = (
+ ("customattributes", "UserCustomAttributeManager"),
+ ("emails", "UserEmailManager"),
+ ("events", "UserEventManager"),
+ ("gpgkeys", "UserGPGKeyManager"),
+ ("impersonationtokens", "UserImpersonationTokenManager"),
+ ("keys", "UserKeyManager"),
+ ("projects", "UserProjectManager"),
+ ("status", "UserStatusManager"),
+ )
+
+ @cli.register_custom_action("User")
+ @exc.on_http_error(exc.GitlabBlockError)
+ def block(self, **kwargs):
+ """Block the user.
+
+ Args:
+ **kwargs: Extra options to send to the server (e.g. sudo)
+
+ Raises:
+ GitlabAuthenticationError: If authentication is not correct
+ GitlabBlockError: If the user could not be blocked
+
+ Returns:
+ bool: Whether the user status has been changed
+ """
+ path = "/users/%s/block" % self.id
+ server_data = self.manager.gitlab.http_post(path, **kwargs)
+ if server_data is True:
+ self._attrs["state"] = "blocked"
+ return server_data
+
+ @cli.register_custom_action("User")
+ @exc.on_http_error(exc.GitlabUnblockError)
+ def unblock(self, **kwargs):
+ """Unblock the user.
+
+ Args:
+ **kwargs: Extra options to send to the server (e.g. sudo)
+
+ Raises:
+ GitlabAuthenticationError: If authentication is not correct
+ GitlabUnblockError: If the user could not be unblocked
+
+ Returns:
+ bool: Whether the user status has been changed
+ """
+ path = "/users/%s/unblock" % self.id
+ server_data = self.manager.gitlab.http_post(path, **kwargs)
+ if server_data is True:
+ 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"
+ _obj_cls = User
+
+ _list_filters = (
+ "active",
+ "blocked",
+ "username",
+ "extern_uid",
+ "provider",
+ "external",
+ "search",
+ "custom_attributes",
+ "status",
+ )
+ _create_attrs = (
+ tuple(),
+ (
+ "email",
+ "username",
+ "name",
+ "password",
+ "reset_password",
+ "skype",
+ "linkedin",
+ "twitter",
+ "projects_limit",
+ "extern_uid",
+ "provider",
+ "bio",
+ "admin",
+ "can_create_group",
+ "website_url",
+ "skip_confirmation",
+ "external",
+ "organization",
+ "location",
+ "avatar",
+ ),
+ )
+ _update_attrs = (
+ ("email", "username", "name"),
+ (
+ "password",
+ "skype",
+ "linkedin",
+ "twitter",
+ "projects_limit",
+ "extern_uid",
+ "provider",
+ "bio",
+ "admin",
+ "can_create_group",
+ "website_url",
+ "skip_confirmation",
+ "external",
+ "organization",
+ "location",
+ "avatar",
+ ),
+ )
+ _types = {"confirm": types.LowercaseStringAttribute, "avatar": types.ImageAttribute}