import datetime from typing import Annotated, Any, Literal, cast from fansifter_common.utils import timezone from pydantic import AfterValidator, BeforeValidator AdReportingCampaignOrderBy = Literal[ "name.asc", "name.desc", "platform.asc", "platform.desc", "startAt.asc", "startAt.desc", "objective.asc", "objective.desc", "clicks.asc", "clicks.desc", "impressions.asc", "impressions.desc", "spendUSD.asc", "spendUSD.desc", "reach.asc", "reach.desc", "actions.asc", "actions.desc", "rate.asc", "rate.desc", "frequency.asc", "frequency.desc", "costPerActionUSD.asc", "costPerActionUSD.desc", ] AdReportingAdSetOrderBy = Literal[ "name.asc", "name.desc", "campaignName.asc", "campaignName.desc", "platform.asc", "platform.desc", "objective.asc", "objective.desc", "startAt.asc", "startAt.desc", "clicks.asc", "clicks.desc", "impressions.asc", "impressions.desc", "spendUSD.asc", "spendUSD.desc", "reach.asc", "reach.desc", "actions.asc", "actions.desc", "rate.asc", "rate.desc", "frequency.asc", "frequency.desc", "costPerActionUSD.asc", "costPerActionUSD.desc", ] AdReportingAdOrderBy = Literal[ "name.asc", "name.desc", "campaignName.asc", "campaignName.desc", "adSetName.asc", "adSetName.desc", "startAt.asc", "startAt.desc", "platform.asc", "platform.desc", "objective.asc", "objective.desc", "clicks.asc", "clicks.desc", "impressions.asc", "impressions.desc", "spendUSD.asc", "spendUSD.desc", "reach.asc", "reach.desc", "actions.asc", "actions.desc", "rate.asc", "rate.desc", "frequency.asc", "frequency.desc", "costPerActionUSD.asc", "costPerActionUSD.desc", ] # Textual fields from the *OrderBy literals that should be ordered # case-insensitively. Names are in snake_case — the form # `fansifter_common.adapters.db.jinja2sql_filters.orderby_filter` compares # against after applying its `transform_to="snakecase"` normalization. AdReportingCampaignCIFields: tuple[str, ...] = ("name",) AdReportingAdSetCIFields: tuple[str, ...] = ("name", "campaign_name") AdReportingAdCIFields: tuple[str, ...] = ("name", "campaign_name", "ad_set_name") AdReportingReportCIFields: tuple[str, ...] = ("name",) AdReportingReportOrderBy = Literal[ "name.asc", "name.desc", "impressions.asc", "impressions.desc", "views.asc", "views.desc", "clicks.asc", "clicks.desc", "spendUSD.asc", "spendUSD.desc", "createdAt.asc", "createdAt.desc", ] def _make_set(value: Any) -> set[str]: if isinstance(value, str): return { stripped_value for value in value.split(",") if (stripped_value := value.strip()) } return cast(set[str], value) GlobalParticipantIds = Annotated[set[str], BeforeValidator(_make_set)] TargetingCountries = Annotated[set[str], BeforeValidator(_make_set)] def _make_dt_aware(value: datetime.datetime) -> datetime.datetime: return timezone.to_aware(value) AwareDatetime = Annotated[ datetime.datetime, AfterValidator(timezone.to_aware), ]