Skip to content

Commit 89dd9b8

Browse files
committed
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
1 parent 2aa9743 commit 89dd9b8

4 files changed

Lines changed: 84 additions & 21 deletions

File tree

ietf/liaisons/mails.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import datetime
2+
13
from django.conf import settings
24
from django.template.loader import render_to_string
35
from django.core.urlresolvers import reverse as urlreverse
@@ -64,7 +66,7 @@ def notify_pending_by_email(request, liaison, fake):
6466

6567
def send_sdo_reminder(sdo):
6668
roles = Role.objects.filter(name="liaiman", group=sdo)
67-
if not roles:
69+
if not roles: # no manager to contact
6870
return None
6971

7072
manager_role = roles[0]
@@ -83,3 +85,44 @@ def send_sdo_reminder(sdo):
8385
send_mail_text(None, to_email, settings.LIAISON_UNIVERSAL_FROM, subject, body)
8486

8587
return body
88+
89+
def possibly_send_deadline_reminder(liaison):
90+
PREVIOUS_DAYS = {
91+
14: 'in two weeks',
92+
7: 'in one week',
93+
4: 'in four days',
94+
3: 'in three days',
95+
2: 'in two days',
96+
1: 'tomorrow',
97+
0: 'today'
98+
}
99+
100+
days_to_go = (liaison.deadline - datetime.date.today()).days
101+
if not (days_to_go < 0 or days_to_go in PREVIOUS_DAYS.keys()):
102+
return None # no reminder
103+
104+
if days_to_go < 0:
105+
subject = '[Liaison OUT OF DATE] %s' % liaison.title
106+
days_msg = 'is out of date for %s days' % (-days_to_go)
107+
else:
108+
subject = '[Liaison deadline %s] %s' % (PREVIOUS_DAYS[days_to_go], liaison.title)
109+
days_msg = 'expires %s' % PREVIOUS_DAYS[days_to_go]
110+
111+
from_email = settings.LIAISON_UNIVERSAL_FROM
112+
to_email = liaison.to_contact.split(',')
113+
cc = liaison.cc.split(',')
114+
if liaison.technical_contact:
115+
cc += liaison.technical_contact.split(',')
116+
if liaison.response_contact:
117+
cc += liaison.response_contact.split(',')
118+
bcc = 'statements@ietf.org'
119+
body = render_to_string('liaisons/liaison_deadline_mail.txt',
120+
dict(liaison=liaison,
121+
days_msg=days_msg,
122+
url=settings.IDTRACKER_BASE_URL + urlreverse("liaison_approval_detail", kwargs=dict(object_id=liaison.pk)),
123+
referenced_url=settings.IDTRACKER_BASE_URL + urlreverse("liaison_detail", kwargs=dict(object_id=liaison.related_to.pk)) if liaison.related_to else None,
124+
))
125+
126+
send_mail_text(None, to_email, from_email, subject, body, cc=cc, bcc=bcc)
127+
128+
return body

ietf/liaisons/management/commands/check_liaison_deadlines.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.conf import settings
44
from django.core.management.base import BaseCommand
55
from django.template.loader import render_to_string
6+
from django.core.urlresolvers import reverse as urlreverse
67

78
from ietf.liaisons.models import LiaisonDetail
89
from ietf.liaisons.mail import IETFEmailMessage
@@ -19,7 +20,7 @@
1920

2021

2122
class Command(BaseCommand):
22-
help = (u"Check liaison deadlines and send a reminder if we are close to its deadline")
23+
help = (u"Check liaison deadlines and send a reminder if we are close to a deadline")
2324

2425
def send_reminder(self, liaison, days_to_go):
2526
if days_to_go < 0:
@@ -40,6 +41,8 @@ def send_reminder(self, liaison, days_to_go):
4041
body = render_to_string('liaisons/liaison_deadline_mail.txt',
4142
{'liaison': liaison,
4243
'days_msg': days_msg,
44+
'url': settings.IDTRACKER_BASE_URL + urlreverse("liaison_approval_detail", kwargs=dict(object_id=liaison.pk)),
45+
'referenced_url': settings.IDTRACKER_BASE_URL + urlreverse("liaison_detail", kwargs=dict(object_id=liaison.related_to.pk)) if liaison.related_to else None,
4346
})
4447
mail = IETFEmailMessage(subject=subject,
4548
to=to_email,
@@ -55,6 +58,19 @@ def send_reminder(self, liaison, days_to_go):
5558

5659
def handle(self, *args, **options):
5760
today = datetime.date.today()
61+
62+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
63+
from ietf.liaisons.mails import possibly_send_deadline_reminder
64+
from ietf.liaisons.proxy import LiaisonDetailProxy as LiaisonDetail
65+
66+
cutoff = today - datetime.timedelta(14)
67+
68+
for l in LiaisonDetail.objects.filter(action_taken=False, deadline__gte=cutoff).exclude(deadline=None):
69+
r = possibly_send_deadline_reminder(l)
70+
if r:
71+
print 'Liaison %05s#: Deadline reminder sent!' % liaison.pk
72+
return
73+
5874
query = LiaisonDetail.objects.filter(deadline_date__isnull=False, action_taken=False, deadline_date__gte=today - datetime.timedelta(14))
5975
for liaison in query:
6076
delta = liaison.deadline_date - today

ietf/liaisons/tests.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,28 @@ def test_send_sdo_reminder(self):
394394
send_sdo_reminder(Group.objects.filter(type="sdo")[0])
395395
self.assertEquals(len(mail_outbox), mailbox_before + 1)
396396
self.assertTrue("authorized individuals" in mail_outbox[-1]["Subject"])
397-
print mail_outbox[-1]
397+
398+
def test_send_liaison_deadline_reminder(self):
399+
make_test_data()
400+
liaison = make_liaison_models()
401+
402+
from ietf.liaisons.mails import possibly_send_deadline_reminder
403+
from ietf.liaisons.proxy import LiaisonDetailProxy as LiaisonDetail
404+
405+
l = LiaisonDetail.objects.all()[0]
406+
407+
mailbox_before = len(mail_outbox)
408+
possibly_send_deadline_reminder(l)
409+
self.assertEquals(len(mail_outbox), mailbox_before + 1)
410+
self.assertTrue("deadline" in mail_outbox[-1]["Subject"])
411+
412+
# try pushing the deadline
413+
l.deadline = l.deadline + datetime.timedelta(days=30)
414+
l.save()
415+
416+
mailbox_before = len(mail_outbox)
417+
possibly_send_deadline_reminder(l)
418+
self.assertEquals(len(mail_outbox), mailbox_before)
398419

399420

400421
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,4 @@
11
{% autoescape off %}The following liaison {{ days_msg }}. Plase take actions.
22

3-
Title: {{ liaison.title }}
4-
Submission Date: {{ liaison.submitted_date }}
5-
URL of the IETF Web page: {% url liaison_detail object_id=liaison.pk %}
6-
{% if liaison.deadline_date %}Please reply by {{ liaison.deadline_date }}{% endif %}
7-
From: {{ liaison.from_body }} ({{ liaison.person }} <{{ liaison.replyto|default:liaison.from_email }}>)
8-
To: {{ liaison.to_body }} ({{ liaison.to_poc }})
9-
Cc: {{ liaison.cc1 }}
10-
Reponse Contact: {{ liaison.response_contact }}
11-
Technical Contact: {{ liaison.technical_contact }}
12-
Purpose: {% if liaison.purpose_text %}{{ liaison.purpose_text }}{% else %}{{ liaison.purpose.purpose_text }}{% endif %}
13-
{% 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 %}
14-
Body: {{ liaison.body }}
15-
Attachment(s):
16-
{% for file in liaison.uploads_set.all %}
17-
{{ file.file_title }} https://datatracker.ietf.org/documents/LIAISON/file{{ file.filename }}
18-
{% empty %}
19-
No document has been attached
20-
{% endfor %}
3+
{% include "liaisons/liaison_mail.txt" %}
214
{% endautoescape %}

0 commit comments

Comments
 (0)