create_superuser()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 26
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 21
nop 3
dl 0
loc 26
ccs 0
cts 16
cp 0
crap 2
rs 9.376
c 0
b 0
f 0
1
"""
2
byceps.cli.command.create_superuser
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
Create a superuser with admin privileges.
6
7
:Copyright: 2014-2025 Jochen Kupperschmidt
8
:License: Revised BSD (see `LICENSE` file for details)
9
"""
10
11
import click
12
from flask.cli import with_appcontext
13
from secret_type import secret
14
15
from byceps.services.authz import authz_service
16
from byceps.services.authz.models import RoleID
17
from byceps.services.user import (
18
    user_command_service,
19
    user_creation_service,
20
    user_email_address_service,
21
)
22
from byceps.services.user.models.user import Password, User
23
24
25
@click.command()
26
@click.option('--screen_name', prompt=True)
27
@click.option('--email_address', prompt=True)
28
@click.option('--password', prompt=True, hide_input=True)
29
@with_appcontext
30
def create_superuser(screen_name, email_address, password) -> None:
31
    """Create a superuser with all roles assigned."""
32
    click.echo(f'Creating user "{screen_name}" ... ', nl=False)
33
    user = _create_user(screen_name, email_address, secret(password))
34
    click.secho('done.', fg='green')
35
36
    click.echo(f'Initializing user "{screen_name}" ... ', nl=False)
37
    user_command_service.initialize_account(user)
38
    click.secho('done.', fg='green')
39
40
    user_email_address_service.confirm_email_address(
41
        user, email_address
42
    ).unwrap()
43
44
    role_ids = _get_role_ids()
45
    click.echo(
46
        f'Assigning {len(role_ids)} roles to user "{screen_name}" ... ',
47
        nl=False,
48
    )
49
    _assign_roles_to_user(role_ids, user)
50
    click.secho('done.', fg='green')
51
52
53
def _create_user(
54
    screen_name: str, email_address: str, password: Password
55
) -> User:
56
    creation_result = user_creation_service.create_user(
57
        screen_name,
58
        email_address,
59
        password,
60
        creation_method='superuser creation command',
61
    )
62
    if creation_result.is_err():
63
        error_message = creation_result.unwrap_err()
64
        raise click.UsageError(f'User creation failed: {error_message}')
65
66
    user, event = creation_result.unwrap()
67
68
    return user
69
70
71
def _get_role_ids() -> set[RoleID]:
72
    return authz_service.get_all_role_ids()
73
74
75
def _assign_roles_to_user(role_ids: set[RoleID], user: User) -> None:
76
    for role_id in role_ids:
77
        authz_service.assign_role_to_user(role_id, user)
78