Skip to content

Commit a2c8fa0

Browse files
committed
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 ietf-tools#2032.
- Legacy-Id: 12212
1 parent cae4ab0 commit a2c8fa0

4 files changed

Lines changed: 76 additions & 10 deletions

File tree

ietf/doc/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,16 @@ def submission(self):
558558
s = s.first()
559559
return s
560560

561+
def pub_date(self):
562+
"""This is the rfc publication date (datetime) for RFCs,
563+
and the new-revision datetime for other documents."""
564+
if self.get_state_slug() == "rfc":
565+
event = self.latest_event(type='published_rfc')
566+
else:
567+
event = self.latest_event(type='new_revision')
568+
return event.time
569+
570+
561571
class RelatedDocHistory(models.Model):
562572
source = models.ForeignKey('DocHistory')
563573
target = models.ForeignKey('DocAlias', related_name="reversely_related_document_history_set")

ietf/doc/tests.py

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
import datetime
44
import json
55
import sys
6+
import urlparse
7+
import bibtexparser
68
if sys.version_info[0] == 2 and sys.version_info[1] < 7:
79
import unittest2 as unittest
810
else:
911
import unittest
1012
from pyquery import PyQuery
1113
from tempfile import NamedTemporaryFile
1214
from Cookie import SimpleCookie
13-
import urlparse
1415

1516
from django.core.urlresolvers import reverse as urlreverse
1617
from django.conf import settings
@@ -21,7 +22,7 @@
2122

2223
from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State,
2324
DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent )
24-
from ietf.doc.factories import DocumentFactory
25+
from ietf.doc.factories import DocumentFactory, DocEventFactory
2526
from ietf.group.models import Group
2627
from ietf.group.factories import GroupFactory
2728
from ietf.meeting.models import Meeting, Session, SessionPresentation
@@ -810,6 +811,60 @@ def test_document_nonietf_pubreq_button(self):
810811
self.assertTrue("Request publication" not in unicontent(r))
811812

812813

814+
def test_document_bibtex(self):
815+
816+
rfc = DocumentFactory.create(
817+
other_aliases = ['rfc6020',],
818+
states = [('draft','rfc'),('draft-iesg','pub')],
819+
std_level_id = 'ps',
820+
time = '2010-10-10',
821+
)
822+
DocEventFactory.create(doc=rfc, type='published_rfc', time = '2010-10-10')
823+
#
824+
url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=rfc.name))
825+
r = self.client.get(url)
826+
entry = bibtexparser.loads(r.content).get_entry_dict()["rfc6020"]
827+
self.assertEqual(entry['series'], u'Request for Comments')
828+
self.assertEqual(entry['number'], u'6020')
829+
self.assertEqual(entry['doi'], u'10.17487/rfc6020')
830+
self.assertEqual(entry['year'], u'2010')
831+
self.assertEqual(entry['month'], u'oct')
832+
#
833+
self.assertNotIn('day', entry)
834+
835+
april1 = DocumentFactory.create(
836+
other_aliases = ['rfc1149',],
837+
stream_id = 'rse',
838+
states = [('draft','rfc'),('draft-iesg','pub')],
839+
std_level_id = 'ind',
840+
time = '1990-04-01',
841+
)
842+
DocEventFactory.create(doc=april1, type='published_rfc', time = '1990-04-01')
843+
#
844+
url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=april1.name))
845+
r = self.client.get(url)
846+
entry = bibtexparser.loads(r.content).get_entry_dict()['rfc1149']
847+
self.assertEqual(entry['series'], u'Request for Comments')
848+
self.assertEqual(entry['number'], u'1149')
849+
self.assertEqual(entry['doi'], u'10.17487/rfc1149')
850+
self.assertEqual(entry['year'], u'1990')
851+
self.assertEqual(entry['month'], u'apr')
852+
self.assertEqual(entry['day'], u'1')
853+
854+
draft = DocumentFactory.create()
855+
docname = u'%s-%s' % (draft.name, draft.rev)
856+
bibname = docname[6:] # drop the 'draft-' prefix
857+
url = urlreverse('ietf.doc.views_doc.document_bibtex', kwargs=dict(name=draft.name))
858+
r = self.client.get(url)
859+
entry = bibtexparser.loads(r.content).get_entry_dict()[bibname]
860+
self.assertEqual(entry['note'], u'Work in Progress')
861+
self.assertEqual(entry['number'], docname)
862+
self.assertEqual(entry['year'], str(draft.pub_date().year))
863+
self.assertEqual(entry['month'], draft.pub_date().strftime('%b').lower())
864+
self.assertEqual(entry['day'], str(draft.pub_date().day))
865+
#
866+
self.assertNotIn('doi', entry)
867+
813868
class AddCommentTestCase(TestCase):
814869
def test_add_comment(self):
815870
draft = make_test_data()

ietf/templates/doc/document_bibtex.bib

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@
1010
{% endif %}
1111
@misc{% templatetag openbrace %}rfc{{ doc.rfc_number }},
1212
series = {Request for Comments},
13-
number= {{ doc.rfc_number }},
14-
howpublished= {% templatetag openbrace %}RFC {{ doc.rfc_number }}{% if doc.doc.intended_std_level %} ({{ doc.intended_std_level }}){% endif %}{% templatetag closebrace %},
13+
number = {{ doc.rfc_number }},
14+
howpublished = {% templatetag openbrace %}RFC {{ doc.rfc_number }}{% if doc.doc.intended_std_level %} ({{ doc.intended_std_level }}){% endif %}{% templatetag closebrace %},
1515
publisher = {RFC Editor},
1616
doi = {% templatetag openbrace %}10.17487/rfc{{ doc.rfc_number }}{% templatetag closebrace %},
1717
url = {https://rfc-editor.org/rfc/rfc{{ doc.rfc_number }}.txt},{% else %}
1818
{% 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 %}
1919
{% if doc.rev != latest_revision.rev %}%% You should probably cite {{latest_revision.doc.name}}-{{latest_revision.rev}} instead of this revision.{%endif%}{% endif %}{% endif %}
2020
@techreport{% templatetag openbrace %}{{doc.name|slice:"6:"}}-{{doc.rev}},
21-
number= {% templatetag openbrace %}{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},
21+
number = {% templatetag openbrace %}{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},
2222
type = {% templatetag openbrace %}Internet-Draft{% templatetag closebrace %},
2323
institution = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %},
2424
publisher = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %},
2525
note = {% templatetag openbrace %}Work in Progress{% templatetag closebrace %},
2626
url = {% templatetag openbrace %}https://tools.ietf.org/html/{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},{% endif %}
27-
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 %},
28-
title= {% templatetag openbrace %}{% templatetag openbrace %}{{doc.title}}{% templatetag closebrace %}{% templatetag closebrace %},
27+
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 %},
28+
title = {% templatetag openbrace %}{% templatetag openbrace %}{{doc.title}}{% templatetag closebrace %}{% templatetag closebrace %},
2929
pagetotal = {{ doc.pages }},
30-
year = {{ doc.time.year }},
31-
month = {{ doc.time|date:"b" }},
32-
day = {{ doc.time.day }},
30+
year = {{ doc.pub_date.year }},
31+
month = {{ doc.pub_date|date:"b" }},{% if not doc.rfc_number or doc.pub_date.day == 1 and doc.pub_date.month == 4 %}
32+
day = {{ doc.pub_date.day }},{% endif %}
3333
abstract = {% templatetag openbrace %}{{ doc.abstract|clean_whitespace }}{% templatetag closebrace %},
3434
{% templatetag closebrace %}
3535

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- conf-mode -*-
22
setuptools>=18.5 # Require this first, to prevent later errors
33
#
4+
bibtexparser>=0.6.2
45
coverage>=4.0.1,!=4.0.2
56
#cssselect>=0.6.1 # for PyQuery
67
decorator>=3.4.0

0 commit comments

Comments
 (0)