diff --git a/ietf/sync/iana.py b/ietf/sync/iana.py index e3ad0e8f4..3772ecfca 100644 --- a/ietf/sync/iana.py +++ b/ietf/sync/iana.py @@ -215,19 +215,29 @@ def update_history_with_changes(changes, send_email=True): return added_events, warnings +def find_document_name(text): + prefixes = ['draft','conflict-review','status-change','charter'] + leading_delimiter_re = '(?]+)>", msg["Subject"]) - if m: - doc_name = m.group(1).lower() - if re.search(r"\.\w{3}$", doc_name): # strip off extension - doc_name = doc_name[:-4] - - if re.search(r"-\d{2}$", doc_name): # strip off revision - doc_name = doc_name[:-3] + doc_name = find_document_name(msg["Subject"]) or "" + doc_name = strip_version_extension(doc_name) # date review_time = datetime.datetime.now() @@ -252,14 +262,18 @@ def parse_review_email(text): # comment body = msg.get_payload().decode('quoted-printable').replace("\r", "") - if "BEGIN IANA LAST CALL COMMENTS" in body: - b = body.find("(BEGIN IANA LAST CALL COMMENTS)") - e = body.find("(END IANA LAST CALL COMMENTS)") - comment = body[b + len("(BEGIN IANA LAST CALL COMMENTS)"):e].strip() - elif "BEGIN IANA COMMENTS" in body: - b = body.find("(BEGIN IANA COMMENTS)") - e = body.find("(END IANA COMMENTS)") - comment = body[b + len("(BEGIN IANA COMMENTS)"):e].strip() + + begin_search = re.search('\(BEGIN\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?(\s*:\s*[a-zA-Z0-9-\.]*)?\s*\)',body) + end_search = re.search('\(END\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?\)',body) + if begin_search and end_search: + begin_string = begin_search.group(0) + end_string = end_search.group(0) + b = body.find(begin_string) + e = body.find(end_string) + comment = body[b + len(begin_string):e].strip() + embedded_name = strip_version_extension(find_document_name(begin_string) or "") + if embedded_name: + doc_name = embedded_name else: comment = "" diff --git a/ietf/sync/tests.py b/ietf/sync/tests.py index 9b9424f8b..9db88b042 100644 --- a/ietf/sync/tests.py +++ b/ietf/sync/tests.py @@ -131,11 +131,12 @@ class IANASyncTests(TestCase): def test_iana_review_mail(self): draft = make_test_data() + subject_template = u'Subject: [IANA #12345] Last Call: <%(draft)s-%(rev)s.txt> (Long text) to Informational RFC' msg_template = u"""From: "%(person)s via RT" Date: Thu, 10 May 2012 12:00:0%(rtime)d +0000 -Subject: [IANA #12345] Last Call: <%(draft)s-%(rev)s.txt> (Long text) to Informational RFC +%(subject)s -(BEGIN IANA %(tag)s) +(BEGIN IANA %(tag)s%(embedded_name)s) IESG: @@ -154,32 +155,44 @@ ICANN (END IANA %(tag)s) """ - tags = ("LAST CALL COMMENTS","COMMENTS") - for tag in tags: - msg = msg_template % dict(person=Person.objects.get(user__username="iana").name, - draft=draft.name, - rev=draft.rev, - tag=tag, - rtime=tags.index(tag)) - - doc_name, review_time, by, comment = iana.parse_review_email(msg.encode('utf-8')) + subjects = ( subject_template % dict(draft=draft.name,rev=draft.rev) , 'Subject: Vacuous Subject' ) - self.assertEqual(doc_name, draft.name) -# self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, 0)) - self.assertEqual(by, Person.objects.get(user__username="iana")) - self.assertTrue("there are no IANA Actions" in comment.replace("\n", "")) + tags = ('LAST CALL COMMENTS', 'COMMENTS') - events_before = DocEvent.objects.filter(doc=draft, type="iana_review").count() - iana.add_review_comment(doc_name, review_time, by, comment) + embedded_names = (': %s-%s.txt'%(draft.name,draft.rev), '') - e = draft.latest_event(type="iana_review") - self.assertTrue(e) - self.assertEqual(e.desc, comment) - self.assertEqual(e.by, by) - - # make sure it doesn't create duplicates - iana.add_review_comment(doc_name, review_time, by, comment) - self.assertEqual(DocEvent.objects.filter(doc=draft, type="iana_review").count(), events_before+1) + for subject in subjects: + for tag in tags: + for embedded_name in embedded_names: + if embedded_name or not 'Vacuous' in subject: + + rtime = 7*subjects.index(subject) + 5*tags.index(tag) + embedded_names.index(embedded_name) + msg = msg_template % dict(person=Person.objects.get(user__username="iana").name, + draft=draft.name, + rev=draft.rev, + tag=tag, + rtime=rtime, + subject=subject, + embedded_name=embedded_name,) + + doc_name, review_time, by, comment = iana.parse_review_email(msg.encode('utf-8')) + + self.assertEqual(doc_name, draft.name) + self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, rtime)) + self.assertEqual(by, Person.objects.get(user__username="iana")) + self.assertTrue("there are no IANA Actions" in comment.replace("\n", "")) + + events_before = DocEvent.objects.filter(doc=draft, type="iana_review").count() + iana.add_review_comment(doc_name, review_time, by, comment) + + e = draft.latest_event(type="iana_review") + self.assertTrue(e) + self.assertEqual(e.desc, comment) + self.assertEqual(e.by, by) + + # make sure it doesn't create duplicates + iana.add_review_comment(doc_name, review_time, by, comment) + self.assertEqual(DocEvent.objects.filter(doc=draft, type="iana_review").count(), events_before+1) def test_notify_page(self): # check that we can get the notify page