"""Models for Subscription message.""" from __future__ import annotations from pydantic import BaseModel class ProfileSubscriptionsUpdatedV1(BaseModel): """Model for Subscription updated payload.""" id: str crmId: str newValue: bool mailingListCrmId: str class SForceSubscriptionUpdate(BaseModel): """Model for a SalesForce Subscription updates.""" Action__c: str Mailing_List_ID__c: str Source__c: str Fan_ID__c: str Subscription_ID__c: str @staticmethod def _get_mapped_field(field_name: str) -> str: """Retrieve the correct SalesForce Subscription field name.""" sf_field_mapping = { 'newValue': 'Action__c', 'mailingListCrmId': 'Mailing_List_ID__c', 'crmId': 'Subscription_ID__c', } return sf_field_mapping.get(field_name) @classmethod def from_profile_update( cls, source_data: ProfileSubscriptionsUpdatedV1, crm_id: str ) -> SForceSubscriptionUpdate: """Create instance from an existing ProfileUpdated.""" sf_dict = {} for updated_field, updated_value in source_data.model_dump().items(): sf_field_name = cls._get_mapped_field(updated_field) if sf_field_name: if sf_field_name == 'Action__c': sf_dict[sf_field_name] = 'Sign Up' if updated_value else 'Unsub' else: sf_dict[sf_field_name] = updated_value sf_dict['Source__c'] = 'New Preference Center' sf_dict['Fan_ID__c'] = crm_id return cls(**sf_dict) def to_dict(self): """Convert to dict, excluding Nones.""" return self.model_dump(exclude_none=True) # Update ref for ProfileSubscriptionsUpdatedV1 in SForceSubscriptionUpdate SForceSubscriptionUpdate.model_rebuild()