from collections.abc import Iterator, Sequence from typing import Any, Self from pydantic import BaseModel, ConfigDict, Field, RootModel, model_validator from dmp.app_connections.enums import AppConnectionStatus # Always populate by name BaseModel.model_config["populate_by_name"] = True class LimitOffsetPage[T](BaseModel): model_config = ConfigDict(from_attributes=True) total: int items: Sequence[T] limit: int offset: int @classmethod def __concrete_name__(cls: type[Any], params: tuple[type[Any], ...]) -> str: return f"{params[0].__name__.title()}LimitOffsetPage" class LabelId(BaseModel): vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") model_config = ConfigDict(from_attributes=True) class ArtistWithId(BaseModel): id: str class AdReportingConnectionCredentials(BaseModel): connection_id: str = Field(alias="connectionId") connect_card_uri: str = Field(alias="connectCardUri") class AdReportingConnection(BaseModel): status: AppConnectionStatus ad_accounts_count: int = Field(alias="adAccountsCount") class AssignLabelToUserAdAccountItem(BaseModel): ad_account_id: str = Field(alias="adAccountId") vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") class AssignLabelsToAdPlatformUserAdAccountsInput( RootModel[list[AssignLabelToUserAdAccountItem]] ): @model_validator(mode="after") def validate_unique(self) -> Self: ad_account_ids = set() for item in self.root: if item.ad_account_id in ad_account_ids: raise ValueError( f"Duplicate ad_account_id: {item.ad_account_id}. " "Ad account ids must be unique." ) ad_account_ids.add(item.ad_account_id) return self def __iter__(self) -> Iterator[AssignLabelToUserAdAccountItem]: # type: ignore return iter(self.root) def __getitem__(self, item: int) -> AssignLabelToUserAdAccountItem: return self.root[item] class SyncFivetranTablesStateInput(BaseModel): fivetran_connection_id: str | None = Field(alias="fivetranConnectorId")