gitscope
← marzneshin / v0.3.0-alpha9 / cli/utils.py
https://dev.kronoz.win/r/marzneshin.git
cli/utils.py · Python
Blame Raw
 1import pydoc
 2from datetime import datetime
 3from typing import Any, Dict, Iterable, Optional, TypeVar, Union
 4
 5import typer
 6from rich.console import Console
 7from rich.table import Table
 8
 9from app.db import crud
10from app.db.models import User
11
12T = TypeVar("T")
13
14rich_console = Console()
15PASSWORD_ENVIRON_NAME = "MARZBAN_ADMIN_PASSWORD"
16
17FLAGS: Dict[str, tuple] = {
18    "username": ("--username", "-u"),
19    "limit": ("--limit", "-l"),
20    "offset": ("--offset", "-o"),
21    "yes_to_all": ("--yes", "-y"),
22    "is_sudo": ("--sudo/--no-sudo",),
23    "format": ("--format", "-f"),
24    "output_file": ("--output", "-o"),
25    "status": ("--status",),
26}
27
28
29def success(text: str, auto_exit: bool = True):
30    typer.echo(typer.style(text, fg=typer.colors.GREEN))
31    if auto_exit:
32        raise typer.Exit(0)
33
34
35def error(text: str, auto_exit: bool = True):
36    typer.echo(typer.style(text, fg=typer.colors.RED), err=True)
37    if auto_exit:
38        raise typer.Exit(-1)
39
40
41def paginate(text: str):
42    pydoc.pager(text)
43
44
45def get_user(db, username: str) -> User:
46    user: Union[User, None] = crud.get_user(db=db, username=username)
47    if not user:
48        error(f'User "{username}" not found!')
49
50    return user
51
52
53def print_table(
54    table: Table, rows: Iterable[Iterable[Any]], console: Optional[Console] = None
55):
56    for row in rows:
57        table.add_row(*row)
58
59    (console or rich_console).print(table)
60
61
62def readable_datetime(
63    date_time: Union[datetime, int, None],
64    include_date: bool = True,
65    include_time: bool = True,
66):
67    def get_datetime_format():
68        dt_format = ""
69        if include_date:
70            dt_format += "%d %B %Y"
71        if include_time:
72            if dt_format:
73                dt_format += ", "
74            dt_format += "%H:%M:%S"
75
76        return dt_format
77
78    if isinstance(date_time, int):
79        date_time = datetime.fromtimestamp(date_time)
80
81    return date_time.strftime(get_datetime_format()) if date_time else "-"
82
83
84def raise_if_falsy(obj: T, message: str) -> T:
85    if not obj:
86        error(text=message, auto_exit=True)
87
88    return obj