56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
|
|
import dataclasses
|
||
|
|
from typing import Optional
|
||
|
|
from flask import request
|
||
|
|
from helpers import str_to_bool
|
||
|
|
|
||
|
|
|
||
|
|
@dataclasses.dataclass
|
||
|
|
class AddressFilter:
|
||
|
|
address: Optional[str] = None
|
||
|
|
area_code: Optional[str] = None
|
||
|
|
city_code: Optional[str] = None
|
||
|
|
created_from: Optional[str] = None
|
||
|
|
created_to: Optional[str] = None
|
||
|
|
modified_from: Optional[str] = None
|
||
|
|
modified_to: Optional[str] = None
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_request_queries(cls) -> "AddressFilter":
|
||
|
|
return cls(
|
||
|
|
address=request.args.get("filter[address]"),
|
||
|
|
area_code=request.args.get("filter[area_code]"),
|
||
|
|
city_code=request.args.get("filter[city_code]"),
|
||
|
|
created_from=request.args.get("filter[created_from]"),
|
||
|
|
created_to=request.args.get("filter[created_to]"),
|
||
|
|
modified_from=request.args.get("filter[modified_from]"),
|
||
|
|
modified_to=request.args.get("filter[modified_to]"),
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@dataclasses.dataclass
|
||
|
|
class Page:
|
||
|
|
page: int = 0
|
||
|
|
size: int = 10
|
||
|
|
asc: bool = False
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_request_queries(cls) -> "Page":
|
||
|
|
return Page(
|
||
|
|
page=int(request.args.get("page", 0)),
|
||
|
|
size=int(request.args.get("size", 10)),
|
||
|
|
asc=request.args.get("asc", type=str_to_bool) or False
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@dataclasses.dataclass
|
||
|
|
class AddressPage(Page):
|
||
|
|
sortby: Optional[str] = None
|
||
|
|
filter: AddressFilter = dataclasses.field(
|
||
|
|
default_factory=AddressFilter.from_request_queries
|
||
|
|
)
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_request_queries(cls) -> "AddressPage":
|
||
|
|
base = Page.from_request_queries()
|
||
|
|
return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby"))
|