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() s = s.first()
return s 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): class RelatedDocHistory(models.Model):
source = models.ForeignKey('DocHistory') source = models.ForeignKey('DocHistory')
target = models.ForeignKey('DocAlias', related_name="reversely_related_document_history_set") target = models.ForeignKey('DocAlias', related_name="reversely_related_document_history_set")

View file

@ -3,6 +3,8 @@ import shutil
import datetime import datetime
import json import json
import sys import sys
import urlparse
import bibtexparser
if sys.version_info[0] == 2 and sys.version_info[1] < 7: if sys.version_info[0] == 2 and sys.version_info[1] < 7:
import unittest2 as unittest import unittest2 as unittest
else: else:
@ -10,7 +12,6 @@ else:
from pyquery import PyQuery from pyquery import PyQuery
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from Cookie import SimpleCookie from Cookie import SimpleCookie
import urlparse
from django.core.urlresolvers import reverse as urlreverse from django.core.urlresolvers import reverse as urlreverse
from django.conf import settings from django.conf import settings
@ -21,7 +22,7 @@ import debug # pyflakes:ignore
from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State, from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State,
DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent ) 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.models import Group
from ietf.group.factories import GroupFactory from ietf.group.factories import GroupFactory
from ietf.meeting.models import Meeting, Session, SessionPresentation from ietf.meeting.models import Meeting, Session, SessionPresentation
@ -810,6 +811,60 @@ class DocTestCase(TestCase):
self.assertTrue("Request publication" not in unicontent(r)) 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): class AddCommentTestCase(TestCase):
def test_add_comment(self): def test_add_comment(self):
draft = make_test_data() draft = make_test_data()

View file

@ -10,26 +10,26 @@
{% endif %} {% endif %}
@misc{% templatetag openbrace %}rfc{{ doc.rfc_number }}, @misc{% templatetag openbrace %}rfc{{ doc.rfc_number }},
series = {Request for Comments}, series = {Request for Comments},
number= {{ doc.rfc_number }}, number = {{ doc.rfc_number }},
howpublished= {% templatetag openbrace %}RFC {{ doc.rfc_number }}{% if doc.doc.intended_std_level %} ({{ doc.intended_std_level }}){% endif %}{% templatetag closebrace %}, howpublished = {% templatetag openbrace %}RFC {{ doc.rfc_number }}{% if doc.doc.intended_std_level %} ({{ doc.intended_std_level }}){% endif %}{% templatetag closebrace %},
publisher = {RFC Editor}, publisher = {RFC Editor},
doi = {% templatetag openbrace %}10.17487/rfc{{ doc.rfc_number }}{% templatetag closebrace %}, doi = {% templatetag openbrace %}10.17487/rfc{{ doc.rfc_number }}{% templatetag closebrace %},
url = {https://rfc-editor.org/rfc/rfc{{ doc.rfc_number }}.txt},{% else %} 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 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 %} {% 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}}, @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 %}, type = {% templatetag openbrace %}Internet-Draft{% templatetag closebrace %},
institution = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %}, institution = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %},
publisher = {% 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 %}, note = {% templatetag openbrace %}Work in Progress{% templatetag closebrace %},
url = {% templatetag openbrace %}https://tools.ietf.org/html/{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},{% endif %} 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 %}, 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 %}, title = {% templatetag openbrace %}{% templatetag openbrace %}{{doc.title}}{% templatetag closebrace %}{% templatetag closebrace %},
pagetotal = {{ doc.pages }}, pagetotal = {{ doc.pages }},
year = {{ doc.time.year }}, year = {{ doc.pub_date.year }},
month = {{ doc.time|date:"b" }}, 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.time.day }}, day = {{ doc.pub_date.day }},{% endif %}
abstract = {% templatetag openbrace %}{{ doc.abstract|clean_whitespace }}{% templatetag closebrace %}, abstract = {% templatetag openbrace %}{{ doc.abstract|clean_whitespace }}{% templatetag closebrace %},
{% templatetag closebrace %} {% templatetag closebrace %}

View file

@ -1,6 +1,7 @@
# -*- conf-mode -*- # -*- conf-mode -*-
setuptools>=18.5 # Require this first, to prevent later errors setuptools>=18.5 # Require this first, to prevent later errors
# #
bibtexparser>=0.6.2
coverage>=4.0.1,!=4.0.2 coverage>=4.0.1,!=4.0.2
#cssselect>=0.6.1 # for PyQuery #cssselect>=0.6.1 # for PyQuery
decorator>=3.4.0 decorator>=3.4.0