-
Notifications
You must be signed in to change notification settings - Fork 590
/
Copy pathuser.py
84 lines (69 loc) · 3.02 KB
/
user.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from typing import Optional
import typer
from rich.table import Table
from app.db import GetDB, crud
from app.db.models import User
from app.utils.system import readable_size
from . import utils
app = typer.Typer(no_args_is_help=True)
@app.command(name="list")
def list_users(
offset: Optional[int] = typer.Option(None, *utils.FLAGS["offset"]),
limit: Optional[int] = typer.Option(None, *utils.FLAGS["limit"]),
username: Optional[list[str]] = typer.Option(None, *utils.FLAGS["username"], help="Search by username(s)"),
search: Optional[str] = typer.Option(None, *utils.FLAGS["search"], help="Search by username/note"),
status: Optional[crud.UserStatus] = typer.Option(None, *utils.FLAGS["status"]),
admins: Optional[list[str]] = typer.Option(None, *utils.FLAGS["admin"], help="Search by owner admin's username(s)")
):
"""
Displays a table of users
NOTE: Sorting is not currently available.
"""
with GetDB() as db:
users: list[User] = crud.get_users(
db=db, offset=offset, limit=limit,
usernames=username, search=search, status=status,
admins=admins
)
utils.print_table(
table=Table(
"ID", "Username", "Status", "Used traffic",
"Data limit", "Reset strategy", "Expires at", "Owner",
),
rows=[
(
str(user.id),
user.username,
user.status.value,
readable_size(user.used_traffic),
readable_size(user.data_limit) if user.data_limit else "Unlimited",
user.data_limit_reset_strategy.value,
utils.readable_datetime(user.expire, include_time=False),
user.admin.username if user.admin else ''
)
for user in users
]
)
@app.command(name="set-owner")
def set_owner(
username: str = typer.Option(None, *utils.FLAGS["username"], prompt=True),
admin: str = typer.Option(None, "--admin", "--owner", prompt=True, help="Admin's username"),
yes_to_all: bool = typer.Option(False, *utils.FLAGS["yes_to_all"], help="Skips confirmations")
):
"""
Transfers user's ownership
NOTE: This command needs additional confirmation for users who already have an owner.
"""
with GetDB() as db:
user: User = utils.raise_if_falsy(
crud.get_user(db, username=username), f'User "{username}" not found.')
dbadmin = utils.raise_if_falsy(
crud.get_admin(db, username=admin), f'Admin "{admin}" not found.')
# Ask for confirmation if user already has an owner
if user.admin and not yes_to_all and not typer.confirm(
f'{username}\'s current owner is "{user.admin.username}".'
f' Are you sure about transferring its ownership to "{admin}"?'
):
utils.error("Aborted.")
crud.set_owner(db, user, dbadmin)
utils.success(f'{username}\'s owner successfully set to "{admin}".')