Skip to content

Commit 7bc6f2b

Browse files
authored
fix: return same bibxml for versioned and versionless references (ietf-tools#4470)
* fix: return same bibxml for versioned and versionless references Fixes ietf-tools#4384. Refactors bibxml production to remove repeated logic. Abandons the half-implemented idea that returning information from the Submission object might be better than the Document or DocHistory objects. * fix: test for None with `is not` and simplify choice from multiple qs objects Addresses review comments.
1 parent 4dd220b commit 7bc6f2b

5 files changed

Lines changed: 46 additions & 69 deletions

File tree

ietf/doc/management/commands/generate_draft_bibxml_files.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010

1111
from django.conf import settings
1212
from django.core.management.base import BaseCommand
13-
from django.template.loader import render_to_string
1413

1514
import debug # pyflakes:ignore
1615

1716
from ietf.doc.models import NewRevisionDocEvent
17+
from ietf.doc.utils import bibxml_for_draft
1818

1919
DEFAULT_DAYS = 7
2020

@@ -76,21 +76,8 @@ def handle(self, *args, **options):
7676
self.mutter('%s %s' % (e.time, e.doc.name))
7777
try:
7878
doc = e.doc
79-
if e.rev != doc.rev:
80-
for h in doc.history_set.order_by("-time"):
81-
if e.rev == h.rev:
82-
doc = h
83-
break
84-
doc.date = e.time.date()
85-
ref_text = '%s' % render_to_string('doc/bibxml.xml', {'name':doc.name, 'doc': doc, 'doc_bibtype':'I-D'})
86-
# if e.rev == e.doc.rev:
87-
# for name in (doc.name, doc.name[6:]):
88-
# ref_file_name = os.path.join(bibxmldir, 'reference.I-D.%s.xml' % (name, ))
89-
# self.write(ref_file_name, ref_text)
90-
# for name in (doc.name, doc.name[6:]):
91-
# ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (name, doc.rev))
92-
# self.write(ref_rev_file_name, ref_text)
93-
ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (doc.name, doc.rev))
94-
self.write(ref_rev_file_name, ref_text)
79+
bibxml = bibxml_for_draft(doc, e.rev)
80+
ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (doc.name, e.rev))
81+
self.write(ref_rev_file_name, bibxml)
9582
except Exception as ee:
9683
sys.stderr.write('\n%s-%s: %s\n' % (doc.name, doc.rev, ee))

ietf/doc/utils.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from django.conf import settings
1818
from django.contrib import messages
1919
from django.forms import ValidationError
20+
from django.http import Http404
2021
from django.template.loader import render_to_string
2122
from django.utils.html import escape
2223
from django.urls import reverse as urlreverse
@@ -1317,3 +1318,33 @@ def fuzzy_find_documents(name, rev=None):
13171318

13181319
FoundDocuments = namedtuple('FoundDocuments', 'documents matched_name matched_rev')
13191320
return FoundDocuments(docs, name, rev)
1321+
1322+
def bibxml_for_draft(doc, rev=None):
1323+
1324+
if rev is not None and rev != doc.rev:
1325+
# find the entry in the history
1326+
for h in doc.history_set.order_by("-time"):
1327+
if rev == h.rev:
1328+
doc = h
1329+
break
1330+
if rev and rev != doc.rev:
1331+
raise Http404("Revision not found")
1332+
1333+
# Build the date we want to claim for the document in the bibxml
1334+
# For documents that have relevent NewRevisionDocEvents, use the date of the event.
1335+
# Very old documents don't have NewRevisionDocEvents - just use the document time.
1336+
1337+
latest_revision_event = doc.latest_event(NewRevisionDocEvent, type="new_revision")
1338+
latest_revision_rev = latest_revision_event.rev if latest_revision_event else None
1339+
best_events = NewRevisionDocEvent.objects.filter(doc__name=doc.name, rev=(rev or latest_revision_rev))
1340+
if best_events.exists():
1341+
# There was a period where it was possible to get more than one NewRevisionDocEvent for a revision.
1342+
# A future data cleanup would allow this to be simplified
1343+
best_event = best_events.order_by('time').first()
1344+
log.assertion('doc.rev == best_event.rev')
1345+
doc.date = best_event.time.date()
1346+
else:
1347+
doc.date = doc.time.date() # Even if this may be incoreect, what would be better?
1348+
1349+
return render_to_string('doc/bibxml.xml', {'name':doc.name, 'doc': doc, 'doc_bibtype':'I-D'})
1350+

ietf/doc/views_doc.py

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@
6363
get_initial_notify, make_notify_changed_event, make_rev_history, default_consensus,
6464
add_events_message_info, get_unicode_document_content, build_doc_meta_block,
6565
augment_docs_and_user_with_user_info, irsg_needed_ballot_positions, add_action_holder_change_event,
66-
build_doc_supermeta_block, build_file_urls, update_documentauthors, fuzzy_find_documents)
66+
build_doc_supermeta_block, build_file_urls, update_documentauthors, fuzzy_find_documents,
67+
bibxml_for_draft)
6768
from ietf.doc.utils_bofreq import bofreq_editors, bofreq_responsible
6869
from ietf.group.models import Role, Group
6970
from ietf.group.utils import can_manage_all_groups_of_type, can_manage_materials, group_features_role_filter
@@ -1020,41 +1021,9 @@ def document_bibxml(request, name, rev=None):
10201021
rev = None
10211022

10221023
doc = get_object_or_404(Document, name=name, type_id='draft')
1023-
1024-
latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision")
1025-
latest_rev = latest_revision.rev if latest_revision else None
1026-
1027-
if rev != None:
1028-
# find the entry in the history
1029-
for h in doc.history_set.order_by("-time"):
1030-
if rev == h.rev:
1031-
doc = h
1032-
break
1033-
if rev and rev != doc.rev:
1034-
raise Http404("Revision not found")
1035-
1036-
### PATCH to deal with unexpected multiple NewRevisionDocEvent objects for the same revision on a document
1037-
doc_event_qs = NewRevisionDocEvent.objects.filter(doc__name=doc.name, rev=(rev or latest_rev))
1038-
if doc_event_qs.count():
1039-
doc_event = doc_event_qs.order_by('time').last()
1040-
doc.date = doc_event.time.date()
1041-
else:
1042-
doc.date = doc.time.date() # Even if this may be incoreect, what would be better?
10431024

1044-
# try:
1045-
# doc_event = NewRevisionDocEvent.objects.get(doc__name=doc.name, rev=(rev or latest_rev))
1046-
# doc.date = doc_event.time.date()
1047-
# except DocEvent.DoesNotExist:
1048-
# doc.date = doc.time.date() # Even if this may be incoreect, what would be better?
1049-
1050-
return render(request, "doc/bibxml.xml",
1051-
dict(
1052-
name=name,
1053-
doc=doc,
1054-
doc_bibtype='I-D',
1055-
),
1056-
content_type="application/xml; charset=utf-8",
1057-
)
1025+
return HttpResponse(bibxml_for_draft(doc, rev), content_type="application/xml; charset=utf-8")
1026+
10581027

10591028

10601029
def document_writeup(request, name):

ietf/submit/utils.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from django.db import transaction
2121
from django.http import HttpRequest # pyflakes:ignore
2222
from django.utils.module_loading import import_string
23-
from django.template.loader import render_to_string
2423
from django.contrib.auth.models import AnonymousUser
2524

2625
import debug # pyflakes:ignore
@@ -29,9 +28,10 @@
2928
DocumentAuthor, AddedMessageEvent )
3029
from ietf.doc.models import NewRevisionDocEvent
3130
from ietf.doc.models import RelatedDocument, DocRelationshipName, DocExtResource
32-
from ietf.doc.utils import add_state_change_event, rebuild_reference_relations
33-
from ietf.doc.utils import ( set_replaces_for_document, prettify_std_name,
34-
update_doc_extresources, can_edit_docextresources, update_documentauthors, update_action_holders )
31+
from ietf.doc.utils import (add_state_change_event, rebuild_reference_relations,
32+
set_replaces_for_document, prettify_std_name, update_doc_extresources,
33+
can_edit_docextresources, update_documentauthors, update_action_holders,
34+
bibxml_for_draft )
3535
from ietf.doc.mails import send_review_possibly_replaces_request, send_external_resource_change_request
3636
from ietf.group.models import Group
3737
from ietf.ietfauth.utils import has_role
@@ -485,14 +485,7 @@ def post_submission(request, submission, approved_doc_desc, approved_subm_desc):
485485
create_submission_event(request, submission, approved_subm_desc)
486486

487487
# Create bibxml-ids entry
488-
ref_text = '%s' % render_to_string('doc/bibxml.xml', {'name':draft.name, 'doc': draft, 'doc_bibtype':'I-D'})
489-
# for name in (draft.name, draft.name[6:]):
490-
# ref_file_name = os.path.join(os.path.join(settings.BIBXML_BASE_PATH, 'bibxml-ids'), 'reference.I-D.%s.xml' % (name, ))
491-
# with io.open(ref_file_name, "w", encoding='utf-8') as f:
492-
# f.write(ref_text)
493-
# ref_rev_file_name = os.path.join(os.path.join(settings.BIBXML_BASE_PATH, 'bibxml-ids'), 'reference.I-D.%s-%s.xml' % (name, draft.rev ))
494-
# with io.open(ref_rev_file_name, "w", encoding='utf-8') as f:
495-
# f.write(ref_text)
488+
ref_text = bibxml_for_draft(draft, draft.rev)
496489
ref_rev_file_name = os.path.join(os.path.join(settings.BIBXML_BASE_PATH, 'bibxml-ids'), 'reference.I-D.%s-%s.xml' % (draft.name, draft.rev ))
497490
with io.open(ref_rev_file_name, "w", encoding='utf-8') as f:
498491
f.write(ref_text)

ietf/templates/doc/bibxml.xml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<reference anchor="{{doc_bibtype}}.{{name|slice:"6:"}}">
33
<front>
4-
<title>{{doc.title}}</title>{% if doc.submission %}{% for author in doc.submission.authors %}
5-
<author fullname="{{ author.name }}">
6-
{% if author.affiliation %}<organization>{{ author.affiliation }}</organization>
7-
{% endif %}</author>{% endfor %}{% else %}{% for author in doc.documentauthor_set.all %}
4+
<title>{{doc.title}}</title>{% for author in doc.documentauthor_set.all %}
85
<author initials="{{ author.person.initials }}" surname="{{ author.person.last_name }}" fullname="{{ author.person.name }}">
96
{% if author.affiliation %}<organization>{{ author.affiliation }}</organization>
10-
{% endif %}</author>{% endfor %}{% endif %}
7+
{% endif %}</author>{% endfor %}
118
<date month="{{doc.date|date:"F"}}" day="{{doc.date.day}}" year="{{doc.date.year}}" />
129
<abstract>
1310
<t>{{doc.abstract}}

0 commit comments

Comments
 (0)