Run tidy as part of tests, and fix HTML issues it finds.

- Legacy-Id: 19904
This commit is contained in:
Lars Eggert 2022-02-01 16:11:34 +00:00
parent a507b31669
commit 64d2ba2558
78 changed files with 882 additions and 959 deletions

View file

@ -38,6 +38,7 @@ RUN apt-get install -qy \
less \
libmagic-dev \
libmariadb-dev \
libtidy-dev \
locales \
mariadb-client \
netcat \

View file

@ -363,7 +363,7 @@ def add_links_in_new_revision_events(doc, events, diff_revisions):
links += ""
if prev != None:
links += ' (<a href="%s?url1=%s&url2=%s">diff from previous</a>)' % (settings.RFCDIFF_BASE_URL, quote(prev, safe="~"), quote(diff_url, safe="~"))
links += ' (<a href="%s?url1=%s&amp;url2=%s">diff from previous</a>)' % (settings.RFCDIFF_BASE_URL, quote(prev, safe="~"), quote(diff_url, safe="~"))
# replace the bold filename part
e.desc = re.sub(r"<b>(.+-[0-9][0-9].txt)</b>", links, e.desc)
@ -1087,7 +1087,7 @@ def build_doc_supermeta_block(doc):
items.append(f'[<a href="{urlreverse("ietf.group.views.group_home",kwargs=dict(acronym=doc.group.acronym))}" title="The working group handling this document">WG</a>]')
items.append(f'[<a href="mailto:{doc.name}@ietf.org?subject={doc.name}" title="Send email to the document authors">Email</a>]')
if doc.rev != "00":
items.append(f'[<a href="{settings.RFCDIFF_BASE_URL}?difftype=--hwdiff&url2={doc.name}-{doc.rev}.txt" title="Inline diff (wdiff)">Diff1</a>]')
items.append(f'[<a href="{settings.RFCDIFF_BASE_URL}?difftype=--hwdiff&amp;url2={doc.name}-{doc.rev}.txt" title="Inline diff (wdiff)">Diff1</a>]')
items.append(f'[<a href="{settings.RFCDIFF_BASE_URL}?url2={doc.name}-{doc.rev}.txt" title="Side-by-side diff">Diff2</a>]')
items.append(f'[<a href="{settings.IDNITS_BASE_URL}?url={settings.IETF_ID_ARCHIVE_URL}{doc.name}-{doc.rev}.txt" title="Run an idnits check of this document">Nits</a>]')

View file

@ -14,7 +14,7 @@ from django.template.defaultfilters import striptags
from django.template.loader import render_to_string
from django.urls import reverse as urlreverse
from django.views.decorators.csrf import csrf_exempt
from django.utils.html import escape
import debug # pyflakes:ignore
@ -527,7 +527,7 @@ def lastcalltext(request, name):
if not existing:
existing = generate_last_call_announcement(request, doc)
form = LastCallTextForm(initial=dict(last_call_text=existing.text))
form = LastCallTextForm(initial=dict(last_call_text=escape(existing.text)))
if request.method == 'POST':
if "save_last_call_text" in request.POST or "send_last_call_request" in request.POST:
@ -612,7 +612,7 @@ def ballot_writeupnotes(request, name):
if not existing:
existing = generate_ballot_writeup(request, doc)
form = BallotWriteupForm(initial=dict(ballot_writeup=existing.text))
form = BallotWriteupForm(initial=dict(ballot_writeup=escape(existing.text)))
if request.method == 'POST' and "save_ballot_writeup" in request.POST or "issue_ballot" in request.POST:
form = BallotWriteupForm(request.POST)
@ -727,7 +727,7 @@ def ballot_rfceditornote(request, name):
if not existing or (existing.text == ""):
existing = generate_ballot_rfceditornote(request, doc)
form = BallotRfcEditorNoteForm(auto_id=False, initial=dict(rfc_editor_note=existing.text))
form = BallotRfcEditorNoteForm(auto_id=False, initial=dict(rfc_editor_note=escape(existing.text)))
if request.method == 'POST' and "save_ballot_rfceditornote" in request.POST:
form = BallotRfcEditorNoteForm(request.POST)
@ -791,7 +791,7 @@ def ballot_approvaltext(request, name):
if not existing:
existing = generate_approval_mail(request, doc)
form = ApprovalTextForm(initial=dict(approval_text=existing.text))
form = ApprovalTextForm(initial=dict(approval_text=escape(existing.text)))
if request.method == 'POST':
if "save_approval_text" in request.POST:

View file

@ -10,7 +10,7 @@ from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render
from django.template.loader import render_to_string
from django.urls import reverse as urlreverse
from django.utils.html import escape
from ietf.doc.mails import (email_bofreq_title_changed, email_bofreq_editors_changed,
email_bofreq_new_revision, email_bofreq_responsible_changed)
@ -172,7 +172,7 @@ def new_bof_request(request):
return redirect('ietf.doc.views_doc.document_main', name=bofreq.name)
else:
init = {'bofreq_content':render_to_string('doc/bofreq/bofreq_template.md',{}),
init = {'bofreq_content':escape(render_to_string('doc/bofreq/bofreq_template.md',{})),
'bofreq_submission':'enter',
}
form = NewBofreqForm(initial=init)

View file

@ -17,6 +17,7 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.encoding import force_text
from django.utils.html import escape
import debug # pyflakes:ignore
@ -507,7 +508,7 @@ def review_announcement_text(request, name):
existing_new_work.text = derive_new_work_text(existing.text,group)
existing_new_work.time = datetime.datetime.now()
form = ReviewAnnouncementTextForm(initial=dict(announcement_text=existing.text,new_work_text=existing_new_work.text))
form = ReviewAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text),new_work_text=escape(existing_new_work.text)))
if request.method == 'POST':
form = ReviewAnnouncementTextForm(request.POST)
@ -588,7 +589,7 @@ def action_announcement_text(request, name):
if not existing:
raise Http404
form = ActionAnnouncementTextForm(initial=dict(announcement_text=existing.text))
form = ActionAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text)))
if request.method == 'POST':
form = ActionAnnouncementTextForm(request.POST)
@ -650,7 +651,7 @@ def ballot_writeupnotes(request, name):
reissue = charter.latest_event(DocEvent, type="sent_ballot_announcement")
form = BallotWriteupForm(initial=dict(ballot_writeup=existing.text))
form = BallotWriteupForm(initial=dict(ballot_writeup=escape(existing.text)))
if request.method == 'POST' and ("save_ballot_writeup" in request.POST or "send_ballot" in request.POST):
form = BallotWriteupForm(request.POST)
@ -802,7 +803,7 @@ def approve(request, name):
return render(request, 'doc/charter/approve.html',
dict(charter=charter,
announcement=announcement))
announcement=escape(announcement)))
def charter_with_milestones_txt(request, name, rev):
charter = get_object_or_404(Document, type="charter", docalias__name=name)

View file

@ -12,6 +12,7 @@ from django.http import HttpResponseRedirect, Http404
from django.urls import reverse
from django.template.loader import render_to_string
from django.conf import settings
from django.utils.html import escape
import debug # pyflakes:ignore
@ -215,7 +216,7 @@ def submit(request, name):
elif "reset_text" in request.POST:
init = { "content": render_to_string("doc/conflict_review/review_choices.txt",dict())}
init = { "content": escape(render_to_string("doc/conflict_review/review_choices.txt",dict()))}
form = UploadForm(initial=init)
# Protect against handcrufted malicious posts
@ -229,9 +230,9 @@ def submit(request, name):
init = { "content": ""}
if not_uploaded_yet:
init["content"] = render_to_string("doc/conflict_review/review_choices.txt",
init["content"] = escape(render_to_string("doc/conflict_review/review_choices.txt",
dict(),
)
))
else:
filename = os.path.join(settings.CONFLICT_REVIEW_PATH, '%s-%s.txt' % (review.canonical_name(), review.rev))
try:
@ -358,7 +359,7 @@ def approve_conflict_review(request, name):
else:
init = { "announcement_text" : default_approval_text(review) }
init = { "announcement_text" : escape(default_approval_text(review)) }
form = AnnouncementForm(initial=init)
return render(request, 'doc/conflict_review/approve.html',

View file

@ -16,6 +16,7 @@ from django.urls import reverse
from django.template.loader import render_to_string
from django.conf import settings
from django.utils.encoding import force_text
from django.utils.html import escape
import debug # pyflakes:ignore
from ietf.doc.mails import email_ad_approved_status_change
@ -396,7 +397,7 @@ def approve(request, name):
init = []
for rel in status_change.relateddocument_set.filter(relationship__slug__in=STATUSCHANGE_RELATIONS):
init.append({"announcement_text" : default_approval_text(status_change,rel),
init.append({"announcement_text" : escape(default_approval_text(status_change,rel)),
"label": "Announcement text for %s to %s"%(rel.target.document.canonical_name(),newstatus(rel)),
})
formset = AnnouncementFormSet(initial=init)
@ -674,7 +675,7 @@ def last_call(request, name):
if not last_call_event:
last_call_event = generate_last_call_text(request, status_change)
form = LastCallTextForm(initial=dict(last_call_text=last_call_event.text))
form = LastCallTextForm(initial=dict(last_call_text=escape(last_call_event.text)))
if request.method == 'POST':
if "save_last_call_text" in request.POST or "send_last_call_request" in request.POST:

View file

@ -244,7 +244,7 @@ class SecrMeetingTestCase(TestCase):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
q = PyQuery(response.content)
self.assertEqual(len(q("#id_rooms_table tr input[type='checkbox']")),meeting.room_set.count())
self.assertEqual(len(q("#id_rooms_table tr input[type='checkbox']")),meeting.room_set.count()+1)
# test delete
# first unschedule sessions so we can delete

View file

@ -52,17 +52,11 @@
<!-- END Breadcrumbs -->
{% endif %}
{% comment %}
<!-- Removed per Glen 08-04-2010 -->
<!-- Javascript Warning -->
<noscript class="errornote"> You have Javascript disabled. Javascript is required for this application.</noscript>
{% endcomment %}
<!-- Django Messages -->
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
<li {% if message.tags %}class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
@ -83,6 +77,5 @@
{% block footer %}<div id="footer"></div>{% endblock %}
</div>
<!-- END Container -->
</body>
</html>

View file

@ -53,12 +53,6 @@
<!-- END Breadcrumbs -->
{% endif %}
{% comment %}
<!-- Removed per Glen 08-04-2010 -->
<!-- Javascript Warning -->
<noscript class="errornote"> You have Javascript disabled. Javascript is required for this application.</noscript>
{% endcomment %}
<!-- Django Messages -->
{% if messages %}
<ul class="messages">

View file

@ -4,7 +4,11 @@
{% block title %}Groups - Search{% endblock %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
<script src="{% static 'secr/js/utils.js' %}"></script>
<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %}{% endblock %}
{% endblock %}
{% block breadcrumbs %}{{ block.super }}

View file

@ -57,8 +57,8 @@
{% endif %}
<td width="320">{{ cname|title }}</td>
<td><input type="text" value="{{ value }}" maxlength="255" class="wg_constraint" disabled><br>{{ field }} {{ field.label }}</td>
{% endfor %}
</tr>
{% endfor %}
{% endif %}
<tr>
<td colspan="2">BOF Sessions:</td>

View file

@ -1,5 +1,4 @@
<li><a href="https://www.ietf.org/instructions/meeting_materials_tool.html" target="_blank">Instructions</a>.</li>
<li>If you require assistance in using this tool, or wish to report a bug, then please send a message to <a href="mailto:{{settings.SECRETARIAT_ACTION_EMAIL}}">ietf-action@ietf.org</a>.</li>
<li>To submit your materials via email, please send agendas to <a href="mailto:agenda@ietf.org">agenda@ietf.org</a> and minutes/presentation slides to <a href="mailto:proceedings@ietf.org">proceedings@ietf.org</a>.</li>
<li><bold>Note:</bold> Normal session materials materials management is now performed using the {% if meeting.number %}<a href="{% url 'ietf.meeting.views.materials' num=meeting.number %}">{% endif %}materials page{% if meeting.number %}</a>{% endif %}
<li><b>Note:</b> Normal session materials materials management is now performed using the {% if meeting.number %}<a href="{% url 'ietf.meeting.views.materials' num=meeting.number %}">{% endif %}materials page{% if meeting.number %}</a>{% endif %}

View file

@ -10,29 +10,37 @@
<tr valign="top">
<td>
<h3>IESG</h3>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcement</b></a></li><br>
<li> <a href="{% url 'ietf.secr.telechat.views.main' %}"><b>Telechat</b></a></li><br>
<li> <a href="{% url 'ietf.secr.console.views.main' %}"><b>Console</b></a></li><br>
<ul>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcement</b></a></li>
<li> <a href="{% url 'ietf.secr.telechat.views.main' %}"><b>Telechat</b></a></li>
<li> <a href="{% url 'ietf.secr.console.views.main' %}"><b>Console</b></a></li>
</ul>
</td>
<td>
<h3>IDs and WGs Process</h3>
<li> <a href="{% url "ietf.secr.areas.views.list_areas" %}"><b>Areas</b></a></li><br>
<li> <a href="{% url 'ietf.secr.groups.views.search' %}"><b>Groups</b></a></li><br>
<li> <a href="{% url 'ietf.secr.rolodex.views.search' %}"><b>Rolodex</b></a></li><br>
<li> <a href="{% url 'ietf.secr.roles.views.main' %}"><b>Roles</b></a></li><br>
<ul>
<li> <a href="{% url "ietf.secr.areas.views.list_areas" %}"><b>Areas</b></a></li>
<li> <a href="{% url 'ietf.secr.groups.views.search' %}"><b>Groups</b></a></li>
<li> <a href="{% url 'ietf.secr.rolodex.views.search' %}"><b>Rolodex</b></a></li>
<li> <a href="{% url 'ietf.secr.roles.views.main' %}"><b>Roles</b></a></li>
</ul>
</td>
</tr>
<tr valign="top">
<td>
<h3>Meetings and Proceedings</h3>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li><br>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Materials Manager (Proceedings)</b></a></li><br>
<li> <a href="{% url "ietf.secr.meetings.views.main" %}"><b>Meeting Manager</b></a></li><br>
<li> <a href="{% url "ietf.secr.meetings.views.blue_sheet_redirect" %}"><b>Blue Sheets</b></a></li><br>
<ul>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Materials Manager (Proceedings)</b></a></li>
<li> <a href="{% url "ietf.secr.meetings.views.main" %}"><b>Meeting Manager</b></a></li>
<li> <a href="{% url "ietf.secr.meetings.views.blue_sheet_redirect" %}"><b>Blue Sheets</b></a></li>
</ul>
</td>
<td>
<h3>IPR</h3>
<li> <a href="{% url 'ietf.ipr.views.admin' state='pending' %}"><b>IPR Admin</b></a></li><br>
<ul>
<li> <a href="{% url 'ietf.ipr.views.admin' state='pending' %}"><b>IPR Admin</b></a></li>
</ul>
</td>
</tr>
</table>
@ -43,9 +51,11 @@
<tr valign="top">
<td>
<h3>Section 1</h3>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li><br>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Material Manager</b></a></li><br>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcements</b></a></li><br>
<ul>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Material Manager</b></a></li>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcements</b></a></li>
</ul>
</td>
<td>
<h3>Section 2</h3>

View file

@ -14,9 +14,6 @@
{% endblock %}
{% block content %}
<noscript class="errornote"> You have javascript disabled. Javascript is required for this application.</noscript>
<div class="module">
<h2>Proceedings - Add</h2>
<form id="proceedings-add-form" enctype="multipart/form-data" action="" method="post">{% csrf_token %}
@ -28,4 +25,3 @@
</div> <!-- module -->
{% endblock %}

View file

@ -28,10 +28,10 @@
<br>
<form action="" method="post">{% csrf_token %}
<p>
<table>
{{ form }}
</table>
<input type="submit" value="Select" />
</p>
</form>
</div> <!-- inline-related -->
</div> <!-- module -->

View file

@ -4,7 +4,7 @@
<div class="module interim-container">
<h2>Meeting - {{ meeting }}</h2>
<p><h3>Session: {{ slot.name }}</h3></p>
<h3>Session: {{ slot.name }}</h3>
<form id="misc-session-edit-form" enctype="multipart/form-data" action="." method="post">{% csrf_token %}
<table class="full-width amstable">
{{ form.as_table }}

View file

@ -55,7 +55,7 @@
<div>
<form id="timeslot-form" action="" method="post">{% csrf_token %}
<table id="timeslot-form" class="full-width amstable">
<table class="full-width amstable">
<col width="150">
{{ form.as_table }}
<tr><td colspan="2" align="center"><input type="submit" name="submit" value="Add" /></td></tr>
@ -69,7 +69,6 @@
</ul>
</div> <!-- button-group -->
</form>
</div> <!-- module -->

View file

@ -40,7 +40,6 @@
{{ form }}
</table>
</div> <!-- inline-related -->
</div> <!-- inline-group -->
<div class="button-group">
<ul>
@ -58,24 +57,3 @@
{% block footer-extras %}
{% include "includes/meetings_footer.html" %}
{% endblock %}

View file

@ -16,6 +16,7 @@
<table id="id_rooms_table" class="full-width">
<thead>
<tr>
<th></th>
{% for field in formset.forms.0.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
@ -27,9 +28,11 @@
<tr><td colspan="3">{{ form.non_field_errors }}</td></tr>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
<td>
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
</td>
{% for field in form.visible_fields %}
<td>
{{ field.errors }}
@ -38,16 +41,15 @@
{% endfor %}
</tr>
{% endfor %}
{% if options_form %}{{ options_form }}{% endif %}
</tbody>
</table>
</form>
</div>
</div>
{% if options_form %}{{ options_form }}{% endif %}
{% include "includes/buttons_save.html" %}
</form>
</div>
{% endblock %}

View file

@ -52,7 +52,6 @@
</ul>
</div>
</form>
</div>
{% endblock %}

View file

@ -40,13 +40,12 @@
{% block content %}
<div class="module interim-container">
<form id="roles-form" action="" method="post">{% csrf_token %}
<h2>Role Tool</h2>
<div class="inline-related">
<h3><b>Select Group</b></h3>
<p>Select a Group to change roles.</p>
<form id="roles-form".>
{{ group_form.as_p }}
</form>
</div> <!-- inline-related -->
<br>
@ -61,20 +60,19 @@
<h2></h2>
<h3>Add Role</h3>
{% with role_form as form %}
<form id="roles-form" action="" method="post">{% csrf_token %}
{{ role_form.non_field_errors }}
<table class="full-width">
<tr>
{{ form.group_acronym.errors }}{{ form.group_acronym }}
<td>{{ form.group_acronym.errors }}{{ form.group_acronym }}</td>
<td>{{ form.name.errors }}{{ form.name }}</td>
<td>{{ form.person.errors }}{{ form.person }}{% if form.person.help_text %}<br>{{ form.person.help_text }}{% endif %}</td>
<td>{{ form.email.errors }}{{ form.email }}{% if form.email.help_text %}<br>{{ form.email.help_text }}{% endif %}</td>
<td><input type="submit" name="submit" value="Add" /></td>
</tr>
</table>
</form>
{% endwith %}
</div> <!-- inline-related -->
</form>
<div class="button-group">
<ul>

View file

@ -29,6 +29,7 @@
<table id="rolodex-email-table" class="full-width">
<thead>
<tr>
<th></th>
{% for field in email_formset.forms.0 %}
{% if not field.is_hidden %}
<th>{{ field.label }}</th>
@ -40,10 +41,12 @@
{% for form in email_formset.forms %}
{% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
<td>
{# Include the hidden fields in the form #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
</td>
{% for field in form.visible_fields %}
<td>
{{ field.errors }}
@ -59,8 +62,8 @@
{% include "includes/buttons_save_cancel.html" %}
</div> <!-- module -->
</form>
</div> <!-- module -->
{% endblock %}

View file

@ -17,9 +17,9 @@
<tr><td>Name:</td><td>{{ person.name }}</td></tr>
<tr><td>Ascii Name:</td><td>{{ person.ascii }}</td></tr>
<tr><td>Short Name:</td><td>{{ person.ascii_short }}</td></tr>
<tr><td>Aliases:</td><td>{% for alias in person.alias_set.all %}{% if not forloop.first %}, {% endif %}{{ alias.name }}{% endfor %}
<tr><td>Aliases:</td><td>{% for alias in person.alias_set.all %}{% if not forloop.first %}, {% endif %}{{ alias.name }}{% endfor %}</td>
<tr><td>User:</td><td>{{ person.user }}</td></tr>
<tr></tr>
<tr><td></td><td></td></tr>
{% for email in person.emails %}
<tr><td>Email {{ forloop.counter }}:</td><td>{{ email }}</td></tr>
{% endfor %}

View file

@ -19,14 +19,6 @@
{% endblock %}
{% block content %}
<noscript>
<div style="position: fixed; top: 0px; left: 0px; z-index: 3000;
height: 100%; width: 100%; background-color: #FFFFFF">
<p style="margin-left: 10px">This page requires JavaScript.</p>
</div>
</noscript>
<div class="module interim-container">
<h2>IETF {{ meeting.number }}: Edit Session Request</h2>
<div class="inline-related">
@ -35,7 +27,7 @@
{% include "includes/sessions_request_form.html" %}
</div> <!-- module -->
</div>
{% endblock %}
{% block footer-extras %}

View file

@ -19,14 +19,6 @@
{% endblock %}
{% block content %}
<noscript>
<div style="position: fixed; top: 0px; left: 0px; z-index: 3000;
height: 100%; width: 100%; background-color: #FFFFFF">
<p style="margin-left: 10px">This page requires JavaScript.</p>
</div>
</noscript>
<div class="module interim-container">
<h2>IETF {{ meeting.number }}: New {% if is_virtual %}Virtual {% endif %}Session Request</h2>
<div class="inline-related">
@ -35,7 +27,7 @@
<li><button onclick="if (window.confirm('A message will be sent to agenda@ietf.com as well as to the area director(s).\n\nContinue?')) { window.location='{% url "ietf.secr.sreq.views.no_session" acronym=group.acronym %}'};">Send a notification that the group does not plan to hold a session at IETF {{ meeting.number }}</button></li>
<li><button onclick="window.location='{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
</ul>
</div>
{% include "includes/sessions_request_form.html" %}
</div> <!-- module -->

View file

@ -32,9 +32,8 @@
{% else %}
<div>None</div>
{% endif %}
</li>
{% endif %}
</li>
{% endif %}
{% endfor %}
</ul>

View file

@ -46,7 +46,7 @@
{% endwith %}
</tr>
{% endfor %}
</tr>
</table>
<div class="telechat-button">
<ul><li><button type="submit" name="submit" value="update_ballot">Update Ballot</button></li></ul>

View file

@ -1,7 +1,7 @@
{% extends "telechat/base_telechat.html" %}
{% block subsection %}
<div id="telechat-main">
<div id="telechat-main-DUPLICATE">
<h3>Select a Telechat</h3>
<form action="" method="post">{% csrf_token %}
{{ form.date.label_tag }} {{ form.date }}&nbsp;&nbsp;<button type="submit" name="submit" value="Select">Select</button>

View file

@ -16,6 +16,8 @@ table .sort:hover {
table .sort:after {
white-space: nowrap;
font-family: 'bootstrap-icons';
font-size: larger;
color: $secondary;
content: '\f283'; // chevron-expand
float: right;
padding-right: .25em;

View file

@ -95,13 +95,13 @@ $(document)
}
attachTo.append(menu.join(""));
}
}
});
if (!("ontouchstart" in document.documentElement)) {
$("ul.nav li.dropdown, ul.nav li.dropend")
.on("mouseenter mouseleave", dropdown_hover);
}
}
});
});
// Automatically add a navigation pane to long pages

View file

@ -99,13 +99,13 @@
<ul>
<li>
If a document has an rfc-editor state, you can select for it by asking for, e.g.,
<a href="https://datatracker.ietf.org/api/v1/doc/document/?limit=0&name__contains=-v6ops-&states__type__slug__in=draft-rfceditor">
<a href="https://datatracker.ietf.org/api/v1/doc/document/?limit=0&amp;name__contains=-v6ops-&amp;states__type__slug__in=draft-rfceditor">
v6ops documents which match <code>states__type__slug__in=draft-rfceditor</code>
</a>
</li>
<li>
If a document has an IESG state, you can select for it by asking for, e.g.,
<a href="https://datatracker.ietf.org/api/v1/doc/document/?name__contains=-v6ops&states__type__slug__in=draft-iesg">
<a href="https://datatracker.ietf.org/api/v1/doc/document/?name__contains=-v6ops&amp;states__type__slug__in=draft-iesg">
v6ops documents which match <code>states__type__slug__in=draft-iesg</code>
</a>
</li>
@ -127,22 +127,22 @@
You could either fetch and remember the different state groups of interest to you
with queries like
<pre>
$ curl 'https://datatracker.ietf.org/api/v1/doc/state/?format=json&limit=0&type__slug__in=draft-rfceditor'
$ curl 'https://datatracker.ietf.org/api/v1/doc/state/?format=json&limit=0&type__slug__in=draft-iesg'
$ curl 'https://datatracker.ietf.org/api/v1/doc/state/?format=json&limit=0&type__slug__in=draft-stream-ietf'
$ curl 'https://datatracker.ietf.org/api/v1/doc/state/?format=json&amp;limit=0&amp;type__slug__in=draft-rfceditor'
$ curl 'https://datatracker.ietf.org/api/v1/doc/state/?format=json&amp;limit=0&amp;type__slug__in=draft-iesg'
$ curl 'https://datatracker.ietf.org/api/v1/doc/state/?format=json&amp;limit=0&amp;type__slug__in=draft-stream-ietf'
</pre>
and then match the listed "resource_uri" of the results to the states listed for each
document when you ask for
<pre>
$ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&name__contains=-v6ops-'
$ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&amp;name__contains=-v6ops-'
</pre>
</li>
<li>
Or alternatively you could do a series of queries asking for matches to the RFC Editor
state first, then the IESG state, then the Stream state, and exclude earlier hits:
<pre>
$ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&name__contains=-v6ops-&states__type__slug__in=draft-rfceditor' ...
$ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&name__contains=-v6ops-&states__type__slug__in=draft-iesg' ...
$ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&amp;name__contains=-v6ops-&amp;states__type__slug__in=draft-rfceditor' ...
$ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&amp;name__contains=-v6ops-&amp;states__type__slug__in=draft-iesg' ...
</pre>
etc.
</li>

View file

@ -79,7 +79,7 @@
<div class="pt-3 container-fluid">
<div class="row">
{% if request.COOKIES.left_menu == "on" and not hide_menu %}
<div class="col-1 d-none d-md-block border-end lh-sm leftmenu small">
<div class="col-1 d-none d-md-block bg-light py-3 lh-sm leftmenu small">
<ul class="nav nav-pills flex-column">
{% include "base/menu.html" with flavor="left" %}
</ul>

View file

@ -19,6 +19,7 @@
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
{% else %}
<span class="fw-bolder">Groups</span>
</li>
{% endif %}
{% if flavor == 'top' %}<li class="dropdown-header">By area/parent</li>{% endif %}
{% wg_menu flavor %}
@ -63,9 +64,11 @@
Non-WG lists
</a>
</li>
{% if flavor == "top" %}</ul>{% endif %}
</li>
<li class="nav-item dropdown">
{% if flavor == "top" %}
</ul>
</li>
{% endif %}
<li class="nav-item dropdown">
{% if flavor == "top" %}
<a href="#"
class="nav-link dropdown-toggle"
@ -77,6 +80,7 @@
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
{% else %}
<span class="fw-bolder">Documents</span>
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
@ -205,9 +209,11 @@
ISE
</a>
</li>
{% if flavor == 'top' %}</ul>{% endif %}
</li>
<li class="nav-item dropdown">
{% if flavor == 'top' %}
</ul>
</li>
{% endif %}
<li class="nav-item dropdown">
{% if flavor == "top" %}
<a href="#"
class="nav-link dropdown-toggle"
@ -221,6 +227,7 @@
<span class="fw-bolder">
Meetings
</span>
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
@ -300,9 +307,11 @@
Meeting proceedings
</a>
</li>
{% if flavor == 'top' %}</ul>{% endif %}
</li>
<li class="nav-item dropdown">
{% if flavor == 'top' %}
</ul>
</li>
{% endif %}
<li class="nav-item dropdown">
{% if flavor == "top" %}
<a href="#"
class="nav-link dropdown-toggle"
@ -316,6 +325,7 @@
<span class="fw-bolder">
Other
</span>
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
@ -405,8 +415,10 @@
Report a bug
</a>
</li>
{% if flavor == 'top' %}</ul>{% endif %}
</li>
{% if flavor == 'top' %}
</ul>
</li>
{% endif %}
{% if flavor == 'top' %}
{% include "base/menu_user.html" %}
{% endif %}
{% endif %}

View file

@ -2,7 +2,7 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% origin %}
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
<ul class="dropdown-menu ms-n1">
{% for p in parents %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap{% endif %}"

View file

@ -16,95 +16,64 @@
User
{% endif %}
</a>
<ul class="dropdown-menu
{% if flavor == 'top' %}
mt-n1
{% else %}
ms-n1
{% endif %}">
<ul class="dropdown-menu {% if flavor == 'top' %} mt-n1 {% else %} ms-n1 {% endif %}">
{% else %}
<span class="fw-bolder">User</span>
</li>
{% endif %}
{% if request.get_full_path == "/accounts/logout/" %}
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/login
{% if "/accounts/logout/" not in request.get_full_path %}
/?next={{ request.get_full_path|urlencode }}
{% endif %}">
href="/accounts/login {% if "/accounts/logout/" not in request.get_full_path %} /?next={{ request.get_full_path|urlencode }}{% endif %}">
Sign in
</a>
</li>
{% else %}
{% if user.is_authenticated %}
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/logout/">
Sign out
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/profile/">
Account info
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="/person/{{ user.person.name|urlencode }}">
Public profile page
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.cookies.views.preferences" %}"
rel="nofollow">
Preferences
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.apikey_index" %}"
rel="nofollow">
API keys
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/password/">
Change password
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/username/">
Change username
@ -112,30 +81,21 @@
</li>
{% else %}
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/login/?next={{ request.get_full_path|urlencode }}">
Sign in
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/reset/">
Password reset
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.cookies.views.preferences" %}"
rel="nofollow">
Preferences
@ -143,10 +103,7 @@
</li>
{% endif %}
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url 'personal-information' %}">
Handling of personal information
</a>
@ -154,10 +111,7 @@
{% endif %}
{% if not request.user.is_authenticated %}
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.create_account" %}">
New account
</a>
@ -165,10 +119,7 @@
{% endif %}
{% if user|has_role:"Reviewer" %}
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.review_overview" %}">
My reviews
</a>
@ -178,46 +129,31 @@
{% if flavor == "top" %}<li class="dropdown-divider"></li>{% endif %}
<li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>AD dashboard</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url 'ietf.doc.views_search.docs_for_ad' name=user.person.full_name_as_key %}">
My docs
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.iesg.views.agenda_documents" %}">
Next telechat
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.iesg.views.discusses" %}">
Discusses
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.iesg.views.milestones_needing_review" %}">
Milestone review
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.doc.views_search.drafts_in_last_call" %}">
Last Call docs
</a>
@ -229,46 +165,31 @@
IETF secretariat
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="/admin/iesg/telechatdate/">
Telechat dates
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="/admin/iesg/telechatagendaitem/">
Management items
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.iesg.views.milestones_needing_review" %}">
Milestones
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.sync.views.discrepancies" %}">
Sync discrepancies
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.add_account_whitelist" %}">
Account whitelist
</a>
@ -283,10 +204,7 @@
IANA
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.sync.views.discrepancies" %}">
Sync discrepancies
</a>
@ -301,14 +219,10 @@
RFC Editor
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.sync.views.discrepancies" %}">
Sync discrepancies
</a>
</li>
{% endif %}
{% if flavor == "top" %}</ul>{% endif %}
</li>

View file

@ -76,7 +76,7 @@
{% for l in origin.4 %}
<table>
<tr>
<td class="{% if forloop.counter0 == origin.5 %} current{% endif %}">&nbsp;{{l }}</td>
<td class="{% if forloop.counter0 == origin.5 %} current{% endif %}">{{ l }}</td>
</tr>
</table>
{% endfor %}

View file

@ -18,7 +18,7 @@
{% bootstrap_form session_form %}
{% bootstrap_form version_form %}
{% bootstrap_button button_type="submit" name="save" content="Save" %}
<a class="btn btn-primary"
href="{% url 'ietf.doc.views_doc.all_presentations' name=doc.name %}">Cancel</a>
<a class="btn btn-secondary float-end"
href="{% url 'ietf.doc.views_doc.all_presentations' name=doc.name %}">Back</a>
</form>
{% endblock %}

View file

@ -27,9 +27,9 @@
{% if field.name == "discuss" %}<div id="div_id_discuss">{% endif %}
{% bootstrap_field field %}
{% if field.name == "discuss" and old_pos and old_pos.discuss_time %}
<div class="form-text">Last edited {{ old_pos.discuss_time }}</div>
<div class="form-text mt-n3 mb-3">Last edited {{ old_pos.discuss_time }}</div>
{% elif field.name == "comment" and old_pos and old_pos.comment_time %}
<div class="form-text">Last edited {{ old_pos.comment_time }}</div>
<div class="form-text mt-n3 mb-3">Last edited {{ old_pos.comment_time }}</div>
{% endif %}
{% if field.name == "discuss" %}</div>{% endif %}
{% endfor %}
@ -73,7 +73,7 @@
}
}
$("input[name=position]").click(function () {
$("input[name=position]").on("click", function () {
discussToggle($(this).val());
});

View file

@ -22,7 +22,7 @@
{% csrf_token %}
{# curly percent bootstrap_form approval_text_form curly percent #}
Due date for this ballot:
<input type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" placeholder={{ fillerdate }} name="duedate">
<input type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" placeholder="{{ fillerdate }}" name="duedate">
<button type="submit" class="btn btn-primary" name="irsg_button" value="Yes">Yes</button>
<button type="submit" class="btn btn-primary" name="irsg_button" value="No">No</button>
</form>

View file

@ -4,9 +4,9 @@
{% load origin %}
{% origin %}
{% load ietf_filters %}
<html lang=en>
<html lang="en">
<head>
<meta charset=utf-8>
<meta charset="utf-8">
<title>Ballot for {{ doc.name }}</title>
</head>
<body>

View file

@ -43,7 +43,7 @@
{% for req in req_group.list %}
<tr>
<td>
<a href={% url 'ietf.doc.views_doc.document_main' name=req.name %}>{{ req.name }}-{{ req.rev }}</a>
<a href="{% url 'ietf.doc.views_doc.document_main' name=req.name %}">{{ req.name }}-{{ req.rev }}</a>
</td>
<td>{{ req.latest_revision_event.time|date:"Y-m-d" }}</td>
<td>{{ req.title }}</td>

View file

@ -18,7 +18,7 @@
{% csrf_token %}
{% bootstrap_form form layout="horizontal" %}
<button type="submit" class="btn btn-primary">Submit</button>
<a class="btn btn-secondary float-end" href="{{ doc.get_absolute_url }}">Cancel</a>
<a class="btn btn-secondary float-end" href="{% url "ietf.doc.views_bofreq.bof_requests" %}">Back</a>
</form>
{% endblock %}
{% block js %}

View file

@ -16,7 +16,7 @@
{% csrf_token %}
{% bootstrap_form form layout="horizontal" %}
<button type="submit" class="btn btn-primary">Submit</button>
<a class="btn btn-secondary float-end" href="{{ doc.get_absolute_url }}">Cancel</a>
<a class="btn btn-secondary float-end" href="{{ doc.get_absolute_url }}">Back</a>
</form>
{% endblock %}
{% block js %}

View file

@ -18,7 +18,7 @@
{% csrf_token %}
{% bootstrap_form announcement_text_form %}
<button type="submit" class="btn btn-primary" name="save_text" value="Save">Submit</button>
<button type="submit" class="btn btn-warning" name="regenerate_text" value="Regenerate"">Regenerate
<button type="submit" class="btn btn-warning" name="regenerate_text" value="Regenerate">Regenerate
</button>
{% if user|has_role:"Secretariat" %}
<a type="submit"

View file

@ -16,21 +16,18 @@
{% csrf_token %}
{% bootstrap_form announcement_text_form %}
<button type="submit" class="btn btn-primary" name="save_text" value="Save">Submit</button>
<button type="submit" class="btn btn-warning" name="regenerate_text" value="Regenerate"">Regenerate
<button type="submit" class="btn btn-warning" name="regenerate_text" value="Regenerate">Regenerate
</button>
{% if user|has_role:"Secretariat" %}
<input type="submit"
type="submit"
class="btn btn-primary"
name="send_annc_only"
value="Send only to IETF-Announce"/>
<input type="submit"
type="submit"
class="btn btn-primary"
name="send_nw_only"
value="Send only to New-Work"/>
<input type="submit"
type="submit"
class="btn btn-primary"
name="send_both"
value="Send to both"/>

View file

@ -139,7 +139,7 @@
{{ doc.name }}-{{ doc.rev }}
</div>
<div class="card-body">
<pre> {{ content|sanitize|maybewordwrap|safe }}</pre>
{{ content|sanitize|maybewordwrap|safe }}
</div>
</div>
{% endif %}

View file

@ -30,7 +30,7 @@
{% endif %}
{% endfor %}
<a class="btn btn-secondary float-end"
href="{% url "ietf.doc.views_downref.downref_registry" %}">Cancel</a>
href="{% url "ietf.doc.views_downref.downref_registry" %}">Back</a>
</p>
</form>
{% endblock %}

View file

@ -1,4 +1,4 @@
[# bs5ok #}
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}

View file

@ -10,7 +10,7 @@
<form name="review-suggested-replaces" role="form" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<a class="btn btn-secondary float-end" href="{{ doc.get_absolute_url }}">Cancel</a>
<a class="btn btn-secondary float-end" href="{{ doc.get_absolute_url }}">Back</a>
<button type="submit" value="Save" class="btn btn-primary">Save</button>
</form>
{% endblock %}

View file

@ -56,7 +56,7 @@
<br>
Action holder{{ doc.documentactionholder_set.all|pluralize }}:
{% for action_holder in doc.documentactionholder_set.all %}
{% person_link action_holder.person title=action_holder.role_for_doc %}&nbsp;{{ action_holder|action_holder_badge }}
{% person_link action_holder.person title=action_holder.role_for_doc %} {{ action_holder|action_holder_badge }}
{% if not forloop.last %},{% endif %}
{% endfor %}
{% endif %}

View file

@ -143,7 +143,6 @@
{% block content_end %}{% endblock %}
</div>
{% block footer %}{% endblock %}
</div>
{% block js %}{% endblock %}
</body>
</html>

View file

@ -2,6 +2,9 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block title %}Document Search{% endblock %}
{% block content %}
{% origin %}

View file

@ -7,7 +7,7 @@
{% load ballot_icon %}
{% load person_filters %}
{% load django_bootstrap5 %}
<tr {% spaceless %}
<tr{% spaceless %}
{% if color_ad_position %} {% with doc|ballotposition:user as pos %} {% if pos %}class="position-{{ pos.slug }}-row"{% endif %}
{% endwith %}
{% endif %}
@ -112,7 +112,7 @@
{% if doc.rev != "00" %}
<a href="{{ rfcdiff_base_url }}?url2={{ doc.name }}-{{ doc.rev }}">
{% elif doc.replaces %}
<a href="{{ rfcdiff_base_url }}?url1={{ doc.replaces_canonical_name }}&url2={{ doc.name }}-{{ doc.rev }}">
<a href="{{ rfcdiff_base_url }}?url1={{ doc.replaces_canonical_name }}&amp;url2={{ doc.name }}-{{ doc.rev }}">
{% endif %}
{% endif %}
{% if doc.get_state_slug == "rfc" %}

View file

@ -3,9 +3,6 @@
{% load origin %}
{% origin %}
{% load ietf_filters static %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% if not docs %}
{% if not skip_no_matches_warning %}<div class="alert alert-info my-3">No documents match your query.</div>{% endif %}
{% endif %}
@ -63,6 +60,3 @@
</tbody>
{% endfor %}
{% if end_table %}</table>{% endif %}
{% block js %}
<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %}

View file

@ -23,7 +23,7 @@
class="btn btn-primary"
name="submit_response"
value="Submit">Submit</button>
<a class="btn btn-secondary float-end" href="{{ back_url }}">Back</a>
<a class="btn btn-secondary float-end" href="{% url 'ietf.doc.views_status_change.rfc_status_changes' %}">Back</a>
</form>
{% endblock %}
{% block js %}

View file

@ -81,7 +81,6 @@
indicates the document might not be ready for submission. Please check each instance carefully to see if changes need to be made to the document's state before submitting.
</p>
{% endif %}
<p>
Upon submission:
<ul>
<li>the document will be placed into the IESG '{{ target_state.iesg }}' state</li>
@ -91,7 +90,6 @@
<li>an entry will be made noting the publication request in the document's history</li>
<li>an email message will be sent to the working group chairs, the secretariat, and everyone listed above</li>
</ul>
</p>
<form method="post">
{% csrf_token %}
<input type="submit"

View file

@ -20,7 +20,7 @@
{% for grouptype in grouped_groups %}
<thead>
<tr>
<th colspan=2 class="table-info">
<th colspan="2" class="table-info">
Active {% firstof grouptype.grouper.verbose_name grouptype.grouper.name 'Top-level Administration' %}
</th>
</tr>

View file

@ -36,6 +36,7 @@
</p>
<p>
The IESG decides which areas working groups belong to. The charter of each area is listed below:
</p>
<ul>
{% for area in areas %}
<li>
@ -43,7 +44,6 @@
</li>
{% endfor %}
</ul>
</p>
{% for area in areas %}
<h2 class="mt-3" id="id-{{ area.acronym|slugify }}">
{{ area.name }}

View file

@ -12,12 +12,12 @@
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort"team">Team</th>
<th data-sort"name">Name</th>
<th data-sort"area">Area</th>
<th data-sort"ad">AD</th>
<th data-sort"secretaries">Secretaries</th>
<th data-sort"chairs">Chairs</th>
<th data-sort="team">Team</th>
<th data-sort="name">Name</th>
<th data-sort="area">Area</th>
<th data-sort="ad">AD</th>
<th data-sort="secretaries">Secretaries</th>
<th data-sort="chairs">Chairs</th>
</tr>
</thead>
<tbody>

View file

@ -94,7 +94,7 @@
</form>
</div>
<h2 class="mt-5">History of settings</h2>
<div id="history">
<div id="history-settings">
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
@ -115,15 +115,15 @@
</table>
</div>
<h2 class="mt-5">History of unavailable periods</h2>
<div id="history">
<div id="history-unavail">
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
<th dta-sort="date">Date</th>
<th dta-sort="by">
<th data-sort="date">Date</th>
<th data-sort="by">
By
</th>
<th dta-sort="description">
<th data-sort="description">
Description
</th>
</tr>

View file

@ -13,7 +13,7 @@
Note that the information on historical groups may be inaccurate.
</p>
{% for label, groups in sections.items %}
<h2 class="mt-5" id="{{ label }}">{{ label }}</h2>
<h2 class="mt-5" id="{{ label|slugify }}">{{ label }}</h2>
{% if label == "WGs" %}
{% elif label == "RGs" %}
<p class="alert alert-info my-3">
@ -24,8 +24,8 @@
</p>
{% endif %}
{% if not groups %}
<p>
<b>No groups found.</b>
<p class="alert alert-info my-3">
No groups found.
</p>
{% else %}
{% regroup groups by parent as grouped_by_areas %}

View file

@ -76,8 +76,8 @@
<label>Select the next states:</label>
{% for checked, default, s in state.next_states_checkboxes %}
<div class="form-check {% if not s.used %}inactive{% endif %}">
<input class="form-check-input" type="checkbox" name="next_states" value="{{ s.pk }}" id="value="{{ s.pk }}"" {% if checked %} checked{% endif %}>
<label class="form-check-label" for="{{ s.pk }}">
<input class="form-check-input" type="checkbox" name="next_states" value="{{ s.pk }}" {% if checked %} checked{% endif %}>
<label class="form-check-label">
{{ s.name }}
{% if default %}<span class="badge bg-secondary">Default</span>{% endif %}
</label>

View file

@ -28,9 +28,8 @@
<div class="col-md-6 rightpanel">
<div class="h2 text-center bg-info">Markdown rendering</div>
<div class="border-bottom text-center">
<label for="exampleFormControlInput1" class="form-label">Constrain width</label>
<input type="checkbox" class="form-check-input" name="widthconstraint">
Constrain width
</input>
</div>
<div class="rightcontent">{{ rendered|sanitize|safe }}</div>
</div>

View file

@ -12,9 +12,11 @@
<h1>Other RFC streams</h1>
<table class="my-3 table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort="stream">Stream</th>
<th data-sort="owner">Owner</th>
<th data-sort="manager">Stream manager</th>
</tr>
</thead>
<tbody>
{% for stream in streams %}

View file

@ -101,7 +101,7 @@
-{{ alatest.reviewed_rev }}
</a>
{% if alatest.reviewed_rev != r.doc.rev %}
(<a href="{{ rfcdiff_base_url }}?url1={{ rlatest.doc.name }}-{{ alatest.reviewed_rev }}&url2={{ r.doc.name }}-{{ r.doc.rev }}">diff</a>)
(<a href="{{ rfcdiff_base_url }}?url1={{ rlatest.doc.name }}-{{ alatest.reviewed_rev }}&amp;url2={{ r.doc.name }}-{{ r.doc.rev }}">diff</a>)
{% endif %}
:
<a href="{{ alatest.review.get_absolute_url }}">

View file

@ -17,7 +17,7 @@
</a>
</div>
{% endif %}
<h2 class="mt-5" id="closed-review-requests">Unassigned and open review requests and assignments</h2>
<h2 class="mt-5" id="unassigned-and-open-review-requests">Unassigned and open review requests and assignments</h2>
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
@ -33,7 +33,7 @@
{% if unassigned_review_requests %}
<thead>
<tr class="table-info" id="unassigned-review-requests">
<th colspan=7>Unassigned review requests</th>
<th colspan="7">Unassigned review requests</th>
</tr>
</thead>
<tbody>
@ -84,7 +84,7 @@
{% if open_review_assignments %}
<thead>
<tr class="table-info" id="open_review_assignments">
<th colspan=7>Open review requests</th>
<th colspan="7">Open review requests</th>
</tr>
</thead>
<tbody>
@ -166,7 +166,7 @@
{% if closed_review_requests %}
<thead>
<tr class="table-info">
<th colspan=8>
<th colspan="8">
Closed review requests
</th>
</tr>
@ -206,7 +206,7 @@
{% if closed_review_assignments %}
<thead>
<tr class="table-info">
<th colspan=8>
<th colspan="8">
Closed review assignments
</th>
</tr>
@ -244,8 +244,8 @@
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</table>
{% endblock %}
{% block js %}
<script src="{% static "ietf/js/list.js" %}">

View file

@ -62,7 +62,6 @@
{% person_link person %}
{% if person.settings_url %}
<a href="{{ person.settings_url }}" class="btn btn-primary btn-small float-end"
}
title="{{ person.settings.expertise }}">Edit
</a>
{% endif %}
@ -92,7 +91,7 @@
</td>
<td>
{% if assignment_to_closure_days != None %}
{{ assignment_to_closure_days }}&nbsp;day{{ assignment_to_closure_days|pluralize }}
{{ assignment_to_closure_days }} day{{ assignment_to_closure_days|pluralize }}
{% endif %}
</td>
<td>

View file

@ -32,7 +32,7 @@
<a class="interim-meeting-link"
href="{% url 'ietf.meeting.views.interim_request_details' number=meeting.number %}">
{{ meeting.number }}
{% if meeting.interim_meeting_cancelled %}&nbsp;&nbsp;<span class="badge bg-warning">CANCELLED</span>{% endif %}
{% if meeting.interim_meeting_cancelled %}<span class="ms-1 badge bg-warning">CANCELLED</span>{% endif %}
</a>
</td>
<td>

View file

@ -139,6 +139,7 @@
<h2>Completion status and completion time</h2>
<table class="review-stats table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort="{{ level }}">
{% if level == "team" %}
Team
@ -167,11 +168,11 @@
Avg. compl. days
{% if count == "pages" %}/page{% endif %}
</th>
</tr>
</thead>
{% for row in data %}
{% if forloop.first %}
<tbody>
{% elif forloop.last %}
{% if forloop.last %}
</tbody>
<tfoot>
{% endif %}
@ -193,7 +194,7 @@
</td>
</tr>
{% endfor %}
</foot>
</tfoot>
</table>
{% elif stats_type == "results" %}
<h2>
@ -201,6 +202,7 @@
</h2>
<table class="review-stats table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort="{{ level }}">
{% if level == "team" %}
Team
@ -213,11 +215,11 @@
{{ r.name }}
</th>
{% endfor %}
</tr>
</thead>
{% for row in data %}
{% if forloop.first %}
<tbody>
{% elif forloop.last %}
{% if forloop.last %}
</tbody>
<tfoot>
{% endif %}
@ -240,6 +242,7 @@
</h2>
<table class="review-stats table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort="{{ level }}">
{% if level == "team" %}
Team
@ -252,11 +255,11 @@
{{ s.name }}
</th>
{% endfor %}
</tr>
</thead>
{% for row in data %}
{% if forloop.first %}
<tbody>
{% elif forloop.last %}
{% if forloop.last %}
</tbody>
<tfoot>
{% endif %}

View file

@ -57,7 +57,7 @@
<th>Group</th>
<td>
{{ submission.group|default:"Individual Submission" }}
{% if submission.group %}<a href="{{ doc.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if submission.group %}<a href="{{ submission.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if errors.group %}
<p class="mt-1 mb-0 text-danger">
<b>{{ errors.group }}</b> (Note: the Secretariat will be notified of this)
@ -93,9 +93,7 @@
type="submit"
value="Submit for manual posting">
</form>
<p>
{% include "submit/problem-reports-footer.html" %}
</p>
{% endblock %}
{% block js %}
{{ all_forms|merge_media:'js' }}<script src="{% static "ietf/js/draft-submit.js" %}"></script>

View file

@ -15,7 +15,7 @@
<br>
<small class="text-muted">{{ submission.name }}</small>
</h1>
<form method="post" class="show-required" class="my-3">
<form method="post" class="show-required my-3">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Send email</button>

View file

@ -204,7 +204,7 @@
<th>Group</th>
<td>
{{ submission.group|default:"Individual Submission" }}
{% if submission.group %}<a href="{{ doc.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if submission.group %}<a href="{{ submission.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if errors.group %}
<p class="mt-1 mb-0 text-danger">
{{ errors.group }}

View file

@ -49,7 +49,6 @@
aria-controls="other-formats">
<input class="form-check-input"
id="checkbox"
type="checkbox"
type="checkbox"/>
Submit other formats
</label>

View file

@ -47,8 +47,10 @@ from bs4 import BeautifulSoup
from contextlib import contextmanager
from pathlib import Path
from tempfile import NamedTemporaryFile
from tidylib import tidy_document
import django.test
from django.test.client import Client
from django.conf import settings
from django.utils.text import slugify
@ -151,6 +153,44 @@ class ReverseLazyTest(django.test.TestCase):
response = self.client.get('/ipr/update/')
self.assertRedirects(response, "/ipr/", status_code=301)
class VerifyingClient(Client):
def __init__(self, test):
super(VerifyingClient, self).__init__()
self.test = test
def get(self, path, *args, **extra):
r = super(VerifyingClient, self).get(path, *args, **extra)
# print(path, r.status_code, r["content-type"].lower())
if r.status_code < 300 and r["content-type"].lower().startswith(
"text/html"
):
document, errors = tidy_document(
r.content, options={"drop-empty-elements": False}
)
errors = "\n".join(
[
e
for e in errors.splitlines()
# FIXME-LARS: django-bootstrap5 incorrectly sets a "required"
# proprietray attribute on some DIVs; remove those errors
if not re.match(r'.*proprietary attribute "required"', e)
# FIXME-LARS: some secretariat templates have this issue, ignore
and not re.match(r".*id and name attribute value mismatch", e)
]
)
if errors:
n = 1
print("\n")
for line in r.content.decode().splitlines():
print(f"{n: 6}: {line}")
n += 1
print(path)
self.test.maxDiff = None
self.test.assertEqual("", errors)
return r
class TestCase(django.test.TestCase):
"""IETF TestCase class
@ -261,6 +301,7 @@ class TestCase(django.test.TestCase):
def setUp(self):
# Replace settings paths with temporary directories.
super().setUp()
self.client = VerifyingClient(self) # Set up the HTML verifier
self._ietf_temp_dirs = {} # trashed during tearDown, DO NOT put paths you care about in this
for setting in self.settings_temp_path_overrides:
self._ietf_temp_dirs[setting] = self.tempdir(slugify(setting))

130
package-lock.json generated
View file

@ -1871,9 +1871,9 @@
"peer": true
},
"node_modules/@types/node": {
"version": "17.0.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz",
"integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==",
"version": "17.0.14",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.14.tgz",
"integrity": "sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng==",
"dev": true
},
"node_modules/@types/parse-json": {
@ -2200,9 +2200,9 @@
}
},
"node_modules/bootstrap-icons": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.7.2.tgz",
"integrity": "sha512-NiR2PqC73AQOPdVSu6GJfnk+hN2z6powcistXk1JgPnKuoV2FSdSl26w931Oz9HYbKCcKUSB6ncZTYJAYJl3QQ==",
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.8.0.tgz",
"integrity": "sha512-plaZQb8tReUULAwQ9M98PyWh5H912eKGVC6etMtc6VqmPmp9Eq0s7Wd0qvPoPLHh0VhXxzdLk1ta5W7lwPIdCQ==",
"engines": {
"node": ">=10"
}
@ -2431,9 +2431,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001303",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz",
"integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==",
"version": "1.0.30001304",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz",
"integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==",
"dev": true,
"funding": {
"type": "opencollective",
@ -3159,9 +3159,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.4.54",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.54.tgz",
"integrity": "sha512-jRAoneRdSxnpRHO0ANpnEUtQHXxlgfVjrLOnQSisw1ryjXJXvS0pJaR/v2B7S++/tRjgEDp4Sjn5nmgb6uTySw==",
"version": "1.4.59",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz",
"integrity": "sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg==",
"dev": true
},
"node_modules/elliptic": {
@ -3321,9 +3321,9 @@
}
},
"node_modules/eslint": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz",
"integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==",
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz",
"integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==",
"dev": true,
"dependencies": {
"@eslint/eslintrc": "^1.0.5",
@ -4016,9 +4016,9 @@
}
},
"node_modules/highcharts": {
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.2.tgz",
"integrity": "sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg=="
"version": "9.3.3",
"resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.3.tgz",
"integrity": "sha512-QeOvm6cifeZYYdTLm4IxZsXcOE9c4xqfs0z0OJJ0z7hhA9WG0rmcVAyuIp5HBl/znjA/ayYHmpYjBYD/9PG4Fg=="
},
"node_modules/highlight.js": {
"version": "10.4.1",
@ -5552,14 +5552,14 @@
}
},
"node_modules/postcss": {
"version": "8.4.5",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
"version": "8.4.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
"integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
"dev": true,
"dependencies": {
"nanoid": "^3.1.30",
"nanoid": "^3.2.0",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.1"
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
@ -5570,9 +5570,9 @@
}
},
"node_modules/postcss-calc": {
"version": "8.2.2",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz",
"integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==",
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz",
"integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==",
"dev": true,
"dependencies": {
"postcss-selector-parser": "^6.0.2",
@ -6108,9 +6108,9 @@
}
},
"node_modules/preact": {
"version": "10.6.4",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.6.4.tgz",
"integrity": "sha512-WyosM7pxGcndU8hY0OQlLd54tOU+qmG45QXj2dAYrL11HoyU/EzOSTlpJsirbBr1QW7lICxSsVJJmcmUglovHQ==",
"version": "10.6.5",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.6.5.tgz",
"integrity": "sha512-i+LXM6JiVjQXSt2jG2vZZFapGpCuk1fl8o6ii3G84MA3xgj686FKjs4JFDkmUVhtxyq21+4ay74zqPykz9hU6w==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
@ -6415,9 +6415,9 @@
"dev": true
},
"node_modules/sass": {
"version": "1.49.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz",
"integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==",
"version": "1.49.4",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.4.tgz",
"integrity": "sha512-xUU5ZlppOjgfEyIIcHpnmY+f+3/ieaadp25S/OqZ5+jBPeTAMJJblkhM6UD9jb4j/lzglz7VOL5kglYt+CvNdQ==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
@ -6428,7 +6428,7 @@
"sass": "sass.js"
},
"engines": {
"node": ">=8.9.0"
"node": ">=12.0.0"
}
},
"node_modules/select2": {
@ -8524,9 +8524,9 @@
"peer": true
},
"@types/node": {
"version": "17.0.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.12.tgz",
"integrity": "sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA==",
"version": "17.0.14",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.14.tgz",
"integrity": "sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng==",
"dev": true
},
"@types/parse-json": {
@ -8779,9 +8779,9 @@
}
},
"bootstrap-icons": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.7.2.tgz",
"integrity": "sha512-NiR2PqC73AQOPdVSu6GJfnk+hN2z6powcistXk1JgPnKuoV2FSdSl26w931Oz9HYbKCcKUSB6ncZTYJAYJl3QQ=="
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.8.0.tgz",
"integrity": "sha512-plaZQb8tReUULAwQ9M98PyWh5H912eKGVC6etMtc6VqmPmp9Eq0s7Wd0qvPoPLHh0VhXxzdLk1ta5W7lwPIdCQ=="
},
"brace-expansion": {
"version": "1.1.11",
@ -8970,9 +8970,9 @@
}
},
"caniuse-lite": {
"version": "1.0.30001303",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz",
"integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==",
"version": "1.0.30001304",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz",
"integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==",
"dev": true
},
"chalk": {
@ -9539,9 +9539,9 @@
}
},
"electron-to-chromium": {
"version": "1.4.54",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.54.tgz",
"integrity": "sha512-jRAoneRdSxnpRHO0ANpnEUtQHXxlgfVjrLOnQSisw1ryjXJXvS0pJaR/v2B7S++/tRjgEDp4Sjn5nmgb6uTySw==",
"version": "1.4.59",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz",
"integrity": "sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg==",
"dev": true
},
"elliptic": {
@ -9669,9 +9669,9 @@
"dev": true
},
"eslint": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz",
"integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==",
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz",
"integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.0.5",
@ -10205,9 +10205,9 @@
}
},
"highcharts": {
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.2.tgz",
"integrity": "sha512-I/48gNMvs3hZxZnPRUqLbnlrGZJJ7YPPVr1+fYeZ35p4pSZAOwTmAGbptrjBr7JlF52HmJH9zMbt/I4TPLu9Pg=="
"version": "9.3.3",
"resolved": "https://registry.npmjs.org/highcharts/-/highcharts-9.3.3.tgz",
"integrity": "sha512-QeOvm6cifeZYYdTLm4IxZsXcOE9c4xqfs0z0OJJ0z7hhA9WG0rmcVAyuIp5HBl/znjA/ayYHmpYjBYD/9PG4Fg=="
},
"highlight.js": {
"version": "10.4.1",
@ -11321,20 +11321,20 @@
"dev": true
},
"postcss": {
"version": "8.4.5",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
"version": "8.4.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
"integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
"dev": true,
"requires": {
"nanoid": "^3.1.30",
"nanoid": "^3.2.0",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.1"
"source-map-js": "^1.0.2"
}
},
"postcss-calc": {
"version": "8.2.2",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz",
"integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==",
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz",
"integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==",
"dev": true,
"requires": {
"postcss-selector-parser": "^6.0.2",
@ -11678,9 +11678,9 @@
}
},
"preact": {
"version": "10.6.4",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.6.4.tgz",
"integrity": "sha512-WyosM7pxGcndU8hY0OQlLd54tOU+qmG45QXj2dAYrL11HoyU/EzOSTlpJsirbBr1QW7lICxSsVJJmcmUglovHQ=="
"version": "10.6.5",
"resolved": "https://registry.npmjs.org/preact/-/preact-10.6.5.tgz",
"integrity": "sha512-i+LXM6JiVjQXSt2jG2vZZFapGpCuk1fl8o6ii3G84MA3xgj686FKjs4JFDkmUVhtxyq21+4ay74zqPykz9hU6w=="
},
"prelude-ls": {
"version": "1.2.1",
@ -11899,9 +11899,9 @@
"dev": true
},
"sass": {
"version": "1.49.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz",
"integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==",
"version": "1.49.4",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.4.tgz",
"integrity": "sha512-xUU5ZlppOjgfEyIIcHpnmY+f+3/ieaadp25S/OqZ5+jBPeTAMJJblkhM6UD9jb4j/lzglz7VOL5kglYt+CvNdQ==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0",

View file

@ -74,3 +74,4 @@ xml2rfc>=2.35.0
xym>=0.4.4,!=0.4.7,<1.0
#zxcvbn-python>=4.4.14 # Not needed until we do back-end password entropy validation
djhtml>=1.4.11 # To auto-indent templates via "djlint --profile django --reformat"
pytidylib>=0.3.2 # Used during tests to check validity of generated HTML