Source code for ferrosoft.apps.ferrobase.services.user_mgm
# Copyright (c) 2024 Ferrosoft GmbH. All rights reserved.
from dataclasses import dataclass, field
from typing import List
from ferrosoft.apps.ferrobase.auth.roles import Role
from ferrosoft.apps.ferrobase.models import User, Organization
[docs]
@dataclass
class UserOptions:
"""Parameters for :func:`add_user`.
``password`` may be ``None`` for SSO-only users; ``roles`` defaults to
an empty list when no role assignment is required.
"""
username: str
email: str
first_name: str
last_name: str
organization: Organization
password: str | None = None
roles: List[Role] = field(default_factory=list)
[docs]
def add_user(options: UserOptions) -> User:
"""Create a :class:`User` and optionally assign the configured roles.
Wraps :meth:`User.objects.create_user` (so passwords are hashed by
Django) and then delegates to ``user.assign_roles`` when any roles are
listed.
"""
user = User.objects.create_user(
options.username,
options.email,
options.password,
first_name=options.first_name,
last_name=options.last_name,
organization=options.organization,
)
if len(options.roles) > 0:
user.assign_roles(*options.roles)
return user