From e024cca8c49e177534496ae72d28010bfdc41108 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Sat, 10 Nov 2018 20:32:42 +0000 Subject: [PATCH] Merged in [15708] and [15730] from housley@vigilsec.com: Added a mail alias for all review team secretaries. Fixes #2139. Use the alias if there is one for email about review request changes. Added a test for the review team secretary alias functionality. - Legacy-Id: 15747 Note: SVN reference [15708] has been migrated to Git commit 6067dcbfefb1a108d6392e5f7f57e2cc70d68b59 Note: SVN reference [15730] has been migrated to Git commit d525ade0b08f9b4fd08e9d89a8395f0c8944d0c5 --- ietf/mailtrigger/models.py | 6 +++--- ietf/review/utils.py | 5 +++-- ietf/utils/mail.py | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ietf/mailtrigger/models.py b/ietf/mailtrigger/models.py index 00a95b17f..f6e6a0c1e 100644 --- a/ietf/mailtrigger/models.py +++ b/ietf/mailtrigger/models.py @@ -4,7 +4,7 @@ from django.db import models from django.template import Template, Context from email.utils import parseaddr -from ietf.utils.mail import formataddr +from ietf.utils.mail import formataddr, get_email_addresses_from_text from ietf.person.models import Email from ietf.review.models import ReviewTeamSettings @@ -60,7 +60,7 @@ class Recipient(models.Model): if self.template: rendering = Template('{%% autoescape off %%}%s{%% endautoescape %%}'%self.template).render(Context(kwargs)) if rendering: - retval.extend([x.strip() for x in rendering.split(',')]) + retval.extend( get_email_addresses_from_text(rendering) ) return clean_duplicates(retval) @@ -175,7 +175,7 @@ class Recipient(models.Model): if not group.acronym=='none': rts = ReviewTeamSettings.objects.filter(group=group).first() if rts and rts.secr_mail_alias and len(rts.secr_mail_alias) > 1: - addrs = [rts.secr_mail_alias, ] + addrs = get_email_addresses_from_text(rts.secr_mail_alias) else: addrs.extend(group.role_set.filter(name='secr').values_list('email__address',flat=True)) return addrs diff --git a/ietf/review/utils.py b/ietf/review/utils.py index 16b35aaea..32a0391e8 100644 --- a/ietf/review/utils.py +++ b/ietf/review/utils.py @@ -17,7 +17,7 @@ from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream from ietf.review.models import (ReviewRequest, ReviewRequestStateName, ReviewTypeName, ReviewerSettings, UnavailablePeriod, ReviewWish, NextReviewerInTeam, ReviewTeamSettings, ReviewSecretarySettings) -from ietf.utils.mail import send_mail +from ietf.utils.mail import send_mail, get_email_addresses_from_text from ietf.doc.utils import extract_complete_replaces_ancestor_mapping_for_docs def active_review_teams(): @@ -352,7 +352,8 @@ def email_review_request_change(request, review_req, subject, msg, by, notify_se if notify_secretary: rts = ReviewTeamSettings.objects.filter(group=review_req.team).first() if rts and rts.secr_mail_alias and rts.secr_mail_alias.strip() != '': - to.add(rts.secr_mail_alias) + for addr in get_email_addresses_from_text(rts.secr_mail_alias): + to.add(addr) else: extract_email_addresses(Role.objects.filter(name="secr", group=review_req.team).distinct()) if notify_reviewer: diff --git a/ietf/utils/mail.py b/ietf/utils/mail.py index b002ce73c..161f924fb 100644 --- a/ietf/utils/mail.py +++ b/ietf/utils/mail.py @@ -448,3 +448,17 @@ def is_valid_email(address): return True except ValidationError: return False + +def get_email_addresses_from_text(text): + """ + + Expects a string with one or more email addresses, each in 2822-compatible + form, separated by comma (as in an RFC2822, Section 3.4 address-list) + Could be as simple as 'foo@example.com' or as complex as 'Some Person + , "list@ietf.org"\n\t'. + + Returns a list of properly formatted email address strings. + + """ + return [ formataddr(e) for e in getaddresses([text, ]) ] +