from datetime import datetime from enum import StrEnum from typing import Annotated from urllib.parse import urljoin from fansifter_common.utils import timezone from pydantic import ( AfterValidator, BaseModel, ConfigDict, Field, ValidationInfo, field_validator, ) class SongwhipCampaignType(StrEnum): SONGWHIP_PRESAVE = "SONGWHIP_PRESAVE" SONGWHIP_EXCLUSIVE_CONTENT = "SONGWHIP_EXCLUSIVE_CONTENT" class SongwhipPresavePage(BaseModel): model_config = ConfigDict(from_attributes=True) id: str name: str url: str = Field(validation_alias="path") vendor_id: int subaccount_id: int global_participant_id: str created_at: Annotated[datetime, AfterValidator(timezone.to_aware)] @field_validator("url") @classmethod def construct_url(cls, path: str, info: ValidationInfo) -> str: if info.context: path = urljoin(info.context.get("songwhip_url"), path) return path class SongwhipCampaign(BaseModel): model_config = ConfigDict(from_attributes=True) id: str type: SongwhipCampaignType name: str url: str | None = Field(None, validation_alias="path") vendor_id: int subaccount_id: int global_participant_id: str created_at: Annotated[datetime, AfterValidator(timezone.to_aware)] @field_validator("url") @classmethod def construct_url(cls, path: str | None, info: ValidationInfo) -> str | None: if path and info.context: path = urljoin(info.context.get("songwhip_url"), path) return path