From 89dd9b83ca422b27103535197f00e69b218fd79a Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Tue, 23 Aug 2011 14:45:09 +0000 Subject: [PATCH] Port liaison deadline reminder emails to new schema, with test; refactor email to use the normal liaison email for the bulk of the message instead of duplicating it - Legacy-Id: 3358 --- ietf/liaisons/mails.py | 45 ++++++++++++++++++- .../commands/check_liaison_deadlines.py | 18 +++++++- ietf/liaisons/tests.py | 23 +++++++++- .../liaisons/liaison_deadline_mail.txt | 19 +------- 4 files changed, 84 insertions(+), 21 deletions(-) diff --git a/ietf/liaisons/mails.py b/ietf/liaisons/mails.py index d13d9c59f..5cc513e84 100644 --- a/ietf/liaisons/mails.py +++ b/ietf/liaisons/mails.py @@ -1,3 +1,5 @@ +import datetime + from django.conf import settings from django.template.loader import render_to_string from django.core.urlresolvers import reverse as urlreverse @@ -64,7 +66,7 @@ def notify_pending_by_email(request, liaison, fake): def send_sdo_reminder(sdo): roles = Role.objects.filter(name="liaiman", group=sdo) - if not roles: + if not roles: # no manager to contact return None manager_role = roles[0] @@ -83,3 +85,44 @@ def send_sdo_reminder(sdo): send_mail_text(None, to_email, settings.LIAISON_UNIVERSAL_FROM, subject, body) return body + +def possibly_send_deadline_reminder(liaison): + PREVIOUS_DAYS = { + 14: 'in two weeks', + 7: 'in one week', + 4: 'in four days', + 3: 'in three days', + 2: 'in two days', + 1: 'tomorrow', + 0: 'today' + } + + days_to_go = (liaison.deadline - datetime.date.today()).days + if not (days_to_go < 0 or days_to_go in PREVIOUS_DAYS.keys()): + return None # no reminder + + if days_to_go < 0: + subject = '[Liaison OUT OF DATE] %s' % liaison.title + days_msg = 'is out of date for %s days' % (-days_to_go) + else: + subject = '[Liaison deadline %s] %s' % (PREVIOUS_DAYS[days_to_go], liaison.title) + days_msg = 'expires %s' % PREVIOUS_DAYS[days_to_go] + + from_email = settings.LIAISON_UNIVERSAL_FROM + to_email = liaison.to_contact.split(',') + cc = liaison.cc.split(',') + if liaison.technical_contact: + cc += liaison.technical_contact.split(',') + if liaison.response_contact: + cc += liaison.response_contact.split(',') + bcc = 'statements@ietf.org' + body = render_to_string('liaisons/liaison_deadline_mail.txt', + dict(liaison=liaison, + days_msg=days_msg, + url=settings.IDTRACKER_BASE_URL + urlreverse("liaison_approval_detail", kwargs=dict(object_id=liaison.pk)), + referenced_url=settings.IDTRACKER_BASE_URL + urlreverse("liaison_detail", kwargs=dict(object_id=liaison.related_to.pk)) if liaison.related_to else None, + )) + + send_mail_text(None, to_email, from_email, subject, body, cc=cc, bcc=bcc) + + return body diff --git a/ietf/liaisons/management/commands/check_liaison_deadlines.py b/ietf/liaisons/management/commands/check_liaison_deadlines.py index ad68661cc..57d938de6 100644 --- a/ietf/liaisons/management/commands/check_liaison_deadlines.py +++ b/ietf/liaisons/management/commands/check_liaison_deadlines.py @@ -3,6 +3,7 @@ import datetime from django.conf import settings from django.core.management.base import BaseCommand from django.template.loader import render_to_string +from django.core.urlresolvers import reverse as urlreverse from ietf.liaisons.models import LiaisonDetail from ietf.liaisons.mail import IETFEmailMessage @@ -19,7 +20,7 @@ PREVIOUS_DAYS = { class Command(BaseCommand): - help = (u"Check liaison deadlines and send a reminder if we are close to its deadline") + help = (u"Check liaison deadlines and send a reminder if we are close to a deadline") def send_reminder(self, liaison, days_to_go): if days_to_go < 0: @@ -40,6 +41,8 @@ class Command(BaseCommand): body = render_to_string('liaisons/liaison_deadline_mail.txt', {'liaison': liaison, 'days_msg': days_msg, + 'url': settings.IDTRACKER_BASE_URL + urlreverse("liaison_approval_detail", kwargs=dict(object_id=liaison.pk)), + 'referenced_url': settings.IDTRACKER_BASE_URL + urlreverse("liaison_detail", kwargs=dict(object_id=liaison.related_to.pk)) if liaison.related_to else None, }) mail = IETFEmailMessage(subject=subject, to=to_email, @@ -55,6 +58,19 @@ class Command(BaseCommand): def handle(self, *args, **options): today = datetime.date.today() + + if settings.USE_DB_REDESIGN_PROXY_CLASSES: + from ietf.liaisons.mails import possibly_send_deadline_reminder + from ietf.liaisons.proxy import LiaisonDetailProxy as LiaisonDetail + + cutoff = today - datetime.timedelta(14) + + for l in LiaisonDetail.objects.filter(action_taken=False, deadline__gte=cutoff).exclude(deadline=None): + r = possibly_send_deadline_reminder(l) + if r: + print 'Liaison %05s#: Deadline reminder sent!' % liaison.pk + return + query = LiaisonDetail.objects.filter(deadline_date__isnull=False, action_taken=False, deadline_date__gte=today - datetime.timedelta(14)) for liaison in query: delta = liaison.deadline_date - today diff --git a/ietf/liaisons/tests.py b/ietf/liaisons/tests.py index 1a7a739b8..424cc36e7 100644 --- a/ietf/liaisons/tests.py +++ b/ietf/liaisons/tests.py @@ -394,7 +394,28 @@ class LiaisonManagementTestCase(django.test.TestCase): send_sdo_reminder(Group.objects.filter(type="sdo")[0]) self.assertEquals(len(mail_outbox), mailbox_before + 1) self.assertTrue("authorized individuals" in mail_outbox[-1]["Subject"]) - print mail_outbox[-1] + + def test_send_liaison_deadline_reminder(self): + make_test_data() + liaison = make_liaison_models() + + from ietf.liaisons.mails import possibly_send_deadline_reminder + from ietf.liaisons.proxy import LiaisonDetailProxy as LiaisonDetail + + l = LiaisonDetail.objects.all()[0] + + mailbox_before = len(mail_outbox) + possibly_send_deadline_reminder(l) + self.assertEquals(len(mail_outbox), mailbox_before + 1) + self.assertTrue("deadline" in mail_outbox[-1]["Subject"]) + + # try pushing the deadline + l.deadline = l.deadline + datetime.timedelta(days=30) + l.save() + + mailbox_before = len(mail_outbox) + possibly_send_deadline_reminder(l) + self.assertEquals(len(mail_outbox), mailbox_before) if not settings.USE_DB_REDESIGN_PROXY_CLASSES: diff --git a/ietf/templates/liaisons/liaison_deadline_mail.txt b/ietf/templates/liaisons/liaison_deadline_mail.txt index fe5f054dd..329471939 100644 --- a/ietf/templates/liaisons/liaison_deadline_mail.txt +++ b/ietf/templates/liaisons/liaison_deadline_mail.txt @@ -1,21 +1,4 @@ {% autoescape off %}The following liaison {{ days_msg }}. Plase take actions. -Title: {{ liaison.title }} -Submission Date: {{ liaison.submitted_date }} -URL of the IETF Web page: {% url liaison_detail object_id=liaison.pk %} -{% if liaison.deadline_date %}Please reply by {{ liaison.deadline_date }}{% endif %} -From: {{ liaison.from_body }} ({{ liaison.person }} <{{ liaison.replyto|default:liaison.from_email }}>) -To: {{ liaison.to_body }} ({{ liaison.to_poc }}) -Cc: {{ liaison.cc1 }} -Reponse Contact: {{ liaison.response_contact }} -Technical Contact: {{ liaison.technical_contact }} -Purpose: {% if liaison.purpose_text %}{{ liaison.purpose_text }}{% else %}{{ liaison.purpose.purpose_text }}{% endif %} -{% if liaison.related_to %}Referenced liaison: {% if liaison.related_to.title %}{{ liaison.related_to.title }}{% else %}Liaison #{{ liaison.related_to.pk }}{% endif %} ({% url liaison_detail object_id=liaison.related_to.pk %}){% endif %} -Body: {{ liaison.body }} -Attachment(s): -{% for file in liaison.uploads_set.all %} - {{ file.file_title }} https://datatracker.ietf.org/documents/LIAISON/file{{ file.filename }} -{% empty %} -No document has been attached -{% endfor %} +{% include "liaisons/liaison_mail.txt" %} {% endautoescape %}