From 2c28cb3eb09523690119a3642c994e60f0cfc860 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Wed, 27 Nov 2019 21:49:22 +0000 Subject: [PATCH] When group secretary email addresses occurred in some mailtrigger To: entries, they were given with both name and address parts, while when occurring in Cc: entries, no names were present. Fixed one case of this, and adjusted a test case for consistency. Also added a more general utility function to exclude selected email addresses from email address lists. - Legacy-Id: 17107 --- ietf/doc/tests_review.py | 2 +- ietf/mailtrigger/models.py | 3 ++- ietf/mailtrigger/utils.py | 6 +++--- ietf/utils/mail.py | 13 +++++++++++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py index da01ecda7..95f510ef0 100644 --- a/ietf/doc/tests_review.py +++ b/ietf/doc/tests_review.py @@ -1152,7 +1152,7 @@ class ReviewTests(TestCase): review_req = reload_db_objects(review_req) self.assertEqual(review_req.deadline,new_deadline) self.assertEqual(len(outbox), 1) - self.assertIn('reviewsecretary@example.com', outbox[0]["Cc"]) + self.assertIn('', outbox[0]["Cc"]) self.assertIn('', outbox[0]["To"]) self.assertIn('Deadline changed', outbox[0]['Subject']) diff --git a/ietf/mailtrigger/models.py b/ietf/mailtrigger/models.py index e55324ac0..ed70ddeb1 100644 --- a/ietf/mailtrigger/models.py +++ b/ietf/mailtrigger/models.py @@ -182,7 +182,8 @@ class Recipient(models.Model): if rts and rts.secr_mail_alias and len(rts.secr_mail_alias) > 1: 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)) + for role in group.role_set.filter(name='secr'): + addrs.append(role.person.formatted_email()) return addrs def gather_review_req_reviewers(self, **kwargs): diff --git a/ietf/mailtrigger/utils.py b/ietf/mailtrigger/utils.py index 24411f7db..a72d15b97 100644 --- a/ietf/mailtrigger/utils.py +++ b/ietf/mailtrigger/utils.py @@ -6,6 +6,7 @@ import debug # pyflakes:ignore from ietf.mailtrigger.models import MailTrigger, Recipient from ietf.submit.models import Submission +from ietf.utils.mail import excludeaddrs class AddrLists(namedtuple('AddrLists',['to','cc'])): @@ -29,18 +30,17 @@ def gather_address_lists(slug, skipped_recipients=None, create_from_slug_if_not_ to.update(recipient.gather(**kwargs)) to.discard('') if skipped_recipients: - to -= set(skipped_recipients) + to = excludeaddrs(to, skipped_recipients) cc = set() for recipient in mailtrigger.cc.all(): cc.update(recipient.gather(**kwargs)) cc.discard('') if skipped_recipients: - cc -= set(skipped_recipients) + cc = excludeaddrs(cc, skipped_recipients) return AddrLists(to=list(to),cc=list(cc)) - def get_mailtrigger(slug, create_from_slug_if_not_exists, desc_if_not_exists): try: mailtrigger = MailTrigger.objects.get(slug=slug) diff --git a/ietf/utils/mail.py b/ietf/utils/mail.py index 4c295a17d..90aaef863 100644 --- a/ietf/utils/mail.py +++ b/ietf/utils/mail.py @@ -249,6 +249,19 @@ def parseaddr(addr): name, addr = simple_parseaddr(addr) return name, addr +def excludeaddrs(addrlist, exlist): + """ + Takes a list or set of email address strings in 2822 format, and + eliminates entries whose address part occurs in the given exclusion list. + """ + exlist = set([ parseaddr(a)[1] for a in exlist ]) + filtered = [] + for a in addrlist: + if not parseaddr(a)[1] in exlist: + filtered.append(a) + filtered = type(addrlist)(filtered) + return filtered + def condition_message(to, frm, subject, msg, cc, extra): if extra: assertion("isinstance(extra, (dict, Message))")