From 2b5345cf670ee338c986ea4f8b05fe4917d45af1 Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Thu, 28 Jun 2012 19:00:24 +0000 Subject: [PATCH] Add some polish, send email notifications on milestone changes - Legacy-Id: 4544 --- ietf/wgcharter/views.py | 2 +- ietf/wginfo/mails.py | 27 +++++++++++++++++++++++++++ ietf/wginfo/milestones.py | 17 ++++++++++++----- ietf/wginfo/tests.py | 3 +++ 4 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 ietf/wginfo/mails.py diff --git a/ietf/wgcharter/views.py b/ietf/wgcharter/views.py index 97d09166f..129c8e363 100644 --- a/ietf/wgcharter/views.py +++ b/ietf/wgcharter/views.py @@ -586,7 +586,7 @@ def approve(request, name): o.save() MilestoneGroupEvent.objects.create( group=group, type="changed_milestone", by=login, - desc="Changed milestone \"%s\", changed state from review to active" % o.desc, + desc="Changed milestone \"%s\", set state to active from review" % o.desc, milestone=o) del milestones_to_delete[i] diff --git a/ietf/wginfo/mails.py b/ietf/wginfo/mails.py new file mode 100644 index 000000000..3c346301f --- /dev/null +++ b/ietf/wginfo/mails.py @@ -0,0 +1,27 @@ +# generation of mails + +import textwrap, datetime + +from django.template.loader import render_to_string +from django.utils.html import strip_tags +from django.utils.text import wrap +from django.conf import settings +from django.core.urlresolvers import reverse as urlreverse + +from ietf.utils.mail import send_mail, send_mail_text + +def email_milestones_changed(request, group, text): + to = [] + if group.ad: + to.append(group.ad.role_email("ad").formatted_email()) + + for r in group.role_set.filter(name="chair"): + to.append(r.formatted_email()) + + text = wrap(strip_tags(text), 70) + text += "\n\n" + text += "URL: %s" % (settings.IDTRACKER_BASE_URL + urlreverse("wg_charter", kwargs=dict(acronym=group.acronym))) + + send_mail_text(request, to, None, + "Milestones changed for %s %s" % (group.acronym, group.type.name), + text) diff --git a/ietf/wginfo/milestones.py b/ietf/wginfo/milestones.py index 2850c1d98..c52a69142 100644 --- a/ietf/wginfo/milestones.py +++ b/ietf/wginfo/milestones.py @@ -17,6 +17,7 @@ from ietf.doc.models import Document, DocEvent from ietf.doc.utils import get_chartering_type from ietf.group.models import * from ietf.group.utils import save_group_in_history, save_milestone_in_history +from ietf.wginfo.mails import email_milestones_changed def json_doc_names(docs): return simplejson.dumps([{"id": doc.pk, "name": doc.name } for doc in docs]) @@ -160,23 +161,23 @@ def edit_milestones(request, acronym, milestone_set="current"): if c["accept"] == "accept": m.state_id = "active" - changes.append("changed state from review to active, accepting new milestone") + changes.append("set state to active from review, accepting new milestone") elif c["accept"] == "reject": m.state_id = "deleted" - changes.append("changed state from review to deleted, rejecting new milestone") + changes.append("set state to deleted from review, rejecting new milestone") if c["desc"] != m.desc and not needs_review: if not history: history = save_milestone_in_history(m) m.desc = c["desc"] - changes.append('changed description to "%s"' % m.desc) + changes.append('set description to "%s"' % m.desc) if c["due"] != m.due: if not history: history = save_milestone_in_history(m) + changes.append('set due date to %s from %s' % (c["due"].strftime("%Y-%m-%d"), m.due.strftime("%Y-%m-%d"))) m.due = c["due"] - changes.append('changed due date to %s' % m.due.strftime("%Y-%m-%d")) resolved = c["resolved"] if resolved != m.resolved: @@ -185,7 +186,7 @@ def edit_milestones(request, acronym, milestone_set="current"): elif not resolved and m.resolved: changes.append("reverted to not being resolved") elif resolved and m.resolved: - changes.append('changed resolution to "%s"' % resolved) + changes.append('set resolution to "%s"' % resolved) if not history: history = save_milestone_in_history(m) @@ -258,6 +259,7 @@ def edit_milestones(request, acronym, milestone_set="current"): f.milestone = GroupMilestone() set_attributes_from_form(f, f.milestone) elif action == "save" and not form_errors: + changes = [] for f in forms: change = save_milestone_form(f) @@ -271,6 +273,11 @@ def edit_milestones(request, acronym, milestone_set="current"): MilestoneGroupEvent.objects.create(group=group, type="changed_milestone", by=login, desc=change, milestone=f.milestone) + changes.append(change) + + if milestone_set == "current": + email_milestones_changed(request, group, u"\n\n".join(c + "." for c in changes)) + if milestone_set == "charter": return redirect('doc_view', name=group.charter.canonical_name()) else: diff --git a/ietf/wginfo/tests.py b/ietf/wginfo/tests.py index 9aadc78bb..094071066 100644 --- a/ietf/wginfo/tests.py +++ b/ietf/wginfo/tests.py @@ -462,6 +462,7 @@ class MilestoneTestCase(django.test.TestCase): self.assertEquals(m.due, m1.due) # add + mailbox_before = len(outbox) r = self.client.post(url, { 'prefix': "m1", 'm1-id': m1.id, 'm1-desc': "Test 2 - changed", @@ -481,6 +482,8 @@ 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.assertTrue("Milestones changed" in outbox[-1]["Subject"]) def test_reset_charter_milestones(self): m1, m2, group = self.create_test_milestones()