Skip to content

Commit 29f021d

Browse files
committed
Add a button to I-D and RFC pages that provides a citation in bibtex format for
the document. Commit ready for merge. - Legacy-Id: 10529
1 parent 95e2147 commit 29f021d

3 files changed

Lines changed: 74 additions & 13 deletions

File tree

ietf/doc/urls.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
url(r'^ad/(?P<name>[\w.-]+)/$(?u)', views_search.docs_for_ad, name="docs_for_ad"),
4646
(r'^ad2/(?P<name>[\w.-]+)/$(?u)', RedirectView.as_view(url='/doc/ad/%(name)s/', permanent=True)),
4747
url(r'^rfc-status-changes/$', views_status_change.rfc_status_changes, name='rfc_status_changes'),
48-
url(r'^start-rfc-status-change/(?P<name>[A-Za-z0-9._+-]*)$', views_status_change.start_rfc_status_change, name='start_rfc_status_change'),
48+
url(r'^start-rfc-status-change/(?P<name>[A-Za-z0-9._+-]*)$', views_status_change.start_rfc_status_change, name='start_rfc_status_change'),
4949
url(r'^iesg/(?P<last_call_only>[A-Za-z0-9.-]+/)?$', views_search.drafts_in_iesg_process, name="drafts_in_iesg_process"),
5050
url(r'^email-aliases/$', views_doc.email_aliases),
5151

@@ -54,6 +54,7 @@
5454
url(r'^select2search/(?P<model_name>(document|docalias))/(?P<doc_type>draft)/$', views_search.ajax_select2_search_docs, name="ajax_select2_search_docs"),
5555

5656
url(r'^(?P<name>[A-Za-z0-9._+-]+)/(?:(?P<rev>[0-9-]+)/)?$', views_doc.document_main, name="doc_view"),
57+
url(r'^(?P<name>[A-Za-z0-9._+-]+)/(?:(?P<rev>[0-9-]+)/)?bibtex/$', views_doc.document_bibtex, name="doc_bibtex"),
5758
url(r'^(?P<name>[A-Za-z0-9._+-]+)/history/$', views_doc.document_history, name="doc_history"),
5859
url(r'^(?P<name>[A-Za-z0-9._+-]+)/writeup/$', views_doc.document_writeup, name="doc_writeup"),
5960
url(r'^(?P<name>[A-Za-z0-9._+-]+)/email/$', views_doc.document_email, name="doc_email"),
@@ -73,8 +74,8 @@
7374
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/state/(?P<state_type>iana-action|iana-review)/$', views_draft.change_iana_state, name='doc_change_iana_state'),
7475
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/info/$', views_draft.edit_info, name='doc_edit_info'),
7576
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/requestresurrect/$', views_draft.request_resurrect, name='doc_request_resurrect'),
76-
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/submit-to-iesg/$', views_draft.to_iesg, name='doc_to_iesg'),
77-
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/resurrect/$', views_draft.resurrect, name='doc_resurrect'),
77+
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/submit-to-iesg/$', views_draft.to_iesg, name='doc_to_iesg'),
78+
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/resurrect/$', views_draft.resurrect, name='doc_resurrect'),
7879
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/addcomment/$', views_doc.add_comment, name='doc_add_comment'),
7980
url(r'^ajax/internet_draft/?$', views_draft.doc_ajax_internet_draft, name="doc_ajax_internet_draft"),
8081

ietf/doc/views_doc.py

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
from ietf.person.models import Email
5959
from ietf.utils.history import find_history_active_at
6060
from ietf.doc.forms import TelechatForm, NotifyForm
61-
from ietf.doc.mails import email_comment
61+
from ietf.doc.mails import email_comment
6262
from ietf.mailtrigger.utils import gather_relevant_expansions
6363

6464
def render_document_top(request, doc, tab, name):
@@ -101,7 +101,7 @@ def document_main(request, name, rev=None):
101101

102102
if doc.type_id == 'conflrev':
103103
conflictdoc = doc.related_that_doc('conflrev')[0].document
104-
104+
105105
revisions = []
106106
for h in doc.history_set.order_by("time", "id"):
107107
if h.rev and not h.rev in revisions:
@@ -233,6 +233,9 @@ def document_main(request, name, rev=None):
233233
# latest revision
234234
latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision")
235235

236+
# bibtex
237+
file_urls.append(("bibtex", "bibtex"))
238+
236239
# ballot
237240
ballot_summary = None
238241
if iesg_state and iesg_state.slug in IESG_BALLOT_ACTIVE_STATES:
@@ -281,7 +284,7 @@ def document_main(request, name, rev=None):
281284
if doc.stream_id == "ietf" and iesg_state:
282285
show_in_states = set(IESG_BALLOT_ACTIVE_STATES)
283286
show_in_states.update(('approved','ann','rfcqueue','pub'))
284-
if iesg_state.slug in show_in_states:
287+
if iesg_state.slug in show_in_states:
285288
can_edit_consensus = can_edit
286289
e = doc.latest_event(ConsensusDocEvent, type="changed_consensus")
287290
consensus = nice_consensus(e and e.consensus)
@@ -463,7 +466,7 @@ def document_main(request, name, rev=None):
463466
if doc.rev == "00" and not os.path.isfile(pathname):
464467
# This could move to a template
465468
content = "A conflict review response has not yet been proposed."
466-
else:
469+
else:
467470
content = get_document_content(filename, pathname, split=False, markup=True)
468471

469472
ballot_summary = None
@@ -491,13 +494,13 @@ def document_main(request, name, rev=None):
491494
if doc.rev == "00" and not os.path.isfile(pathname):
492495
# This could move to a template
493496
content = "Status change text has not yet been proposed."
494-
else:
497+
else:
495498
content = get_document_content(filename, pathname, split=False)
496499

497500
ballot_summary = None
498501
if doc.get_state_slug() in ("iesgeval"):
499502
ballot_summary = needed_ballot_positions(doc, doc.active_ballot().active_ad_positions().values())
500-
503+
501504
if isinstance(doc,Document):
502505
sorted_relations=doc.relateddocument_set.all().order_by('relationship__name')
503506
elif isinstance(doc,DocHistory):
@@ -590,7 +593,7 @@ def document_email(request,name):
590593
aliases = get_doc_email_aliases(name) if doc.type_id=='draft' else None
591594

592595
expansions = gather_relevant_expansions(doc=doc)
593-
596+
594597
return render(request, "doc/document_email.html",
595598
dict(doc=doc,
596599
top=top,
@@ -665,6 +668,32 @@ def document_history(request, name):
665668
),
666669
context_instance=RequestContext(request))
667670

671+
672+
def document_bibtex(request, name, rev=None):
673+
doc = get_object_or_404(Document, docalias__name=name)
674+
675+
latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision")
676+
replaced_by = [d.name for d in doc.related_that("replaces")]
677+
published = doc.latest_event(type="published_rfc")
678+
rfc = latest_revision.doc if latest_revision.doc.get_state_slug() == "rfc" else None
679+
680+
if rev != None and rev != doc.rev:
681+
# find the entry in the history
682+
for h in doc.history_set.order_by("-time"):
683+
if rev == h.rev:
684+
doc = h
685+
break
686+
687+
return render_to_response("doc/document_bibtex.bib",
688+
dict(doc=doc,
689+
replaced_by=replaced_by,
690+
published=published,
691+
rfc=rfc,
692+
latest_revision=latest_revision),
693+
content_type="text/plain; charset=utf-8",
694+
context_instance=RequestContext(request))
695+
696+
668697
def document_writeup(request, name):
669698
doc = get_object_or_404(Document, docalias__name=name)
670699
top = render_document_top(request, doc, "writeup", name)
@@ -921,7 +950,7 @@ def add_comment(request, name):
921950
form = AddCommentForm(request.POST)
922951
if form.is_valid():
923952
c = form.cleaned_data['comment']
924-
953+
925954
e = DocEvent(doc=doc, by=login)
926955
e.type = "added_comment"
927956
e.desc = c
@@ -932,7 +961,7 @@ def add_comment(request, name):
932961
return redirect("doc_history", name=doc.name)
933962
else:
934963
form = AddCommentForm()
935-
964+
936965
return render_to_response('doc/add_comment.html',
937966
dict(doc=doc,
938967
form=form),
@@ -1035,7 +1064,7 @@ def email_aliases(request,name=''):
10351064
doc = get_object_or_404(Document, name=name) if name else None
10361065
if not name:
10371066
# require login for the overview page, but not for the
1038-
# document-specific pages
1067+
# document-specific pages
10391068
if not request.user.is_authenticated():
10401069
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
10411070
aliases = get_doc_email_aliases(name)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{% spaceless %}
2+
3+
{% load ietf_filters %}
4+
5+
{% if doc.get_state_slug == "rfc" %}
6+
@misc{% templatetag openbrace %}rfc{{ doc.rfc_number }},
7+
series = {Request for Comments},
8+
number= {{ doc.rfc_number }},
9+
howpublished= {% templatetag openbrace %}{{ doc.stream }} RFC {{ doc.rfc_number }} ({{ doc.intended_std_level }}){% templatetag closebrace %},
10+
publisher = {RFC Editor},
11+
doi = {% templatetag openbrace %}10.17487/rfc{{ doc.rfc_number }}{% templatetag closebrace %},
12+
url = {https://rfc-editor.org/rfc/rfc{{ doc.rfc_number }}.txt},{% else %}
13+
{% 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 %}
14+
{% if doc.rev != latest_revision.rev %}%% You should probably cite {{latest_revision.doc.name}}-{{latest_revision.rev}} instead of this revision.{%endif%}{% endif %}{% endif %}
15+
@techreport{% templatetag openbrace %}{{doc.name|slice:"6:"}}-{{doc.rev}},
16+
number= {% templatetag openbrace %}{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},
17+
type = {% templatetag openbrace %}Internet-Draft{% templatetag closebrace %},
18+
institution = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %},
19+
publisher = {% templatetag openbrace %}Internet Engineering Task Force{% templatetag closebrace %},
20+
note = {% templatetag openbrace %}Work in Progress{% templatetag closebrace %},
21+
url = {% templatetag openbrace %}https://tools.ietf.org/html/{{doc.name}}-{{doc.rev}}{% templatetag closebrace %},{% endif %}
22+
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 %},
23+
title= {% templatetag openbrace %}{% templatetag openbrace %}{{doc.title}}{% templatetag closebrace %}{% templatetag closebrace %},
24+
pagetotal = {{ doc.pages }},
25+
year = {{ doc.time.year }},
26+
month = {{ doc.time|date:"b" }},
27+
day = {{ doc.time.day }},
28+
abstract = {% templatetag openbrace %}{{ doc.abstract|clean_whitespace }}{% templatetag closebrace %},
29+
{% templatetag closebrace %}
30+
31+
{% endspaceless %}

0 commit comments

Comments
 (0)