diff --git a/ietf/doc/management/commands/generate_draft_bibxml_files.py b/ietf/doc/management/commands/generate_draft_bibxml_files.py index 218430806..f2dc508b9 100644 --- a/ietf/doc/management/commands/generate_draft_bibxml_files.py +++ b/ietf/doc/management/commands/generate_draft_bibxml_files.py @@ -10,12 +10,12 @@ import sys from django.conf import settings from django.core.management.base import BaseCommand -from django.template.loader import render_to_string from django.utils import timezone import debug # pyflakes:ignore from ietf.doc.models import NewRevisionDocEvent +from ietf.doc.utils import bibxml_for_draft DEFAULT_DAYS = 7 @@ -77,21 +77,8 @@ class Command(BaseCommand): self.mutter('%s %s' % (e.time, e.doc.name)) try: doc = e.doc - if e.rev != doc.rev: - for h in doc.history_set.order_by("-time"): - if e.rev == h.rev: - doc = h - break - doc.date = e.time.date() - ref_text = '%s' % render_to_string('doc/bibxml.xml', {'name':doc.name, 'doc': doc, 'doc_bibtype':'I-D'}) - # if e.rev == e.doc.rev: - # for name in (doc.name, doc.name[6:]): - # ref_file_name = os.path.join(bibxmldir, 'reference.I-D.%s.xml' % (name, )) - # self.write(ref_file_name, ref_text) - # for name in (doc.name, doc.name[6:]): - # ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (name, doc.rev)) - # self.write(ref_rev_file_name, ref_text) - ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (doc.name, doc.rev)) - self.write(ref_rev_file_name, ref_text) + bibxml = bibxml_for_draft(doc, e.rev) + ref_rev_file_name = os.path.join(bibxmldir, 'reference.I-D.%s-%s.xml' % (doc.name, e.rev)) + self.write(ref_rev_file_name, bibxml) except Exception as ee: sys.stderr.write('\n%s-%s: %s\n' % (doc.name, doc.rev, ee)) diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py index 13cfe5265..956903c0c 100644 --- a/ietf/doc/utils.py +++ b/ietf/doc/utils.py @@ -17,6 +17,7 @@ from urllib.parse import quote from django.conf import settings from django.contrib import messages from django.forms import ValidationError +from django.http import Http404 from django.template.loader import render_to_string from django.utils import timezone from django.utils.html import escape @@ -1331,3 +1332,33 @@ def fuzzy_find_documents(name, rev=None): FoundDocuments = namedtuple('FoundDocuments', 'documents matched_name matched_rev') return FoundDocuments(docs, name, rev) + +def bibxml_for_draft(doc, rev=None): + + if rev is not None and rev != doc.rev: + # find the entry in the history + for h in doc.history_set.order_by("-time"): + if rev == h.rev: + doc = h + break + if rev and rev != doc.rev: + raise Http404("Revision not found") + + # Build the date we want to claim for the document in the bibxml + # For documents that have relevent NewRevisionDocEvents, use the date of the event. + # Very old documents don't have NewRevisionDocEvents - just use the document time. + + latest_revision_event = doc.latest_event(NewRevisionDocEvent, type="new_revision") + latest_revision_rev = latest_revision_event.rev if latest_revision_event else None + best_events = NewRevisionDocEvent.objects.filter(doc__name=doc.name, rev=(rev or latest_revision_rev)) + if best_events.exists(): + # There was a period where it was possible to get more than one NewRevisionDocEvent for a revision. + # A future data cleanup would allow this to be simplified + best_event = best_events.order_by('time').first() + log.assertion('doc.rev == best_event.rev') + doc.date = best_event.time.date() + else: + doc.date = doc.time.date() # Even if this may be incoreect, what would be better? + + return render_to_string('doc/bibxml.xml', {'name':doc.name, 'doc': doc, 'doc_bibtype':'I-D'}) + diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py index 670aff436..926b06ac4 100644 --- a/ietf/doc/views_doc.py +++ b/ietf/doc/views_doc.py @@ -63,7 +63,8 @@ from ietf.doc.utils import (add_links_in_new_revision_events, augment_events_wit get_initial_notify, make_notify_changed_event, make_rev_history, default_consensus, add_events_message_info, get_unicode_document_content, build_doc_meta_block, augment_docs_and_user_with_user_info, irsg_needed_ballot_positions, add_action_holder_change_event, - build_doc_supermeta_block, build_file_urls, update_documentauthors, fuzzy_find_documents) + build_doc_supermeta_block, build_file_urls, update_documentauthors, fuzzy_find_documents, + bibxml_for_draft) from ietf.doc.utils_bofreq import bofreq_editors, bofreq_responsible from ietf.group.models import Role, Group 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): rev = None doc = get_object_or_404(Document, name=name, type_id='draft') - - latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision") - latest_rev = latest_revision.rev if latest_revision else None - - if rev != None: - # find the entry in the history - for h in doc.history_set.order_by("-time"): - if rev == h.rev: - doc = h - break - if rev and rev != doc.rev: - raise Http404("Revision not found") - - ### PATCH to deal with unexpected multiple NewRevisionDocEvent objects for the same revision on a document - doc_event_qs = NewRevisionDocEvent.objects.filter(doc__name=doc.name, rev=(rev or latest_rev)) - if doc_event_qs.count(): - doc_event = doc_event_qs.order_by('time').last() - doc.date = doc_event.time.date() - else: - doc.date = doc.time.date() # Even if this may be incoreect, what would be better? -# try: -# doc_event = NewRevisionDocEvent.objects.get(doc__name=doc.name, rev=(rev or latest_rev)) -# doc.date = doc_event.time.date() -# except DocEvent.DoesNotExist: -# doc.date = doc.time.date() # Even if this may be incoreect, what would be better? + return HttpResponse(bibxml_for_draft(doc, rev), content_type="application/xml; charset=utf-8") - return render(request, "doc/bibxml.xml", - dict( - name=name, - doc=doc, - doc_bibtype='I-D', - ), - content_type="application/xml; charset=utf-8", - ) def document_writeup(request, name): diff --git a/ietf/secr/static/js/dynamic_inlines.js b/ietf/secr/static/js/dynamic_inlines.js index 9a7c0ed1f..a0b67c591 100644 --- a/ietf/secr/static/js/dynamic_inlines.js +++ b/ietf/secr/static/js/dynamic_inlines.js @@ -28,13 +28,15 @@ function add_inline_form(name) { // check to see if this is a stacked or tabular inline if (first.hasClass("tabular")) { var field_table = first.parent().find('table > tbody') - var count = field_table.children().length - var copy = $('tr:last', field_table).clone(true) + const children = field_table.children('tr.dynamic-inline') + var count = children.length + const last = $(children[count-1]) + var copy = last.clone(true) copy.removeClass("row1 row2") - copy.find("input[name$='address']").removeAttr("readonly") - copy.addClass("row"+((count % 2) == 0 ? 1 : 2)) - field_table.append(copy) - increment_form_ids($('tr:last', field_table), count, name) + copy.find("input[name$='address']").attr("readonly", false) + copy.addClass("row"+((count % 2) ? 2 : 1)) + copy.insertAfter(last) + increment_form_ids($(copy), count, name) } else { var last = $(first).parent().children('.last-related') @@ -54,13 +56,14 @@ function add_inline_form(name) { $(function() { var html_template = '
{{ recipient.template|escape|linebreaksbr }}
+ {{ recipient.template|escape }}
{% endif %}
{{ recipient.code|escape|linebreaksbr }}
+ {{ recipient.code|escape }}
{% endif %}