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 \ less \
libmagic-dev \ libmagic-dev \
libmariadb-dev \ libmariadb-dev \
libtidy-dev \
locales \ locales \
mariadb-client \ mariadb-client \
netcat \ netcat \

View file

@ -363,7 +363,7 @@ def add_links_in_new_revision_events(doc, events, diff_revisions):
links += "" links += ""
if prev != None: 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 # replace the bold filename part
e.desc = re.sub(r"<b>(.+-[0-9][0-9].txt)</b>", links, e.desc) 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="{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>]') 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": 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.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>]') 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>]')
@ -1321,4 +1321,4 @@ def fuzzy_find_documents(name, rev=None):
rev = None # found a doc by name with rev = None, so update that rev = None # found a doc by name with rev = None, so update that
FoundDocuments = namedtuple('FoundDocuments', 'documents matched_name matched_rev') FoundDocuments = namedtuple('FoundDocuments', 'documents matched_name matched_rev')
return FoundDocuments(docs, name, rev) return FoundDocuments(docs, name, rev)

View file

@ -14,7 +14,7 @@ from django.template.defaultfilters import striptags
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.utils.html import escape
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -527,7 +527,7 @@ def lastcalltext(request, name):
if not existing: if not existing:
existing = generate_last_call_announcement(request, doc) 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 request.method == 'POST':
if "save_last_call_text" in request.POST or "send_last_call_request" in request.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: if not existing:
existing = generate_ballot_writeup(request, doc) 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: if request.method == 'POST' and "save_ballot_writeup" in request.POST or "issue_ballot" in request.POST:
form = BallotWriteupForm(request.POST) form = BallotWriteupForm(request.POST)
@ -727,7 +727,7 @@ def ballot_rfceditornote(request, name):
if not existing or (existing.text == ""): if not existing or (existing.text == ""):
existing = generate_ballot_rfceditornote(request, doc) 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: if request.method == 'POST' and "save_ballot_rfceditornote" in request.POST:
form = BallotRfcEditorNoteForm(request.POST) form = BallotRfcEditorNoteForm(request.POST)
@ -791,7 +791,7 @@ def ballot_approvaltext(request, name):
if not existing: if not existing:
existing = generate_approval_mail(request, doc) 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 request.method == 'POST':
if "save_approval_text" in request.POST: if "save_approval_text" in request.POST:
@ -1206,4 +1206,4 @@ def irsg_ballot_status(request):
docs.append(doc) docs.append(doc)
return render(request, 'doc/irsg_ballot_status.html', {'docs':docs}) return render(request, 'doc/irsg_ballot_status.html', {'docs':docs})

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.shortcuts import get_object_or_404, redirect, render
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse as urlreverse 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, from ietf.doc.mails import (email_bofreq_title_changed, email_bofreq_editors_changed,
email_bofreq_new_revision, email_bofreq_responsible_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) return redirect('ietf.doc.views_doc.document_main', name=bofreq.name)
else: 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', 'bofreq_submission':'enter',
} }
form = NewBofreqForm(initial=init) form = NewBofreqForm(initial=init)

View file

@ -17,6 +17,7 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.html import escape
import debug # pyflakes:ignore 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.text = derive_new_work_text(existing.text,group)
existing_new_work.time = datetime.datetime.now() 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': if request.method == 'POST':
form = ReviewAnnouncementTextForm(request.POST) form = ReviewAnnouncementTextForm(request.POST)
@ -588,7 +589,7 @@ def action_announcement_text(request, name):
if not existing: if not existing:
raise Http404 raise Http404
form = ActionAnnouncementTextForm(initial=dict(announcement_text=existing.text)) form = ActionAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text)))
if request.method == 'POST': if request.method == 'POST':
form = ActionAnnouncementTextForm(request.POST) form = ActionAnnouncementTextForm(request.POST)
@ -650,7 +651,7 @@ def ballot_writeupnotes(request, name):
reissue = charter.latest_event(DocEvent, type="sent_ballot_announcement") 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): if request.method == 'POST' and ("save_ballot_writeup" in request.POST or "send_ballot" in request.POST):
form = BallotWriteupForm(request.POST) form = BallotWriteupForm(request.POST)
@ -802,7 +803,7 @@ def approve(request, name):
return render(request, 'doc/charter/approve.html', return render(request, 'doc/charter/approve.html',
dict(charter=charter, dict(charter=charter,
announcement=announcement)) announcement=escape(announcement)))
def charter_with_milestones_txt(request, name, rev): def charter_with_milestones_txt(request, name, rev):
charter = get_object_or_404(Document, type="charter", docalias__name=name) charter = get_object_or_404(Document, type="charter", docalias__name=name)
@ -833,4 +834,4 @@ def charter_with_milestones_txt(request, name, rev):
return render(request, 'doc/charter/charter_with_milestones.txt', return render(request, 'doc/charter/charter_with_milestones.txt',
dict(charter_text=charter_text, dict(charter_text=charter_text,
milestones=milestones), milestones=milestones),
content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET) content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET)

View file

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

View file

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

View file

@ -244,7 +244,7 @@ class SecrMeetingTestCase(TestCase):
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
q = PyQuery(response.content) 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 # test delete
# first unschedule sessions so we can delete # first unschedule sessions so we can delete
@ -441,4 +441,4 @@ class SecrMeetingTestCase(TestCase):
times = get_times(meeting,day) times = get_times(meeting,day)
values = [ x[0] for x in times ] values = [ x[0] for x in times ]
self.assertTrue(times) self.assertTrue(times)
self.assertTrue(timeslot.time.strftime('%H%M') in values) self.assertTrue(timeslot.time.strftime('%H%M') in values)

View file

@ -52,17 +52,11 @@
<!-- END Breadcrumbs --> <!-- END Breadcrumbs -->
{% endif %} {% 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 --> <!-- Django Messages -->
{% if messages %} {% if messages %}
<ul class="messages"> <ul class="messages">
{% for message in 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 %} {% endfor %}
</ul> </ul>
{% endif %} {% endif %}
@ -83,6 +77,5 @@
{% block footer %}<div id="footer"></div>{% endblock %} {% block footer %}<div id="footer"></div>{% endblock %}
</div> </div>
<!-- END Container --> <!-- END Container -->
</body> </body>
</html> </html>

View file

@ -53,12 +53,6 @@
<!-- END Breadcrumbs --> <!-- END Breadcrumbs -->
{% endif %} {% 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 --> <!-- Django Messages -->
{% if messages %} {% if messages %}
<ul class="messages"> <ul class="messages">

View file

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

View file

@ -57,8 +57,8 @@
{% endif %} {% endif %}
<td width="320">{{ cname|title }}</td> <td width="320">{{ cname|title }}</td>
<td><input type="text" value="{{ value }}" maxlength="255" class="wg_constraint" disabled><br>{{ field }} {{ field.label }}</td> <td><input type="text" value="{{ value }}" maxlength="255" class="wg_constraint" disabled><br>{{ field }} {{ field.label }}</td>
{% endfor %}
</tr> </tr>
{% endfor %}
{% endif %} {% endif %}
<tr> <tr>
<td colspan="2">BOF Sessions:</td> <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><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>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>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"> <tr valign="top">
<td> <td>
<h3>IESG</h3> <h3>IESG</h3>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcement</b></a></li><br> <ul>
<li> <a href="{% url 'ietf.secr.telechat.views.main' %}"><b>Telechat</b></a></li><br> <li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcement</b></a></li>
<li> <a href="{% url 'ietf.secr.console.views.main' %}"><b>Console</b></a></li><br> <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>
<td> <td>
<h3>IDs and WGs Process</h3> <h3>IDs and WGs Process</h3>
<li> <a href="{% url "ietf.secr.areas.views.list_areas" %}"><b>Areas</b></a></li><br> <ul>
<li> <a href="{% url 'ietf.secr.groups.views.search' %}"><b>Groups</b></a></li><br> <li> <a href="{% url "ietf.secr.areas.views.list_areas" %}"><b>Areas</b></a></li>
<li> <a href="{% url 'ietf.secr.rolodex.views.search' %}"><b>Rolodex</b></a></li><br> <li> <a href="{% url 'ietf.secr.groups.views.search' %}"><b>Groups</b></a></li>
<li> <a href="{% url 'ietf.secr.roles.views.main' %}"><b>Roles</b></a></li><br> <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> </td>
</tr> </tr>
<tr valign="top"> <tr valign="top">
<td> <td>
<h3>Meetings and Proceedings</h3> <h3>Meetings and Proceedings</h3>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li><br> <ul>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Materials Manager (Proceedings)</b></a></li><br> <li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
<li> <a href="{% url "ietf.secr.meetings.views.main" %}"><b>Meeting Manager</b></a></li><br> <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.blue_sheet_redirect" %}"><b>Blue Sheets</b></a></li><br> <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>
<td> <td>
<h3>IPR</h3> <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> </td>
</tr> </tr>
</table> </table>
@ -43,9 +51,11 @@
<tr valign="top"> <tr valign="top">
<td> <td>
<h3>Section 1</h3> <h3>Section 1</h3>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li><br> <ul>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Material Manager</b></a></li><br> <li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcements</b></a></li><br> <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>
<td> <td>
<h3>Section 2</h3> <h3>Section 2</h3>
@ -64,4 +74,4 @@
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -17,9 +17,9 @@
<tr><td>Name:</td><td>{{ person.name }}</td></tr> <tr><td>Name:</td><td>{{ person.name }}</td></tr>
<tr><td>Ascii Name:</td><td>{{ person.ascii }}</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>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><td>User:</td><td>{{ person.user }}</td></tr>
<tr></tr> <tr><td></td><td></td></tr>
{% for email in person.emails %} {% for email in person.emails %}
<tr><td>Email {{ forloop.counter }}:</td><td>{{ email }}</td></tr> <tr><td>Email {{ forloop.counter }}:</td><td>{{ email }}</td></tr>
{% endfor %} {% endfor %}
@ -66,4 +66,4 @@
</div> <!-- view-buttons --> </div> <!-- view-buttons -->
</div> <!-- view-container --> </div> <!-- view-container -->
{% endblock %} {% endblock %}

View file

@ -19,14 +19,6 @@
{% endblock %} {% endblock %}
{% block content %} {% 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"> <div class="module interim-container">
<h2>IETF {{ meeting.number }}: Edit Session Request</h2> <h2>IETF {{ meeting.number }}: Edit Session Request</h2>
<div class="inline-related"> <div class="inline-related">
@ -35,9 +27,9 @@
{% include "includes/sessions_request_form.html" %} {% include "includes/sessions_request_form.html" %}
</div> <!-- module --> </div> <!-- module -->
</div>
{% endblock %} {% endblock %}
{% block footer-extras %} {% block footer-extras %}
{% include "includes/sessions_footer.html" %} {% include "includes/sessions_footer.html" %}
{% endblock %} {% endblock %}

View file

@ -19,14 +19,6 @@
{% endblock %} {% endblock %}
{% block content %} {% 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"> <div class="module interim-container">
<h2>IETF {{ meeting.number }}: New {% if is_virtual %}Virtual {% endif %}Session Request</h2> <h2>IETF {{ meeting.number }}: New {% if is_virtual %}Virtual {% endif %}Session Request</h2>
<div class="inline-related"> <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="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> <li><button onclick="window.location='{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
</ul> </ul>
</div>
{% include "includes/sessions_request_form.html" %} {% include "includes/sessions_request_form.html" %}
</div> <!-- module --> </div> <!-- module -->
@ -44,4 +36,4 @@
{% block footer-extras %} {% block footer-extras %}
{% include "includes/sessions_footer.html" %} {% include "includes/sessions_footer.html" %}
{% endblock %} {% endblock %}

View file

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

View file

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

View file

@ -1,7 +1,7 @@
{% extends "telechat/base_telechat.html" %} {% extends "telechat/base_telechat.html" %}
{% block subsection %} {% block subsection %}
<div id="telechat-main"> <div id="telechat-main-DUPLICATE">
<h3>Select a Telechat</h3> <h3>Select a Telechat</h3>
<form action="" method="post">{% csrf_token %} <form action="" method="post">{% csrf_token %}
{{ form.date.label_tag }} {{ form.date }}&nbsp;&nbsp;<button type="submit" name="submit" value="Select">Select</button> {{ form.date.label_tag }} {{ form.date }}&nbsp;&nbsp;<button type="submit" name="submit" value="Select">Select</button>
@ -9,4 +9,4 @@
<br> <br>
<a href="/admin/iesg/telechatdate/" target="_blank">Add a new Telechat Date</a> <a href="/admin/iesg/telechatdate/" target="_blank">Add a new Telechat Date</a>
</div> </div>
{% endblock %} {% endblock %}

View file

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

View file

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

View file

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

View file

@ -79,7 +79,7 @@
<div class="pt-3 container-fluid"> <div class="pt-3 container-fluid">
<div class="row"> <div class="row">
{% if request.COOKIES.left_menu == "on" and not hide_menu %} {% 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"> <ul class="nav nav-pills flex-column">
{% include "base/menu.html" with flavor="left" %} {% include "base/menu.html" with flavor="left" %}
</ul> </ul>

View file

@ -19,394 +19,406 @@
<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 %} {% else %}
<span class="fw-bolder">Groups</span> <span class="fw-bolder">Groups</span>
{% endif %}
{% if flavor == 'top' %}<li class="dropdown-header">By area/parent</li>{% endif %}
{% wg_menu flavor %}
<li class="dropend">
<a class="dropdown-item dropdown-toggle {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.active_groups" %}">
Other
</a>
{% active_groups_menu flavor %}
</li> </li>
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %} {% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>New work</li> {% if flavor == 'top' %}<li class="dropdown-header">By area/parent</li>{% endif %}
<li> {% wg_menu flavor %}
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}" <li class="dropend">
href="{% url "ietf.group.views.chartering_groups" %}"> <a class="dropdown-item dropdown-toggle {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
Chartering groups href="{% url "ietf.group.views.active_groups" %}">
</a> Other
</li> </a>
<li> {% active_groups_menu flavor %}
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.bofs" group_type="wg" %}">
BOFs
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.doc.views_bofreq.bof_requests" %}">
BOF Requests
</a>
</li>
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>Other groups</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.concluded_groups" %}">
Concluded groups
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.mailinglists.views.nonwg' %}">
Non-WG lists
</a>
</li>
{% if flavor == "top" %}</ul>{% endif %}
</li> </li>
<li class="nav-item dropdown"> {% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
{% if flavor == "top" %} <li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>New work</li>
<a href="#" <li>
class="nav-link dropdown-toggle" <a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
role="button" href="{% url "ietf.group.views.chartering_groups" %}">
data-bs-toggle="dropdown" Chartering groups
aria-expanded="false"> </a>
Documents </li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.bofs" group_type="wg" %}">
BOFs
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.doc.views_bofreq.bof_requests" %}">
BOF Requests
</a>
</li>
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>Other groups</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.concluded_groups" %}">
Concluded groups
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.mailinglists.views.nonwg' %}">
Non-WG lists
</a>
</li>
{% if flavor == "top" %}
</ul>
</li>
{% endif %}
<li class="nav-item dropdown">
{% if flavor == "top" %}
<a href="#"
class="nav-link dropdown-toggle"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false">
Documents
</a>
<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 %}"
href="{% url "ietf.doc.views_search.search" %}">
Search
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.doc.views_search.recent_drafts" %}">
Recent drafts
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.submit.views.upload_submission" %}">
Draft submission
</a>
</li>
{% if user and user.is_authenticated %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.community.views.view_list" user.username %}">
My tracked docs
</a> </a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}"> </li>
{% else %} {% if user|has_role:"Area Director,Secretariat" %}
<span class="fw-bolder">Documents</span> {% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
{% endif %}
<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.search" %}"> href="{% url 'ietf.doc.views_status_change.rfc_status_changes' %}">
Search RFC status changes
</a> </a>
</li> </li>
{% endif %}
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.doc.views_ballot.irsg_ballot_status' %}">
IRSG ballot status
</a>
</li>
{% if user|has_role:"WG Chair,RG Chair" %}
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>Manage</li>
<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.recent_drafts" %}"> href="{% url "ietf.submit.views.approvals" %}">
Recent drafts Approve a draft
</a> </a>
</li> </li>
<li> {% for g in user|docman_groups %}
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.submit.views.upload_submission" %}">
Draft submission
</a>
</li>
{% if user and user.is_authenticated %}
<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.community.views.view_list" user.username %}"> href="{% url "ietf.group.views.group_documents" g.acronym %}">
My tracked docs {{ g.acronym }} {{ g.type.slug }} docs
</a> </a>
</li> </li>
{% if user|has_role:"Area Director,Secretariat" %} {% endfor %}
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %} {% for g in user|matman_groups %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.doc.views_status_change.rfc_status_changes' %}">
RFC status changes
</a>
</li>
{% endif %}
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %}
<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_ballot.irsg_ballot_status' %}"> href="{% url "ietf.group.views.meetings" g.acronym %}">
IRSG ballot status {{ g.acronym }} {{ g.type.slug }} meetings
</a> </a>
</li> </li>
{% if user|has_role:"WG Chair,RG Chair" %} {% endfor %}
{% if flavor == 'top' %}<li class="dropdown-divider"></li>{% endif %} {% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>Manage</li> {% if user|has_role:"Review Team Secretary" %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.submit.views.approvals" %}">
Approve a draft
</a>
</li>
{% for g in user|docman_groups %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.group_documents" g.acronym %}">
{{ g.acronym }} {{ g.type.slug }} docs
</a>
</li>
{% endfor %}
{% for g in user|matman_groups %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.meetings" g.acronym %}">
{{ g.acronym }} {{ g.type.slug }} meetings
</a>
</li>
{% endfor %}
{% endif %}
{% if user|has_role:"Review Team Secretary" %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
Review Teams
</li>
{% for g in user|managed_review_groups %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.review_requests" g.acronym %}">
{{ g.acronym }} reviews
</a>
</li>
{% endfor %}
{% endif %}
{% if user|active_nomcoms %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
NomComs
</li>
{% for g in user|active_nomcoms %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.nomcom.views.private_index" g.nomcom_set.first.year %}">
{{ g.acronym|capfirst }}
</a>
</li>
{% endfor %}
{% endif %}
{% endif %}
{% if flavor == 'top' %} {% if flavor == 'top' %}
<li class="dropdown-divider"> <li class="dropdown-divider">
</li> </li>
{% endif %} {% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}> <li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
RFC streams Review Teams
</li> </li>
<li> {% for g in user|managed_review_groups %}
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}" <li>
href="{% url "ietf.group.views.stream_documents" acronym="iab" %}"> <a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
IAB href="{% url "ietf.group.views.review_requests" g.acronym %}">
</a> {{ g.acronym }} reviews
</a>
</li>
{% endfor %}
{% endif %}
{% if user|active_nomcoms %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
NomComs
</li> </li>
<li> {% for g in user|active_nomcoms %}
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}" <li>
href="{% url "ietf.group.views.stream_documents" acronym="irtf" %}"> <a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
IRTF href="{% url "ietf.nomcom.views.private_index" g.nomcom_set.first.year %}">
</a> {{ g.acronym|capfirst }}
</li> </a>
<li> </li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}" {% endfor %}
href="{% url "ietf.group.views.stream_documents" acronym="ise" %}"> {% endif %}
ISE {% endif %}
</a> {% if flavor == 'top' %}
</li> <li class="dropdown-divider">
{% if flavor == 'top' %}</ul>{% endif %}
</li> </li>
<li class="nav-item dropdown"> {% endif %}
{% if flavor == "top" %} <li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
<a href="#" RFC streams
class="nav-link dropdown-toggle" </li>
role="button" <li>
data-bs-toggle="dropdown" <a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
aria-expanded="false"> href="{% url "ietf.group.views.stream_documents" acronym="iab" %}">
IAB
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.stream_documents" acronym="irtf" %}">
IRTF
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.group.views.stream_documents" acronym="ise" %}">
ISE
</a>
</li>
{% if flavor == 'top' %}
</ul>
</li>
{% endif %}
<li class="nav-item dropdown">
{% if flavor == "top" %}
<a href="#"
class="nav-link dropdown-toggle"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false">
Meetings
</a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
{% else %}
<span class="fw-bolder">
Meetings
</span>
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/agenda/">
Agenda
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/materials/">
Materials
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/floor-plan/">
Floor plan
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="https://www.ietf.org/how/meetings/register/">
Registration
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.meeting.views.important_dates' %}">
Important dates
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/secr/sreq/">
Request a session
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/requests">
Session requests
</a>
</li>
{% if flavor == 'top' %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
Upcoming meetings
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/upcoming">
Upcoming meetings
</a>
</li>
{% if flavor == 'top' %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
Past meetings
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/past">
Past meetings
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="https://www.ietf.org/how/meetings/past/">
Meeting proceedings
</a>
</li>
{% if flavor == 'top' %}
</ul>
</li>
{% endif %}
<li class="nav-item dropdown">
{% if flavor == "top" %}
<a href="#"
class="nav-link dropdown-toggle"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false">
Other
</a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
{% else %}
<span class="fw-bolder">
Other
</span>
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/ipr/">
IPR disclosures
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/liaison/">
Liaison statements
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/iesg/agenda/">
IESG agenda
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.nomcom.views.index' %}">
NomComs
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/doc/downref/">
Downref registry
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.stats.views.stats_index" %}">
Statistics
</a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.stats.views.document_stats' %}">
Drafts/RFCs
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.stats.views.meeting_stats' %}">
Meetings Meetings
</a> </a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
{% else %}
<span class="fw-bolder">
Meetings
</span>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/agenda/">
Agenda
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/materials/">
Materials
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/floor-plan/">
Floor plan
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="https://www.ietf.org/how/meetings/register/">
Registration
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.meeting.views.important_dates' %}">
Important dates
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/secr/sreq/">
Request a session
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/requests">
Session requests
</a>
</li>
{% if flavor == 'top' %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
Upcoming meetings
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/upcoming">
Upcoming meetings
</a>
</li>
{% if flavor == 'top' %}
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
Past meetings
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/meeting/past">
Past meetings
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="https://www.ietf.org/how/meetings/past/">
Meeting proceedings
</a>
</li>
{% if flavor == 'top' %}</ul>{% endif %}
</li> </li>
<li class="nav-item dropdown"> {% if user and user.is_authenticated %}
{% if flavor == "top" %} <li>
<a href="#" <a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
class="nav-link dropdown-toggle" href="{% url 'ietf.stats.views.review_stats' %}">
role="button" Reviews
data-bs-toggle="dropdown"
aria-expanded="false">
Other
</a> </a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
{% else %}
<span class="fw-bolder">
Other
</span>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/ipr/">
IPR disclosures
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/liaison/">
Liaison statements
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/iesg/agenda/">
IESG agenda
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.nomcom.views.index' %}">
NomComs
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/doc/downref/">
Downref registry
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url "ietf.stats.views.stats_index" %}">
Statistics
</a>
<ul class="dropdown-menu {% if flavor == 'top' %}mt-n1{% else %}ms-n1{% endif %}">
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.stats.views.document_stats' %}">
Drafts/RFCs
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.stats.views.meeting_stats' %}">
Meetings
</a>
</li>
{% if user and user.is_authenticated %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.stats.views.review_stats' %}">
Reviews
</a>
</li>
{% endif %}
</ul>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/group/edu/materials/">
Tutorials
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/api/">
API Help
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.release.views.release' %}">
Release notes
</a>
</li>
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="https://trac.ietf.org/trac/ietfdb/newticket">
<span class="bi bi-bug">
</span>
Report a bug
</a>
</li>
{% if flavor == 'top' %}</ul>{% endif %}
</li> </li>
{% if flavor == 'top' %} {% endif %}
{% include "base/menu_user.html" %} </ul>
{% endif %} </li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/group/edu/materials/">
Tutorials
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="/api/">
API Help
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="{% url 'ietf.release.views.release' %}">
Release notes
</a>
</li>
{% if flavor == 'top' %}
<li class="dropdown-divider">
</li>
{% endif %}
<li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap link-primary{% endif %}"
href="https://trac.ietf.org/trac/ietfdb/newticket">
<span class="bi bi-bug">
</span>
Report a bug
</a>
</li>
{% if flavor == 'top' %}
</ul>
</li>
{% endif %}
{% if flavor == 'top' %}
{% include "base/menu_user.html" %}
{% endif %}

View file

@ -2,7 +2,7 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% 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 %} {% for p in parents %}
<li> <li>
<a class="dropdown-item {% if flavor != 'top' %}text-wrap{% endif %}" <a class="dropdown-item {% if flavor != 'top' %}text-wrap{% endif %}"
@ -15,4 +15,4 @@
href="{{ o.menu_url }}">{{ o.acronym|upper }}</a> href="{{ o.menu_url }}">{{ o.acronym|upper }}</a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View file

@ -16,299 +16,213 @@
User User
{% endif %} {% endif %}
</a> </a>
<ul class="dropdown-menu <ul class="dropdown-menu {% if flavor == 'top' %} mt-n1 {% else %} ms-n1 {% endif %}">
{% if flavor == 'top' %}
mt-n1
{% else %}
ms-n1
{% endif %}">
{% else %} {% else %}
<span class="fw-bolder">User</span> <span class="fw-bolder">User</span>
{% endif %} </li>
{% if request.get_full_path == "/accounts/logout/" %} {% endif %}
{% if request.get_full_path == "/accounts/logout/" %}
<li>
<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 %}">
Sign in
</a>
</li>
{% else %}
{% if user.is_authenticated %}
<li> <li>
<a class="dropdown-item <a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
rel="nofollow" rel="nofollow"
href="/accounts/login href="/accounts/logout/">
{% if "/accounts/logout/" not in request.get_full_path %} Sign out
/?next={{ request.get_full_path|urlencode }} </a>
{% endif %}"> </li>
<li>
<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 %}"
href="/person/{{ user.person.name|urlencode }}">
Public profile page
</a>
</li>
<li>
<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 %}"
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 %}"
rel="nofollow"
href="/accounts/password/">
Change password
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
rel="nofollow"
href="/accounts/username/">
Change username
</a>
</li>
{% else %}
<li>
<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 Sign in
</a> </a>
</li> </li>
{% else %}
{% if user.is_authenticated %}
<li>
<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 %}"
rel="nofollow"
href="/accounts/profile/">
Account info
</a>
</li>
<li>
<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 %}"
href="{% url "ietf.cookies.views.preferences" %}"
rel="nofollow">
Preferences
</a>
</li>
<li>
<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 %}"
rel="nofollow"
href="/accounts/password/">
Change password
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
rel="nofollow"
href="/accounts/username/">
Change username
</a>
</li>
{% else %}
<li>
<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 %}"
rel="nofollow"
href="/accounts/reset/">
Password reset
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
href="{% url "ietf.cookies.views.preferences" %}"
rel="nofollow">
Preferences
</a>
</li>
{% endif %}
<li> <li>
<a class="dropdown-item <a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
{% if flavor != 'top' %} rel="nofollow"
text-wrap link-primary href="/accounts/reset/">
{% endif %}" Password reset
href="{% url 'personal-information' %}"> </a>
Handling of personal information </li>
<li>
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.cookies.views.preferences" %}"
rel="nofollow">
Preferences
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if not request.user.is_authenticated %} <li>
<li> <a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
<a class="dropdown-item href="{% url 'personal-information' %}">
{% if flavor != 'top' %} Handling of personal information
text-wrap link-primary </a>
{% endif %}" </li>
href="{% url "ietf.ietfauth.views.create_account" %}"> {% endif %}
New account {% if not request.user.is_authenticated %}
</a> <li>
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.create_account" %}">
New account
</a>
</li>
{% endif %}
{% if user|has_role:"Reviewer" %}
<li>
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.review_overview" %}">
My reviews
</a>
</li>
{% endif %}
{% if user|has_role:"Area Director" %}
{% 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 %}"
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 %}"
href="{% url "ietf.iesg.views.agenda_documents" %}">
Next telechat
</a>
</li>
<li>
<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 %}"
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 %}"
href="{% url "ietf.doc.views_search.drafts_in_last_call" %}">
Last Call docs
</a>
</li>
{% endif %}
{% if user|has_role:"Secretariat" %}
{% if flavor == "top" %}<li class="dropdown-divider"></li>{% endif %}
<li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
IETF secretariat
</li>
<li>
<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 %}"
href="/admin/iesg/telechatagendaitem/">
Management items
</a>
</li>
<li>
<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 %}"
href="{% url "ietf.sync.views.discrepancies" %}">
Sync discrepancies
</a>
</li>
<li>
<a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
href="{% url "ietf.ietfauth.views.add_account_whitelist" %}">
Account whitelist
</a>
</li>
{% endif %}
{% if user|has_role:"IANA" %}
{% if flavor == "top" %}
<li class="dropdown-divider">
</li> </li>
{% endif %} {% endif %}
{% if user|has_role:"Reviewer" %} <li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
<li> IANA
<a class="dropdown-item </li>
{% if flavor != 'top' %} <li>
text-wrap link-primary <a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
{% endif %}" href="{% url "ietf.sync.views.discrepancies" %}">
href="{% url "ietf.ietfauth.views.review_overview" %}"> Sync discrepancies
My reviews </a>
</a> </li>
{% endif %}
{% if user|has_role:"RFC Editor" %}
{% if flavor == "top" %}
<li class="dropdown-divider">
</li> </li>
{% endif %} {% endif %}
{% if user|has_role:"Area Director" %} <li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
{% if flavor == "top" %}<li class="dropdown-divider"></li>{% endif %} RFC Editor
<li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>AD dashboard</li> </li>
<li> <li>
<a class="dropdown-item <a class="dropdown-item {% if flavor != 'top' %} text-wrap link-primary{% endif %}"
{% if flavor != 'top' %} href="{% url "ietf.sync.views.discrepancies" %}">
text-wrap link-primary Sync discrepancies
{% endif %}" </a>
href="{% url 'ietf.doc.views_search.docs_for_ad' name=user.person.full_name_as_key %}"> </li>
My docs {% endif %}
</a> {% if flavor == "top" %}</ul>{% endif %}
</li>
<li>
<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 %}"
href="{% url "ietf.iesg.views.discusses" %}">
Discusses
</a>
</li>
<li>
<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 %}"
href="{% url "ietf.doc.views_search.drafts_in_last_call" %}">
Last Call docs
</a>
</li>
{% endif %}
{% if user|has_role:"Secretariat" %}
{% if flavor == "top" %}<li class="dropdown-divider"></li>{% endif %}
<li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
IETF secretariat
</li>
<li>
<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 %}"
href="/admin/iesg/telechatagendaitem/">
Management items
</a>
</li>
<li>
<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 %}"
href="{% url "ietf.sync.views.discrepancies" %}">
Sync discrepancies
</a>
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
href="{% url "ietf.ietfauth.views.add_account_whitelist" %}">
Account whitelist
</a>
</li>
{% endif %}
{% if user|has_role:"IANA" %}
{% if flavor == "top" %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
IANA
</li>
<li>
<a class="dropdown-item
{% if flavor != 'top' %}
text-wrap link-primary
{% endif %}"
href="{% url "ietf.sync.views.discrepancies" %}">
Sync discrepancies
</a>
</li>
{% endif %}
{% if user|has_role:"RFC Editor" %}
{% if flavor == "top" %}
<li class="dropdown-divider">
</li>
{% endif %}
<li {% if flavor == "top" %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
RFC Editor
</li>
<li>
<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

@ -9,4 +9,4 @@
{{ p.short_name }} {{ p.short_name }}
</a> </a>
</li> </li>
{% endfor %} {% endfor %}

View file

@ -76,7 +76,7 @@
{% for l in origin.4 %} {% for l in origin.4 %}
<table> <table>
<tr> <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> </tr>
</table> </table>
{% endfor %} {% endfor %}

View file

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

View file

@ -27,9 +27,9 @@
{% if field.name == "discuss" %}<div id="div_id_discuss">{% endif %} {% if field.name == "discuss" %}<div id="div_id_discuss">{% endif %}
{% bootstrap_field field %} {% bootstrap_field field %}
{% if field.name == "discuss" and old_pos and old_pos.discuss_time %} {% 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 %} {% 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 %} {% endif %}
{% if field.name == "discuss" %}</div>{% endif %} {% if field.name == "discuss" %}</div>{% endif %}
{% endfor %} {% endfor %}
@ -73,7 +73,7 @@
} }
} }
$("input[name=position]").click(function () { $("input[name=position]").on("click", function () {
discussToggle($(this).val()); discussToggle($(this).val());
}); });

View file

@ -22,7 +22,7 @@
{% csrf_token %} {% csrf_token %}
{# curly percent bootstrap_form approval_text_form curly percent #} {# curly percent bootstrap_form approval_text_form curly percent #}
Due date for this ballot: 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="Yes">Yes</button>
<button type="submit" class="btn btn-primary" name="irsg_button" value="No">No</button> <button type="submit" class="btn btn-primary" name="irsg_button" value="No">No</button>
</form> </form>

View file

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

View file

@ -43,7 +43,7 @@
{% for req in req_group.list %} {% for req in req_group.list %}
<tr> <tr>
<td> <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>
<td>{{ req.latest_revision_event.time|date:"Y-m-d" }}</td> <td>{{ req.latest_revision_event.time|date:"Y-m-d" }}</td>
<td>{{ req.title }}</td> <td>{{ req.title }}</td>

View file

@ -18,7 +18,7 @@
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form layout="horizontal" %} {% bootstrap_form form layout="horizontal" %}
<button type="submit" class="btn btn-primary">Submit</button> <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> </form>
{% endblock %} {% endblock %}
{% block js %} {% block js %}

View file

@ -16,7 +16,7 @@
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form layout="horizontal" %} {% bootstrap_form form layout="horizontal" %}
<button type="submit" class="btn btn-primary">Submit</button> <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> </form>
{% endblock %} {% endblock %}
{% block js %} {% block js %}

View file

@ -18,7 +18,7 @@
{% csrf_token %} {% csrf_token %}
{% bootstrap_form announcement_text_form %} {% 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-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> </button>
{% if user|has_role:"Secretariat" %} {% if user|has_role:"Secretariat" %}
<a type="submit" <a type="submit"

View file

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

View file

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

View file

@ -30,7 +30,7 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
<a class="btn btn-secondary float-end" <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> </p>
</form> </form>
{% endblock %} {% endblock %}

View file

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

View file

@ -10,7 +10,7 @@
<form name="review-suggested-replaces" role="form" method="post"> <form name="review-suggested-replaces" role="form" method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% 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> <button type="submit" value="Save" class="btn btn-primary">Save</button>
</form> </form>
{% endblock %} {% endblock %}

View file

@ -56,7 +56,7 @@
<br> <br>
Action holder{{ doc.documentactionholder_set.all|pluralize }}: Action holder{{ doc.documentactionholder_set.all|pluralize }}:
{% for action_holder in doc.documentactionholder_set.all %} {% 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 %} {% if not forloop.last %},{% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View file

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

View file

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

View file

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

View file

@ -3,9 +3,6 @@
{% load origin %} {% load origin %}
{% origin %} {% origin %}
{% load ietf_filters static %} {% load ietf_filters static %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% if not docs %} {% if not docs %}
{% if not skip_no_matches_warning %}<div class="alert alert-info my-3">No documents match your query.</div>{% endif %} {% if not skip_no_matches_warning %}<div class="alert alert-info my-3">No documents match your query.</div>{% endif %}
{% endif %} {% endif %}
@ -62,7 +59,4 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
{% endfor %} {% endfor %}
{% if end_table %}</table>{% endif %} {% 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" class="btn btn-primary"
name="submit_response" name="submit_response"
value="Submit">Submit</button> 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> </form>
{% endblock %} {% endblock %}
{% block js %} {% 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. 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> </p>
{% endif %} {% endif %}
<p>
Upon submission: Upon submission:
<ul> <ul>
<li>the document will be placed into the IESG '{{ target_state.iesg }}' state</li> <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 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> <li>an email message will be sent to the working group chairs, the secretariat, and everyone listed above</li>
</ul> </ul>
</p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<input type="submit" <input type="submit"

View file

@ -20,7 +20,7 @@
{% for grouptype in grouped_groups %} {% for grouptype in grouped_groups %}
<thead> <thead>
<tr> <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' %} Active {% firstof grouptype.grouper.verbose_name grouptype.grouper.name 'Top-level Administration' %}
</th> </th>
</tr> </tr>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -101,7 +101,7 @@
-{{ alatest.reviewed_rev }} -{{ alatest.reviewed_rev }}
</a> </a>
{% if alatest.reviewed_rev != r.doc.rev %} {% 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 %} {% endif %}
: :
<a href="{{ alatest.review.get_absolute_url }}"> <a href="{{ alatest.review.get_absolute_url }}">

View file

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

View file

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

View file

@ -32,7 +32,7 @@
<a class="interim-meeting-link" <a class="interim-meeting-link"
href="{% url 'ietf.meeting.views.interim_request_details' number=meeting.number %}"> href="{% url 'ietf.meeting.views.interim_request_details' number=meeting.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> </a>
</td> </td>
<td> <td>
@ -52,4 +52,4 @@
<script src="{% static 'ietf/js/select2.js' %}"></script> <script src="{% static 'ietf/js/select2.js' %}"></script>
<script src="{% static 'ietf/js/select2.js' %}"></script> <script src="{% static 'ietf/js/select2.js' %}"></script>
<script src="{% static 'ietf/js/meeting-interim-request.js' %}"></script> <script src="{% static 'ietf/js/meeting-interim-request.js' %}"></script>
{% endblock %} {% endblock %}

View file

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

View file

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

View file

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

View file

@ -204,7 +204,7 @@
<th>Group</th> <th>Group</th>
<td> <td>
{{ submission.group|default:"Individual Submission" }} {{ 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 %} {% if errors.group %}
<p class="mt-1 mb-0 text-danger"> <p class="mt-1 mb-0 text-danger">
{{ errors.group }} {{ errors.group }}

View file

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

View file

@ -47,8 +47,10 @@ from bs4 import BeautifulSoup
from contextlib import contextmanager from contextlib import contextmanager
from pathlib import Path from pathlib import Path
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from tidylib import tidy_document
import django.test import django.test
from django.test.client import Client
from django.conf import settings from django.conf import settings
from django.utils.text import slugify from django.utils.text import slugify
@ -151,6 +153,44 @@ class ReverseLazyTest(django.test.TestCase):
response = self.client.get('/ipr/update/') response = self.client.get('/ipr/update/')
self.assertRedirects(response, "/ipr/", status_code=301) 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): class TestCase(django.test.TestCase):
"""IETF TestCase class """IETF TestCase class
@ -261,6 +301,7 @@ class TestCase(django.test.TestCase):
def setUp(self): def setUp(self):
# Replace settings paths with temporary directories. # Replace settings paths with temporary directories.
super().setUp() 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 self._ietf_temp_dirs = {} # trashed during tearDown, DO NOT put paths you care about in this
for setting in self.settings_temp_path_overrides: for setting in self.settings_temp_path_overrides:
self._ietf_temp_dirs[setting] = self.tempdir(slugify(setting)) self._ietf_temp_dirs[setting] = self.tempdir(slugify(setting))
@ -271,4 +312,4 @@ class TestCase(django.test.TestCase):
self._ietf_saved_context.disable() self._ietf_saved_context.disable()
for dir in self._ietf_temp_dirs.values(): for dir in self._ietf_temp_dirs.values():
shutil.rmtree(dir) shutil.rmtree(dir)
super().tearDown() super().tearDown()

130
package-lock.json generated
View file

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

View file

@ -73,4 +73,5 @@ Unidecode>=0.4.18,<1.2.0
xml2rfc>=2.35.0 xml2rfc>=2.35.0
xym>=0.4.4,!=0.4.7,<1.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 #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" 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