Summary: Be more careful when generating writeups so that we wait with

saving newly generated writeups until we see a POST (problem found by
the test crawler)
 - Legacy-Id: 10137
This commit is contained in:
Ole Laursen 2015-10-06 16:20:12 +00:00
parent 63d96e0354
commit ec54a59cc6
6 changed files with 52 additions and 31 deletions

View file

@ -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()

View file

@ -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):

View file

@ -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)

View file

@ -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):

View file

@ -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),

View file

@ -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):