From a2c8fa01786d73e2d1f197444ebc1270f8a61625 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Tue, 25 Oct 2016 18:07:48 +0000 Subject: [PATCH] Added a Document.pub_date() method which returns the RFC publication datetime or other documents' new-revision datetime. Changed the generated bibtex entries to use pub_date(). Added tests for bibtext entries. Added 'bibtexparser' to requirements.txt. Fixes issue #2032. - Legacy-Id: 12212 --- ietf/doc/models.py | 10 +++++ ietf/doc/tests.py | 59 +++++++++++++++++++++++++- ietf/templates/doc/document_bibtex.bib | 16 +++---- requirements.txt | 1 + 4 files changed, 76 insertions(+), 10 deletions(-) diff --git a/ietf/doc/models.py b/ietf/doc/models.py index d38febd14..2c7644906 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -558,6 +558,16 @@ class Document(DocumentInfo): s = s.first() return s + def pub_date(self): + """This is the rfc publication date (datetime) for RFCs, + and the new-revision datetime for other documents.""" + if self.get_state_slug() == "rfc": + event = self.latest_event(type='published_rfc') + else: + event = self.latest_event(type='new_revision') + return event.time + + class RelatedDocHistory(models.Model): source = models.ForeignKey('DocHistory') target = models.ForeignKey('DocAlias', related_name="reversely_related_document_history_set") diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 15e7b6ab4..d08c8ea47 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -3,6 +3,8 @@ import shutil import datetime import json import sys +import urlparse +import bibtexparser if sys.version_info[0] == 2 and sys.version_info[1] < 7: import unittest2 as unittest else: @@ -10,7 +12,6 @@ else: from pyquery import PyQuery from tempfile import NamedTemporaryFile from Cookie import SimpleCookie -import urlparse from django.core.urlresolvers import reverse as urlreverse from django.conf import settings @@ -21,7 +22,7 @@ import debug # pyflakes:ignore from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State, DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent ) -from ietf.doc.factories import DocumentFactory +from ietf.doc.factories import DocumentFactory, DocEventFactory from ietf.group.models import Group from ietf.group.factories import GroupFactory from ietf.meeting.models import Meeting, Session, SessionPresentation @@ -810,6 +811,60 @@ class DocTestCase(TestCase): self.assertTrue("Request publication" not in unicontent(r)) + def test_document_bibtex(self): + + rfc = DocumentFactory.create( + other_aliases = ['rfc6020',], + states = [('draft','rfc'),('draft-iesg','pub')], + std_level_id = 'ps', + time = '2010-10-10', + ) + DocEventFactory.create(doc=rfc, type='published_rfc', time = '2010-10-10') + # + url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=rfc.name)) + r = self.client.get(url) + entry = bibtexparser.loads(r.content).get_entry_dict()["rfc6020"] + self.assertEqual(entry['series'], u'Request for Comments') + self.assertEqual(entry['number'], u'6020') + self.assertEqual(entry['doi'], u'10.17487/rfc6020') + self.assertEqual(entry['year'], u'2010') + self.assertEqual(entry['month'], u'oct') + # + self.assertNotIn('day', entry) + + april1 = DocumentFactory.create( + other_aliases = ['rfc1149',], + stream_id = 'rse', + states = [('draft','rfc'),('draft-iesg','pub')], + std_level_id = 'ind', + time = '1990-04-01', + ) + DocEventFactory.create(doc=april1, type='published_rfc', time = '1990-04-01') + # + url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=april1.name)) + r = self.client.get(url) + entry = bibtexparser.loads(r.content).get_entry_dict()['rfc1149'] + self.assertEqual(entry['series'], u'Request for Comments') + self.assertEqual(entry['number'], u'1149') + self.assertEqual(entry['doi'], u'10.17487/rfc1149') + self.assertEqual(entry['year'], u'1990') + self.assertEqual(entry['month'], u'apr') + self.assertEqual(entry['day'], u'1') + + draft = DocumentFactory.create() + docname = u'%s-%s' % (draft.name, draft.rev) + bibname = docname[6:] # drop the 'draft-' prefix + url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=draft.name)) + r = self.client.get(url) + entry = bibtexparser.loads(r.content).get_entry_dict()[bibname] + self.assertEqual(entry['note'], u'Work in Progress') + self.assertEqual(entry['number'], docname) + self.assertEqual(entry['year'], str(draft.pub_date().year)) + self.assertEqual(entry['month'], draft.pub_date().strftime('%b').lower()) + self.assertEqual(entry['day'], str(draft.pub_date().day)) + # + self.assertNotIn('doi', entry) + class AddCommentTestCase(TestCase): def test_add_comment(self): draft = make_test_data() diff --git a/ietf/templates/doc/document_bibtex.bib b/ietf/templates/doc/document_bibtex.bib index 05875d50d..489abf3ec 100644 --- a/ietf/templates/doc/document_bibtex.bib +++ b/ietf/templates/doc/document_bibtex.bib @@ -10,26 +10,26 @@ {% endif %} @misc{% templatetag openbrace %}rfc{{ doc.rfc_number }}, series = {Request for Comments}, - number= {{ doc.rfc_number }}, - howpublished= {% templatetag openbrace %}RFC {{ doc.rfc_number }}{% if doc.doc.intended_std_level %} ({{ doc.intended_std_level }}){% endif %}{% templatetag closebrace %}, + number = {{ doc.rfc_number }}, + howpublished = {% templatetag openbrace %}RFC {{ doc.rfc_number }}{% if doc.doc.intended_std_level %} ({{ doc.intended_std_level }}){% endif %}{% templatetag closebrace %}, publisher = {RFC Editor}, doi = {% templatetag openbrace %}10.17487/rfc{{ doc.rfc_number }}{% templatetag closebrace %}, url = {https://rfc-editor.org/rfc/rfc{{ doc.rfc_number }}.txt},{% else %} {% if published %}%% You should probably cite rfc{{ latest_revision.doc.rfc_number }} instead of this I-D.{% else %}{% if replaced_by %}%% You should probably cite {{replaced_by|join:" or "}} instead of this I-D.{% else %} {% if doc.rev != latest_revision.rev %}%% You should probably cite {{latest_revision.doc.name}}-{{latest_revision.rev}} instead of this revision.{%endif%}{% endif %}{% endif %} @techreport{% templatetag openbrace %}{{doc.name|slice:"6:"}}-{{doc.rev}}, - number= {% templatetag openbrace %}{{doc.name}}-{{doc.rev}}{% templatetag closebrace %}, + number = {% templatetag openbrace %}{{doc.name}}-{{doc.rev}}{% templatetag closebrace %}, type = {% templatetag openbrace %}Internet-Draft{% templatetag closebrace %}, institution = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %}, publisher = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %}, note = {% templatetag openbrace %}Work in Progress{% templatetag closebrace %}, url = {% templatetag openbrace %}https://tools.ietf.org/html/{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},{% endif %} - author= {% templatetag openbrace %}{% for entry in doc.authors.all %}{% with entry.person as author %}{{author.name}}{% endwith %}{% if not forloop.last %} and {% endif %}{% endfor %}{% templatetag closebrace %}, - title= {% templatetag openbrace %}{% templatetag openbrace %}{{doc.title}}{% templatetag closebrace %}{% templatetag closebrace %}, + author = {% templatetag openbrace %}{% for entry in doc.authors.all %}{% with entry.person as author %}{{author.name}}{% endwith %}{% if not forloop.last %} and {% endif %}{% endfor %}{% templatetag closebrace %}, + title = {% templatetag openbrace %}{% templatetag openbrace %}{{doc.title}}{% templatetag closebrace %}{% templatetag closebrace %}, pagetotal = {{ doc.pages }}, - year = {{ doc.time.year }}, - month = {{ doc.time|date:"b" }}, - day = {{ doc.time.day }}, + year = {{ doc.pub_date.year }}, + month = {{ doc.pub_date|date:"b" }},{% if not doc.rfc_number or doc.pub_date.day == 1 and doc.pub_date.month == 4 %} + day = {{ doc.pub_date.day }},{% endif %} abstract = {% templatetag openbrace %}{{ doc.abstract|clean_whitespace }}{% templatetag closebrace %}, {% templatetag closebrace %} diff --git a/requirements.txt b/requirements.txt index e217749ec..3b9b5b8b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ # -*- conf-mode -*- setuptools>=18.5 # Require this first, to prevent later errors # +bibtexparser>=0.6.2 coverage>=4.0.1,!=4.0.2 #cssselect>=0.6.1 # for PyQuery decorator>=3.4.0