Users: filter by admin username added

Details:
 - `crud.py`'s get_users(): `admin` param replaced by `admins`.
 - get_users() view: owner(admin) param added.
 - list_users command: multiple admin search added.
 - CLI docs re-generated.
This commit is contained in:
Alireza Jafari
2024-04-15 22:21:47 +03:30
parent b038f5eecf
commit 77b1582e52
5 changed files with 11 additions and 11 deletions

View File

@@ -121,7 +121,7 @@ def get_users(db: Session,
search: Optional[str] = None,
status: Optional[Union[UserStatus, list]] = None,
sort: Optional[List[UsersSortingOptions]] = None,
admin: Optional[Admin] = None,
admins: Optional[List[str]] = None,
reset_strategy: Optional[Union[UserDataLimitResetStrategy, list]] = None,
return_with_count: bool = False) -> Union[List[User], Tuple[List[User], int]]:
query = db.query(User)
@@ -147,8 +147,8 @@ def get_users(db: Session,
else:
query = query.filter(User.data_limit_reset_strategy == reset_strategy)
if admin:
query = query.filter(User.admin == admin)
if admins:
query = query.filter(User.admin.has(Admin.username.in_(admins)))
# count it before applying limit and offset
if return_with_count:

View File

@@ -222,6 +222,7 @@ def get_users(offset: int = None,
limit: int = None,
username: List[str] = Query(None),
search: Union[str, None] = None,
owner: Union[list[str], None] = Query(None, alias="admin"),
status: UserStatus = None,
sort: str = None,
db: Session = Depends(get_db),
@@ -229,8 +230,6 @@ def get_users(offset: int = None,
"""
Get all users
"""
dbadmin = crud.get_admin(db, admin.username)
if sort is not None:
opts = sort.strip(',').split(',')
sort = []
@@ -248,7 +247,7 @@ def get_users(offset: int = None,
usernames=username,
status=status,
sort=sort,
admin=dbadmin if not admin.is_sudo else None,
admins=owner if admin.is_sudo else [admin.username],
return_with_count=True)
return {"users": users, "total": count}

View File

@@ -273,7 +273,7 @@ $ user list [OPTIONS]
* `-u, --username TEXT`: Search by username(s)
* `-s, --search TEXT`: Search by username/note
* `--status [active|disabled|limited|expired|on_hold]`
* `--admin, --owner TEXT`: Search by owner admin's username
* `--admin, --owner TEXT`: Search by owner admin's username(s)
* `--help`: Show this message and exit.
### `user set-owner`

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional
import typer
from rich.table import Table
@@ -16,10 +16,10 @@ app = typer.Typer(no_args_is_help=True)
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)"),
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"]),
admin: Optional[str] = typer.Option(None, "--admin", "--owner", help="Search by owner admin's username")
admins: Optional[list[str]] = typer.Option(None, *utils.FLAGS["admin"], help="Search by owner admin's username(s)")
):
"""
Displays a table of users
@@ -30,7 +30,7 @@ def list_users(
users: list[User] = crud.get_users(
db=db, offset=offset, limit=limit,
usernames=username, search=search, status=status,
admin=crud.get_admin(db, admin) if admin else None
admins=admins
)
utils.print_table(

View File

@@ -17,6 +17,7 @@ PASSWORD_ENVIRON_NAME = "MARZBAN_ADMIN_PASSWORD"
FLAGS: Dict[str, tuple] = {
"username": ("--username", "-u"),
"search": ("--search", "-s"),
"admin": ("--admin", "--owner"),
"limit": ("--limit", "-l"),
"offset": ("--offset", "-o"),
"yes_to_all": ("--yes", "-y"),