From 989c65ac793976f845923d85585333ba0528314d Mon Sep 17 00:00:00 2001 From: George Katsikas <giorgakis.katsikas@gmail.com> Date: Mon, 11 Dec 2023 12:36:51 +0100 Subject: [PATCH] rework email sender to allow for mails -if they exist- --- scipost_django/mails/core.py | 29 ++++++++++++------- .../fellowship_invitation_initial.json | 2 +- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/scipost_django/mails/core.py b/scipost_django/mails/core.py index 939b2764c..ee3ec5afd 100644 --- a/scipost_django/mails/core.py +++ b/scipost_django/mails/core.py @@ -42,7 +42,7 @@ class MailEngine: bcc=[], from_email="", from_name="", - **kwargs + **kwargs, ): """ Start engine with specific mail_code. Any other keyword argument that is passed will @@ -257,17 +257,21 @@ class MailEngine: def _validate_email_fields(self): """Validate all email addresses in the mail config.""" for email_key in self._email_fields: - if email_key in self.mail_data: - if isinstance(self.mail_data[email_key], list): - for i, email in enumerate(self.mail_data[email_key]): - self.mail_data[email_key][i] = self._validate_email_addresses( - email - ) - else: - self.mail_data[email_key] = self._validate_email_addresses( - self.mail_data[email_key] + if emails := self.mail_data.get(email_key, None): + emails = emails if isinstance(emails, list) else [emails] + valid_emails = [ + valid_entry + for entry in emails + if (valid_entry := self._validate_email_addresses(entry)) + ] + + if len(valid_emails) == 0: + raise ConfigurationError( + "No valid email addresses found for %s." % email_key ) + self.mail_data[email_key] = valid_emails + def _validate_email_addresses(self, entry): """ Return email address given raw email, email prefix or database relation given in `entry`. @@ -280,13 +284,16 @@ class MailEngine: return "%s%s" % (entry, get_current_domain()) elif self.template_variables["object"]: mail_to = self.template_variables["object"] - for attr in entry.split("."): + for attr in entry.split("|")[0].split("."): try: mail_to = getattr(mail_to, attr) if inspect.ismethod(mail_to): mail_to = mail_to() except AttributeError: # Invalid property/mail + if entry.endswith("|None"): + # Allow None values + return None raise KeyError("The property (%s) does not exist." % entry) return mail_to raise KeyError("Neither an email adress nor db instance is given.") diff --git a/scipost_django/templates/email/fellowship_nominees/fellowship_invitation_initial.json b/scipost_django/templates/email/fellowship_nominees/fellowship_invitation_initial.json index f9272fd54..7be7d6dc1 100644 --- a/scipost_django/templates/email/fellowship_nominees/fellowship_invitation_initial.json +++ b/scipost_django/templates/email/fellowship_nominees/fellowship_invitation_initial.json @@ -2,7 +2,7 @@ "subject": "Invitation to become a Fellow at SciPost", "recipient_list": [ "nomination.profile.email", - "nomination.profile.contributor.user.email" + "nomination.profile.contributor.user.email|None" ], "bcc": [ "edadmin@" -- GitLab