gitscope
https://dev.kronoz.win/r/marzneshin.git
cli/user.py · v0.6.0
Source
1 a47eb4c Dawsh 2y ago from typing import List, Optional
2 a47eb4c Dawsh 2y ago
3 a47eb4c Dawsh 2y ago import typer
4 a47eb4c Dawsh 2y ago from rich.table import Table
5 a47eb4c Dawsh 2y ago
6 a47eb4c Dawsh 2y ago from app.db import GetDB, crud
7 a47eb4c Dawsh 2y ago from app.db.models import User
8 a47eb4c Dawsh 2y ago from app.utils.system import readable_size
9 a47eb4c Dawsh 2y ago
10 a47eb4c Dawsh 2y ago from . import utils
11 a47eb4c Dawsh 2y ago
12 a47eb4c Dawsh 2y ago app = typer.Typer(no_args_is_help=True)
13 a47eb4c Dawsh 2y ago
14 a47eb4c Dawsh 2y ago
15 a47eb4c Dawsh 2y ago @app.command(name="list")
16 a47eb4c Dawsh 2y ago def list_users(
17 a47eb4c Dawsh 2y ago offset: Optional[int] = typer.Option(None, *utils.FLAGS["offset"]),
18 a47eb4c Dawsh 2y ago limit: Optional[int] = typer.Option(None, *utils.FLAGS["limit"]),
19 01cdf2e Dawsh 2y ago username: Optional[List[str]] = typer.Option(
20 01cdf2e Dawsh 2y ago None, *utils.FLAGS["username"], help="Search by username(s)"
21 01cdf2e Dawsh 2y ago ),
22 f4fecee Dawsh 2y ago status: Optional[crud.UserStatus] = typer.Option(
23 f4fecee Dawsh 2y ago None, *utils.FLAGS["status"]
24 f4fecee Dawsh 2y ago ),
25 01cdf2e Dawsh 2y ago admin: Optional[str] = typer.Option(
26 01cdf2e Dawsh 2y ago None, "--admin", "--owner", help="Search by owner admin's username"
27 01cdf2e Dawsh 2y ago ),
28 a47eb4c Dawsh 2y ago ):
29 a47eb4c Dawsh 2y ago """
30 a47eb4c Dawsh 2y ago Displays a table of users
31 a47eb4c Dawsh 2y ago
32 a47eb4c Dawsh 2y ago NOTE: Sorting is not currently available.
33 a47eb4c Dawsh 2y ago """
34 a47eb4c Dawsh 2y ago with GetDB() as db:
35 a47eb4c Dawsh 2y ago users: list[User] = crud.get_users(
36 01cdf2e Dawsh 2y ago db=db,
37 01cdf2e Dawsh 2y ago offset=offset,
38 01cdf2e Dawsh 2y ago limit=limit,
39 01cdf2e Dawsh 2y ago usernames=username,
40 01cdf2e Dawsh 2y ago status=status,
41 01cdf2e Dawsh 2y ago admin=crud.get_admin(db, admin) if admin else None,
42 a47eb4c Dawsh 2y ago )
43 a47eb4c Dawsh 2y ago
44 a47eb4c Dawsh 2y ago utils.print_table(
45 a47eb4c Dawsh 2y ago table=Table(
46 01cdf2e Dawsh 2y ago "ID",
47 01cdf2e Dawsh 2y ago "Username",
48 01cdf2e Dawsh 2y ago "Status",
49 01cdf2e Dawsh 2y ago "Used traffic",
50 01cdf2e Dawsh 2y ago "Data limit",
51 01cdf2e Dawsh 2y ago "Reset strategy",
52 01cdf2e Dawsh 2y ago "Expires at",
53 01cdf2e Dawsh 2y ago "Owner",
54 a47eb4c Dawsh 2y ago ),
55 a47eb4c Dawsh 2y ago rows=[
56 a47eb4c Dawsh 2y ago (
57 a47eb4c Dawsh 2y ago str(user.id),
58 a47eb4c Dawsh 2y ago user.username,
59 a47eb4c Dawsh 2y ago user.status.value,
60 a47eb4c Dawsh 2y ago readable_size(user.used_traffic),
61 f4fecee Dawsh 2y ago (
62 f4fecee Dawsh 2y ago readable_size(user.data_limit)
63 f4fecee Dawsh 2y ago if user.data_limit
64 f4fecee Dawsh 2y ago else "Unlimited"
65 f4fecee Dawsh 2y ago ),
66 a47eb4c Dawsh 2y ago user.data_limit_reset_strategy.value,
67 a47eb4c Dawsh 2y ago utils.readable_datetime(user.expire, include_time=False),
68 01cdf2e Dawsh 2y ago user.admin.username if user.admin else "",
69 a47eb4c Dawsh 2y ago )
70 a47eb4c Dawsh 2y ago for user in users
71 01cdf2e Dawsh 2y ago ],
72 a47eb4c Dawsh 2y ago )
73 a47eb4c Dawsh 2y ago
74 a47eb4c Dawsh 2y ago
75 a47eb4c Dawsh 2y ago @app.command(name="set-owner")
76 a47eb4c Dawsh 2y ago def set_owner(
77 a47eb4c Dawsh 2y ago username: str = typer.Option(None, *utils.FLAGS["username"], prompt=True),
78 01cdf2e Dawsh 2y ago admin: str = typer.Option(
79 01cdf2e Dawsh 2y ago None, "--admin", "--owner", prompt=True, help="Admin's username"
80 01cdf2e Dawsh 2y ago ),
81 01cdf2e Dawsh 2y ago yes_to_all: bool = typer.Option(
82 01cdf2e Dawsh 2y ago False, *utils.FLAGS["yes_to_all"], help="Skips confirmations"
83 01cdf2e Dawsh 2y ago ),
84 a47eb4c Dawsh 2y ago ):
85 a47eb4c Dawsh 2y ago """
86 a47eb4c Dawsh 2y ago Transfers user's ownership
87 a47eb4c Dawsh 2y ago
88 a47eb4c Dawsh 2y ago NOTE: This command needs additional confirmation for users who already have an owner.
89 a47eb4c Dawsh 2y ago """
90 a47eb4c Dawsh 2y ago with GetDB() as db:
91 a47eb4c Dawsh 2y ago user: User = utils.raise_if_falsy(
92 f4fecee Dawsh 2y ago crud.get_user(db, username=username),
93 f4fecee Dawsh 2y ago f'User "{username}" not found.',
94 01cdf2e Dawsh 2y ago )
95 a47eb4c Dawsh 2y ago
96 a47eb4c Dawsh 2y ago dbadmin = utils.raise_if_falsy(
97 01cdf2e Dawsh 2y ago crud.get_admin(db, username=admin), f'Admin "{admin}" not found.'
98 01cdf2e Dawsh 2y ago )
99 a47eb4c Dawsh 2y ago
100 a47eb4c Dawsh 2y ago # Ask for confirmation if user already has an owner
101 01cdf2e Dawsh 2y ago if (
102 01cdf2e Dawsh 2y ago user.admin
103 01cdf2e Dawsh 2y ago and not yes_to_all
104 01cdf2e Dawsh 2y ago and not typer.confirm(
105 01cdf2e Dawsh 2y ago f'{username}\'s current owner is "{user.admin.username}".'
106 01cdf2e Dawsh 2y ago f' Are you sure about transferring its ownership to "{admin}"?'
107 01cdf2e Dawsh 2y ago )
108 a47eb4c Dawsh 2y ago ):
109 a47eb4c Dawsh 2y ago utils.error("Aborted.")
110 a47eb4c Dawsh 2y ago
111 a47eb4c Dawsh 2y ago crud.set_owner(db, user, dbadmin)
112 a47eb4c Dawsh 2y ago
113 a47eb4c Dawsh 2y ago utils.success(f'{username}\'s owner successfully set to "{admin}".')