From 4a68b92c03733d57ec02cb73b95fbf50f4c1990c Mon Sep 17 00:00:00 2001 From: Lars Eggert Date: Thu, 15 Sep 2022 18:28:08 +0100 Subject: [PATCH 1/3] fix: Add `
` to restore mailtrigger indentation
 (#4454)

* fix: Add 
 to restore mailtrigger indentation

Fixes #4452

* Switch tag order
---
 ietf/templates/mailtrigger/recipient.html | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/ietf/templates/mailtrigger/recipient.html b/ietf/templates/mailtrigger/recipient.html
index 0ded49a7c..008d08e90 100644
--- a/ietf/templates/mailtrigger/recipient.html
+++ b/ietf/templates/mailtrigger/recipient.html
@@ -39,12 +39,12 @@
                         
                         
                             {% if recipient.template %}
-                                {{ recipient.template|escape|linebreaksbr }}
+                                
{{ recipient.template|escape }}
{% endif %} {% if recipient.code %} - {{ recipient.code|escape|linebreaksbr }} +
{{ recipient.code|escape }}
{% endif %} @@ -55,4 +55,4 @@ {% endblock %} {% block js %} -{% endblock %} +{% endblock %} \ No newline at end of file From 4dd220b98049cccf1ef2c13e76d66aaef11f51e4 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Fri, 16 Sep 2022 14:35:32 -0300 Subject: [PATCH 2/3] fix: restore "add another" button on secr rooms and rolodex edit pages (#4467) * fix: replace inline JS for "Add another" on secr rooms page * fix: update rolodex edit page to re-enable "Add another" button * refactor: use new class instead of reusing inline-related The "inline-related" class has styling rules, etc. To avoid accidental styling changes, use "dynamic-inline" as a class to indicate which tr elements should be managed. --- ietf/secr/static/js/dynamic_inlines.js | 21 ++++++++++++--------- ietf/secr/templates/meetings/rooms.html | 2 +- ietf/secr/templates/rolodex/edit.html | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) 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 = '' $('.inline-group').each(function(i) { //prefix is in the name of the input fields before the "-" - var prefix = $("input[type='hidden'][name!='csrfmiddlewaretoken']", this).attr("name").split("-")[0] - $(this).append(html_template.replace("{{prefix}}", prefix)) + var prefix = $("input[type='hidden'][name!='csrfmiddlewaretoken']", this).attr("name").split("-")[0]; + $(this).append(html_template.replace("{{prefix}}", prefix)); + $('#addlink-' + prefix).on('click', () => add_inline_form(prefix)); }) }) diff --git a/ietf/secr/templates/meetings/rooms.html b/ietf/secr/templates/meetings/rooms.html index d3decca80..7d6740e5e 100644 --- a/ietf/secr/templates/meetings/rooms.html +++ b/ietf/secr/templates/meetings/rooms.html @@ -28,7 +28,7 @@ {% if form.non_field_errors %} {{ form.non_field_errors }} {% endif %} - + {% for hidden in form.hidden_fields %} {{ hidden }} diff --git a/ietf/secr/templates/rolodex/edit.html b/ietf/secr/templates/rolodex/edit.html index ee7a4db5e..61f48e5ec 100644 --- a/ietf/secr/templates/rolodex/edit.html +++ b/ietf/secr/templates/rolodex/edit.html @@ -43,7 +43,7 @@ {% for form in email_formset.forms %} {% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %} - + {# Include the hidden fields in the form #} {% for hidden in form.hidden_fields %} From 7bc6f2b6b24efc5a04c286e61763ebcf877feafa Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 19 Sep 2022 10:38:57 -0500 Subject: [PATCH 3/3] fix: return same bibxml for versioned and versionless references (#4470) * fix: return same bibxml for versioned and versionless references Fixes #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. --- .../commands/generate_draft_bibxml_files.py | 21 ++--------- ietf/doc/utils.py | 31 ++++++++++++++++ ietf/doc/views_doc.py | 37 ++----------------- ietf/submit/utils.py | 17 +++------ ietf/templates/doc/bibxml.xml | 7 +--- 5 files changed, 45 insertions(+), 68 deletions(-) diff --git a/ietf/doc/management/commands/generate_draft_bibxml_files.py b/ietf/doc/management/commands/generate_draft_bibxml_files.py index 8bdaa0a86..9ac90523d 100644 --- a/ietf/doc/management/commands/generate_draft_bibxml_files.py +++ b/ietf/doc/management/commands/generate_draft_bibxml_files.py @@ -10,11 +10,11 @@ import sys from django.conf import settings from django.core.management.base import BaseCommand -from django.template.loader import render_to_string import debug # pyflakes:ignore from ietf.doc.models import NewRevisionDocEvent +from ietf.doc.utils import bibxml_for_draft DEFAULT_DAYS = 7 @@ -76,21 +76,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 f9ea81387..01b529c5e 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.html import escape from django.urls import reverse as urlreverse @@ -1317,3 +1318,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 e2ec39edc..d34ac4a59 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/submit/utils.py b/ietf/submit/utils.py index f0a78c5cf..eb6838d94 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -20,7 +20,6 @@ from django.core.validators import validate_email from django.db import transaction from django.http import HttpRequest # pyflakes:ignore from django.utils.module_loading import import_string -from django.template.loader import render_to_string from django.contrib.auth.models import AnonymousUser import debug # pyflakes:ignore @@ -29,9 +28,10 @@ from ietf.doc.models import ( Document, State, DocAlias, DocEvent, SubmissionDoc DocumentAuthor, AddedMessageEvent ) from ietf.doc.models import NewRevisionDocEvent from ietf.doc.models import RelatedDocument, DocRelationshipName, DocExtResource -from ietf.doc.utils import add_state_change_event, rebuild_reference_relations -from ietf.doc.utils import ( set_replaces_for_document, prettify_std_name, - update_doc_extresources, can_edit_docextresources, update_documentauthors, update_action_holders ) +from ietf.doc.utils import (add_state_change_event, rebuild_reference_relations, + set_replaces_for_document, prettify_std_name, update_doc_extresources, + can_edit_docextresources, update_documentauthors, update_action_holders, + bibxml_for_draft ) from ietf.doc.mails import send_review_possibly_replaces_request, send_external_resource_change_request from ietf.group.models import Group from ietf.ietfauth.utils import has_role @@ -485,14 +485,7 @@ def post_submission(request, submission, approved_doc_desc, approved_subm_desc): create_submission_event(request, submission, approved_subm_desc) # Create bibxml-ids entry - ref_text = '%s' % render_to_string('doc/bibxml.xml', {'name':draft.name, 'doc': draft, 'doc_bibtype':'I-D'}) - # for name in (draft.name, draft.name[6:]): - # ref_file_name = os.path.join(os.path.join(settings.BIBXML_BASE_PATH, 'bibxml-ids'), 'reference.I-D.%s.xml' % (name, )) - # with io.open(ref_file_name, "w", encoding='utf-8') as f: - # f.write(ref_text) - # 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 )) - # with io.open(ref_rev_file_name, "w", encoding='utf-8') as f: - # f.write(ref_text) + ref_text = bibxml_for_draft(draft, draft.rev) 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 )) with io.open(ref_rev_file_name, "w", encoding='utf-8') as f: f.write(ref_text) diff --git a/ietf/templates/doc/bibxml.xml b/ietf/templates/doc/bibxml.xml index afc7234a6..d9d534bf3 100644 --- a/ietf/templates/doc/bibxml.xml +++ b/ietf/templates/doc/bibxml.xml @@ -1,13 +1,10 @@ - {{doc.title}}{% if doc.submission %}{% for author in doc.submission.authors %} - - {% if author.affiliation %}{{ author.affiliation }} - {% endif %}{% endfor %}{% else %}{% for author in doc.documentauthor_set.all %} + {{doc.title}}{% for author in doc.documentauthor_set.all %} {% if author.affiliation %}{{ author.affiliation }} - {% endif %}{% endfor %}{% endif %} + {% endif %}{% endfor %} {{doc.abstract}}