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"))