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
This commit is contained in:
Henrik Levkowetz 2016-10-25 18:07:48 +00:00
parent cae4ab0024
commit a2c8fa0178
4 changed files with 76 additions and 10 deletions

View file

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

View file

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

View file

@ -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 %}

View file

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