diff --git a/ietf/wginfo/mails.py b/ietf/wginfo/mails.py index f967a2e4f..96b8bb6e8 100644 --- a/ietf/wginfo/mails.py +++ b/ietf/wginfo/mails.py @@ -1,6 +1,6 @@ # generation of mails -import textwrap, datetime +import textwrap, datetime, re from django.template.loader import render_to_string from django.utils.html import strip_tags @@ -12,7 +12,17 @@ from ietf.utils.mail import send_mail, send_mail_text from ietf.group.models import * -def email_milestones_changed(request, group, text): +def email_milestones_changed(request, group, changes): + def wrap_up_email(to, text): + text = wrap(strip_tags(text), 70) + text += "\n\n" + text += u"URL: %s" % (settings.IDTRACKER_BASE_URL + urlreverse("wg_charter", kwargs=dict(acronym=group.acronym))) + + send_mail_text(request, to, None, + u"Milestones changed for %s %s" % (group.acronym, group.type.name), + text) + + # first send to AD and chairs to = [] if group.ad: to.append(group.ad.role_email("ad").formatted_email()) @@ -20,13 +30,15 @@ def email_milestones_changed(request, group, text): for r in group.role_set.filter(name="chair"): to.append(r.formatted_email()) - text = wrap(strip_tags(text), 70) - text += "\n\n" - text += u"URL: %s" % (settings.IDTRACKER_BASE_URL + urlreverse("wg_charter", kwargs=dict(acronym=group.acronym))) + if to: + wrap_up_email(to, u"\n\n".join(c + "." for c in changes)) + + # then send to WG + if group.list_email: + review_re = re.compile("Added .* for review, due") + to = [ group.list_email ] + wrap_up_email(to, u"\n\n".join(c + "." for c in changes if not review_re.match(c))) - send_mail_text(request, to, None, - u"Milestones changed for %s %s" % (group.acronym, group.type.name), - text) def email_milestone_review_reminder(group, grace_period=7): """Email reminders about milestones needing review to AD.""" diff --git a/ietf/wginfo/milestones.py b/ietf/wginfo/milestones.py index eba2f5733..f5094be87 100644 --- a/ietf/wginfo/milestones.py +++ b/ietf/wginfo/milestones.py @@ -280,7 +280,7 @@ def edit_milestones(request, acronym, milestone_set="current"): changes.append(change) if milestone_set == "current": - email_milestones_changed(request, group, u"\n\n".join(c + "." for c in changes)) + email_milestones_changed(request, group, changes) if milestone_set == "charter": return redirect('doc_view', name=group.charter.canonical_name()) diff --git a/ietf/wginfo/tests.py b/ietf/wginfo/tests.py index 0c568ffbd..8e24413d8 100644 --- a/ietf/wginfo/tests.py +++ b/ietf/wginfo/tests.py @@ -462,7 +462,7 @@ class MilestoneTestCase(django.test.TestCase): self.assertEquals(GroupMilestone.objects.count(), milestones_before) self.assertEquals(m.due, m1.due) - # add + # edit mailbox_before = len(outbox) r = self.client.post(url, { 'prefix': "m1", 'm1-id': m1.id, @@ -483,8 +483,11 @@ class MilestoneTestCase(django.test.TestCase): self.assertEquals(m.resolved, "Done") self.assertEquals(set(m.docs.values_list("name", flat=True)), set(docs)) self.assertTrue("Changed milestone" in m.milestonegroupevent_set.all()[0].desc) - self.assertEquals(len(outbox), mailbox_before + 1) + self.assertEquals(len(outbox), mailbox_before + 2) + self.assertTrue("Milestones changed" in outbox[-2]["Subject"]) + self.assertTrue(group.ad.role_email("ad").address in str(outbox[-2])) self.assertTrue("Milestones changed" in outbox[-1]["Subject"]) + self.assertTrue(group.list_email in str(outbox[-1])) def test_reset_charter_milestones(self): m1, m2, group = self.create_test_milestones()