from dataclasses import dataclass, field from datetime import date, datetime from typing import Optional, Union, List import marshmallow_dataclass from api import ma from projects.schemas import ProjectTargetSchema from shared.schemas import ArtistSchema, RoleSchema from marshmallow import validate RECENT_SEARCHES_LIMIT = 7 @dataclass class Image: url: str width: Optional[int] = field(default=None) height: Optional[int] = field(default=None) @dataclass class ArtistSearchSchema: id: str name: str projectsCount: int isUnknown: bool image: Optional[Image] = None isSony: bool = True @dataclass class ProjectSearchModel: id: int name: str startDate: date targets: ProjectTargetSchema isConfidential: bool userRoles: Optional[List[RoleSchema]] editDate: Optional[datetime] isClaimed: bool = True @dataclass class CampaignSearchModel: id: int uuid: str name: str platforms: List[str] endDate: date startDate: date categoryId: Optional[int] project: Optional[ProjectSearchModel] = None isPending: bool = False isUnassigned: bool = False RecentSearchEntity = Union[ProjectSearchModel, CampaignSearchModel, ArtistSchema] @dataclass class RecentSearchItemResponse: id: int type: int entity: RecentSearchEntity recent_search_item_response = marshmallow_dataclass.class_schema( RecentSearchItemResponse, base_schema=ma.Schema ) @dataclass class RecentSearchQueryParams: limit: Optional[int] = field(default=RECENT_SEARCHES_LIMIT, metadata={"validate": validate.Range(min=1)}) recent_search_query_params = marshmallow_dataclass.class_schema( RecentSearchQueryParams, base_schema=ma.Schema )