Source code for magpie.api.management.user.user_formats

from typing import TYPE_CHECKING

from pyramid.httpexceptions import HTTPInternalServerError

from magpie.api.exception import evaluate_call
from magpie.constants import get_constant
from magpie.models import UserGroupStatus, UserStatuses

if TYPE_CHECKING:
    from typing import List

    from magpie.models import AnyUser
    from magpie.typedefs import JSON, Str


[docs] def format_user(user, group_names=None, basic_info=False, dotted=False): # type: (AnyUser, List[Str], bool, bool) -> JSON """ Formats a :term:`User` information into JSON. :param user: :term:`User` to be formatted. :param group_names: Override of group name listing to provide as user memberships. Retrieve the complete group membership listing from the :paramref:`user` if not provided. :param basic_info: If ``True``, return only sufficient details to identify the :term:`User`, without any additional group details. :param dotted: Employ a dot (``.``) instead of underscore (``_``) to separate :term:`User` from its basic information. .. seealso:: :func:`magpie.api.management.group.group_formats.format_group` """ def fmt_usr(): sep = "." if dotted else "_" prefix = "user." if dotted else "" status = UserStatuses.get(user.status) user_info = { "user{}name".format(sep): str(user.user_name), "{}email".format(prefix): str(user.email), "{}status".format(prefix): status.name, } if not basic_info: grp_names = group_names if group_names else [grp.group_name for grp in user.groups] user_info["group_names"] = list(sorted(grp_names)) # indicate if user has any pending T&C groups user_info["has_pending_group"] = bool(user.get_groups_by_status(UserGroupStatus.PENDING)) # special users not meant to be used as valid "accounts" marked as without an ID if user.user_name != get_constant("MAGPIE_ANONYMOUS_USER") and status != UserStatuses.Pending: user_info["user{}id".format(sep)] = int(user.id) return user_info return evaluate_call( lambda: fmt_usr(), http_error=HTTPInternalServerError, msg_on_fail="Failed to format user.", content={"user": repr(user)} )