50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
from config import defaults
|
|
from components.utils import ensure_list, to_unique_sorted_str_list
|
|
from components.models import *
|
|
|
|
|
|
class TableSearch(BaseModel):
|
|
q: Annotated[Any, AfterValidator(lambda x: str(x))] = ""
|
|
page: Annotated[Any, AfterValidator(lambda x: int(x) if x else 1)] = 1
|
|
page_size: Annotated[
|
|
Any,
|
|
AfterValidator(lambda x: int(x) if x else defaults.TABLE_PAGE_SIZE),
|
|
] = defaults.TABLE_PAGE_SIZE
|
|
sorting: tuple = ("created", True)
|
|
filters: Annotated[
|
|
Any,
|
|
AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))),
|
|
] = {}
|
|
|
|
@field_validator("filters", mode="after")
|
|
def filters_formatter(cls, v):
|
|
filters = dict()
|
|
for f in v:
|
|
key_name, key_value = f.split(":")
|
|
if key_name == "assigned_users":
|
|
continue
|
|
if key_name not in filters.keys():
|
|
filters[key_name] = key_value
|
|
else:
|
|
if isinstance(filters[key_name], list):
|
|
filters[key_name].append(key_value)
|
|
else:
|
|
filters[key_name] = [filters[key_name], key_value]
|
|
|
|
return filters
|
|
|
|
@field_validator("sorting", mode="before")
|
|
def split_sorting(cls, v):
|
|
if isinstance(v, str):
|
|
match v.split(":"):
|
|
case [
|
|
sort_attr,
|
|
direction,
|
|
]:
|
|
sort_reverse = True if direction == "desc" else False
|
|
case _:
|
|
sort_reverse = True
|
|
sort_attr = "created"
|
|
|
|
return (sort_attr, sort_reverse)
|