gitscope
← marzneshin / v0.6.3 / 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,
55    rows: Iterable[Iterable[Any]],
56    console: Optional[Console] = None,
57):
58    for row in rows:
59        table.add_row(*row)
60
61    (console or rich_console).print(table)
62
63
64def readable_datetime(
65    date_time: Union[datetime, int, None],
66    include_date: bool = True,
67    include_time: bool = True,
68):
69    def get_datetime_format():
70        dt_format = ""
71        if include_date:
72            dt_format += "%d %B %Y"
73        if include_time:
74            if dt_format:
75                dt_format += ", "
76            dt_format += "%H:%M:%S"
77
78        return dt_format
79
80    if isinstance(date_time, int):
81        date_time = datetime.fromtimestamp(date_time)
82
83    return date_time.strftime(get_datetime_format()) if date_time else "-"
84
85
86def raise_if_falsy(obj: T, message: str) -> T:
87    if not obj:
88        error(text=message, auto_exit=True)
89
90    return obj