Skip to content

Commit 35577dc

Browse files
committed
Added view for preparing the last call/editing writeups, for making last call (for Secretariat) and for approving a ballot (for Secretariat)
- Legacy-Id: 2286
1 parent 2d7d4f9 commit 35577dc

11 files changed

Lines changed: 548 additions & 28 deletions

File tree

branch/iesg-tracker/ietf/idrfc/mails.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.template.loader import render_to_string
77
from django.utils.html import strip_tags
88

9-
from ietf.utils.mail import send_mail
9+
from ietf.utils.mail import send_mail, send_mail_text
1010
from ietf.idtracker.models import *
1111

1212
def email_state_changed(request, doc, text):
@@ -77,7 +77,7 @@ def generate_last_call_announcement(request, doc):
7777
return render_to_string("idrfc/last_call_announcement.txt",
7878
dict(doc=doc,
7979
doc_url=request.build_absolute_uri(doc.idinternal.get_absolute_url()),
80-
expiration_date=expiration_date.strftime("%B %-d, %Y"),
80+
expiration_date=expiration_date.strftime("%Y-%m-%d"), #.strftime("%B %-d, %Y"),
8181
cc=", ".join("<%s>" % e for e in cc),
8282
group=group,
8383
docs=docs,
@@ -136,7 +136,7 @@ def generate_approval_mail(request, doc):
136136
return render_to_string("idrfc/approval_mail.txt",
137137
dict(doc=doc,
138138
doc_url=request.build_absolute_uri(doc.idinternal.get_absolute_url()),
139-
cc=", ".join(cc),
139+
cc=",\n ".join(cc),
140140
docs=docs,
141141
doc_type=doc_type,
142142
made_by=made_by,
@@ -147,7 +147,6 @@ def generate_approval_mail(request, doc):
147147
)
148148

149149
def generate_approval_mail_rfc_editor(request, doc):
150-
# FIXME: need unit test for this function
151150
full_status = full_intended_status(doc.intended_status)
152151
status = full_status.replace("a ", "").replace("an ", "")
153152
disapproved = doc.idinternal.cur_state_id in IDState.DO_NOT_PUBLISH_STATES
@@ -193,3 +192,25 @@ def email_ballot_deferred(request, doc, by, telechat_date):
193192
dict(doc=doc,
194193
by=by,
195194
telechat_date=telechat_date))
195+
196+
def email_ballot(request, doc):
197+
to = "iesg@ietf.org"
198+
# FIXME: fill in
199+
200+
def email_iana(request, doc, to, msg):
201+
# fix up message and send message to IANA for each in ballot set
202+
import email
203+
parsed_msg = email.message_from_string(msg.encode("utf-8"))
204+
205+
for i in doc.idinternal.ballot_set():
206+
extra = {}
207+
extra["Reply-To"] = "noreply@ietf.org"
208+
extra["X-IETF-Draft-string"] = i.document().filename
209+
extra["X-IETF-Draft-revision"] = i.document().revision_display()
210+
211+
send_mail_text(request, "To: IANA <%s>" % to,
212+
parsed_msg["From"], parsed_msg["Subject"],
213+
parsed_msg.get_payload(),
214+
extra=extra,
215+
bcc="fenner@research.att.com")
216+

branch/iesg-tracker/ietf/idrfc/tests.py

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,70 @@ def test_undefer_ballot(self):
368368

369369
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
370370
self.assertTrue(not draft.idinternal.ballot.defer)
371-
self.assertTrue(draft.idinternal.cur_state_id == IDState.IESG_EVALUATION)
371+
self.assertEquals(draft.idinternal.cur_state_id, IDState.IESG_EVALUATION)
372+
373+
class ApproveBallotTestCase(django.test.TestCase):
374+
fixtures = ['base', 'draft', 'ballot']
375+
376+
def test_approve_ballot(self):
377+
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
378+
url = urlreverse('doc_approve_ballot', kwargs=dict(name=draft.filename))
379+
login_testing_unauthorized(self, "klm", url)
380+
381+
# normal get
382+
r = self.client.get(url)
383+
self.assertEquals(r.status_code, 200)
384+
q = PyQuery(r.content)
385+
self.assertTrue("Send out the announcement" in q('input[type=submit]')[0].get('value'))
386+
self.assertEquals(len(q('pre')), 1)
387+
388+
# approve
389+
mailbox_before = len(mail_outbox)
390+
391+
r = self.client.post(url, dict())
392+
self.assertEquals(r.status_code, 302)
393+
394+
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
395+
self.assertEquals(draft.idinternal.cur_state_id, IDState.APPROVED_ANNOUNCEMENT_SENT)
396+
397+
self.assertEquals(len(mail_outbox), mailbox_before + 4)
398+
399+
self.assertTrue("Protocol Action" in mail_outbox[-2]['Subject'])
400+
# the IANA copy
401+
self.assertTrue("Protocol Action" in mail_outbox[-1]['Subject'])
402+
403+
class MakeLastCallTestCase(django.test.TestCase):
404+
fixtures = ['base', 'draft', 'ballot']
405+
406+
def test_make_last_call(self):
407+
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
408+
url = urlreverse('doc_make_last_call', kwargs=dict(name=draft.filename))
409+
login_testing_unauthorized(self, "klm", url)
410+
411+
# normal get
412+
r = self.client.get(url)
413+
self.assertEquals(r.status_code, 200)
414+
q = PyQuery(r.content)
415+
self.assertEquals(len(q('input[name=last_call_sent_date]')), 1)
416+
417+
# make last call
418+
mailbox_before = len(mail_outbox)
419+
420+
r = self.client.post(url,
421+
dict(last_call_sent_date=q('input[name=last_call_sent_date]')[0].get("value"),
422+
last_call_expiration_date=q('input[name=last_call_expiration_date]')[0].get("value")
423+
))
424+
self.assertEquals(r.status_code, 302)
425+
426+
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
427+
self.assertEquals(draft.idinternal.cur_state_id, IDState.IN_LAST_CALL)
428+
429+
self.assertEquals(len(mail_outbox), mailbox_before + 4)
430+
431+
self.assertTrue("Last Call" in mail_outbox[-4]['Subject'])
432+
# the IANA copy
433+
self.assertTrue("Last Call" in mail_outbox[-3]['Subject'])
434+
372435

373436

374437
TEST_RFC_INDEX = '''<?xml version="1.0" encoding="UTF-8"?>

branch/iesg-tracker/ietf/idrfc/urls.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,20 @@
3838
(r'^search/$', views_search.search_results),
3939
(r'^all/$', views_search.all),
4040
(r'^active/$', views_search.active),
41-
url(r'^(?P<name>[^/]+)/$', views_doc.document_main, {}, name="doc_view"),
41+
url(r'^(?P<name>[^/]+)/$', views_doc.document_main, name="doc_view"),
4242
(r'^(?P<name>[^/]+)/_debug.data$', views_doc.document_debug),
4343
(r'^(?P<name>[^/]+)/_ballot.data$', views_doc.document_ballot),
4444
(r'^ad/(?P<name>[^/]+)/$', views_search.by_ad),
4545

46-
url(r'^(?P<name>[^/]+)/edit/state/$', views_edit.change_state, {}, name='doc_change_state'),
47-
url(r'^(?P<name>[^/]+)/edit/info/$', views_edit.edit_info, {}, name='doc_edit_info'),
48-
url(r'^(?P<name>[^/]+)/edit/resurrect/$', views_edit.request_resurrect, {}, name='doc_request_resurrect'),
49-
url(r'^(?P<name>[^/]+)/edit/addcomment/$', views_edit.add_comment, {}, name='doc_add_comment'),
50-
url(r'^(?P<name>[^/]+)/edit/position/$', views_ballot.edit_position, {}, name='doc_edit_position'),
51-
url(r'^(?P<name>[^/]+)/edit/deferballot/$', views_ballot.defer_ballot, {}, name='doc_defer_ballot'),
52-
url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, {}, name='doc_undefer_ballot'),
53-
url(r'^(?P<name>[^/]+)/edit/sendballotcomment/$', views_ballot.send_ballot_comment, {}, name='doc_send_ballot_comment'),
46+
url(r'^(?P<name>[^/]+)/edit/state/$', views_edit.change_state, name='doc_change_state'),
47+
url(r'^(?P<name>[^/]+)/edit/info/$', views_edit.edit_info, name='doc_edit_info'),
48+
url(r'^(?P<name>[^/]+)/edit/resurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'),
49+
url(r'^(?P<name>[^/]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'),
50+
url(r'^(?P<name>[^/]+)/edit/position/$', views_ballot.edit_position, name='doc_edit_position'),
51+
url(r'^(?P<name>[^/]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
52+
url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),
53+
url(r'^(?P<name>[^/]+)/edit/sendballotcomment/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
54+
url(r'^(?P<name>[^/]+)/edit/preparelastcall/$', views_ballot.prepare_last_call, name='doc_prepare_last_call'),
55+
url(r'^(?P<name>[^/]+)/edit/approveballot/$', views_ballot.approve_ballot, name='doc_approve_ballot'),
56+
url(r'^(?P<name>[^/]+)/edit/makelastcall/$', views_ballot.make_last_call, name='doc_make_last_call'),
5457
)

branch/iesg-tracker/ietf/idrfc/utils.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,28 @@ def add_document_comment(request, doc, text, include_by=True, ballot=None):
1717
c.rfc_flag = doc.idinternal.rfc_flag
1818
c.save()
1919

20+
def generate_ballot(request, doc):
21+
ballot = BallotInfo()
22+
ballot.ballot = doc.idinternal.ballot_id
23+
ballot.active = False
24+
ballot.last_call_text = generate_last_call_announcement(request, doc)
25+
ballot.approval_text = generate_approval_mail(request, doc)
26+
ballot.ballot_writeup = render_to_string("idrfc/ballot_writeup.txt")
27+
ballot.save()
28+
doc.idinternal.ballot = ballot
29+
return ballot
30+
2031
def make_last_call(request, doc):
2132
try:
2233
ballot = doc.idinternal.ballot
2334
except BallotInfo.DoesNotExist:
24-
ballot = BallotInfo()
25-
ballot.ballot = doc.idinternal.ballot_id
26-
ballot.active = False
27-
ballot.last_call_text = generate_last_call_announcement(request, doc)
28-
ballot.approval_text = generate_approval_mail(request, doc)
29-
ballot.ballot_writeup = render_to_string("idrfc/ballot_writeup.txt")
30-
ballot.save()
35+
ballot = generate_ballot(request, doc)
3136

3237
send_last_call_request(request, doc, ballot)
3338
add_document_comment(request, doc, "Last Call was requested")
3439

3540
def log_state_changed(request, doc, by):
36-
change = u"State changed to <b>%s</b> from <b>%s</b> by <b>%s</b>" % (
41+
change = u"State changed to <b>%s</b> from <b>%s</b> by %s" % (
3742
doc.idinternal.docstate(),
3843
format_document_state(doc.idinternal.prev_state, doc.
3944
idinternal.prev_sub_state),
@@ -53,3 +58,5 @@ def log_state_changed(request, doc, by):
5358
email_state_changed(request, doc, strip_tags(change))
5459

5560
return change
61+
62+

0 commit comments

Comments
 (0)