class Personalization(object): """A Personalization defines who should receive an individual message and how that message should be handled. """ def __init__(self): """Create an empty Personalization and initialize member variables.""" self._tos = [] self._from_email = None self._ccs = [] self._bccs = [] self._subject = None self._headers = [] self._substitutions = [] self._custom_args = [] self._send_at = None self._dynamic_template_data = None def add_email(self, email): email_type = type(email) if email_type.__name__ == 'To': self.add_to(email) return if email_type.__name__ == 'Cc': self.add_cc(email) return if email_type.__name__ == 'Bcc': self.add_bcc(email) return if email_type.__name__ == 'From': self.from_email = email return raise ValueError('Please use a To, From, Cc or Bcc object.') def _get_unique_recipients(self, recipients): unique_recipients = [] for recipient in recipients: recipient_email = recipient['email'].lower() if isinstance(recipient, dict) else recipient.email.lower() if all( unique_recipient['email'].lower() != recipient_email for unique_recipient in unique_recipients ): new_unique_recipient = recipient if isinstance(recipient, dict) else recipient.get() unique_recipients.append(new_unique_recipient) return unique_recipients @property def tos(self): """A list of recipients for this Personalization. :rtype: list(dict) """ return self._get_unique_recipients(self._tos) @tos.setter def tos(self, value): self._tos = value def add_to(self, email): """Add a single recipient to this Personalization. :type email: Email """ if email.substitutions: if isinstance(email.substitutions, list): for substitution in email.substitutions: self.add_substitution(substitution) else: self.add_substitution(email.substitutions) if email.dynamic_template_data: self.dynamic_template_data = email.dynamic_template_data if email.subject: if isinstance(email.subject, str): self.subject = email.subject else: self.subject = email.subject.get() self._tos.append(email.get()) @property def from_email(self): return self._from_email @from_email.setter def from_email(self, value): self._from_email = value def set_from(self, email): self._from_email = email.get() @property def ccs(self): """A list of recipients who will receive copies of this email. :rtype: list(dict) """ return self._get_unique_recipients(self._ccs) @ccs.setter def ccs(self, value): self._ccs = value def add_cc(self, email): """Add a single recipient to receive a copy of this email. :param email: new recipient to be CCed :type email: Email """ self._ccs.append(email.get()) @property def bccs(self): """A list of recipients who will receive blind carbon copies of this email. :rtype: list(dict) """ return self._get_unique_recipients(self._bccs) @bccs.setter def bccs(self, value): self._bccs = value def add_bcc(self, email): """Add a single recipient to receive a blind carbon copy of this email. :param email: new recipient to be BCCed :type email: Email """ self._bccs.append(email.get()) @property def subject(self): """The subject of your email (within this Personalization). Char length requirements, according to the RFC: https://stackoverflow.com/a/1592310 :rtype: string """ return self._subject @subject.setter def subject(self, value): self._subject = value @property def headers(self): """The headers for emails in this Personalization. :rtype: list(dict) """ return self._headers @headers.setter def headers(self, value): self._headers = value def add_header(self, header): """Add a single Header to this Personalization. :type header: Header """ self._headers.append(header.get()) @property def substitutions(self): """Substitutions to be applied within this Personalization. :rtype: list(dict) """ return self._substitutions @substitutions.setter def substitutions(self, value): self._substitutions = value def add_substitution(self, substitution): """Add a new Substitution to this Personalization. :type substitution: Substitution """ if not isinstance(substitution, dict): substitution = substitution.get() self._substitutions.append(substitution) @property def custom_args(self): """The CustomArgs that will be carried along with this Personalization. :rtype: list(dict) """ return self._custom_args @custom_args.setter def custom_args(self, value): self._custom_args = value def add_custom_arg(self, custom_arg): """Add a CustomArg to this Personalization. :type custom_arg: CustomArg """ self._custom_args.append(custom_arg.get()) @property def send_at(self): """A unix timestamp allowing you to specify when you want emails from this Personalization to be delivered. Scheduling more than 72 hours in advance is forbidden. :rtype: int """ return self._send_at @send_at.setter def send_at(self, value): self._send_at = value @property def dynamic_template_data(self): """Data for dynamic transactional template. Should be JSON-serializable structure. :rtype: JSON-serializable structure """ return self._dynamic_template_data @dynamic_template_data.setter def dynamic_template_data(self, value): if not isinstance(value, dict): value = value.get() self._dynamic_template_data = value def get(self): """ Get a JSON-ready representation of this Personalization. :returns: This Personalization, ready for use in a request body. :rtype: dict """ personalization = {} for key in ['tos', 'ccs', 'bccs']: value = getattr(self, key) if value: personalization[key[:-1]] = value from_value = getattr(self, 'from_email') if from_value: personalization['from'] = from_value for key in ['subject', 'send_at', 'dynamic_template_data']: value = getattr(self, key) if value: personalization[key] = value for prop_name in ['headers', 'substitutions', 'custom_args']: prop = getattr(self, prop_name) if prop: obj = {} for key in prop: obj.update(key) personalization[prop_name] = obj return personalization