Skip to content

Commit 4b96b2b

Browse files
committed
* Added a taken care field to stop deadline notifications
* Set 'out of date' liaisons as already taken care. * Command to notify for liaisons close to their deadlines. Fixes ietf-tools#384 - Legacy-Id: 2544
1 parent 895b895 commit 4b96b2b

4 files changed

Lines changed: 296 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import datetime
2+
3+
from django.conf import settings
4+
from django.core.management.base import BaseCommand
5+
from django.template.loader import render_to_string
6+
7+
from ietf.liaisons.models import LiaisonDetail
8+
from ietf.liaisons.mail import IETFEmailMessage
9+
10+
11+
PREVIOUS_DAYS = {
12+
14: 'in two weeks',
13+
7: 'in one week',
14+
4: 'in four days',
15+
3: 'in three days',
16+
2: 'in two days',
17+
1: 'tomorrow',
18+
0: 'today'}
19+
20+
21+
class Command(BaseCommand):
22+
help = (u"Check liaison deadlines and send a reminder if we are close to its deadline")
23+
24+
def send_reminder(self, liaison, days_to_go):
25+
if days_to_go < 0:
26+
subject = '[Liaison OUT OF DATE] %s' % liaison.title
27+
days_msg = 'is out of date for %s days' % (-days_to_go)
28+
else:
29+
subject = '[Liaison deadline %s] %s' % (PREVIOUS_DAYS[days_to_go], liaison.title)
30+
days_msg = 'expires %s' % PREVIOUS_DAYS[days_to_go]
31+
32+
from_email = settings.LIAISON_UNIVERSAL_FROM
33+
to_email = liaison.to_poc.split(',')
34+
cc = liaison.cc1.split(',')
35+
if liaison.technical_contact:
36+
cc += liaison.technical_contact.split(',')
37+
if liaison.response_contact:
38+
cc += liaison.response_contact.split(',')
39+
bcc = ['statements@ietf.org']
40+
body = render_to_string('liaisons/liaison_deadline_mail.txt',
41+
{'liaison': liaison,
42+
'days_msg': days_msg,
43+
})
44+
print body
45+
mail = IETFEmailMessage(subject=subject,
46+
to=to_email,
47+
from_email=from_email,
48+
cc=cc,
49+
bcc=bcc,
50+
body=body)
51+
if not settings.DEBUG:
52+
mail.send()
53+
print 'Liaison %05s#: Deadline reminder Sent!' % liaison.pk
54+
else:
55+
print 'Liaison %05s#: Deadline reminder Not Sent because in DEBUG mode!' % liaison.pk
56+
57+
def handle(self, *args, **options):
58+
today = datetime.date.today()
59+
query = LiaisonDetail.objects.filter(deadline_date__isnull=False, taken_care=False, deadline_date__gte=today - datetime.timedelta(14))
60+
for liaison in query:
61+
delta = liaison.deadline_date - today
62+
if delta.days < 0 or delta.days in PREVIOUS_DAYS.keys():
63+
self.send_reminder(liaison, delta.days)
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
2+
from south.db import db
3+
from django.db import models
4+
from ietf.liaisons.models import *
5+
6+
class Migration:
7+
8+
def forwards(self, orm):
9+
10+
# Adding field 'LiaisonDetail.taken_care'
11+
db.add_column('liaison_detail', 'taken_care', orm['liaisons.liaisondetail:taken_care'])
12+
13+
14+
15+
def backwards(self, orm):
16+
17+
# Deleting field 'LiaisonDetail.taken_care'
18+
db.delete_column('liaison_detail', 'taken_care')
19+
20+
21+
22+
models = {
23+
'idtracker.personororginfo': {
24+
'Meta': {'db_table': "'person_or_org_info'"},
25+
'address_type': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
26+
'created_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}),
27+
'date_created': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
28+
'date_modified': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
29+
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}),
30+
'first_name_key': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}),
31+
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
32+
'last_name_key': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
33+
'middle_initial': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
34+
'middle_initial_key': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
35+
'modified_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}),
36+
'name_prefix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
37+
'name_suffix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
38+
'person_or_org_tag': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
39+
'record_type': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'})
40+
},
41+
'liaisons.frombodies': {
42+
'Meta': {'db_table': "'from_bodies'"},
43+
'body_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
44+
'email_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
45+
'from_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46+
'is_liaison_manager': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
47+
'other_sdo': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
48+
'poc': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'db_column': "'poc'"})
49+
},
50+
'liaisons.liaisondetail': {
51+
'Meta': {'db_table': "'liaison_detail'"},
52+
'approval': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.OutgoingLiaisonApproval']", 'null': 'True', 'blank': 'True'}),
53+
'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
54+
'by_secretariat': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
55+
'cc1': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
56+
'cc2': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
57+
'deadline_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
58+
'detail_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59+
'from_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
60+
'from_raw_body': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
61+
'from_raw_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
62+
'last_modified_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
63+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'db_column': "'person_or_org_tag'"}),
64+
'purpose': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonPurpose']", 'null': 'True'}),
65+
'purpose_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'db_column': "'purpose'", 'blank': 'True'}),
66+
'related_to': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonDetail']", 'null': 'True', 'blank': 'True'}),
67+
'replyto': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
68+
'response_contact': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
69+
'submitted_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
70+
'submitter_email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
71+
'submitter_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
72+
'taken_care': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
73+
'technical_contact': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
74+
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
75+
'to_body': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
76+
'to_email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
77+
'to_poc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
78+
},
79+
'liaisons.liaisonmanagers': {
80+
'Meta': {'db_table': "'liaison_managers'"},
81+
'email_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
82+
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
83+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}),
84+
'sdo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.SDOs']"})
85+
},
86+
'liaisons.liaisonpurpose': {
87+
'Meta': {'db_table': "'liaison_purpose'"},
88+
'purpose_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
89+
'purpose_text': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'})
90+
},
91+
'liaisons.outgoingliaisonapproval': {
92+
'approval_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
93+
'approved': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
94+
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
95+
},
96+
'liaisons.sdoauthorizedindividual': {
97+
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
98+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}),
99+
'sdo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.SDOs']"})
100+
},
101+
'liaisons.sdos': {
102+
'Meta': {'db_table': "'sdos'"},
103+
'sdo_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
104+
'sdo_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
105+
},
106+
'liaisons.uploads': {
107+
'Meta': {'db_table': "'uploads'"},
108+
'detail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonDetail']"}),
109+
'file_extension': ('django.db.models.fields.CharField', [], {'max_length': '10', 'blank': 'True'}),
110+
'file_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
111+
'file_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
112+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"})
113+
}
114+
}
115+
116+
complete_apps = ['liaisons']

0 commit comments

Comments
 (0)