from dataclasses import dataclass, field from typing import Optional, List from datetime import date import marshmallow_dataclass from marshmallow import validate from api import ma from media_plan.schemas import MediaPlanShortResponseSchema from models import Label, Artist from projects.schemas import ProjectsCountResponseSchema, ProjectModelSchema from projects.schemas import UnclaimedProjectModelSchema from shared.schemas import TeamMemberResponseSchema, ArtistSchema from models.user_project import UserProjectRoles from constants.project_statuses import ProjectStatuses from config import ARTIST_IMAGE_SERVICE_URL, LABEL_IMAGE_SERVICE_URL @dataclass class ArtistRequestModel: query: Optional[str] limit: int @dataclass class ArtistProjectsLabel: id: int name: str imageUrl: str @dataclass class ArtistProjectsMetadata: counts: ProjectsCountResponseSchema projectsLabels: List[ArtistProjectsLabel] = field(default_factory=list) def __init__(self, counts: ProjectsCountResponseSchema, labels: Optional[List[Label]]): self.counts = counts if labels: self.projectsLabels = [ ArtistProjectsLabel(label.id, label.name, LABEL_IMAGE_SERVICE_URL.format(id=label.id)) for label in labels ] @dataclass class ArtistProjectListResponseSchema: metadata: ArtistProjectsMetadata items: List[ProjectModelSchema] = field(default_factory=list) limit: int = field(default_factory=int) offset: int = field(default_factory=int) @dataclass class ArtistUnclaimedProjectListResponseSchema: metadata: ArtistProjectsMetadata items: List[UnclaimedProjectModelSchema] = field(default_factory=list) limit: int = field(default_factory=int) offset: int = field(default_factory=int) @dataclass class ArtistTeamLabel: id: int name: str imageUrl: str @dataclass class ArtistTeamLabelSchema: artistTeamId: int label: ArtistTeamLabel users: List[TeamMemberResponseSchema] @dataclass class ArtistTeamListResponseSchema: labels: List[ArtistTeamLabelSchema] @dataclass class ArtistTeamMemberParams: userId: int roleId: int = field( metadata={ "validate": validate.OneOf( [UserProjectRoles.EDITOR.value, UserProjectRoles.VIEWER.value] ) } ) categoryIds: List[int] = field(default_factory=list) @dataclass class ArtistTeamMembersUpdateRequestSchema: labelId: int added: List[ArtistTeamMemberParams] = field(default_factory=list) updated: List[ArtistTeamMemberParams] = field(default_factory=list) deleted: List[ArtistTeamMemberParams] = field(default_factory=list) @dataclass class ArtistRosterRequestSchema: labelId: int @dataclass class ArtistRosterMetadata: projectsCount: int earliestProjectStartDate: Optional[date] latestProjectEndDate: Optional[date] status: str isCurrentUserArtistTeamMember: bool @dataclass class ArtistRosterArtistModel: artist: ArtistSchema metadata: ArtistRosterMetadata @dataclass class ArtistRosterResponseModel: live: List[ArtistRosterArtistModel] planned: List[ArtistRosterArtistModel] inactive: List[ArtistRosterArtistModel] @dataclass class ArtistRosterProjectResponseModel: id: int name: str totalBudget: float allocatedBudget: float status: int startDate: date endDate: date currency: str mediaPlans: List[MediaPlanShortResponseSchema] artist_roster_project_response_model_schema = marshmallow_dataclass.class_schema( ArtistRosterProjectResponseModel, base_schema=ma.Schema ) @dataclass class ArtistRosterProjectsRequestSchema: labelId: int statuses: Optional[List[int]] = field( default=None, metadata={ "validate": validate.ContainsOnly(ProjectStatuses.all_values()) } ) artist_roster_projects_request_schema = marshmallow_dataclass.class_schema( ArtistRosterProjectsRequestSchema, base_schema=ma.Schema ) @dataclass class LabelArtistResponse: id: str # external_id name: str imageUrl: str def __init__(self, artist: Artist): self.id = artist.external_id self.name = artist.name if artist.images: self.imageUrl = artist.images[0].url else: self.imageUrl = ARTIST_IMAGE_SERVICE_URL.format(id=self.id.split("_")[1]) label_artist_response = marshmallow_dataclass.class_schema( LabelArtistResponse, base_schema=ma.Schema )