from __future__ import annotations from dataclasses import dataclass, field from typing import Protocol from fansifter_common.auth.account import Account from pydantic import BaseModel from dmp.app_connections.enums import AppConnectionStatus from dmp.google.enums import GoogleUserConnectionStatus from dmp.google.models import ( GoogleAdAccount, ) @dataclass(kw_only=True) class GoogleUser: id: str name: str granted_scopes: list[str] def scopes_sufficient(self, scopes: list[str], /) -> bool: return set(self.granted_scopes).issuperset(scopes) @dataclass(kw_only=True) class GoogleUserConnectionAdAccount: id: str external_id: str name: str @classmethod def from_model(cls, obj: GoogleAdAccount) -> GoogleUserConnectionAdAccount: return cls( id=obj.id, external_id=obj.external_id, name=obj.name or obj.external_id, ) @dataclass(kw_only=True) class GoogleUserConnectionResponse: user: GoogleUser | None status: GoogleUserConnectionStatus required_scopes: list[str] ad_accounts: list[GoogleUserConnectionAdAccount] = field(default_factory=list) ad_accounts_count: int = field(init=False) def __post_init__(self) -> None: self.ad_accounts_count = len(self.ad_accounts) @property def is_connected(self) -> bool: return self.status == GoogleUserConnectionStatus.CONNECTED @dataclass class AssignGoogleUserAdAccountLabelData: ad_account_id: str vendor_id: int subaccount_id: int @property def account(self) -> Account: return Account(vendor_id=self.vendor_id, subaccount_id=self.subaccount_id) class GoogleUserAdAccountLabel(BaseModel): id: str external_id: str name: str business_account_name: str | None campaigns_count: int vendor_id: int | None subaccount_id: int | None class BusinessCenterAdAccount(Protocol): external_id: str name: str campaigns_count: int class GoogleAdAccountOverview(BaseModel): id: str user_ad_account_id: str | None user_id: str | None external_id: str name: str vendor_id: int | None subaccount_id: int | None is_self_connected: bool user_connection_status: GoogleUserConnectionStatus user_self_connected: bool ad_reporting_connection_status: AppConnectionStatus ad_reporting_self_connected: bool sharing_user_id: str | None reporting_user_id: str | None campaigns_count: int