summaryrefslogtreecommitdiff
path: root/gitlab/v4/objects/users.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/v4/objects/users.py')
-rw-r--r--gitlab/v4/objects/users.py419
1 files changed, 419 insertions, 0 deletions
diff --git a/gitlab/v4/objects/users.py b/gitlab/v4/objects/users.py
new file mode 100644
index 0000000..bcd924e
--- /dev/null
+++ b/gitlab/v4/objects/users.py
@@ -0,0 +1,419 @@
+from gitlab import cli, types
+from gitlab import exceptions as exc
+from gitlab.base import * # noqa
+from gitlab.mixins import * # noqa
+
+from .custom_attributes import UserCustomAttributeManager
+from .events import UserEventManager
+
+
+class CurrentUserEmail(ObjectDeleteMixin, RESTObject):
+ _short_print_attr = "email"
+
+
+class CurrentUserEmailManager(RetrieveMixin, CreateMixin, DeleteMixin, RESTManager):
+ _path = "/user/emails"
+ _obj_cls = CurrentUserEmail
+ _create_attrs = (("email",), tuple())
+
+
+class CurrentUserGPGKey(ObjectDeleteMixin, RESTObject):
+ pass
+
+
+class CurrentUserGPGKeyManager(RetrieveMixin, CreateMixin, DeleteMixin, RESTManager):
+ _path = "/user/gpg_keys"
+ _obj_cls = CurrentUserGPGKey
+ _create_attrs = (("key",), tuple())
+
+
+class CurrentUserKey(ObjectDeleteMixin, RESTObject):
+ _short_print_attr = "title"
+
+
+class CurrentUserKeyManager(RetrieveMixin, CreateMixin, DeleteMixin, RESTManager):
+ _path = "/user/keys"
+ _obj_cls = CurrentUserKey
+ _create_attrs = (("title", "key"), tuple())
+
+
+class CurrentUserStatus(SaveMixin, RESTObject):
+ _id_attr = None
+ _short_print_attr = "message"
+
+
+class CurrentUserStatusManager(GetWithoutIdMixin, UpdateMixin, RESTManager):
+ _path = "/user/status"
+ _obj_cls = CurrentUserStatus
+ _update_attrs = (tuple(), ("emoji", "message"))
+
+
+class CurrentUser(RESTObject):
+ _id_attr = None
+ _short_print_attr = "username"
+ _managers = (
+ ("status", "CurrentUserStatusManager"),
+ ("emails", "CurrentUserEmailManager"),
+ ("gpgkeys", "CurrentUserGPGKeyManager"),
+ ("keys", "CurrentUserKeyManager"),
+ )
+
+
+class CurrentUserManager(GetWithoutIdMixin, RESTManager):
+ _path = "/user"
+ _obj_cls = CurrentUser
+
+
+class User(SaveMixin, ObjectDeleteMixin, RESTObject):
+ _short_print_attr = "username"
+ _managers = (
+ ("customattributes", "UserCustomAttributeManager"),
+ ("emails", "UserEmailManager"),
+ ("events", "UserEventManager"),
+ ("gpgkeys", "UserGPGKeyManager"),
+ ("identityproviders", "UserIdentityProviderManager"),
+ ("impersonationtokens", "UserImpersonationTokenManager"),
+ ("keys", "UserKeyManager"),
+ ("memberships", "UserMembershipManager"),
+ ("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",
+ "two_factor",
+ )
+ _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",
+ "public_email",
+ "private_profile",
+ "color_scheme_id",
+ "theme_id",
+ ),
+ )
+ _update_attrs = (
+ ("email", "username", "name"),
+ (
+ "password",
+ "skype",
+ "linkedin",
+ "twitter",
+ "projects_limit",
+ "extern_uid",
+ "provider",
+ "bio",
+ "admin",
+ "can_create_group",
+ "website_url",
+ "skip_reconfirmation",
+ "external",
+ "organization",
+ "location",
+ "avatar",
+ "public_email",
+ "private_profile",
+ "color_scheme_id",
+ "theme_id",
+ ),
+ )
+ _types = {"confirm": types.LowercaseStringAttribute, "avatar": types.ImageAttribute}
+
+
+class ProjectUser(RESTObject):
+ pass
+
+
+class ProjectUserManager(ListMixin, RESTManager):
+ _path = "/projects/%(project_id)s/users"
+ _obj_cls = ProjectUser
+ _from_parent_attrs = {"project_id": "id"}
+ _list_filters = ("search",)
+
+
+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 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 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 UserStatus(RESTObject):
+ pass
+
+
+class UserStatusManager(GetWithoutIdMixin, RESTManager):
+ _path = "/users/%(user_id)s/status"
+ _obj_cls = UserStatus
+ _from_parent_attrs = {"user_id": "id"}
+
+
+class UserIdentityProviderManager(DeleteMixin, RESTManager):
+ """Manager for user identities.
+
+ This manager does not actually manage objects but enables
+ functionality for deletion of user identities by provider.
+ """
+
+ _path = "/users/%(user_id)s/identities"
+ _from_parent_attrs = {"user_id": "id"}
+
+
+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 UserMembership(RESTObject):
+ _id_attr = "source_id"
+
+
+class UserMembershipManager(RetrieveMixin, RESTManager):
+ _path = "/users/%(user_id)s/memberships"
+ _obj_cls = UserMembership
+ _from_parent_attrs = {"user_id": "id"}
+ _list_filters = ("type",)
+
+
+# Having this outside projects avoids circular imports due to ProjectUser
+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",
+ "with_custom_attributes",
+ "with_programming_language",
+ "wiki_checksum_failed",
+ "repository_checksum_failed",
+ "min_access_level",
+ "id_after",
+ "id_before",
+ )
+
+ 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)