diff --git a/ietf/doc/mails.py b/ietf/doc/mails.py index 6f7378567..9217d0b64 100644 --- a/ietf/doc/mails.py +++ b/ietf/doc/mails.py @@ -92,6 +92,17 @@ def generate_ballot_writeup(request, doc): return e +def generate_ballot_rfceditornote(request, doc): + e = WriteupDocEvent() + e.type = "changed_ballot_rfceditornote_text" + e.by = request.user.person + e.doc = doc + e.desc = u"RFC Editor Note for ballot was generated" + e.text = unicode(render_to_string("doc/mail/ballot_rfceditornote.txt")) + e.save() + + return e + def generate_last_call_announcement(request, doc): expiration_date = datetime.date.today() + datetime.timedelta(days=14) if doc.group.type_id in ("individ", "area"): diff --git a/ietf/doc/models.py b/ietf/doc/models.py index ddc20b297..ddad2b69f 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -232,6 +232,10 @@ class DocumentInfo(models.Model): else: return None + def has_rfc_editor_note(self): + e = self.latest_event(WriteupDocEvent, type="changed_rfc_editor_note_text") + return bool(e and (e.text != "")) + def meeting_related(self): answer = False if self.type_id in ("agenda","minutes","bluesheets","slides"): @@ -675,6 +679,7 @@ EVENT_TYPES = [ ("changed_ballot_approval_text", "Changed ballot approval text"), ("changed_ballot_writeup_text", "Changed ballot writeup text"), + ("changed_rfc_editor_note_text", "Changed RFC Editor Note text"), ("changed_last_call_text", "Changed last call text"), ("requested_last_call", "Requested last call"), diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 27bd054d8..923498b2a 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -707,11 +707,19 @@ class DocTestCase(TestCase): text="This is ballot writeup notes.", by=Person.objects.get(name="(System)")) + rfced_note = WriteupDocEvent.objects.create( + doc=doc, + desc="Changed text", + type="changed_rfc_editor_note_text", + text="This is a note for the RFC Editor.", + by=Person.objects.get(name="(System)")) + url = urlreverse('doc_writeup', kwargs=dict(name=doc.name)) r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertTrue(appr.text in r.content) self.assertTrue(notes.text in r.content) + self.assertTrue(rfced_note.text in r.content) def test_history(self): doc = make_test_data() diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py index 1589df22c..40c6bfda8 100644 --- a/ietf/doc/tests_ballot.py +++ b/ietf/doc/tests_ballot.py @@ -273,6 +273,45 @@ class BallotWriteupsTests(TestCase): draft = Document.objects.get(name=draft.name) self.assertTrue("This is a simple test" in draft.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text").text) + def test_edit_ballot_rfceditornote(self): + draft = make_test_data() + url = urlreverse('doc_ballot_rfceditornote', kwargs=dict(name=draft.name)) + login_testing_unauthorized(self, "secretary", url) + + # add a note to the RFC Editor + rfced_note = WriteupDocEvent.objects.create( + doc=draft, + desc="Changed text", + type="changed_rfc_editor_note_text", + text="This is a note for the RFC Editor.", + by=Person.objects.get(name="(System)")) + + # normal get + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual(len(q('textarea[name=rfc_editor_note]')), 1) + self.assertTrue(q('[type=submit]:contains("Save")')) + self.assertTrue("" in r.content) + self.assertTrue("This is a note for the RFC Editor" in r.content) + + # save with a note + r = self.client.post(url, dict( + rfc_editor_note="This is a simple test.", + save_ballot_rfceditornote="1")) + self.assertEqual(r.status_code, 200) + draft = Document.objects.get(name=draft.name) + self.assertTrue(draft.has_rfc_editor_note()) + self.assertTrue("This is a simple test" in draft.latest_event(WriteupDocEvent, type="changed_rfc_editor_note_text").text) + + # clear the existing note + r = self.client.post(url, dict( + rfc_editor_note=" ", + clear_ballot_rfceditornote="1")) + self.assertEqual(r.status_code, 200) + draft = Document.objects.get(name=draft.name) + self.assertFalse(draft.has_rfc_editor_note()) + def test_issue_ballot(self): draft = make_test_data() url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.name)) @@ -340,6 +379,55 @@ class BallotWriteupsTests(TestCase): 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) + def test_edit_verify_permissions(self): + + def verify_fail(username, url): + if username: + self.client.login(username=username, password=username+"+password") + r = self.client.get(url) + self.assertEqual(r.status_code,403) + + def verify_can_see(username, url): + self.client.login(username=username, password=username+"+password") + r = self.client.get(url) + self.assertEqual(r.status_code,200) + q = PyQuery(r.content) + self.assertEqual(len(q("