from dataclasses import field from datetime import datetime, date from typing import List, Optional, Any from marshmallow_dataclass import dataclass from models import Playlist, Artist, Project from shared.schemas import RoleSchema from projects.schemas import ProjectTargetSchema from utils.date_utils import DateRange from models.user import User from models.campaign import Campaign from models.territories import Territory from models.projects_history import ProjectHistoryItem from enum import Enum class QueryActionTypes(Enum): ADDED = 1 CHANGED = 2 CREATED = 3 EXTENDED = 4 MOVED = 5 REMOVED = 6 SHORTENED = 7 UPDATED = 8 REJECTED = 9 APPROVED = 10 CLAIMED = 11 @dataclass class HistoryLabel: id: int name: str @dataclass class HistoryUser: id: str name: str email: str label: Optional[HistoryLabel] role: RoleSchema def __init__(self, user: User, role: Optional[RoleSchema] = None): self.id = user.external_id self.name = user.name self.email = user.email self.role = role if len(user.labels) > 0: first_label = user.labels[0] self.label = HistoryLabel(first_label.id, first_label.name) @dataclass class HistoryDateRange: start_date: date end_date: date def __init__(self, date_range: DateRange): self.start_date = date_range.start self.end_date = date_range.end @dataclass class HistoryBudgetValue: value: float def __init__(self, value: float): self.value = value @dataclass class HistoryTextValue: value: Optional[str] def __init__(self, value: Optional[str]): self.value = value @dataclass class HistoryListTextValue: value: Optional[List[str]] def __init__(self, value: Optional[List[str]]): self.value = value @dataclass class HistoryTerritory: id: int name: str def __init__(self, territory: Territory): self.id = territory.id self.name = territory.name @dataclass class HistoryCampaign: id: int name: str projectId: Optional[int] categoryId: Optional[int] isDeleted: bool source: Optional[str] def __init__(self, campaign: Campaign): self.id = campaign.id self.name = campaign.name self.projectId = campaign.project_id self.isDeleted = campaign.is_deleted self.source = campaign.source if campaign.type: self.categoryId = campaign.type.group_id @dataclass class HistoryAction: id: int type: str @dataclass class HistoryItemResponseModel: id: int action: HistoryAction date: datetime = field(metadata={"format": "%Y-%m-%dT%H:%M:%S%z"}) user: Optional[HistoryUser] = None is_gras: Optional[bool] = False old_value: Any = None new_value: Any = None campaign: Optional[HistoryCampaign] = None def __init__(self, item: ProjectHistoryItem, user: Optional[HistoryUser]): self.id = item.id self.date = item.created_at self.action = HistoryAction(item.history_action.id, item.history_action.type) if user is not None: self.user = user if user is None: self.is_gras = True if item.old_value: self.old_value = item.old_value if item.new_value: self.new_value = item.new_value if item.campaign: self.campaign = HistoryCampaign(item.campaign) @dataclass class ProjectHistorySchema: id: int name: str targets: ProjectTargetSchema def __init__(self, project: Project, targets: ProjectTargetSchema): self.id = project.id self.name = project.name self.targets = targets @dataclass class RecentHistoryItemResponseSchema: event: HistoryItemResponseModel project: ProjectHistorySchema def __init__(self, event: HistoryItemResponseModel, project: ProjectHistorySchema): self.event = event self.project = project @dataclass class ProjectHistoryResponseSchema: items: List[HistoryItemResponseModel] = field(default_factory=list) total: int = field(default_factory=int) limit: int = field(default_factory=int) offset: int = field(default_factory=int) def __init__(self, items: List[HistoryItemResponseModel], total: int, limit: int, offset: int): self.items = items self.total = total self.limit = limit self.offset = offset @dataclass class HistoryTeamMemberSchema: id: int name: str email: str roles: List[RoleSchema] def __init__(self, user_id: int, name: str, email: str, roles: List[RoleSchema]): self.id = user_id self.name = name self.email = email self.roles = roles @dataclass class ProjectNotesResponseSchema: history: List[HistoryItemResponseModel] = field(default_factory=list) def __init__(self, history: List[HistoryItemResponseModel]): self.history = history @dataclass class HistoryObjective: id: int name: str def __init__(self, campaign: Campaign): self.id = campaign.objective.id self.name = campaign.objective.name @dataclass class HistoryArtist: id: int name: str def __init__(self, playlist: Artist): self.id = playlist.id self.name = playlist.name @dataclass class HistoryPlaylist: id: int name: str owner: str provider: str def __init__(self, playlist: Playlist): self.id = playlist.id self.name = playlist.name self.owner = playlist.owner_name self.provider = playlist.provider @dataclass class HistoryCampaignType: id: int name: str def __init__(self, campaign): self.id = campaign.type.id self.name = campaign.type.name @dataclass class HistoryCampaignChanged: key: str value: str