import dataclasses from typing import Optional from flask import request from helpers import str_to_bool @dataclasses.dataclass class PhoneFilter: phone_numbers: Optional[str] = None prefix: 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) -> "PhoneFilter": return cls( phone_number=request.args.get("filter[phone_number]"), prefix=request.args.get("filter[prefix]"), 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 PhonePage(Page): sortby: Optional[str] = None filter: PhoneFilter = dataclasses.field( default_factory=PhoneFilter.from_request_queries ) @classmethod def from_request_queries(cls) -> "PhonePage": # return super().from_request_queries() base = Page.from_request_queries() return cls(**dataclasses.asdict(base), sortby=request.args.get("sortby"))