from typing import Any from fansifter_common.core.enums import Brand from fansifter_common.testing.factories import SQLAlchemyFactory from fansifter_common.utils import timezone from polyfactory import Use from email_campaigns.audiences.models import Audience, AudienceFanDataList from email_campaigns.automated.enums import AutomatedEmailType from email_campaigns.automated.models import AutomatedEmail, SourceCampaign from email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.campaigns.models import CampaignBatch, EmailCampaign from email_campaigns.emails.models import EmailDomain from email_campaigns.reporting.models import EmailReportingReport from email_campaigns.rosters.enums import FanDataListType class AudienceFanDataListFactory(SQLAlchemyFactory[AudienceFanDataList]): list_id = Use(SQLAlchemyFactory.__faker__.uuid4) type = FanDataListType.ARTIST class AudienceFactory(SQLAlchemyFactory[Audience]): archived_at = None fandata_lists = Use(lambda: [AudienceFanDataListFactory.build()]) # Email factories class EmailDomainFactory(SQLAlchemyFactory[EmailDomain]): domain = Use(SQLAlchemyFactory.__faker__.domain_name) brand = Brand.SME # Campaigns factories class CampaignFactory(SQLAlchemyFactory[EmailCampaign]): audience_id = None status = EmailCampaignStatus.DRAFT email_domain = Use(EmailDomainFactory.build) global_participant_id = Use(lambda: CampaignFactory.__faker__.uuid4(cast_to=str)) custom_list_id = None send_at = Use( lambda: CampaignFactory.__faker__.future_datetime(tzinfo=timezone.UTC) ) send_at_timezone = None cancelled_at = None deleted_at = None deleted_by = None html_content = ( '' ) class CampaignBatchFactory(SQLAlchemyFactory[CampaignBatch]): completed_at = None cancelled_at = None # Source campaigns factories class SourceCampaignFactory(SQLAlchemyFactory[SourceCampaign]): global_participant_id = Use(lambda: CampaignFactory.__faker__.uuid4(cast_to=str)) custom_list_id = None is_double_opt_in_enabled = False source = "smf" # Automated Email factories class AutomatedEmailFactory(SQLAlchemyFactory[AutomatedEmail]): type = AutomatedEmailType.TRIGGERED email_domain = Use(EmailDomainFactory.build) global_participant_id = Use(lambda: CampaignFactory.__faker__.uuid4(cast_to=str)) custom_list_id = None last_sent_at = None deleted_at = None deleted_by = None source_campaign_connections: Any = Use(list) # Reporting factories class EmailReportingReportFactory(SQLAlchemyFactory[EmailReportingReport]): __set_association_proxy__ = False __set_relationships__ = False