from typing import Optional, List from dataclasses import field, dataclass from marshmallow import validate from datetime import date from services.territory.constants import GLOBAL_TERRITORY_ID from models import CampaignObjective from models.performance_metrics import MetricsField from shared.schemas import DSPList, AVAILABLE_DSPS @dataclass class MetricsFieldObjective: id: int name: str def __init__(self, objective: CampaignObjective): self.id = objective.id self.name = objective.name @dataclass class MetricsFieldType: id: int name: str index: int @dataclass class MetricsFieldFormat: id: int name: str @dataclass class MetricsFieldSchema: id: int name: str title: Optional[str] subtitle: Optional[str] totalName: Optional[str] description: Optional[str] type: MetricsFieldType format: MetricsFieldFormat index: int def __init__(self, field: MetricsField): self.id = field.id self.name = field.name self.title = field.title self.subtitle = field.subtitle self.totalName = field.total_name self.description = field.description self.index = field.order_index self.type = MetricsFieldType(field.type.id, field.type.name, field.type.order_index) self.format = MetricsFieldFormat(field.format.id, field.format.name) @dataclass class ObjectiveSchema: id: int name: str fields: List[MetricsFieldSchema] @dataclass class MetricsResponseSchema: objectives: List[ObjectiveSchema] allFields: List[MetricsFieldSchema] @dataclass class UpdateUserMetricsRequestSchema: metrics: List[int] @dataclass class MetricsPlatformsResponseSchema: platforms: List[str] @dataclass class PerformanceMetricsParamsSchema: startDate: date endDate: date provider: Optional[int] breakdown: Optional[int] freeText: Optional[str] = field(metadata={"validate": validate.Length(min=2, max=500)}) dsps: Optional[DSPList] = field(default_factory=AVAILABLE_DSPS) sort: Optional[str] = field(default="0") labels: List[int] = field(default_factory=list) platforms: List[str] = field(default_factory=list) categories: List[int] = field(default_factory=list) isPending: Optional[bool] = None disableDateValidation: Optional[bool] = field(default=False) territoryId: Optional[int] = field(default=GLOBAL_TERRITORY_ID) @dataclass class PerformanceMetricsCampaignMetadata: projectId: Optional[int] campaignId: Optional[int] isPending: bool @dataclass class PerformanceMetricsProjectsMetadata: projectId: int hasPendingCampaigns: bool canApproveCampaigns: bool isConfidential: bool @dataclass class PerformanceMetricsResponseSchema: entityId: str name: str fields: dict metadata: Optional[dict] = None @dataclass class PerformanceMetricsListResponseSchema: items: List[PerformanceMetricsResponseSchema] total: Optional[int] = field(default=0) totalFields: Optional[dict] = field(default_factory=dict) @dataclass class BreakdownOptionSchema: id: int name: str group: str daysRange: int @dataclass class PerformanceMetricsDetailsResponseSchema: items: List[PerformanceMetricsResponseSchema] @dataclass class PhasesCampaignsModel: entity_id: int entity_name: str campaign_id: str @dataclass class PlatformsQueryParams: onlyExternal: Optional[bool] = field(default=False)