mirror of
https://github.com/Gozargah/Marzban.git
synced 2026-05-17 08:35:56 +03:00
85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
from typing import Optional, List
|
|
|
|
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}".')
|