diff --git a/ietf/doc/lastcall.py b/ietf/doc/lastcall.py index 016b85e41..86cae3832 100644 --- a/ietf/doc/lastcall.py +++ b/ietf/doc/lastcall.py @@ -13,12 +13,15 @@ from ietf.doc.mails import send_last_call_request, email_last_call_expired def request_last_call(request, doc): if not doc.latest_event(type="changed_ballot_writeup_text"): - generate_ballot_writeup(request, doc) + e = generate_ballot_writeup(request, doc) + e.save() if not doc.latest_event(type="changed_ballot_approval_text"): - generate_approval_mail(request, doc) + e = generate_approval_mail(request, doc) + e.save() if not doc.latest_event(type="changed_last_call_text"): - generate_last_call_announcement(request, doc) - + e = generate_last_call_announcement(request, doc) + e.save() + send_last_call_request(request, doc) e = DocEvent() diff --git a/ietf/doc/mails.py b/ietf/doc/mails.py index 2fdea8310..ab2bdbd8b 100644 --- a/ietf/doc/mails.py +++ b/ietf/doc/mails.py @@ -112,8 +112,8 @@ def generate_ballot_writeup(request, doc): e.doc = doc e.desc = u"Ballot writeup was generated" e.text = unicode(render_to_string("doc/mail/ballot_writeup.txt", {'iana': iana})) - e.save() - + + # caller is responsible for saving, if necessary return e def generate_last_call_announcement(request, doc): @@ -154,8 +154,8 @@ def generate_last_call_announcement(request, doc): e.doc = doc e.desc = u"Last call announcement was generated" e.text = unicode(mail) - e.save() + # caller is responsible for saving, if necessary return e @@ -173,8 +173,8 @@ def generate_approval_mail(request, doc): e.doc = doc e.desc = u"Ballot approval text was generated" e.text = unicode(mail) - e.save() + # caller is responsible for saving, if necessary return e def generate_approval_mail_approved(request, doc): diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py index 75551e76b..92813cc06 100644 --- a/ietf/doc/tests_ballot.py +++ b/ietf/doc/tests_ballot.py @@ -211,8 +211,8 @@ class BallotWriteupsTests(TestCase): regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) - draft = Document.objects.get(name=draft.name) - self.assertTrue("Subject: Last Call" in draft.latest_event(WriteupDocEvent, type="changed_last_call_text").text) + text = q("[name=last_call_text]").text() + self.assertTrue("Subject: Last Call" in text) def test_request_last_call(self): @@ -223,12 +223,14 @@ class BallotWriteupsTests(TestCase): # give us an announcement to send r = self.client.post(url, dict(regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) - + q = PyQuery(r.content) + text = q("[name=last_call_text]").text() + mailbox_before = len(outbox) # send r = self.client.post(url, dict( - last_call_text=draft.latest_event(WriteupDocEvent, type="changed_last_call_text").text, + last_call_text=text, send_last_call_request="1")) draft = Document.objects.get(name=draft.name) self.assertEqual(draft.get_state_slug("draft-iesg"), "lc-req") @@ -341,7 +343,6 @@ class BallotWriteupsTests(TestCase): # test regenerate r = self.client.post(url, dict(regenerate_approval_text="1")) self.assertEqual(r.status_code, 200) - draft = Document.objects.get(name=draft.name) self.assertTrue("Subject: Protocol Action" in draft.latest_event(WriteupDocEvent, type="changed_ballot_approval_text").text) # test regenerate when it's a disapprove @@ -349,7 +350,6 @@ class BallotWriteupsTests(TestCase): r = self.client.post(url, dict(regenerate_approval_text="1")) self.assertEqual(r.status_code, 200) - draft = Document.objects.get(name=draft.name) self.assertTrue("NOT be published" in draft.latest_event(WriteupDocEvent, type="changed_ballot_approval_text").text) # test regenerate when it's a conflict review @@ -360,7 +360,6 @@ class BallotWriteupsTests(TestCase): r = self.client.post(url, dict(regenerate_approval_text="1")) self.assertEqual(r.status_code, 200) - draft = Document.objects.get(name=draft.name) self.assertTrue("Subject: Results of IETF-conflict review" in draft.latest_event(WriteupDocEvent, type="changed_ballot_approval_text").text) diff --git a/ietf/doc/utils_charter.py b/ietf/doc/utils_charter.py index a93a00984..3e9d0d800 100644 --- a/ietf/doc/utils_charter.py +++ b/ietf/doc/utils_charter.py @@ -150,8 +150,8 @@ def generate_ballot_writeup(request, doc): e.doc = doc e.desc = u"Ballot writeup was generated" e.text = unicode(render_to_string("doc/charter/ballot_writeup.txt")) - e.save() - + + # caller is responsible for saving, if necessary return e def default_action_text(group, charter, by): diff --git a/ietf/doc/views_ballot.py b/ietf/doc/views_ballot.py index e614c51fe..9d10df376 100644 --- a/ietf/doc/views_ballot.py +++ b/ietf/doc/views_ballot.py @@ -451,6 +451,8 @@ def lastcalltext(request, name): e.desc = "Last call announcement was changed" e.text = t e.save() + elif existing.pk == None: + existing.save() if "send_last_call_request" in request.POST: prev_state = doc.get_state("draft-iesg") @@ -477,7 +479,8 @@ def lastcalltext(request, name): if "regenerate_last_call_text" in request.POST: e = generate_last_call_announcement(request, doc) - + e.save() + # make sure form has the updated text form = LastCallTextForm(initial=dict(last_call_text=e.text)) @@ -530,6 +533,8 @@ def ballot_writeupnotes(request, name): e.desc = "Ballot writeup was changed" e.text = t e.save() + elif existing.pk == None: + existing.save() if "issue_ballot" in request.POST: create_ballot_if_not_open(doc, login, "approve") @@ -548,6 +553,7 @@ def ballot_writeupnotes(request, name): approval = doc.latest_event(WriteupDocEvent, type="changed_ballot_approval_text") if not approval: approval = generate_approval_mail(request, doc) + approval.save() msg = generate_issue_ballot_mail(request, doc, ballot) send_mail_preformatted(request, msg) @@ -612,9 +618,12 @@ def ballot_approvaltext(request, name): e.desc = "Ballot approval text was changed" e.text = t e.save() + elif existing.pk == None: + existing.save() if "regenerate_approval_text" in request.POST: e = generate_approval_mail(request, doc) + e.save() # make sure form has the updated text form = ApprovalTextForm(initial=dict(approval_text=e.text)) @@ -642,15 +651,15 @@ def approve_ballot(request, name): login = request.user.person - e = doc.latest_event(WriteupDocEvent, type="changed_ballot_approval_text") - if not e: - e = generate_approval_mail(request, doc) - approval_text = e.text + approval_mail_event = doc.latest_event(WriteupDocEvent, type="changed_ballot_approval_text") + if not approval_mail_event: + approval_mail_event = generate_approval_mail(request, doc) + approval_text = approval_mail_event.text - e = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text") - if not e: - e = generate_ballot_writeup(request, doc) - ballot_writeup = e.text + ballot_writeup_event = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text") + if not ballot_writeup_event: + ballot_writeup_event = generate_ballot_writeup(request, doc) + ballot_writeup = ballot_writeup_event.text if "NOT be published" in approval_text: action = "do_not_publish" @@ -675,6 +684,11 @@ def approve_ballot(request, name): prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) events = [] + if approval_mail_event.pk == None: + approval_mail_event.save() + if ballot_writeup_event.pk == None: + ballot_writeup_event.save() + if new_state.slug == "ann" and new_state.slug != prev_state.slug and not request.REQUEST.get("skiprfceditorpost"): # start by notifying the RFC Editor import ietf.sync.rfceditor @@ -748,16 +762,19 @@ def make_last_call(request, name): login = request.user.person - e = doc.latest_event(WriteupDocEvent, type="changed_last_call_text") - if not e: - if doc.type.slug != 'draft': + announcement_event = doc.latest_event(WriteupDocEvent, type="changed_last_call_text") + if not announcement_event: + if doc.type_id != 'draft': raise Http404 - e = generate_last_call_announcement(request, doc) - announcement = e.text + announcement_event = generate_last_call_announcement(request, doc) + announcement = announcement_event.text if request.method == 'POST': form = MakeLastCallForm(request.POST) if form.is_valid(): + if announcement_event.pk == None: + announcement_event.save() + send_mail_preformatted(request, announcement) if doc.type.slug == 'draft': send_mail_preformatted(request, announcement, extra=extra_automation_headers(doc), diff --git a/ietf/doc/views_charter.py b/ietf/doc/views_charter.py index 09bf473bd..dc97af827 100644 --- a/ietf/doc/views_charter.py +++ b/ietf/doc/views_charter.py @@ -554,6 +554,8 @@ def ballot_writeupnotes(request, name): e.save() existing = e + elif existing.pk == None: + existing.save() if "send_ballot" in request.POST and approval: if has_role(request.user, "Area Director") and not charter.latest_event(BallotPositionDocEvent, type="changed_ballot_position", ad=by, ballot=ballot):