More fixes.

- Legacy-Id: 19899
This commit is contained in:
Lars Eggert 2022-01-31 19:17:50 +00:00
parent 335a39d4fc
commit cc723ce449
58 changed files with 1761 additions and 1411 deletions

View file

@ -226,13 +226,13 @@ def urlize_ietf_docs(string, autoescape=None):
""" """
if autoescape and not isinstance(string, SafeData): if autoescape and not isinstance(string, SafeData):
string = escape(string) string = escape(string)
string = re.sub(r"(?<!>)(RFC\s*?)0{0,3}(\d+)", "<a href=\"/doc/rfc\\2/\">\\1\\2</a>", string) string = re.sub(r"(?<!>)(RFC\s*?)0{0,3}(\d+)", "<a href=\"/doc/rfc\\2/\">\\1\\2</a>", string, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(BCP\s*?)0{0,3}(\d+)", "<a href=\"/doc/bcp\\2/\">\\1\\2</a>", string) string = re.sub(r"(?<!>)(BCP\s*?)0{0,3}(\d+)", "<a href=\"/doc/bcp\\2/\">\\1\\2</a>", string, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(STD\s*?)0{0,3}(\d+)", "<a href=\"/doc/std\\2/\">\\1\\2</a>", string) string = re.sub(r"(?<!>)(STD\s*?)0{0,3}(\d+)", "<a href=\"/doc/std\\2/\">\\1\\2</a>", string, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(FYI\s*?)0{0,3}(\d+)", "<a href=\"/doc/fyi\\2/\">\\1\\2</a>", string) string = re.sub(r"(?<!>)(FYI\s*?)0{0,3}(\d+)", "<a href=\"/doc/fyi\\2/\">\\1\\2</a>", string, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(draft-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string) string = re.sub(r"(?<!>)(draft-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(conflict-review-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string) string = re.sub(r"(?<!>)(conflict-review-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(status-change-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string) string = re.sub(r"(?<!>)(status-change-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string, flags=re.IGNORECASE)
return mark_safe(string) return mark_safe(string)
urlize_ietf_docs = stringfilter(urlize_ietf_docs) urlize_ietf_docs = stringfilter(urlize_ietf_docs)

View file

@ -789,4 +789,4 @@ def apikey_disable(request):
messages.error(request, "Key validation failed; key not disabled") messages.error(request, "Key validation failed; key not disabled")
else: else:
form = KeyDeleteForm(request.GET) form = KeyDeleteForm(request.GET)
return render(request, 'form.html', {'form':form, 'title':"Disable a personal API key", 'description':'', 'button':'Disable key'}) return render(request, 'form.html', {'form':form, 'title':"Disable a personal API key", 'description':'', 'button':'Disable key'})

View file

@ -92,12 +92,12 @@ class PersonTests(TestCase):
#debug.show('person.photo_name()') #debug.show('person.photo_name()')
self.assertContains(r, person.photo_name(), status_code=200) self.assertContains(r, person.photo_name(), status_code=200)
q = PyQuery(r.content) q = PyQuery(r.content)
self.assertIn("Photo of %s"%person, q("div.bio-text img.bio-photo").attr("alt")) self.assertIn("Photo of %s"%person, q("div.bio-text img").attr("alt"))
bio_text = q("div.bio-text").text() bio_text = q("div.bio-text").text()
self.assertIsNotNone(bio_text) self.assertIsNotNone(bio_text)
photo_url = q("div.bio-text img.bio-photo").attr("src") photo_url = q("div.bio-text img").attr("src")
r = self.client.get(photo_url) r = self.client.get(photo_url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
@ -398,5 +398,4 @@ class PersonUtilsTests(TestCase):

View file

@ -38,7 +38,7 @@ $popover-max-width: 100%;
@import "~/node_modules/bootstrap/scss/pagination"; @import "~/node_modules/bootstrap/scss/pagination";
@import "~/node_modules/bootstrap/scss/badge"; @import "~/node_modules/bootstrap/scss/badge";
@import "~/node_modules/bootstrap/scss/alert"; @import "~/node_modules/bootstrap/scss/alert";
// @import "~/node_modules/bootstrap/scss/progress"; @import "~/node_modules/bootstrap/scss/progress";
@import "~/node_modules/bootstrap/scss/list-group"; @import "~/node_modules/bootstrap/scss/list-group";
@import "~/node_modules/bootstrap/scss/close"; @import "~/node_modules/bootstrap/scss/close";
// @import "~/node_modules/bootstrap/scss/toasts"; // @import "~/node_modules/bootstrap/scss/toasts";

View file

@ -5,7 +5,6 @@
// @import "~/node_modules/bootstrap/scss/utilities"; // @import "~/node_modules/bootstrap/scss/utilities";
table .sort { table .sort {
// white-space: nowrap;
cursor: pointer; cursor: pointer;
} }
@ -14,16 +13,18 @@ table .sort:hover {
color: var(--#{$variable-prefix}table-hover-color); color: var(--#{$variable-prefix}table-hover-color);
} }
table .sort:before { table .sort:after {
white-space: nowrap;
font-family: 'bootstrap-icons'; font-family: 'bootstrap-icons';
content: '\f127'; content: '\f283'; // chevron-expand
float: right;
padding-right: .25em; padding-right: .25em;
} }
table .sort.asc:before { table .sort.asc:after {
content: '\f128'; content: '\f282'; // chevron-down
} }
table .sort.desc:before { table .sort.desc:after {
content: '\f148'; content: '\f286'; // chevron-up
} }

View file

@ -0,0 +1,69 @@
$(document)
.ready(function () {
// fill in submitter info when an author button is clicked
$("form.idsubmit input[type=button].author")
.on("click", function () {
var name = $(this)
.data("name");
var email = $(this)
.data("email");
$(this)
.parents("form")
.find("input[name=submitter-name]")
.val(name || "");
$(this)
.parents("form")
.find("input[name=submitter-email]")
.val(email || "");
});
$("form.idsubmit")
.on("submit", function () {
if (this.submittedAlready)
return false;
else {
this.submittedAlready = true;
return true;
}
});
$("form.idsubmit #add-author")
.on("click", function () {
// clone the last author block and make it empty
var cloner = $("#cloner");
var next = cloner.clone();
next.find('input:not([type=hidden])')
.val('');
// find the author number
var t = next.children('h3')
.text();
var n = parseInt(t.replace(/\D/g, ''));
// change the number in attributes and text
next.find('*')
.each(function () {
var e = this;
$.each(['id', 'for', 'name', 'value'], function (i, v) {
if ($(e)
.attr(v)) {
$(e)
.attr(v, $(e)
.attr(v)
.replace(n - 1, n));
}
});
});
t = t.replace(n, n + 1);
next.children('h3')
.text(t);
// move the cloner id to next and insert next into the DOM
cloner.removeAttr('id');
next.attr('id', 'cloner');
next.insertAfter(cloner);
});
});

View file

@ -68,9 +68,10 @@ $(document)
$(header_row) $(header_row)
.children("[data-sort]") .children("[data-sort]")
.addClass("sort"); .addClass("sort");
$(header_row) // $(header_row)
.children("th, td") // .children("th, td")
.each((i, e) => field_magic(i, e, fields)); // .wrapInner("<span class='tablesorter-th'></span>");
// // .each((i, e) => field_magic(i, e, fields));
if ($(header_row) if ($(header_row)
.text() .text()

View file

@ -1,7 +1,7 @@
// Taken from django-password-strength, with changes to use the bower-managed zxcvbn.js The // Taken from django-password-strength, with changes to use the bower-managed zxcvbn.js The
// bower-managed zxcvbn.js is kept up-to-date to a larger extent than the copy packaged with // bower-managed zxcvbn.js is kept up-to-date to a larger extent than the copy packaged with
// the django-password-strength component. // the django-password-strength component.
(function($, window, document, undefined){ (function ($, window, document, undefined) {
window.djangoPasswordStrength = { window.djangoPasswordStrength = {
config: { config: {
passwordClass: 'password_strength', passwordClass: 'password_strength',
@ -15,64 +15,108 @@
$.extend(self.config, config); $.extend(self.config, config);
} }
// Fix the initial widget for bootstrap 5
var widget = $("." + self.config.passwordClass)
.closest("form");
widget
.find(".hidden")
.addClass("visually-hidden")
.removeClass("hidden");
widget
.find(".label")
.addClass("badge")
.removeClass("label");
widget
.find(".label-danger")
.addClass("bg-danger")
.removeClass("label-danger");
widget
.find(".text-muted")
.addClass("form-text")
.removeClass("text-muted");
self.initListeners(); self.initListeners();
}, },
initListeners: function() { initListeners: function () {
var self = this; var self = this;
var body = $('body');
$('.' + self.config.passwordClass).on('keyup', function() { $('.' + self.config.passwordClass)
var password_strength_bar = $(this).parent().find('.password_strength_bar'); .on('keyup', function () {
var password_strength_info = $(this).parent().find('.password_strength_info'); var password_strength_bar = $(this)
var password_strength_offline_info = $(this).parent().parent().parent().find('.password_strength_offline_info'); .parent()
.find('.password_strength_bar');
var password_strength_info = $(this)
.parent()
.find('.password_strength_info');
var password_strength_offline_info = $(this)
.parent()
.parent()
.parent()
.find('.password_strength_offline_info');
if( $(this).val() ) { if ($(this)
var result = zxcvbn( $(this).val() ); .val()) {
var result = zxcvbn($(this)
.val());
if( result.score < 3 ) { if (result.score < 3) {
password_strength_bar.removeClass('progress-bar-success').addClass('progress-bar-warning'); password_strength_bar.removeClass('bg-success')
password_strength_info.find('.label').removeClass('hidden'); .addClass('bg-warning');
password_strength_info.find('.badge')
.removeClass('visually-hidden');
} else {
password_strength_bar.removeClass('bg-warning')
.addClass('bg-success');
password_strength_info.find('.badge')
.addClass('visually-hidden');
}
password_strength_bar.width(((result.score + 1) / 5) * 100 + '%')
.attr('aria-valuenow', result.score + 1);
// henrik@levkowetz.com -- this is the only changed line:
password_strength_info.find('.password_strength_time')
.html(result.crack_times_display.online_no_throttling_10_per_second);
password_strength_info.removeClass('visually-hidden');
password_strength_offline_info.find('.password_strength_time')
.html(result.crack_times_display.offline_slow_hashing_1e4_per_second);
password_strength_offline_info.removeClass('visually-hidden');
} else { } else {
password_strength_bar.removeClass('progress-bar-warning').addClass('progress-bar-success'); password_strength_bar.removeClass('bg-success')
password_strength_info.find('.label').addClass('hidden'); .addClass('bg-warning');
password_strength_bar.width('0%')
.attr('aria-valuenow', 0);
password_strength_info.addClass('visually-hidden');
} }
self.match_passwords($(this));
password_strength_bar.width( ((result.score+1)/5)*100 + '%' ).attr('aria-valuenow', result.score + 1); });
// henrik@levkowetz.com -- this is the only changed line:
password_strength_info.find('.password_strength_time').html(result.crack_times_display.online_no_throttling_10_per_second);
password_strength_info.removeClass('hidden');
password_strength_offline_info.find('.password_strength_time').html(result.crack_times_display.offline_slow_hashing_1e4_per_second);
password_strength_offline_info.removeClass('hidden');
} else {
password_strength_bar.removeClass('progress-bar-success').addClass('progress-bar-warning');
password_strength_bar.width( '0%' ).attr('aria-valuenow', 0);
password_strength_info.addClass('hidden');
}
self.match_passwords($(this));
});
var timer = null; var timer = null;
$('.' + self.config.confirmationClass).on('keyup', function() { $('.' + self.config.confirmationClass)
var password_field; .on('keyup', function () {
var confirm_with = $(this).data('confirm-with'); var password_field;
var confirm_with = $(this)
.data('confirm-with');
if( confirm_with ) { if (confirm_with) {
password_field = $('#' + confirm_with); password_field = $('#' + confirm_with);
} else { } else {
password_field = $('.' + self.config.passwordClass); password_field = $('.' + self.config.passwordClass);
} }
if (timer !== null) clearTimeout(timer); if (timer !== null) clearTimeout(timer);
timer = setTimeout(function(){ timer = setTimeout(function () {
self.match_passwords(password_field); self.match_passwords(password_field);
}, 400); }, 400);
}); });
}, },
display_time: function(seconds) { display_time: function (seconds) {
var minute = 60; var minute = 60;
var hour = minute * 60; var hour = minute * 60;
var day = hour * 24; var day = hour * 24;
@ -81,46 +125,57 @@
var century = year * 100; var century = year * 100;
// Provide fake gettext for when it is not available // Provide fake gettext for when it is not available
if( typeof gettext !== 'function' ) { gettext = function(text) { return text; }; }; if (typeof gettext !== 'function') { gettext = function (text) { return text; }; }
if( seconds < minute ) return gettext('only an instant'); if (seconds < minute) return gettext('only an instant');
if( seconds < hour) return (1 + Math.ceil(seconds / minute)) + ' ' + gettext('minutes'); if (seconds < hour) return (1 + Math.ceil(seconds / minute)) + ' ' + gettext('minutes');
if( seconds < day) return (1 + Math.ceil(seconds / hour)) + ' ' + gettext('hours'); if (seconds < day) return (1 + Math.ceil(seconds / hour)) + ' ' + gettext('hours');
if( seconds < month) return (1 + Math.ceil(seconds / day)) + ' ' + gettext('days'); if (seconds < month) return (1 + Math.ceil(seconds / day)) + ' ' + gettext('days');
if( seconds < year) return (1 + Math.ceil(seconds / month)) + ' ' + gettext('months'); if (seconds < year) return (1 + Math.ceil(seconds / month)) + ' ' + gettext('months');
if( seconds < century) return (1 + Math.ceil(seconds / year)) + ' ' + gettext('years'); if (seconds < century) return (1 + Math.ceil(seconds / year)) + ' ' + gettext('years');
return gettext('centuries'); return gettext('centuries');
}, },
match_passwords: function(password_field, confirmation_fields) { match_passwords: function (password_field, confirmation_fields) {
var self = this; var self = this;
// Optional parameter: if no specific confirmation field is given, check all // Optional parameter: if no specific confirmation field is given, check all
if( confirmation_fields === undefined ) { confirmation_fields = $('.' + self.config.confirmationClass) } if (confirmation_fields === undefined) { confirmation_fields = $('.' + self.config.confirmationClass); }
if( confirmation_fields === undefined ) { return; } if (confirmation_fields === undefined) { return; }
var password = password_field.val(); var password = password_field.val();
confirmation_fields.each(function(index, confirm_field) { confirmation_fields.each(function (index, confirm_field) {
var confirm_value = $(confirm_field).val(); var confirm_value = $(confirm_field)
var confirm_with = $(confirm_field).data('confirm-with'); .val();
var confirm_with = $(confirm_field)
.data('confirm-with');
if( confirm_with && confirm_with == password_field.attr('id')) { if (confirm_with && confirm_with == password_field.attr('id')) {
if( confirm_value && password ) { if (confirm_value && password) {
if (confirm_value === password) { if (confirm_value === password) {
$(confirm_field).parent().find('.password_strength_info').addClass('hidden'); $(confirm_field)
.parent()
.find('.password_strength_info')
.addClass('visually-hidden');
} else { } else {
$(confirm_field).parent().find('.password_strength_info').removeClass('hidden'); $(confirm_field)
.parent()
.find('.password_strength_info')
.removeClass('visually-hidden');
} }
} else { } else {
$(confirm_field).parent().find('.password_strength_info').addClass('hidden'); $(confirm_field)
.parent()
.find('.password_strength_info')
.addClass('visually-hidden');
} }
} }
}); });
// If a password field other than our own has been used, add the listener here // If a password field other than our own has been used, add the listener here
if( !password_field.hasClass(self.config.passwordClass) && !password_field.data('password-listener') ) { if (!password_field.hasClass(self.config.passwordClass) && !password_field.data('password-listener')) {
password_field.on('keyup', function() { password_field.on('keyup', function () {
self.match_passwords($(this)); self.match_passwords($(this));
}); });
password_field.data('password-listener', true); password_field.data('password-listener', true);
@ -131,4 +186,4 @@
// Call the init for backwards compatibility // Call the init for backwards compatibility
djangoPasswordStrength.init(); djangoPasswordStrength.init();
})(jQuery, window, document); })(jQuery, window, document);

View file

@ -1 +1 @@
import "zxcvbn"; window.zxcvbn = require('zxcvbn');

View file

@ -36,5 +36,5 @@ def two_pages_decorated_with_errors(submission, errors):
for line in pages.split('\n'): for line in pages.split('\n'):
result += escape(line) result += escape(line)
result += '\n' result += '\n'
result += '</pre>pre>\n' result += '</pre>\n'
return mark_safe(result) return mark_safe(result)

View file

@ -202,7 +202,7 @@ class SubmitTests(BaseSubmitTestCase):
sys.stderr.write("Author initials: %s\n" % author.initials()) sys.stderr.write("Author initials: %s\n" % author.initials())
self.assertEqual(len(submission.authors), 1) self.assertEqual(len(submission.authors), 1)
a = submission.authors[0] a = submission.authors[0]
self.assertEqual(a["name"], author.ascii) self.assertEqual(a["name"], author.ascii_name())
self.assertEqual(a["email"], author.email().address.lower()) self.assertEqual(a["email"], author.email().address.lower())
self.assertEqual(a["affiliation"], "Test Centre Inc.") self.assertEqual(a["affiliation"], "Test Centre Inc.")
self.assertEqual(a["country"], "UK") self.assertEqual(a["country"], "UK")
@ -2516,7 +2516,7 @@ ZSBvZiBsaW5lcyAtIGJ1dCBpdCBjb3VsZCBiZSBhIGRyYWZ0Cg==
if is_secretariat: if is_secretariat:
# check that reply button is visible # check that reply button is visible
reply_href = self.get_href(q, "#email-details a#reply%s:contains('Reply')" % submission.pk) reply_href = self.get_href(q, "a#reply%s:contains('Reply')" % submission.pk)
else: else:
# No reply button # No reply button
@ -2591,7 +2591,7 @@ Thank you
# check the page # check the page
r = self.client.get(the_url) r = self.client.get(the_url)
q = PyQuery(r.content) q = PyQuery(r.content)
post_button = q('[type=submit]:contains("Send Email")') post_button = q('[type=submit]:contains("Send email")')
self.assertEqual(len(post_button), 1) self.assertEqual(len(post_button), 1)
subject = post_button.parents("form").find('input[name="subject"]').val() subject = post_button.parents("form").find('input[name="subject"]').val()
frm = post_button.parents("form").find('input[name="frm"]').val() frm = post_button.parents("form").find('input[name="frm"]').val()

View file

@ -1,10 +1,14 @@
{# bs5ok #}
{% load ietf_filters session_filters origin %} {% load ietf_filters session_filters origin %}
{% if not session.past_cutoff_date %} {% if not session.past_cutoff_date %}
{% origin %} {% origin %}
{% with gt=session.group.type_id %} {% with gt=session.group.type_id %}
{%comment%} {%comment%}
<a class="button btn-primary btn-sm" href="{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}{% if gt == 'wg' or gt == 'rg' or gt == 'ag' %}{% else %}#session_{{session.pk}}{% endif %}">Edit</a> <a class="btn btn-primary btn-sm"
{%endcomment%} href="{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}{% if gt == 'wg' or gt == 'rg' or gt == 'ag' %}{% else %}#session_{{session.pk}}{% endif %}">Edit</a>
<a href="{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}{% if gt == 'wg' or gt == 'rg' or gt == 'ag' or gt == 'rag' %}{% else %}#session_{{session.pk}}{% endif %}">Edit materials</a> {% endcomment %}
<a class="btn btn-primary btn-sm" href="{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}{% if gt == 'wg' or gt == 'rg' or gt == 'ag' or gt == 'rag' %}{% else %}#session_{{ session.pk }}{% endif %}">
Edit materials
</a>
{% endwith %} {% endwith %}
{% endif %} {% endif %}

View file

@ -1,3 +1,4 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015-2019, All Rights Reserved #} {# Copyright The IETF Trust 2015-2019, All Rights Reserved #}
{% load origin %} {% load origin %}
{% origin %} {% origin %}
@ -5,11 +6,6 @@
{% load tz %} {% load tz %}
<tr> <tr>
<td> <td>
{% comment %}
<a name="{{ session.group.acronym }}"></a>
<a name="wg-{{ session.group.acronym }}"></a>
<a name="session.group-{{ session.group.acronym }}"></a>
{% endcomment %}
{% if session.name %} {% if session.name %}
<div id="{{ session.name|slugify }}">{{ session.name }}</div> <div id="{{ session.name|slugify }}">{{ session.name }}</div>
{% else %} {% else %}
@ -22,15 +18,9 @@
{% endif %} {% endif %}
</td> </td>
{% if session.all_meeting_sessions_cancelled %} {% if session.all_meeting_sessions_cancelled %}
{% if user|has_role:"Secretariat" or user_groups %} <td colspan="{% if user|has_role:'Secretariat' or user_groups %}7{% else %}6{% endif %}">
<td colspan="7"> <span class="badge bg-danger">Session cancelled</span>
<span class="badge bg-danger">Session cancelled</span> </td>
</td>
{% else %}
<td colspan="6">
<span class="badge bg-danger">Session cancelled</span>
</td>
{% endif %}
{% else %} {% else %}
<td> <td>
{% if session.all_meeting_agendas %} {% if session.all_meeting_agendas %}
@ -38,7 +28,7 @@
{% if session.all_meeting_agendas|length == 1 %} {% if session.all_meeting_agendas|length == 1 %}
{% if agenda.time > old %} {% if agenda.time > old %}
<span class="small bi bi-bell" <span class="small bi bi-bell"
title="Last Update: {{ agenda.time|utc|date:"Y-m-d H:i:s" }}&nbsp;UTC"></span> title="Last Update: {{ agenda.time|utc|date:"Y-m-d H:i:s" }} UTC"></span>
{% endif %} {% endif %}
<a href="{{ session.all_meeting_agendas.0|meeting_href:session.meeting }}">Agenda</a> <a href="{{ session.all_meeting_agendas.0|meeting_href:session.meeting }}">Agenda</a>
<br> <br>
@ -85,7 +75,7 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% else %} {% else %}
<span class="badge bg-bluesheets">No bluesheets</span> <span class="badge bg-warning">No bluesheets</span>
{% endif %} {% endif %}
{% endif %} {% endif %}
</td> </td>
@ -94,7 +84,7 @@
{% for slide in slides %} {% for slide in slides %}
{% if slide.time > old %} {% if slide.time > old %}
<span class="small bi bi-bell" <span class="small bi bi-bell"
title="Last Update: {{ slide.time|utc|date:"Y-m-d H:i:s" }}&nbsp;UTC"></span> title="Last Update: {{ slide.time|utc|date:"Y-m-d H:i:s" }} UTC"></span>
{% endif %} {% endif %}
<a href="{{ slide|meeting_href:session.meeting }}">{{ slide.title|clean_whitespace }}</a> <a href="{{ slide|meeting_href:session.meeting }}">{{ slide.title|clean_whitespace }}</a>
<br> <br>
@ -108,7 +98,7 @@
{% for draft in drafts %} {% for draft in drafts %}
{% if draft.time > old %} {% if draft.time > old %}
<span class="small bi bi-bell" <span class="small bi bi-bell"
title="Last Update: {{ draft.time|utc|date:"Y-m-d H:i:s" }}&nbsp;UTC"></span> title="Last Update: {{ draft.time|utc|date:"Y-m-d H:i:s" }} UTC"></span>
{% endif %} {% endif %}
<a href="{{ draft.get_href }}">{{ draft.name }}</a> <a href="{{ draft.get_href }}">{{ draft.name }}</a>
<br> <br>
@ -126,8 +116,8 @@
</td> </td>
<td> <td>
{% if user|has_role:"Secretariat" or session.group in user_groups %} {% if user|has_role:"Secretariat" or session.group in user_groups %}
<div>{% include "meeting/edit_materials_button.html" %}</div> <div class="float-end">{% include "meeting/edit_materials_button.html" %}</div>
{% endif %} {% endif %}
</td> </td>
{% endif %} {% endif %}
</tr> </tr>

View file

@ -1,77 +1,94 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}{% load origin %}{% origin %} {# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% origin %}
{% load ietf_filters %} {% load ietf_filters %}
{% load proceedings_filters %} {% load proceedings_filters %}
<tr> <tr>
<td> <td>
{% comment %}
<a name="{{ session.group.acronym }}"></a>
<a name="wg-{{ session.group.acronym }}"></a>
<a name="session.group-{{ session.group.acronym }}"></a>
{% endcomment %}
{% if session.name %} {% if session.name %}
<div id="{{ session.name|slugify }}">{{ session.name }}</div> <div id="{{ session.name|slugify }}">{{ session.name }}</div>
{% else %} {% else %}
<div id="{{session.group.acronym}}"><a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{session.group.acronym}}</a></div> <div id="{{ session.group.acronym }}">
{% if session.group.state_id == "bof" %} <a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{ session.group.acronym }}</a>
<span class="badge bg-success">BOF</span> </div>
{% endif %} {% if session.group.state_id == "bof" %}<span class="badge bg-success">BOF</span>{% endif %}
{% endif %} {% endif %}
</td> </td>
{% if session.all_meeting_sessions_cancelled %} {% if session.all_meeting_sessions_cancelled %}
<td colspan="4"><span class="badge bg-danger">Session cancelled</span></td> <td colspan="4">
<span class="badge bg-danger">Session cancelled</span>
</td>
{% else %} {% else %}
<td> <td>
{% if session.all_meeting_agendas %} {% if session.all_meeting_agendas %}
{% if session.all_meeting_agendas|length == 1 %} {% if session.all_meeting_agendas|length == 1 %}
<a href="{{ session.all_meeting_agendas.0|meeting_href:meeting }}">Agenda</a><br> <a href="{{ session.all_meeting_agendas.0|meeting_href:meeting }}">Agenda</a>
<br>
{% else %} {% else %}
{% for agenda in session.all_meeting_agendas %} {% for agenda in session.all_meeting_agendas %}
<a href="{{agenda|meeting_href:meeting}}">Agenda {{agenda.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i"}}</a><br> <a href="{{ agenda|meeting_href:meeting }}">
Agenda {{ agenda.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i" }}
</a>
<br>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% else %} {% else %}
{% if show_agenda == "True" and not meeting.proceedings_final %} {% if show_agenda == "True" and not meeting.proceedings_final %}
<span class="badge bg-warning">No agenda</span><br> <span class="badge bg-warning">No agenda</span>
<br>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if session.all_meeting_minutes %} {% if session.all_meeting_minutes %}
{% if session.all_meeting_minutes|length == 1 %} {% if session.all_meeting_minutes|length == 1 %}
<a href="{{ session.all_meeting_minutes.0|meeting_href:meeting }}">Minutes</a><br> <a href="{{ session.all_meeting_minutes.0|meeting_href:meeting }}">Minutes</a>
<br>
{% else %} {% else %}
{% for minutes in session.all_meeting_minutes %} {% for minutes in session.all_meeting_minutes %}
<a href="{{ minutes|meeting_href:meeting}}">Minutes {{minutes.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i"}}</a><br> <a href="{{ minutes|meeting_href:meeting }}">
Minutes {{ minutes.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i" }}
</a>
<br>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% else %} {% else %}
{% if show_agenda == "True" and not meeting.proceedings_final %} {% if show_agenda == "True" and not meeting.proceedings_final %}
<span class="badge bg-warning">No minutes</span><br> <span class="badge bg-warning">No minutes</span>
<br>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if session.all_meeting_bluesheets %} {% if session.all_meeting_bluesheets %}
{% if session.all_meeting_bluesheets|length == 1 %} {% if session.all_meeting_bluesheets|length == 1 %}
<a href="{{session.all_meeting_bluesheets.0|meeting_href:meeting}}">Bluesheets</a><br> <a href="{{ session.all_meeting_bluesheets.0|meeting_href:meeting }}">Bluesheets</a>
<br>
{% else %} {% else %}
{% for bs in session.all_meeting_bluesheets %} {% for bs in session.all_meeting_bluesheets %}
<a href="{{bs|meeting_href:meeting}}">Bluesheets {{bs.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i"}}</a><br> <a href="{{ bs|meeting_href:meeting }}">
Bluesheets {{ bs.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i" }}
</a>
<br>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% with session.group|status_for_meeting:meeting as status %} {% with session.group|status_for_meeting:meeting as status %}
{% if status %} {% if status %}
<a href="{% url 'ietf.group.views.group_about_status_meeting' acronym=session.group.acronym num=meeting.number %}">Status</a><br> <a href="{% url 'ietf.group.views.group_about_status_meeting' acronym=session.group.acronym num=meeting.number %}">
Status
</a>
<br>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
</td> </td>
<td> <td>
{% if session.all_meeting_sessions_for_group|length == 1 %} {% if session.all_meeting_sessions_for_group|length == 1 %}
{% for rec in session.all_meeting_recordings %} {% for rec in session.all_meeting_recordings %}
<a href="{{rec|meeting_href:meeting}}">{{rec|hack_recording_title:False}}</a><br> <a href="{{ rec|meeting_href:meeting }}">{{ rec|hack_recording_title:False }}</a>
<br>
{% endfor %} {% endfor %}
{% else %} {% else %}
{% for rec in session.all_meeting_recordings %} {% for rec in session.all_meeting_recordings %}
<a href="{{rec|meeting_href:meeting}}">{{rec|hack_recording_title:True}}</a><br> <a href="{{ rec|meeting_href:meeting }}">{{ rec|hack_recording_title:True }}</a>
<br>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
</td> </td>
@ -81,20 +98,17 @@
<a href="{{ slide|meeting_href:meeting }}">{{ slide.title|clean_whitespace }}</a> <a href="{{ slide|meeting_href:meeting }}">{{ slide.title|clean_whitespace }}</a>
<br> <br>
{% empty %} {% empty %}
{% if not meeting.proceedings_final %} {% if not meeting.proceedings_final %}<span class="badge bg-warning">No slides</span>{% endif %}
<span class="badge bg-warning">No slides</span>
{% endif %}
{% endfor %} {% endfor %}
{% endwith %} {% endwith %}
</td> </td>
<td> <td>
{% with session.all_meeting_drafts as drafts %} {% with session.all_meeting_drafts as drafts %}
{% for draft in drafts %} {% for draft in drafts %}
<a href="{% url "ietf.doc.views_doc.document_main" name=draft.canonical_name %}">{{ draft.canonical_name }}</a><br> <a href="{% url "ietf.doc.views_doc.document_main" name=draft.canonical_name %}">{{ draft.canonical_name }}</a>
<br>
{% empty %} {% empty %}
{% if not meeting.proceedings_final %} {% if not meeting.proceedings_final %}<span class="badge bg-warning">No drafts</span>{% endif %}
<span class="badge bg-warning">No drafts</span>
{% endif %}
{% endfor %} {% endfor %}
{% endwith %} {% endwith %}
</td> </td>

View file

@ -1,20 +1,37 @@
{# bs5ok #}
{% extends "base.html" %} {% extends "base.html" %}
{# Copyright The IETF Trust 2020, All Rights Reserved #} {# Copyright The IETF Trust 2020, All Rights Reserved #}
{% load origin staticfiles django_bootstrap5 %} {% load origin staticfiles django_bootstrap5 %}
{% block title %}
{% block title %}Approved Slides for {{ submission.session.meeting }} : {{ submission.session.group.acronym }}{% endblock %} Approved Slides for {{ submission.session.meeting }} : {{ submission.session.group.acronym }}
{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1 class ="mb-3">
<h1>These slides have already been {% if submission.status.slug == 'approved' %} approved {% else %} rejected {% endif %}</h1> These slides have already been
{% if submission.status.slug == 'approved' %}
<p>The slides from {{ submission.submitter }} have already been {% if submission.status.slug == 'approved' %} approved {% else %} rejected {% endif %}. No further action is needed.</p> approved
{% else %}
<p>You may wish to rejected
{% if submission.status.slug == 'approved' and submission.doc %}
<a href="{% url 'ietf.doc.views_doc.document_main' name=submission.doc.name %}">view the slides</a> or
{% endif %} {% endif %}
<a href="{% url "ietf.meeting.views.session_details" num=submission.session.meeting.number acronym=submission.session.group.acronym %}">return to this meeting session</a>.</p> </h1>
<p>
{% endblock %} The slides from {{ submission.submitter }} have already been
{% if submission.status.slug == 'approved' %}
approved.
{% else %}
rejected.
{% endif %}
No further action is needed.
</p>
<p>
You may wish to
{% if submission.status.slug == 'approved' and submission.doc %}
<a href="{% url 'ietf.doc.views_doc.document_main' name=submission.doc.name %}">view the slides</a>
or
{% endif %}
<a href="{% url "ietf.meeting.views.session_details" num=submission.session.meeting.number acronym=submission.session.group.acronym %}">
return to this meeting session
</a>.
</p>
{% endblock %}

View file

@ -72,7 +72,7 @@
{% endif %} {% endif %}
{% if not_meeting_sessions %} {% if not_meeting_sessions %}
<p> <p>
<small class="text-muted">{{ area.name }} groups not meeting:</small> {{ area.name }} groups not meeting:
{% for session in not_meeting_sessions %} {% for session in not_meeting_sessions %}
{% ifchanged session.group.acronym %} {% ifchanged session.group.acronym %}
<a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{ session.group.acronym }}</a> <a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{ session.group.acronym }}</a>

View file

@ -1,13 +1,13 @@
{# bs5ok #}
{% extends "meeting/proceedings/edit_material_base.html" %} {% extends "meeting/proceedings/edit_material_base.html" %}
{# Copyright The IETF Trust 2021, All Rights Reserved #} {# Copyright The IETF Trust 2021, All Rights Reserved #}
{% load tz %} {% load tz %}
{% block intro %} {% block intro %}
<p class="form-text"> <p class="form-text">
{% if material.active %} {% if material.active %}
This item will be listed on the proceedings as "{{ material }}". To change this, set the title below.<br> This item will be listed on the proceedings as "{{ material }}". To change this, set the title below.
{% else %} {% else %}
This item currently will not appear on the proceedings.<br> This item currently will not appear on the proceedings.
{% endif %} {% endif %}
</p> </p>
{% endblock %} {% endblock %}

View file

@ -1,25 +1,21 @@
{# bs5ok #}
{% extends "base.html" %} {% extends "base.html" %}
{# Copyright The IETF Trust 2021, All Rights Reserved #} {# Copyright The IETF Trust 2021, All Rights Reserved #}
{% load origin %} {% load origin %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}{{ action|capfirst }} {{ material.type.name }} for {{ material.meeting }} proceedings{% endblock %}
{% block title %}{{ action|capfirst }} {{material.type.name}} for {{ material.meeting }} proceedings{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>{{ action|capfirst }} material</h1> <h1>{{ action|capfirst }} material</h1>
<p class="alert alert-warning my-3">
<p>{{ action|capfirst }} <strong>{{material}}</strong> for the {{ material.meeting }} proceedings?</p> {{ action|capfirst }} <strong>{{ material }}</strong> for the {{ material.meeting }} proceedings?
</p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<button type="submit" class="btn btn-primary">{{ action|capfirst }} material</button> <button type="submit" class="btn btn-primary">{{ action|capfirst }} material</button>
<a class="btn btn-primary" href="{% url 'ietf.meeting.views_proceedings.material_details' num=material.meeting.number %}">Cancel</a> <a class="btn btn-secondary float-end"
href="{% url 'ietf.meeting.views_proceedings.material_details' num=material.meeting.number %}">
Back
</a>
</form> </form>
{% endblock %}
{% endblock %}

View file

@ -1,26 +1,28 @@
{# 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 static django_bootstrap5 %} {% load origin static django_bootstrap5 %}
{% block title %}Propose Slides for {{ session.meeting }} : {{ session.group.acronym }}{% endblock %} {% block title %}Propose Slides for {{ session.meeting }} : {{ session.group.acronym }}{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>
<h1>Propose Slides for {{ session.meeting }} : {{ session.group.acronym }}{% if session.name %} : {{session.name}}{% endif %}</h1> Propose Slides for {{ session.meeting }}
{% if session_number %}<h2> Session {{session_number}} : {{session.official_timeslotassignment.timeslot.time|date:"D M-d-Y Hi"}}</h2>{% endif %} <br>
<small class="text-muted">{{ session.group.acronym }}
<p>This form will allow you to propose a slide deck to the session chairs. After you upload your proposal, mail will be sent to the session chairs asking for their approval.</p> {% if session.name %}: {{ session.name }}{% endif %}
</small>
</h1>
{% if session_number %}
<h2 class="mt-3">
Session {{ session_number }} : {{ session.official_timeslotassignment.timeslot.time|date:"D M-d-Y Hi" }}
</h2>
{% endif %}
<p class="alert alert-info my-3">
This form will allow you to propose a slide deck to the session chairs. After you upload your proposal, mail will be sent to the session chairs asking for their approval.
</p>
<form enctype="multipart/form-data" method="post"> <form enctype="multipart/form-data" method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Upload</button> <button type="submit" class="btn btn-primary">Upload</button>
</form> </form>
{% endblock %}
{% endblock %}

View file

@ -1,33 +1,44 @@
{# 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 %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Remove {{ sp.document }} from session{% endblock %}
{% block title %}Remove {{sp.document}} from session{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Confirm removing document from session {{sp.session}}</h1> <h1>Confirm removing document from session {{ sp.session }}</h1>
{% if sp.session.is_material_submission_cutoff %} {% if sp.session.is_material_submission_cutoff %}
<p class="alert alert-warning">The deadline for submission corrections has passed. This may affect published proceedings.</p> <p class="alert alert-warning my-3">
The deadline for submission corrections has passed. This may affect published proceedings.
</p>
{% endif %} {% endif %}
<h2 class="mt-3">Document</h2>
<h2>Document</h2> <p>
<p><strong>{{sp.document.name}}{% if sp.rev %}-{{sp.rev}}{% else %} (current version){% endif %}</strong></p> <strong>{{ sp.document.name }}
<p>{{sp.document.title}}</p> {% if sp.rev %}
<h2>Session</h2> -{{ sp.rev }}
<p>{{sp.session}}</p> {% else %}
(current version)
{% endif %}
</strong>
</p>
<p>
{{ sp.document.title }}
</p>
<h2 class="mt-3">Session</h2>
<p>
{{ sp.session }}
</p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<button type="submit"
class="btn btn-{% if sp.session.is_material_submission_cutoff %}warning{% else %}primary{% endif %}"
<button type="submit" class="btn btn-{% if sp.session.is_material_submission_cutoff %}warning{% else %}primary{% endif %}" name="remove_session">Remove document from session</button> name="remove_session">
<a class="btn btn-primary href="{% url 'ietf.meeting.views.session_details' num=sp.session.meeting.number acronym=sp.session.group.acronym%}">Cancel</a> Remove from session
</button>
<a class="btn btn-secondary float-end"
href="{% url 'ietf.meeting.views.session_details' num=sp.session.meeting.number acronym=sp.session.group.acronym %}">
Back
</a>
</form> </form>
{% endblock %} {% endblock %}

View file

@ -1,26 +1,16 @@
{# bs5ok #}
{% extends "nomcom/nomcom_public_base.html" %} {% extends "nomcom/nomcom_public_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block subtitle %}- Change Nomination{% endblock %}
{% block subtitle %} - Change Nomination {% endblock %}
{% block nomcom_content %} {% block nomcom_content %}
{% origin %} {% origin %}
{% if need_confirmation %} {% if need_confirmation %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<button class="btn btn-primary" type="submit">Save</button> <button class="btn btn-primary" type="submit">Save</button>
</form> </form>
{% endif %} {% endif %}
{% endblock %}
{% endblock %}

View file

@ -1,79 +1,61 @@
{# 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 %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load static %} {% load static %}
{% block title %}Change password{% endblock %} {% block title %}Change password{% endblock %}
{% block js %} {% block js %}
{{ block.super }} {{ block.super }}
<script src="{% static 'ietf/js/zxcvbn.js' %}"></script> <script src="{% static 'ietf/js/zxcvbn.js' %}"></script>
<script src="{% static 'ietf/js/password_strength.js' %}"></script> <script src="{% static 'ietf/js/password_strength.js' %}"></script>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
{% if success %} {% if success %}
<h1>Your password was successfully changed.</h1> <p class="alert alert-info my-3">
Your password was successfully changed.
</p>
{% if not user.is_authenticated %} {% if not user.is_authenticated %}
<a type="a" class="btn btn-primary" href="/accounts/login/" rel="nofollow">Sign in</a> <a type="a"
class="btn btn-primary"
href="/accounts/login/"
rel="nofollow">Sign in</a>
{% endif %} {% endif %}
{% else %} {% else %}
<div class="row"> <h1>Change password</h1>
<div class="col-md-2 col-sm-0"></div> <form method="post" class="my-3">
<div class="col-md-8 col-sm-12"> {% csrf_token %}
<h1>Change password</h1> {% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Change password</button>
<form method="post"> </form>
{% csrf_token %} <div class="alert alert-info mt-5">
{% bootstrap_form form %} <b>Online attack: </b>This password form uses the
<a href="https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/">zxcvbn</a>
password strength estimator to give an indication of password strength.
The crack time estimate given above assume online attack without rate
<button type="submit" class="btn btn-primary">Change password</button> limiting, at a rate of 10 attempts per second.
<hr>
<b>Offline cracking: </b>
</form> The datatracker currently uses the <code>{{ hasher.algorithm }}</code>
password hasher with
<div class="form-text"> {% if hasher.iterations %}
This password form uses the {{ hasher.iterations }} iterations
<a href="https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/">zxcvbn</a> {% elif hasher.rounds %}
password strength estimator to give an indication of password strength. {{ hasher.rounds }} rounds
The crack time estimage given above assume online attack without rate {% elif hasher.time_cost and hasher.memory_cost and hasher.parallelism %}
limiting, at a rate of 10 attempts per second. <code>time cost {{ hasher.time_cost }}</code>, <code>memory cost {{ hasher.memory_cost }}</code>
</div> and <code>parallelism {{ hasher.parallelism }}</code>
{% endif %}
<h4>Offline cracking</h4> .
<div class="form-text"> Calculating offline attack time if password hashes should leak is left
The datatracker currently uses the <b>{{ hasher.algorithm }}</b> as an exercise for the reader.
password hasher with <span class="password_strength_offline_info visually-hidden">
<b> As a guideline, if we assume offline hashing using the current hasher
{% if hasher.iterations %} at a speed of 10<sup>4</sup> attempts per second, this password would
{{ hasher.iterations }} iterations take <em class="password_strength_time"></em> to crack.
{% elif hasher.rounds %} </span>
{{ hasher.rounds }} rounds
{% elif hasher.time_cost and hasher.memory_cost and hasher.parallelism %}
time cost {{ hasher.time_cost }}, memory cost {{ hasher.memory_cost }}
and parallelism {{ hasher.parallelism }}
{% endif %}
</b>.
Calculating offline attack time if password hashes should leak is left
as an excercise for the reader.
</div>
<div class="form-text">
<p class="text-muted password_strength_offline_info hidden">
As a guideline, if we assume offline hashing using the current hasher
at a speed of 10<sup>4</sup> attempts per second, this password would
take <b><em class="password_strength_time"></em></b> to crack.
</p>
</div>
</div>
<div class="col-md-2 col-sm-0"></div>
</div> </div>
</div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View file

@ -1,42 +1,23 @@
{# 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 %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load static %} {% load static %}
{% block title %}Change username{% endblock %} {% block title %}Change username{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Change username</h1>
<div class="row"> <div class="alert alert-info my-3">
<div class="col-md-2 col-sm-0"></div> This form lets you change your username (login) from {{ user.username }} to
<div class="col-md-8 col-sm-12"> one of your other active email addresses. If you want to change to a new
<h1>Change username</h1> email address, then please first
<a href="{% url 'ietf.ietfauth.views.profile' %}">edit your profile</a>
<div class="form-text"> to add that email address to the active email addresses for your account.
This form lets you change your username (login) from {{ user.username }} to
one of your other active email addresses. If you want to change to a new
email address, then please first
<a href="{% url 'ietf.ietfauth.views.profile' %}">edit your profile</a>
to add that email address to the active email addresses for your account.
</div>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Change username</button>
</form>
</div>
<div class="col-md-2 col-sm-0"></div>
</div> </div>
<form method="post" class="my-3">
{% endblock %} {% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Change username</button>
</form>
{% endblock %}

View file

@ -1,40 +1,35 @@
{# 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 %}
{% load static %} {% load static %}
{% load django_bootstrap5 textfilters %}
{% load django_bootstrap5 %}
{% block title %}Complete account creation{% endblock %} {% block title %}Complete account creation{% endblock %}
{% block js %} {% block js %}
{{ block.super }} {{ block.super }}
<script src="{% static 'ietf/js/zxcvbn.js' %}"></script> <script src="{% static 'ietf/js/zxcvbn.js' %}"></script>
<script src="{% static 'ietf/js/password_strength.js' %}"></script> <script src="{% static 'ietf/js/password_strength.js' %}"></script>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
{% if success %} {% if success %}
<h1>Account creation successful</h1> <h1>Account creation successful</h1>
<p class="alert alert-success my-3">
<p>Your account with login {{ email }} has been created, using the password you have selected.</p> Your account with login {{ email|linkify }} has been created, using the password you have selected.
<a type="a" class="btn btn-primary" href="{% url "ietf.ietfauth.views.login" %}" rel="nofollow">Sign in</a> </p>
<a type="a"
class="btn btn-primary"
href="{% url "ietf.ietfauth.views.login" %}"
rel="nofollow">Sign in</a>
{% else %} {% else %}
<h1>Complete account creation</h1> <h1>Complete account creation</h1>
<p class="alert alert-info my-3">
<p>In order to complete the setup of your account with login {{ email }}, please choose a password:</p> In order to complete the setup of your account with login {{ email|linkify }}, please provide the following information:
</p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Set name and password</button> <button type="submit" class="btn btn-primary">Set name and password</button>
</form> </form>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View file

@ -1,37 +1,31 @@
{# 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 django_bootstrap5 %} {% load origin django_bootstrap5 textfilters %}
{% block title %}Confirm new email address{% endblock %} {% block title %}Confirm new email address{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Confirm new email address</h1> <h1>Confirm new email address</h1>
{% if not can_confirm %} {% if not can_confirm %}
<p class="alert alert-danger">An error has occured when attempting to add the email address {{ email }} to your account {{ username }}.</p> <p class="alert alert-danger my-3">
An error has occurred when attempting to add the email address {{ email|linkify }} to your account {{ username }}.
</p>
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
<a class="btn btn-primary my-3"
<p> href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
</p>
{% elif new_email_obj %} {% elif new_email_obj %}
<p>Your account {{ username }} has been updated to include the email address {{ email }}.</p> <p class="alert alert-success my-3">
Your account {{ username }} has been updated to include the email address {{ email|linkify }}.
<p>
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
</p> </p>
<a class="btn btn-primary my-3"
href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% else %} {% else %}
<p>Confirm that you want to add the email address {{ email }} to your account {{ username }}.</p> <p class="alert alert-info my-3">
Confirm that you want to add the email address {{ email|linkify }} to your account {{ username }}.
<form method="post"> </p>
<form method="post" class="my-3">
{% csrf_token %} {% csrf_token %}
<button type="submit" class="btn btn-warning" name="action" value="confirm">Confirm email address</button> <button type="submit" class="btn btn-warning" name="action" value="confirm">Confirm email address</button>
</form> </form>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View file

@ -1,21 +1,19 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin textfilters %}
{% load origin %} {% block title %}Profile update successful{% endblock %}
{% block content %}
{% block title %}Profile update successful{% endblock%} {% origin %}
<h1>Profile update successful</h1>
{% block content %} <p class="my-3">
{% origin %} Your account has been updated to reflect the changes you submitted.
</p>
<h1>Profile update successful</h1> {% for email in email_confirmations %}
<p class="alert alert-success my-3">
<p>Your account has been updated to reflect the changes you submitted.</p> <b>A confirmation email has been sent to {{ email|linkify }}.</b> The email will be activated after you click on the link it contains.
</p>
{% for email in email_confirmations %} {% endfor %}
<p class="alert alert-info"><b>A confirmation email has been sent to {{email}}.</b> The email will be activated after you click on the link it contains.</p> <a class="btn btn-primary"
{% endfor %} href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% endblock %}
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% endblock %}

View file

@ -1,48 +1,41 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin %}
{% load django_bootstrap5 textfilters %}
{% load django_bootstrap5 %}
{% block title %}Account creation{% endblock %} {% block title %}Account creation{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
{% if to_email %} {% if to_email %}
<h1>Account request received.</h1> <h1>Account request received.</h1>
<div class="alert alert-info my-3">
<p>Your account creation request has been successfully received.</p> Your account creation request has been successfully received.
<hr>
<p>We have sent an email to {{ to_email }} with instructions on how to complete the process.</p> We have sent an email to {{ to_email|linkify }} with instructions on how to complete the process.
</div>
{% else %} {% else %}
<h1>Account creation</h1> <h1>Account creation</h1>
<div class="row">
<p> <div class="col-md-6">
<b>If you already have an account and want to use a new email address,</b> <div class="alert alert-info">
please go to your account profile page and <b>If you already have an account and want to use a new email address</b>, please go to your account profile page and
<br>
<a class="btn btn-primary mt-3"
href="{% url "ietf.ietfauth.views.profile" %}">Add a new email address</a>
</div>
</div>
<div class="col-md-6">
<div class="alert alert-info">
<b>If you already have an account but forgot your password</b>, please simply
<br>
<a class="btn btn-warning mt-3"
href="{% url "ietf.ietfauth.views.password_reset" %}">Reset your password</a>
</div>
</div>
</div>
<p class="my-3">
Otherwise, please enter your email address in order to create your datatracker account.
</p> </p>
<p>
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}"> Add a new email address</a>
</p>
<p>
<b>If you already have an account but forgot your password,</b>
please simply
</p>
<p>
<a class="btn btn-warning" href="{% url "ietf.ietfauth.views.password_reset" %}">Reset your password</a>
</p>
<hr/>
<p>Please enter your email address in order to create your datatracker account.</p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}

View file

@ -1,116 +1,125 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin %}
{% load widget_tweaks django_bootstrap5 textfilters ietf_filters %}
{% load widget_tweaks django_bootstrap5 %}
{% load person_filters %} {% load person_filters %}
{% block title %}Profile for {{ user }}{% endblock %} {% block title %}Profile for {{ user }}{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Profile information for {{ user.person.name }}</h1> <h1>Profile information for {{ user.person.name }}</h1>
<p class="my-3">
<p> The information you provide below is used to generate your
The information you provide below is used to generate your <a href="{% url 'ietf.person.views.profile' email_or_name=user.person.email %}">public datatracker profile page</a> <a href="{% url 'ietf.person.views.profile' email_or_name=user.person.email %}">public datatracker profile page</a>
</p> </p>
<form class="form-horizontal" method="post"> <form class="form-horizontal" method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form_errors person_form %} {% bootstrap_form_errors person_form %}
{% for f in new_email_forms %} {% for f in new_email_forms %}
{% bootstrap_form_errors f %} {% bootstrap_form_errors f %}
{% endfor %} {% endfor %}
<div class="row mb-3"> <div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">User name <a href="#pi"><i class="bi bi-exclamation-circle"></i></a></label> <label class="col-sm-2 col-form-label fw-bold">
User name
<a href="#pi">
<i class="bi bi-exclamation-circle"></i>
</a>
</label>
<div class="col-sm-10"> <div class="col-sm-10">
<p class="form-control-plaintext"> <p class="form-control-plaintext">
{{ user.username }} {{ user.username }}
</p> </p>
<a class="btn btn-primary" href="/accounts/username/">Edit</a> <a class="btn btn-primary" href="/accounts/username/">Edit</a>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">Password <a href="#pi"><i class="bi bi-exclamation-circle"></i></a></label> <label class="col-sm-2 col-form-label fw-bold">
Password
<a href="#pi">
<i class="bi bi-exclamation-circle"></i>
</a>
</label>
<div class="col-sm-10"> <div class="col-sm-10">
<a class="btn btn-primary" href="/accounts/password/">Change password</a> <a class="btn btn-primary" href="/accounts/password/">Change password</a>
</div> </div>
</div> </div>
{% if person.photo %} {% if person.photo %}
<div class="row mb-3"> <div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">Photo <a href="#pi"><i class="bi bi-exclamation-circle"></i></a></label> <label class="col-sm-2 col-form-label fw-bold">
<div class="col-sm-10"> Photo
<p class="form-control-plaintext"> <a href="#pi">
<a href="{{ person.photo.url }}"> <i class="bi bi-exclamation-circle"></i>
<img class="photo" src="{{ person.photo.url }}" alt="Photo of {{ person }}" /> </a>
</a> </label>
</p> <div class="col-sm-10">{% include "person/photo.html" with person=person %}</div>
</div>
</div> </div>
{% endif %} {% endif %}
<div class="row mb-3"> <div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">NomCom Eligible</label> <label class="col-sm-2 col-form-label fw-bold">NomCom Eligible</label>
<div class="col-sm-10"> <div class="col-sm-10">
<p class="form-control-plaintext"> {% with person|is_nomcom_eligible|yesno:'Yes,No,No' as is_eligible %}
{{ person|is_nomcom_eligible|yesno:'Yes,No,No' }} <p class="form-control-plaintext {% if is_eligible == 'Yes' %}text-success fw-bold{% endif %}">
</p> {{ is_eligible }}
</p>
{% endwith %}
{% if volunteer_status == 'allow' %} {% if volunteer_status == 'allow' %}
<a id="volunteer-button" class="btn btn-primary" href="{% url "ietf.nomcom.views.volunteer" %}">Volunteer</a> <a id="volunteer-button"
class="btn btn-primary"
href="{% url "ietf.nomcom.views.volunteer" %}">Volunteer</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="offset-sm-2 alert alert-info "> <div class="offset-sm-2 alert alert-info ">
<p>
If you believe this calculation is incorrect, make sure you've added all the
email addresses you've registered for IETF meetings with to the
list below.</p>
<p>
If you've done so and the calculation is still incorrect, please
send a note to
<a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">{{ settings.SECRETARIAT_SUPPORT_EMAIL }}</a>.
</p>
<p>
See <a href="{% url 'ietf.doc.views_doc.document_main' name='rfc8713' %}">RFC 8713</a>
for eligibility requirements.
For the 2021 and 2022 NomComs, see also <a href="{% url 'ietf.doc.views_doc.document_main' name='rfc8989' %}">RFC 8989</a>.
</p>
{% if volunteer_status == 'volunteered' %} {% if volunteer_status == 'volunteered' %}
<p> <p class="mb-0">
<b id="volunteered">You have volunteered for the {{ nomcom.group.name }}.</b> To modify your volunteer status, contact the NomCom chair. <b id="volunteered">You have volunteered for the {{ nomcom.group.name }}.</b> To modify your volunteer status, contact the NomCom chair.
</p> </p>
{% else %}
<p>
If you believe this calculation is incorrect, make sure you've added all the
email addresses you've registered for IETF meetings with to the
list below.
</p>
<p>
If you've done so and the calculation is still incorrect, please
send a note to
<a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">{{ settings.SECRETARIAT_SUPPORT_EMAIL }}</a>.
</p>
<p class="mb-0">
See
<a href="{% url 'ietf.doc.views_doc.document_main' name='rfc8713' %}">RFC 8713</a>
for eligibility requirements.
For the 2021 and 2022 NomComs, see also
<a href="{% url 'ietf.doc.views_doc.document_main' name='rfc8989' %}">RFC 8989</a>.
</p>
{% endif %} {% endif %}
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">External Resources <a href="#pi"><i class="bi bi-exclamation-circle"></i></a></label> <label class="col-sm-2 col-form-label fw-bold">
External Resources
<a href="#pi">
<i class="bi bi-exclamation-circle"></i>
</a>
</label>
<div class="col-sm-10"> <div class="col-sm-10">
{% for extres in person.personextresource_set.all %} <div class="form-control-plaintext">
<div class="row"> <dl class="row mb-0">
<div class="col-3"> {% for extres in person.personextresource_set.all %}
{% firstof extres.display_name extres.name.name %} <dt class="col-sm-3">
</div> {% firstof extres.display_name extres.name.name %}
<div class="col"> </dt>
{{ extres.value }} <dd class="col-sm-9">
</div> {{ extres.value|linkify }}
</div> </dd>
{% empty %} {% empty %}
None None
{% endfor %} {% endfor %}
<a class="btn btn-primary mt-1" href="{% url 'ietf.ietfauth.views.edit_person_externalresources' %}">Edit</a> </dl>
</div>
<a class="btn btn-primary"
href="{% url 'ietf.ietfauth.views.edit_person_externalresources' %}">Edit</a>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">Email addresses</label> <label class="col-sm-2 col-form-label fw-bold">Email addresses</label>
<div class="col-sm-10 emails"> <div class="col-sm-10 emails">
@ -119,31 +128,42 @@
<th class="text-center">Primary</th> <th class="text-center">Primary</th>
<th class="text-center">Active</th> <th class="text-center">Active</th>
<th>Address</th> <th>Address</th>
<th>Origin</th></tr> <th>Origin</th>
</tr>
{% for email in emails %} {% for email in emails %}
<tr> <tr>
<td class="text-center"> <td class="text-center">
<input class="form-check-input" type="radio" name="primary_email" value="{{ email.pk }}" {% if email.primary %}checked{% endif %}/> <input class="form-check-input"
type="radio"
name="primary_email"
value="{{ email.pk }}"
{% if email.primary %}checked{% endif %}/>
</td> </td>
<td class="text-center"> <td class="text-center">
<input class="form-check-input" type="checkbox" name="active_emails" value="{{ email.pk }}" {% if email.active %}checked{% endif %}/> <input class="form-check-input"
type="checkbox"
name="active_emails"
value="{{ email.pk }}"
{% if email.active %}checked{% endif %}/>
</td> </td>
<td> <td>
{% if email.origin == person.user.username or email.origin == '' %} {% if email.origin == person.user.username or email.origin == '' %}
<a href="#pi"><i class="bi bi-exclamation-circle"></i></a> <a href="#pi">
<i class="bi bi-exclamation-circle"></i>
</a>
{% endif %} {% endif %}
{{ email }} {{ email }}
</td> </td>
<td>{{ email.origin|default:'(unknown)' }}</td> <td>{{ email.origin|default:'(unknown)'|urlize_ietf_docs }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
<p class="text-muted">Note: Email addresses cannot be deleted in this form, only deactivated.</p> <p class="form-text">
Note: Email addresses cannot be deleted in this form, only deactivated.
</p>
{% for f in new_email_forms %} {% for f in new_email_forms %}
{% bootstrap_field f.new_email layout="horizontal" show_label=False %} {% bootstrap_field f.new_email layout="horizontal" show_label=False %}
{% endfor %} {% endfor %}
<div class="new-emails"></div> <div class="new-emails"></div>
<div> <div>
<button class="btn btn-primary add-email mb-5">Add new email address</button> <button class="btn btn-primary add-email mb-5">Add new email address</button>
@ -152,49 +172,53 @@
{% bootstrap_field role.email_form.email show_label=False %} {% bootstrap_field role.email_form.email show_label=False %}
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
{% bootstrap_form person_form layout="horizontal" exclude="ascii_short" %} {% bootstrap_form person_form layout="horizontal" exclude="ascii_short" %}
{% bootstrap_button button_type="submit" content="Submit" extra_classes="offset-sm-2" %} {% bootstrap_button button_type="submit" content="Submit" extra_classes="offset-sm-2" %}
</form> </form>
<div class="form-text mt-5">
<div class="small text-muted mt-5">
<p id="pi"> <p id="pi">
<b><i class="bi bi-exclamation-circle"></i> Personal information requiring consent</b> <b><i class="bi bi-exclamation-circle"></i> Personal information requiring consent</b>
</p> </p>
<p> <p>
Personal information in the datatracker which is derived from your contributions Personal information in the datatracker which is derived from your contributions
to the IETF standards development process is covered by the EU General Data Protection to the IETF standards development process is covered by the EU General Data Protection
Regulation's Regulation's
<a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679#d1e1888-1-1">Article 6(1)&nbsp;(f)</a> <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679#d1e1888-1-1">
Article 6(1)&nbsp;(f)
</a>
covering IETF's Legitimate Interest due to the IETF's mission of developing standards covering IETF's Legitimate Interest due to the IETF's mission of developing standards
for the internet. See also the page on <a href="/help/personal-information">handling for the internet. See also the page on
of personal information</a>. <a href="/help/personal-information">
handling
of personal information
</a>.
</p> </p>
<p> <p>
Personal information which is <i>not</i> derived from your contributions is covered by the EU Personal information which is <i>not</i> derived from your contributions is covered by the EU
<a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679#d1e1888-1-1">GDPR Article 6(1)&nbsp;(a)</a> <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679#d1e1888-1-1">
GDPR Article 6(1)&nbsp;(a)
</a>
regarding consent. All such information is visible on this page and shown with the regarding consent. All such information is visible on this page and shown with the
<i class="bi bi-exclamation-circle"></i> symbol next to it, or listed on your <i class="bi bi-exclamation-circle"></i> symbol next to it, or listed on your
<a href="{% url 'ietf.community.views.view_list' user.username %}">notification subscription page</a>. Most of this <a href="{% url 'ietf.community.views.view_list' user.username %}">notification subscription page</a>.
Most of this
information can be edited or removed on these pages. There are some exceptions, such information can be edited or removed on these pages. There are some exceptions, such
as photos, which currently require an email to <a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">the Secretariat</a> as photos, which currently require an email to
<a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">the Secretariat</a>
if you wish to update or remove the information. if you wish to update or remove the information.
</p> </p>
<p> <p>
All the information the datatracker has that is coupled to this account and visible All the information the datatracker has that is coupled to this account and visible
on this page or otherwise related to your work on ietf documents, is also available on this page or otherwise related to your work on ietf documents, is also available
to you as a <a href="{% url 'ietf.api.views.PersonalInformationExportView' %}">JSON blob</a> when to you as a
<a href="{% url 'ietf.api.views.PersonalInformationExportView' %}">JSON blob</a>
when
you are logged in. It contains both the Legitimate Interest information and the information you are logged in. It contains both the Legitimate Interest information and the information
that requires Consent. that requires Consent.
</p> </p>
</div> </div>
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script> <script>
$(document) $(document)

View file

@ -1,22 +1,22 @@
{# 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 %}
{% block title %}Account management{% endblock %} {% block title %}Account management{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Account management</h1> <h1>Account management</h1>
<div class="buttonlist"> <div class="buttonlist">
{% if user.username %} {% if user.username %}
<a type="a" class="btn btn-primary" href="/accounts/profile/">View/edit profile</a> <a type="a" class="btn btn-primary" href="/accounts/profile/">View/edit profile</a>
{% else %} {% else %}
<a type="a" class="btn btn-primary" href="/accounts/login/" rel="nofollow">Sign in</a> <a type="a"
class="btn btn-primary"
href="/accounts/login/"
rel="nofollow">Sign in</a>
{% endif %} {% endif %}
<a type="a" class="btn btn-info" href="/accounts/create/">New account</a> <a type="a" class="btn btn-info" href="/accounts/create/">New account</a>
<a type="a" class="btn btn-warning" href="/accounts/reset/">Reset password</a> <a type="a" class="btn btn-warning" href="/accounts/reset/">Reset password</a>
<a type="a" class="btn btn-primary" href="/accounts/settings/">Change browser preferences</a> <a type="a" class="btn btn-primary" href="/accounts/settings/">Change browser preferences</a>
</div> </div>
{% endblock %}
{% endblock %}

View file

@ -1,15 +1,13 @@
{# 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 %}
{% block title %}Signed out{% endblock %} {% block title %}Signed out{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>You have been signed out</h1> <h1>You have been signed out</h1>
<a class="btn btn-primary" href="/accounts/login/" rel="nofollow">Sign in</a> <a class="btn btn-primary my-3" href="/accounts/login/" rel="nofollow">Sign in</a>
{% endblock %} {% endblock %}
{% block js %} {% block js %}
{% if request.META.HTTP_REFERER %} {% if request.META.HTTP_REFERER %}
<script> <script>
@ -21,4 +19,4 @@
}); });
</script> </script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View file

@ -1,26 +1,17 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Sign in{% endblock %} {% block title %}Sign in{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Sign in</h1> <h1>Sign in</h1>
<script>window.scrollTo(0, 0)</script>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Sign in" %} {% bootstrap_button button_type="submit" content="Sign in" %}
<a class="btn btn-secondary"
<div class="float-end"> href="{% url 'ietf.ietfauth.views.password_reset' %}">Forgot your password?</a>
Forgot your password?
<a href="{% url 'ietf.ietfauth.views.password_reset' %}">Request a reset</a>.
</div>
</form> </form>
{% endblock %} {% endblock %}

View file

@ -1,19 +1,17 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin %}
{% block title %}Complete account creation{% endblock %} {% block title %}Complete account creation{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Additional Assistance Required</h1> <h1>Additional Assistance Required</h1>
<p class="alert alert-info my-3">
<p>
Our apologies, it looks like there was an issue creating your Datatracker account. Our apologies, it looks like there was an issue creating your Datatracker account.
Please send an email to the <a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">IETF secretariat</a> and we'll get you set up promptly. Please send an email to the
<a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">IETF secretariat</a>
and we'll get you set up promptly.
</p> </p>
<a class="btn btn-primary"
href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">Email IETF secretariat</a>
{% endblock %} {% endblock %}

View file

@ -1,14 +1,16 @@
{# 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 %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Missing person info</h1> <h1>Missing person record</h1>
<p class="alert alert-danger my-3">
<p>
There is no person record associated with your login. Please There is no person record associated with your login. Please
contact the secretariat at <a href="mailto:{{settings.SECRETARIAT_INFO_EMAIL}}">{{settings.SECRETARIAT_INFO_EMAIL}}</a> contact the secretariat at
<a href="mailto:{{ settings.SECRETARIAT_INFO_EMAIL }}">{{ settings.SECRETARIAT_INFO_EMAIL }}</a>
and explain the situation. and explain the situation.
</p> </p>
<a class="btn btn-primary"
href="mailto:{{ settings.SECRETARIAT_INFO_EMAIL }}">Contact the secretariat</a>
{% endblock %} {% endblock %}

View file

@ -1,26 +1,22 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Password reset{% endblock %} {% block title %}Password reset{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
{% if success %} {% if success %}
<h1>Password reset successful</h1> <h1>Password reset successful</h1>
<p>Your password reset request has been successfully received .</p> <p class="alert alert-success my-3">
<p>We have sent you an email with instructions on how to set a new password.</p> Your password reset request has been successfully received.
We have sent you an email with instructions on how to set a new password.
</p>
{% else %} {% else %}
<h1>Password reset</h1> <h1>Password reset</h1>
<p class="alert alert-info my-3">
<p>Please enter the account for which you would like to reset the password.</p> Please enter the account for which you would like to reset the password.
</p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}

View file

@ -1,78 +1,77 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin %}
{% block title %}About the Datatracker{% endblock %} {% block title %}About the Datatracker{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>About the IETF Datatracker</h1> <h1>About the IETF Datatracker</h1>
<p> <p>
The IETF Datatracker is the primary day-to-day front-end to the IETF database for people The IETF Datatracker is the primary day-to-day front-end to the IETF database for people
who work on IETF standards. It contains data about the documents, working groups, who work on IETF standards. It contains data about the documents, working groups,
meetings, agendas, minutes, presentations, and more, of the IETF. meetings, agendas, minutes, presentations, and more, of the IETF.
The primary public face of the IETF is at <a href="https://www.ietf.org/">www.ietf.org</a>. The primary public face of the IETF is at
<a href="https://www.ietf.org/">www.ietf.org</a>.
</p> </p>
<p> <p>
All the Datatracker code is publicly available from the All the Datatracker code is publicly available from the
<a href="https://svn.ietf.org/svn/tools/ietfdb">IETF tools SVN repository</a>. <a href="https://svn.ietf.org/svn/tools/ietfdb">IETF tools SVN repository</a>.
Bug tickets and wiki notes are available from the Bug tickets and wiki notes are available from the
<a href="https://trac.ietf.org/trac/ietfdb">Issue Tracker</a>, and <a href="https://trac.ietf.org/trac/ietfdb">Issue Tracker</a>,
there are also <a href="/release">release notes</a> available since version 2.00. and
there are also
<a href="/release">release notes</a>
available since version 2.00.
</p> </p>
<p> <p>
Below you'll find a brief history of the datatracker development, in terms of the big Below you'll find a brief history of the datatracker development, in terms of the big
moments. For the nitty-gritty week-to-week code changes, please check the release moments. For the nitty-gritty week-to-week code changes, please check the release
notes or the commit log. notes or the commit log.
</p> </p>
<h2>Version 6.x Work</h2> <h2>Version 6.x Work</h2>
<p> <p>
Between the release of 6.0.0 in April 2015 and the <a href="/release/">latest release</a> Between the release of 6.0.0 in April 2015 and the
<a href="/release/">latest release</a>
there has been numerous releases (75, as of 11 Feb 2017) which has extended the there has been numerous releases (75, as of 11 Feb 2017) which has extended the
functionality of the datatracker substantially. The <a href="/release/#release-list">release list</a> functionality of the datatracker substantially. The
<a href="/release/#release-list">release list</a>
gives more information. gives more information.
</p> </p>
<h2>Version 6.0.0: Facelift using Bootstrap</h2> <h2>Version 6.0.0: Facelift using Bootstrap</h2>
<p> <p>
During more than a year, from July 2013 to late 2014, <i>Lars Eggert</i> worked intensively During more than a year, from July 2013 to late 2014, <i>Lars Eggert</i> worked intensively
on a major facelift to the datatracker, porting the GUI to Bootstrap. The work on a major facelift to the datatracker, porting the GUI to Bootstrap. The work
took took
<a href="https://trac.ietf.org/trac/ietfdb/log/personal/lars?rev=8652&amp;stop_rev=5871&amp;limit=500"> <a href="https://trac.ietf.org/trac/ietfdb/log/personal/lars?rev=8652&amp;stop_rev=5871&amp;limit=500">
287 separate commits 287 separate commits
</a>, and comprised changes to 1016 different files. </a>,
and comprised changes to 1016 different files.
</p> </p>
<p> <p>
This work has turned the IETF Datatracker website into a responsive website which This work has turned the IETF Datatracker website into a responsive website which
support use on a much larger variety of devices, from small mobile devices to desktops. support use on a much larger variety of devices, from small mobile devices to desktops.
</p> </p>
<p> <p>
The work relies heavily on the capabilities of <a href="https://getbootstrap.com"> The work relies heavily on the capabilities of
Bootstrap</a>, and continues to use the <a href="https://www.djangoproject.org/">Django</a> <a href="https://getbootstrap.com">Bootstrap</a>,
framework which the datatracker has been build on since <a href="/release/2.00/">version and continues to use the
2.00</a>. It also uses icons from <a href="https://fontawesome.com/">FontAwesome</a>, and functions from <a href="https://www.djangoproject.org/">Django</a>
framework which the datatracker has been build on since
<a href="/release/2.00/">
version
2.00
</a>.
It also uses icons from
<a href="https://fontawesome.com/">FontAwesome</a>,
and functions from
<a href="https://django-bootstrap3.readthedocs.org/">django-bootstrap3</a>. <a href="https://django-bootstrap3.readthedocs.org/">django-bootstrap3</a>.
</p> </p>
<p> <p>
Additional Additional
<a href="https://trac.ietf.org/trac/ietfdb/log/branch/iola?rev=9116&amp;stop_rev=8520&amp;limit=200"> <a href="https://trac.ietf.org/trac/ietfdb/log/branch/iola?rev=9116&amp;stop_rev=8520&amp;limit=200">
page conversion work page conversion work
</a> has been done by <i>Ole Laursen</i>, with </a>
has been done by <i>Ole Laursen</i>, with
<a href="https://trac.ietf.org/trac/ietfdb/log/personal/henrik/facelift-r9116"> <a href="https://trac.ietf.org/trac/ietfdb/log/personal/henrik/facelift-r9116">
final style tweaks, bug-fixes and adaptations final style tweaks, bug-fixes and adaptations
</a> </a>
@ -81,47 +80,60 @@
(with the addition of complementing green and red colours for success and error indications), (with the addition of complementing green and red colours for success and error indications),
and a selection of fonts from and a selection of fonts from
<a href="https://www.paratype.com/public/">ParaType</a> <a href="https://www.paratype.com/public/">ParaType</a>
(<a href="https://www.identifont.com/show?2G32">PT Serif</a> for body text, (<a href="https://www.identifont.com/show?2G32">PT Serif</a>
<a href="https://www.identifont.com/show?2G2G">PT Sans Caption</a> for headers, for body text,
<a href="https://www.identifont.com/show?2G2F">PT Sans</a> for menus, <a href="https://www.identifont.com/show?2G2G">PT Sans Caption</a>
for headers,
<a href="https://www.identifont.com/show?2G2F">PT Sans</a>
for menus,
and PT Mono for monospaced documents). (Even if PT Sans Caption was and PT Mono for monospaced documents). (Even if PT Sans Caption was
created as a 'Caption' (6-8pt) <a href="https://en.wikipedia.org/wiki/Font#Optical_size"> created as a 'Caption' (6-8pt)
optical size</a> font to go with PT Sans, it works well for headers when paired with PT Serif.) <a href="https://en.wikipedia.org/wiki/Font#Optical_size">optical size</a>
font to go with PT Sans, it works well for headers when paired with PT Serif.)
</p> </p>
<h2>Version 5.x Work</h2> <h2>Version 5.x Work</h2>
<p> <p>
Between the release of 5.0.0 in January 2014 and the last release in the 5.x series in Between the release of 5.0.0 in January 2014 and the last release in the 5.x series in
April 2015, there were 42 releases containing bug fixes and features. Worth mentioning April 2015, there were 42 releases containing bug fixes and features. Worth mentioning
were 4 code sprint releases, added support for the secretariat's agenda scheduling work, were 4 code sprint releases, added support for the secretariat's agenda scheduling work,
the addition of pages for <a href="/rg/">Research Groups</a> and <a the addition of pages for
href="/group/edu">Teams</a>, a <a href="/api/v1/?format=json">JSON interface</a> to the <a href="/rg/">Research Groups</a>
database for tool builders, improved <a href="/ipr/">IPR support</a>, a move to Django 1.7, and
and many <a href="https://trac.ietf.org/trac/ietfdb/wiki/Testing?version=13"> <a href="/group/edu">Teams</a>,
improvements in testing support</a>. a
<a href="/api/v1/?format=json">JSON interface</a>
to the
database for tool builders, improved
<a href="/ipr/">
IPR support
</a>,
a move to Django 1.7,
and many
<a href="https://trac.ietf.org/trac/ietfdb/wiki/Testing?version=13">
improvements in testing support
</a>.
</p> </p>
<h2>
<h2>Version 5.0.0: Shim Removal</h2> Version 5.0.0: Shim Removal
</h2>
<div class="alert alert-info"> <div class="alert alert-info">
To be written. To be written.
</div> </div>
<h2>
<h2>Version 4.00: New Database Schema</h2> Version 4.00: New Database Schema
</h2>
<div class="alert alert-info"> <div class="alert alert-info">
To be written. To be written.
</div> </div>
<h2>
<h2>Version 3.00: Django Port of the IESG Datatracker Pages</h2> Version 3.00: Django Port of the IESG Datatracker Pages
</h2>
<div class="alert alert-info"> <div class="alert alert-info">
To be written. To be written.
</div> </div>
<h2>
<h2>Version 2.00: Django Port of the Public Datatracker Pages</h2> Version 2.00: Django Port of the Public Datatracker Pages
</h2>
<p> <p>
This release was a complete re-write of the CGI/Perl-based IESG datatracker This release was a complete re-write of the CGI/Perl-based IESG datatracker
in Python, using the Django framework. It comprised about 8000 lines of in Python, using the Django framework. It comprised about 8000 lines of
@ -134,16 +146,19 @@
to get all public pages ported and released. The release was deployed to get all public pages ported and released. The release was deployed
in the early hours of 28 June 2007, and nobody noticed the change :-)) in the early hours of 28 June 2007, and nobody noticed the change :-))
</p> </p>
<h2>
<h2>Version 1.0: Initial Perl/MySQL database and web-pages</h2> Version 1.0: Initial Perl/MySQL database and web-pages
</h2>
<p> <p>
The first version of the idtracker was commissioned by the IESG under <i>Harald The first version of the idtracker was commissioned by the IESG under <i>Harald
Alvestrand</i> in 2001, and the IESG started using it at the beginning of 2002. It was Alvestrand</i> in 2001, and the IESG started using it at the beginning of 2002. It was
written by <i>Michael Lee</i> in Perl, with direct SQL statements. It provided a written by <i>Michael Lee</i> in Perl, with direct SQL statements. It provided a
major improvement in visibility of the progress of drafts by the IESG. major improvement in visibility of the progress of drafts by the IESG.
The first <a href="https://www.ietf.org/proceedings/55/slides/plenary-6/plenary-6.ppt"> The first
public presentation</a> of it and its capabilities was made 2002-11-20 <a href="https://www.ietf.org/proceedings/55/slides/plenary-6/plenary-6.ppt">
in Atlanta by Thomas Narten. public presentation
</p> </a>
of it and its capabilities was made 2002-11-20
in Atlanta by Thomas Narten.
</p>
{% endblock %} {% endblock %}

View file

@ -1,18 +1,19 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %} {% extends "base.html" %}
{% load origin %} {% load origin textfilters ietf_filters %}
{% load cache %} {% load cache %}
{% block title %}Release information{% endblock %} {% block title %}Release information{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<div class="row"> <div class="row">
<h1 class="col-11"> <h1 class="col-11">
<a href="https://trac.ietf.org/trac/ietfdb/browser/tags/{{ entry.version }}"> <a class="text-reset text-decoration-none"
Version {{ entry.version }}</a> href="https://trac.ietf.org/trac/ietfdb/browser/tags/{{ entry.version }}">
<br><small class="text-muted">Released {{ entry.date }}</small> Version {{ entry.version }}
</a>
<br>
<small class="text-muted">Released {{ entry.date }}</small>
</h1> </h1>
<div class="col-1 text-end"> <div class="col-1 text-end">
<a href="{% url "ietf.release.views.stats" %}" class="icon-link"> <a href="{% url "ietf.release.views.stats" %}" class="icon-link">
@ -20,16 +21,20 @@
</a> </a>
</div> </div>
</div> </div>
<ul class="pagination d-flex py-2"> <ul class="pagination d-flex py-2">
<li class="me-auto page-item {% if not entry.prev %}disabled{% endif %}"> <li class="me-auto page-item {% if not entry.prev %}disabled{% endif %}">
<a class="page-link" href="{% if entry.prev %}/release/{{ entry.prev.version }}/{% else %}#{% endif %}"><span class="bi bi-arrow-left"></span> Previous release</a> <a class="page-link"
href="{% if entry.prev %}/release/{{ entry.prev.version }}/{% else %}#{% endif %}">
<span class="bi bi-arrow-left"></span> Previous release
</a>
</li> </li>
<li class="page-item {% if not entry.next %}disabled{% endif %}"> <li class="page-item {% if not entry.next %}disabled{% endif %}">
<a class="page-link" href="{% if entry.next %}/release/{{ entry.next.version }}/{% else %}#{% endif %}">Next release <span class="bi bi-arrow-right"></span></a> <a class="page-link"
href="{% if entry.next %}/release/{{ entry.next.version }}/{% else %}#{% endif %}">
Next release <span class="bi bi-arrow-right"></span>
</a>
</li> </li>
</ul> </ul>
<p> <p>
{% if coverage %} {% if coverage %}
Tested: Tested:
@ -38,40 +43,47 @@
<b>URLs</b>: {{ coverage.url.percentage|stringformat:".2f" }}% <b>URLs</b>: {{ coverage.url.percentage|stringformat:".2f" }}%
{% endif %} {% endif %}
{% if code_coverage_url %} {% if code_coverage_url %}
<br/> (A
(A <a href="{{ code_coverage_url }}">code test coverage report</a> dated {{ code_coverage_time }} is available.) <a href="{{ code_coverage_url }}">code test coverage report</a>
dated {{ code_coverage_time }} is available.)
{% endif %} {% endif %}
</p> </p>
<h2 class="mt-3">{{ entry.version }} release notes</h2>
<h2>{{ entry.version }} release notes</h2> {% if entry.title %}<h3 class="mt-3">{{ entry.title }}</h3>{% endif %}
{% if entry.title %}<h4>{{ entry.title }}</h4>{% endif %} <pre>{{ entry.html|linkify|urlize_ietf_docs }}</pre>
<pre>{{ entry.html|safe }} <div class="text-muted mt-1 ms-3">&mdash; {{ entry.author }} &lt;{{ entry.email|linkify }}&gt; {{ entry.date }}</div>
&mdash; {{ entry.author }} &lt;{{ entry.email }}&gt; {{ entry.date }}
</pre>
{% cache 3600 ietf_release_list %} {% cache 3600 ietf_release_list %}
<div id="release-list"></div> <div id="release-list"></div>
<h2>Release list:</h2> <h2 class="mt-3">Release list</h2>
<table class="table table-striped table-sm">
<table class="table table-striped table-sm"> <thead>
<tr>
<th>Version</th>
<th>Release date</th>
<th>Feature summary</th>
</tr>
</thead>
<tbody>
{% for item in releases %} {% for item in releases %}
{% ifchanged %} {% ifchanged %}
<tr class="table-info"> <tr class="table-info">
<th colspan="3" class="h4">{{ item.date|slice:"7:11" }}</th> <th></th>
<th class="text-end">{{ item.date|slice:"7:11" }}</th>
<th></th>
</tr> </tr>
{% endifchanged %} {% endifchanged %}
<tr> <tr>
<td class="text-end"><a href="/release/{{ item.version }}/">{{ item.version }}</a></td> <td class="text-end">
<td class="text-end pe-3">{{ item.date|slice:":11" }}</td> <a href="/release/{{ item.version }}/">{{ item.version }}</a>
<td>{{ item.title }}</td> </td>
<td class="text-end">{{ item.date|slice:":11" }}</td>
<td>{{ item.title|linkify|urlize_ietf_docs }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </tbody>
{% endcache %} </table>
{% endcache %}
{% endblock %} {% endblock %}
{% block footer %} {% block footer %}
<p class="text-center"> <p class="text-center">
<a href="https://trac.ietf.org/trac/ietfdb/wiki/ContractorInstructions">Contractor instructions</a> <a href="https://trac.ietf.org/trac/ietfdb/wiki/ContractorInstructions">Contractor instructions</a>

View file

@ -1,63 +1,60 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% load humanize %} {% load humanize %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Add pre-approval{% endblock %} {% block title %}Add pre-approval{% endblock %}
{% load ietf_filters %} {% load ietf_filters %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<h2 class="mt-3">Add pre-approval</h2>
<h2>Add pre-approval</h2> <p>
You can register a pre-approved draft name. Then the chair
<p>You can register a pre-approved draft name. Then the chair approval step of group <code>-00</code> submissions is suspended for that draft name
approval step of group -00 submissions is suspended for that draft name so a future submission is posted to the data tracker immediately.
so a future submission is posted to the data tracker immediately.</p> </p>
<p>
<p>When the revision -00 draft is submitted, the pre-approval will not When the revision <code>-00</code> draft is submitted, the pre-approval will not
be shown anymore as it has fulfilled its purpose (only revision -00 submissions are be shown anymore as it has fulfilled its purpose (only revision <code>-00</code> submissions are
subject to approval). If the draft never shows up, you can instead subject to approval). If the draft never shows up, you can instead
later cancel the pre-approval to get rid of it.</p> later cancel the pre-approval to get rid of it.
</p>
<h3>Instructions</h3> <h2 class="mt-3">Instructions</h2>
<p class="alert alert-warning my-3">
<p class="alert alert-warning">Do not include <code>-00</code> and do not include a file extension Do not include a version (like <code>-00</code>) and do not include a file extension
like <code>.txt</code> in the name.</p> (like <code>.txt</code>) in the name.
</p>
{% if user|has_role:"Secretariat" %} {% if user|has_role:"Secretariat" %}
<p class="alert alert-info">Only group submissions are subject to approval and are thus pre-approvable.</p> <p class="alert alert-info my-3">
Only group submissions are subject to approval and are thus pre-approvable.
</p>
{% else %} {% else %}
<p>As chair{% if groups|length > 1 %} of {{ groups|length|apnumber }} groups{% endif %} you can pre-approve draft names on the form:</p> <p>
As chair
{% if groups|length > 1 %}of {{ groups|length|apnumber }} groups{% endif %}
you can pre-approve draft names on the form:
</p>
<p class="buttonlist"> <p class="buttonlist">
{% for g in groups %} {% for g in groups %}
<button class="btn btn-primary name-template">draft-ietf-<b>{{ g.acronym }}</b>-<i>something</i></button> <button class="btn btn-primary name-template">
draft-ietf-<b>{{ g.acronym }}</b>-<i>something</i>
</button>
{% endfor %} {% endfor %}
</p> </p>
{% endif %} {% endif %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Save</button> <button type="submit" class="btn btn-primary">Save</button>
<a class="btn btn-secondary float-end" href="{% url "ietf.submit.views.approvals" %}#preapprovals">Back</a> <a class="btn btn-secondary float-end"
href="{% url "ietf.submit.views.approvals" %}#preapprovals">Back</a>
</form> </form>
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script> <script>
$(".name-template").click(function (){ $(".name-template").click(function (){
$("form input[name=name]").text("").focus().val($(this).text().replace("something", "")); $("form input[name=name]").text("").focus().val($(this).text().replace("something", ""));
}); });
</script> </script>
{% endblock %} {% endblock %}

View file

@ -1,39 +1,33 @@
{# 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 %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}
{% block title %}{% if submission == None %}Add new submission request email{% else %}Add submission request email to {{ submission.name }}{% endif %}{% endblock %} {% if submission == None %}
Add new submission request email
{% else %}
Add submission request email to {{ submission.name }}
{% endif %}
{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Add email</h1> <h1>Add email</h1>
<p class="my-3">
{% if submission == None %} {% if submission == None %}
<p>
A new submission request will be created for the given name and revision. The A new submission request will be created for the given name and revision. The
name must take the form "draft-xxx-nn" where xxx is lowercase letters, digits or dashes name must take the form <code>draft-xxx-nn</code> where <code>xxx</code> is lowercase letters, digits or dashes
and nn is the revision number - 00 for the initial revision. For example<br/> and <code>nn</code> is the revision number, <code>00</code> for the initial revision. For example,
&nbsp;&nbsp;&nbsp;draft-my-spec-00 <code>draft-my-spec-00</code>.
</p> {% else %}
{% else %} The email will be added to the submission history for {{ submission.name }}.
<p> {% endif %}
The email will be added to the submission history for {{ submission.name }} </p>
</p> <form class="add-email my-3" method="post">
{% endif %}
<form class="add-email" method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Add Email</button> <button type="submit" class="btn btn-primary">Add Email</button>
<a class="btn btn-secondary float-end" href="{% url "ietf.submit.views.manualpost" %}">Back</a> <a class="btn btn-secondary float-end"
href="{% url "ietf.submit.views.manualpost" %}">Back</a>
</form> </form>
{% endblock %}
{% endblock %}

View file

@ -1,21 +1,19 @@
{# 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 %}
{% block title %}Draft submission API instructions{% endblock %} {% block title %}Draft submission API instructions{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h2>Draft submission API instructions</h2> <h1 class="mb-3">Draft submission API instructions</h1>
<p> <p>
A simplified draft submission interface, intended for automation, A simplified draft submission interface, intended for automation,
is available at <code>{% url 'ietf.submit.views.api_submit' %}</code>. is available at <code>{% url 'ietf.submit.views.api_submit' %}</code>.
</p> </p>
<p> <p>
The interface accepts only xml uploads which can be processed on the server, and The interface accepts only XML uploads that can be processed on the server, and
requires the user to have a datatracker account. A successful submit still requires requires the user to have a datatracker account. A successful submit still requires
the same email confirmation roundtrip as submissions done through the regular the same email confirmation round-trip as submissions done through the regular
<a href="{% url 'ietf.submit.views.upload_submission' %}">submission tool</a>. <a href="{% url 'ietf.submit.views.upload_submission' %}">submission tool</a>.
</p> </p>
<p> <p>
@ -23,16 +21,21 @@
Some limitations: Some limitations:
</p> </p>
<ul> <ul>
<li>Only xml-only uploads are supported, not text or combined.</li> <li>Only XML-only uploads are supported, not text or combined.</li>
<li>Document replacement information cannot be supplied.</li> <li>Document replacement information cannot be supplied.</li>
<li>The server expects <code>multipart/form-data</code>, supported by <code>curl</code> but <b>not</b> by <code>wget</code></li> <li>
The server expects <code>multipart/form-data</code>, supported by <code>curl</code> but <b>not</b> by <code>wget</code>.
</li>
</ul> </ul>
<p> <p>
It takes 2 parameters: It takes two parameters:
</p> </p>
<ul> <ul>
<li><code>user</code> which is the user login</li> <li>
<li><code>xml</code>, which is the submitted file <code>user</code> which is the user login
</li>
<li>
<code>xml</code>, which is the submitted file
</ul> </ul>
<p> <p>
It returns an appropriate http result code, and a brief explanatory text message. It returns an appropriate http result code, and a brief explanatory text message.
@ -40,11 +43,8 @@
<p> <p>
Here is an example: Here is an example:
</p> </p>
<pre> <pre class="border p-3">
$ curl -S -F "user=user.name@example.com" -F "xml=@~/draft-user-example.xml" https://datatracker.ietf.org/api/submit $ curl -S -F "user=user.name@example.com" -F "xml=@~/draft-user-example.xml" https://datatracker.ietf.org/api/submit
Upload of draft-user-example OK, confirmation requests sent to: Upload of draft-user-example OK, confirmation requests sent to:
User Name &lt;user.name@example.com&gt; User Name &lt;user.name@example.com&gt;</pre>
</pre> {% endblock %}
{% endblock %}

View file

@ -1,22 +1,20 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static %} {% load origin static person_filters ietf_filters %}
{% block pagehead %} {% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}"> <link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %} {% endblock %}
{% block title %}Draft submission approvals{% endblock %} {% block title %}Draft submission approvals{% endblock %}
{% load ietf_filters %} {% load ietf_filters %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
{% if user.is_authenticated %} {% if user.is_authenticated %}
<h2 id="approvals">Submissions you can approve</h2> <h2 class="mt-5" id="approvals">Submissions you can approve</h2>
{% if not approvals %} {% if not approvals %}
<p>You don't have any submissions to approve.</p> <p class="alert alert-info my-3">
You don't have any submissions to approve.
</p>
{% else %} {% else %}
<table class="approvals table table-sm table-striped tablesorter"> <table class="approvals table table-sm table-striped tablesorter">
<thead> <thead>
@ -28,22 +26,28 @@
<tbody> <tbody>
{% for s in approvals %} {% for s in approvals %}
<tr> <tr>
<td><a href="{% url "ietf.submit.views.submission_status" submission_id=s.pk access_token=s.access_token %}">{{ s.name }}-{{ s.rev }}</a></td> <td>
<a href="{% url "ietf.submit.views.submission_status" submission_id=s.pk access_token=s.access_token %}">
{{ s.name }}-{{ s.rev }}
</a>
</td>
<td>{{ s.submission_date }}</td> <td>{{ s.submission_date }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
<h2 class="mt-5" id="preapprovals">Pre-approved drafts not yet submitted</h2>
<h2 id="preapprovals">Pre-approved drafts not yet submitted</h2>
{% if user|has_role:"Secretariat,WG Chair,RG Chair" %} {% if user|has_role:"Secretariat,WG Chair,RG Chair" %}
<p><a class="btn btn-primary" href="{% url "ietf.submit.views.add_preapproval" %}">Add pre-approval</a></p> <p>
<a class="btn btn-primary"
href="{% url "ietf.submit.views.add_preapproval" %}">Add pre-approval</a>
</p>
{% endif %} {% endif %}
{% if not preapprovals %} {% if not preapprovals %}
<p>No pre-approvals within your jurisdiction found.</p> <p class="alert alert-info my-3">
No pre-approvals within your jurisdiction found.
</p>
{% else %} {% else %}
<table class="preapprovals table table-sm table-striped tablesorter"> <table class="preapprovals table table-sm table-striped tablesorter">
<thead> <thead>
@ -57,20 +61,25 @@
<tbody> <tbody>
{% for p in preapprovals %} {% for p in preapprovals %}
<tr> <tr>
<td>{{ p.name }}</td> <td>{{ p.name|urlize_ietf_docs }}</td>
<td>{{ p.time|date:"Y-m-d" }}</td> <td>{{ p.time|date:"Y-m-d" }}</td>
<td>{{ p.by }}</td> <td>{% person_link p.by %}</td>
<td><a class="btn btn-danger btn-sm" href="{% url "ietf.submit.views.cancel_preapproval" preapproval_id=p.id %}">Cancel</a></td> <td>
<a class="btn btn-danger btn-sm float-end"
href="{% url "ietf.submit.views.cancel_preapproval" preapproval_id=p.id %}">
Cancel
</a>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
<h2 class="mt-5" id="recently-approved">Approved drafts within the past {{ days }} days</h2>
<h2 id="recently-approved">Approved drafts within the past {{ days }} days</h2>
{% if not recently_approved %} {% if not recently_approved %}
<p>No drafts approved.</p> <p class="alert alert-info my-3">
No drafts approved.
</p>
{% else %} {% else %}
<table class="recently-approved table table-sm table-striped tablesorter"> <table class="recently-approved table table-sm table-striped tablesorter">
<thead> <thead>
@ -82,26 +91,31 @@
<tbody> <tbody>
{% for d in recently_approved %} {% for d in recently_approved %}
<tr> <tr>
<td><a href="{% url "ietf.doc.views_doc.document_main" d.name %}">{{ d.name }}</a></td> <td>
<a href="{% url "ietf.doc.views_doc.document_main" d.name %}">{{ d.name }}</a>
</td>
<td>{{ d.submission_date }}</td> <td>{{ d.submission_date }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
{% else %} {% else %}
<h2>Submission of approvals</h2> <h2>Submission of approvals</h2>
<p> <p>
This is where chairs and the secretariat can approve and pre-approve document This is where chairs and the secretariat can approve and pre-approve document
submissions which require approval, such as WG -00 drafts. submissions which require approval, such as WG <code>-00</code> drafts.
</p> </p>
<p> <p>
You need to <a href="https://{{ request.get_host }}/accounts/login/?next={{request.get_full_path|urlencode}}" rel="nofollow">sign in</a> in order to handle approvals. You need to
<a href="https://{{ request.get_host }}/accounts/login/?next={{ request.get_full_path|urlencode }}"
rel="nofollow">
sign in
</a>
in order to handle approvals.
</p> </p>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script src="{% static "ietf/js/list.js" %}"></script> <script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,30 +1,21 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin person_filters %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Cancel pre-approval{% endblock %} {% block title %}Cancel pre-approval{% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<h2>Cancel pre-approval</h2> <h2>Cancel pre-approval</h2>
<p class="alert alert-info my-3">
<p> Pre-approval of <b>{{ preapproval.name }}</b> by <b>{% person_link preapproval.by %}</b>
Pre-approval of <b>{{ preapproval.name }}</b> by <b>{{ preapproval.by }}</b>
on <b>{{ preapproval.time }}</b>. on <b>{{ preapproval.time }}</b>.
</p> </p>
<form class="actions" method="post"> <form class="actions" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="cancel"> <input type="hidden" name="action" value="cancel">
<button type="submit" class="btn btn-danger">Cancel pre-approval</button> <button type="submit" class="btn btn-danger">Cancel pre-approval</button>
<a class="btn btn-secondary float-end" href="{% url "ietf.submit.views.approvals" %}#preapprovals">Back</a> <a class="btn btn-secondary float-end"
href="{% url "ietf.submit.views.approvals" %}#preapprovals">Back</a>
</form> </form>
{% endblock %}
{% endblock %}

View file

@ -1,57 +1,71 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% block title %}Confirm submission of {{ submission.name }}{% endblock %} {% block title %}Confirm submission of {{ submission.name }}{% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<h2>Confirm submission of {{ submission.name }}</h2> <h2>Confirm submission of {{ submission.name }}</h2>
{% if submission.state_id != "auth" and submission.state_id != "aut-appr" %} {% if submission.state_id != "auth" and submission.state_id != "aut-appr" %}
{% if submission.state_id == "posted" %} {% if submission.state_id == "posted" %}
<p>The submission has already been posted. See the <a href="{% url "ietf.doc.views_doc.document_main" name=submission.name %}">draft here</a>.</p> <p class="alert alert-info my-3">
The submission has already been posted. See the
<a href="{% url "ietf.doc.views_doc.document_main" name=submission.name %}">draft here</a>.
</p>
{% else %} {% else %}
<p>The submission is not in a state where it can be confirmed.</p> <div class="alert alert-info my-3">
<p>
<p>Go to the <b><a href="{% url "ietf.submit.views.submission_status" submission_id=submission.pk %}">status page</a></b> The submission is not in a state where it can be confirmed.
to see what has happened to it.</p> </p>
<p class="mb-0">
Go to the
<a href="{% url "ietf.submit.views.submission_status" submission_id=submission.pk %}">status page</a>
to see what has happened to it.
</p>
</div>
{% endif %} {% endif %}
{% else %} {% else %}
{% if not key_matched %} {% if not key_matched %}
<p class="error">Incorrect authorization key.</p> <div class="alert alert-danger my-3">
<p class="error">
<p>Double-check the link you followed. If everything fails, you can go to Incorrect authorization key.
the <a href="{% url "ietf.submit.views.submission_status" submission_id=submission.pk %}">status page</a>, </p>
cancel the submission and try again.</p> <p class="mb-0">
Double-check the link you followed. If everything fails, you can go to
the
<a href="{% url "ietf.submit.views.submission_status" submission_id=submission.pk %}">status page</a>,
cancel the submission and try again.
</p>
</div>
{% else %} {% else %}
<p>Authorization key accepted.</p> <div class="alert alert-success my-3">
<p>
<p>Go to the <b><a href="{% url "ietf.submit.views.submission_status" submission_id=submission.pk %}">status page</a></b> Authorization key accepted.
for submission details and links to the files which will be posted.</p> </p>
<p>
<p>Please press the button below to finish posting of Go to the
<b>{{ submission.name }}-{{ submission.rev }}</b>.</p> <a href="{% url "ietf.submit.views.submission_status" submission_id=submission.pk %}">status page</a>
for submission details and links to the files which will be posted.
</p>
<p class="mb-0">
Please press the button below to finish posting of
<b>{{ submission.name }}-{{ submission.rev }}</b>.
</p>
</div>
<form id="confirm-submission" method="post"> <form id="confirm-submission" method="post">
{% csrf_token %} {% csrf_token %}
<button class="btn btn-primary" type="submit" name="action" value="confirm">Confirm submission & post draft</button> <button class="btn btn-primary" type="submit" name="action" value="confirm">
<button class="btn btn-danger" type="submit" name="action" value="cancel" >Cancel submission</button> Confirm submission &amp; post draft
</button>
<button class="btn btn-danger" type="submit" name="action" value="cancel">Cancel submission</button>
</form> </form>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script> <script>
$(function () { $(function () {
$("form.confirm-submission").submit(function() { $("form.confirm-submission").on("submit", function() {
if (this.submittedAlready) if (this.submittedAlready)
return false; return false;
else else
@ -59,4 +73,4 @@
}); });
}); });
</script> </script>
{% endblock %} {% endblock %}

View file

@ -1,3 +1,4 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
@ -5,95 +6,97 @@
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% load submit_tags %} {% load submit_tags %}
{% load misc_filters %} {% load misc_filters %}
{% block pagehead %} {% block pagehead %}
{{ block.super }} {{ block.super }}
{{ all_forms|merge_media:'css' }} {{ all_forms|merge_media:'css' }}
{% endblock %} {% endblock %}
{% block title %}Adjust meta-data of submitted {{ submission.name }}{% endblock %} {% block title %}Adjust meta-data of submitted {{ submission.name }}{% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<div class="modal fade" id="twopages" tabindex="-1" role="dialog" aria-labelledby="twopageslabel" aria-hidden="true"> <div class="modal fade"
<div class="modal-dialog modal-xl"> id="twopages"
tabindex="-1"
role="dialog"
aria-labelledby="twopageslabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-bs-dismiss="modal" aria-hidden="true">&times;</button> <h5 class="modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</h5>
<h4 class="modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</h4> <button type="button"
</div> class="btn-close"
<div class="modal-body"> data-bs-dismiss="modal"
{{ submission|two_pages_decorated_with_errors:errors }} aria-label="Close"></button>
</div> </div>
<div class="modal-body">{{ submission|two_pages_decorated_with_errors:errors }}</div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<h2 class="mt-5">Adjust meta-data of submitted {{ submission.name }}</h2>
<h2>Adjust meta-data of submitted {{ submission.name }}</h2>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr> <tr>
<th>Document</th> <th>Document</th>
<td> <td>
{{ submission.name }} {{ submission.name }}
<button class="btn btn-primary btn-sm float-end" data-bs-toggle="modal" data-bs-target="#twopages">View first two pages</button> <button class="btn btn-primary btn-sm float-end ms-1"
data-bs-toggle="modal"
data-bs-target="#twopages">
View first two pages
</button>
{% show_submission_files submission %} {% show_submission_files submission %}
</td> </td>
</tr> </tr>
<tr>
<tr><th>Submission date</th><td>{{ submission.submission_date }}</td></tr> <th>Submission date</th>
<td>{{ submission.submission_date }}</td>
</tr>
<tr> <tr>
<th>Group</th> <th>Group</th>
<td>{{ submission.group|default:"Individual Submission" }} <td>
{% if errors.group %}<p class="text-danger"><b>{{ errors.group }}</b> (Note: the Secretariat will be notified of this)</p>{% endif %} {{ submission.group|default:"Individual Submission" }}
{% if submission.group %}<a href="{{ doc.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if errors.group %}
<p class="mt-1 mb-0 text-danger">
<b>{{ errors.group }}</b> (Note: the Secretariat will be notified of this)
</p>
{% endif %}
</td> </td>
</tr> </tr>
<tr>
<tr><th>File size</th><td>{{ submission.file_size|filesizeformat }}</td></tr> <th>File size</th>
<td>{{ submission.file_size|filesizeformat }}</td>
</tr>
</table> </table>
<h3 class="mt-5">Adjust meta-data</h3>
<h3>Adjust meta-data</h3> {% if form_errors %}<div class="alert alert-danger my-3">Please fix the errors in the form below.</div>{% endif %}
{% if form_errors %}
<div class="alert alert-danger">
Please fix the errors in the form below.
</div>
{% endif %}
<form class="idsubmit" method="post"> <form class="idsubmit" method="post">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form edit_form %} {% bootstrap_form edit_form %}
{% include "submit/submitter_form.html" %} {% include "submit/submitter_form.html" %}
{% include "submit/replaces_form.html" %} {% include "submit/replaces_form.html" %}
{% for form in author_forms %} {% for form in author_forms %}
<div {% if forloop.last %}id="cloner"{% endif %}> <div {% if forloop.last %}id="cloner"{% endif %}>
<h3>Author {{ forloop.counter }}</h3> <h3 class="mt-5">Author {{ forloop.counter }}</h3>
{% bootstrap_form form %} {% bootstrap_form form %}
<input type="hidden" name="authors-prefix" value="{{ form.prefix }}"> <input type="hidden" name="authors-prefix" value="{{ form.prefix }}">
</div> </div>
{% endfor %} {% endfor %}
<input class="btn btn-primary"
type="button"
value="Add another author"
<input class="btn btn-primary" type="button" value="Add another author" id="add-author"> id="add-author">
<input class="btn btn-primary" type="submit" value="Submit for manual posting"> <br>
<input class="btn btn-primary mt-3"
type="submit"
value="Submit for manual posting">
</form> </form>
<p> <p>
{% include "submit/problem-reports-footer.html" %} {% include "submit/problem-reports-footer.html" %}
</p> </p>
{% endblock %} {% endblock %}
{% block js %} {% block js %}
{{ all_forms|merge_media:'js' }} {{ all_forms|merge_media:'js' }}<script src="{% static "ietf/js/draft-submit.js" %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,32 +1,26 @@
{# 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 %}
{% load static %} {% load static %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Email related to{{ submission.name }}{% endblock %} {% block title %}Email related to{{ submission.name }}{% endblock %}
{% block pagehead %} {% block pagehead %}
<link rel="stylesheet" href="{% static 'ietf/css/datepicker.css' %}"> <link rel="stylesheet" href="{% static 'ietf/css/datepicker.css' %}">
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Email related to<br><small class="text-muted">{{ submission.name }}</small></h1> <h1>
Email related to
<form method="post" class="show-required"> <br>
<small class="text-muted">{{ submission.name }}</small>
</h1>
<form method="post" class="show-required" class="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>
</form> </form>
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script src="{% static 'ietf/js/datepicker.js' %}"></script> <script src="{% static 'ietf/js/datepicker.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,4 +1,7 @@
{# bs5ok #}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
<h3>Additional resource information</h3> <h3 class="mt-3">Additional resource information</h3>
{% bootstrap_form extresources_form %} {% bootstrap_form extresources_form %}
<p><b>Valid tags:</b> {{ extresources_form.valid_resource_tags|join:", " }}</p> <p>
<b>Valid tags:</b> {{ extresources_form.valid_resource_tags|join:", " }}
</p>

View file

@ -1,24 +1,22 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_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 %} {% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}"> <link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %} {% endblock %}
{% block title %}Draft submissions awaiting manual posting{% endblock %} {% block title %}Draft submissions awaiting manual posting{% endblock %}
{% load ietf_filters %} {% load ietf_filters %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<h2 class="mt-3" id="man_post">Submissions needing manual posting</h2>
<h2 id="man_post">Submissions needing manual posting</h2>
{% if not manual %} {% if not manual %}
<p id="no-manual">There are no submissions needing manual posting.</p> <p class="alert alert-info my-3" id="no-manual">
There are no submissions needing manual posting.
</p>
{% else %} {% else %}
<table id="manual" class="submissions table table-sm table-striped tablesorter"> <table id="manual"
class="submissions table table-sm table-striped tablesorter">
<thead> <thead>
<tr> <tr>
<th data-sort="draft">Draft</th> <th data-sort="draft">Draft</th>
@ -31,25 +29,44 @@
{% for s in manual %} {% for s in manual %}
<tr> <tr>
{% if user.is_authenticated %} {% if user.is_authenticated %}
<td><a href="{% url "ietf.submit.views.submission_status" submission_id=s.pk access_token=s.access_token %}">{{ s.name }}-{{ s.rev }}</a></td> <td>
<a href="{% url "ietf.submit.views.submission_status" submission_id=s.pk access_token=s.access_token %}">
{{ s.name }}-{{ s.rev }}
</a>
</td>
{% else %} {% else %}
<td><a href="{% url "ietf.submit.views.submission_status" submission_id=s.pk %}">{{ s.name }}-{{ s.rev }}</a></td> <td>
<a href="{% url "ietf.submit.views.submission_status" submission_id=s.pk %}">{{ s.name }}-{{ s.rev }}</a>
</td>
{% endif %} {% endif %}
<td>{{ s.submission_date }}</td> <td>{{ s.submission_date }}</td>
<td>{% if s.passes_checks %}Ok{% else %}Fails{% endif %}</td> <td>
<td>{% if s.errors %}Errors{% else %}Ok{% endif %}</td> {% if s.passes_checks %}
<span class="text-success">Ok</span>
{% else %}
<span class="text-danger">Fails</span>
{% endif %}
</td>
<td>
{% if s.errors %}
<span class="text-danger">Errors</span>
{% else %}
<span class="text-success">Ok</span>
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
<h2 class="mt-3" id="id_upload">Submissions awaiting draft upload</h2>
<h2 id="id_upload">Submissions awaiting draft upload</h2>
{% if not waiting_for_draft %} {% if not waiting_for_draft %}
<p id="no-waiting-for-draft">There are no submissions awaiting draft upload.</p> <p class="alert alert-info my-3" id="no-waiting-for-draft">
There are no submissions awaiting draft upload.
</p>
{% else %} {% else %}
<table id="waiting-for-draft" class="waiting-for-draft table table-sm table-striped tablesorter"> <table id="waiting-for-draft"
class="waiting-for-draft table table-sm table-striped tablesorter">
<thead> <thead>
<tr> <tr>
<th data-sort="name">Name</th> <th data-sort="name">Name</th>
@ -61,38 +78,57 @@
{% for s in waiting_for_draft %} {% for s in waiting_for_draft %}
<tr> <tr>
{% if user.is_authenticated %} {% if user.is_authenticated %}
<td><a id="aw{{ s.pk }}" href="{% url "ietf.submit.views.submission_status" submission_id=s.pk access_token=s.access_token %}">{{ s.name }}</a></td> <td>
<a id="aw{{ s.pk }}"
href="{% url "ietf.submit.views.submission_status" submission_id=s.pk access_token=s.access_token %}">
{{ s.name }}
</a>
</td>
{% else %} {% else %}
<td><a id="aw{{ s.pk }}" href="{% url "ietf.submit.views.submission_status" submission_id=s.pk %}">{{ s.name }}</a></td> <td>
<a id="aw{{ s.pk }}"
href="{% url "ietf.submit.views.submission_status" submission_id=s.pk %}">{{ s.name }}</a>
</td>
{% endif %} {% endif %}
<td>{{ s.rev }}</td> <td>{{ s.rev }}</td>
<td>{{ s.submission_date }}</td> <td>{{ s.submission_date }}</td>
<td>
{% if user|has_role:"Secretariat" %} {% if user|has_role:"Secretariat" %}
<td> <form id="cancel-submission"
<form id="cancel-submission" action="/submit/awaitingdraft/cancel" method="post"> action="/submit/awaitingdraft/cancel"
method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="submission_id" value="{{ s.pk }}"> <input type="hidden" name="submission_id" value="{{ s.pk }}">
<input type="hidden" name="access_token" value="{{ s.access_token }}"> <input type="hidden" name="access_token" value="{{ s.access_token }}">
<button class="btn btn-danger btn-sm" type="submit" data-bs-toggle="tooltip" title="Cancels the submission permanently.">Cancel submission</button> <button class="btn btn-danger btn-sm float-end ms-1"
type="submit"
data-bs-toggle="tooltip"
title="Cancels the submission permanently.">
Cancel submission
</button>
</form> </form>
</td> {% endif %}
{% endif %} {% if user|has_role:"Secretariat" %}
{% if user|has_role:"Secretariat" %} <a id="add-submission-email{{ s.pk }}"
<td><a id="add-submission-email{{ s.pk }}" class="btn btn-primary btn-sm" href="{% url "ietf.submit.views.add_manualpost_email" submission_id=s.pk access_token=s.access_token %}">Add email</a></td> class="btn btn-primary btn-sm float-end ms-1"
{% endif %} href="{% url "ietf.submit.views.add_manualpost_email" submission_id=s.pk access_token=s.access_token %}">
Add email
</a>
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endif %} {% endif %}
{% if user|has_role:"Secretariat" %} {% if user|has_role:"Secretariat" %}
<a id="new-submission-email" class="btn btn-primary btn-sm" href="{% url "ietf.submit.views.add_manualpost_email" %}">New submission from email</a> <a id="new-submission-email"
class="btn btn-primary"
href="{% url "ietf.submit.views.add_manualpost_email" %}">
New submission from email
</a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script src="{% static "ietf/js/list.js" %}"></script> <script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,14 +1,13 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}{% load origin %}{% origin %} {# bs5ok #}
<p> {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% origin %}
<div class="alert alert-secondary mt-5 small">
Please send reports about submission tool bugs to the Tools Team using one Please send reports about submission tool bugs to the Tools Team using one
of the Bug Report links at the bottom of the page. of the Bug Report links at the bottom of the page.
<hr>
</p>
<p>
If you run into problems submitting an Internet-Draft and need to request manual posting of an Internet-Draft, please send the If you run into problems submitting an Internet-Draft and need to request manual posting of an Internet-Draft, please send the
draft and the reason for manual posting to <a href="mailto:{{settings.SECRETARIAT_SUPPORT_EMAIL}}">{{settings.SECRETARIAT_SUPPORT_EMAIL}}</a>. draft and the reason for manual posting to
<a href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">{{ settings.SECRETARIAT_SUPPORT_EMAIL }}</a>.
Be advised that manual processing always takes additional time. Be advised that manual processing always takes additional time.
</div>
</p>

View file

@ -1,13 +1,4 @@
{% for field in replaces_form %} {# bs5ok #}
<h3>Replacement information</h3> {% load django_bootstrap5 %}
<tr{% if field.errors %} class="error"{% endif %}> <h3 class="mt-5 mb-3">Replacement information</h3>
<th>{{ field.label_tag }}</th> {% bootstrap_form replaces_form %}
<td>
{{ field }}
{% if field.help_text %}
<div class="helptext">{{ field.help_text }}</div>
{% endif %}
{{ field.errors }}
</td>
</tr>
{% endfor %}

View file

@ -1,35 +1,30 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Submission status{% endblock %} {% block title %}Submission status{% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<p> <p class="my-3">
Please enter the name of the Internet-Draft you wish to view the Please enter the name of the Internet-Draft you wish to view the
submission status of. submission status of.
</p> </p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{% if error %}
<p class="alert alert-danger">{{ error }}</p>
{% endif %}
<div class="mb-3"> <div class="mb-3">
<label>I-D name</label> <label class="form-label">I-D name</label>
<input type="text" class="form-control" placeholder="draft-..." name="name" value="{{ name|default:"" }}"> <input type="text"
class="form-control"
placeholder="draft-..."
name="name"
value="{{ name|default:"" }}">
</div> </div>
{% if error %}
<p class="alert alert-danger my-3">
{{ error }}
</p>
{% endif %}
<input class="btn btn-primary" type="submit" value="See status"> <input class="btn btn-primary" type="submit" value="See status">
</form> </form>
{% endblock %}
{% endblock %}

View file

@ -1,60 +1,62 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static %} {% load origin static textfilters ietf_filters %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block title %}Submission email{% endblock %} {% block title %}Submission email{% endblock %}
{% load ietf_filters %} {% load ietf_filters %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<h2 id="approvals">Email for {{ submission.name }}</h2> <h2 id="approvals">Email for {{ submission.name }}</h2>
<dl id="email-details" class="emails row my-3">
<table id="email-details" class="emails table table-sm table-striped tablesorter"> <dt class="col-sm-2">
<tr> Uploaded
<th>Uploaded</th> </dt>
<td>{{ message.time }}</td> <dd class="col-sm-10">
</tr> {{ message.time }}
</dd>
<tr> <dt class="col-sm-2">
<th>Date</th> Date
<td>{{ message.message.time }}</td> </dt>
</tr> <dd class="col-sm-10">
{{ message.message.time }}
<tr> </dd>
<th>From</th> <dt class="col-sm-2">
<td>{{ message.message.frm }}</td> From
</tr> </dt>
<dd class="col-sm-10">
<tr> {{ message.message.frm|linkify }}
<th>Subject</th> </dd>
<td>{{ message.message.subject }}</td> <dt class="col-sm-2">
</tr> Subject
</dt>
<tr> <dd class="col-sm-10">
<th>Message</th> {{ message.message.subject }}
<td>{{ message.message.body|linebreaksbr }}</td> </dd>
</tr> <dt class="col-sm-2">
Message
{% for a in attachments %} </dt>
<tr> <dd class="col-sm-10">
<th>Attachment</th> <pre>{{ message.message.body|linkify|urlize_ietf_docs|linebreaksbr }}</pre>
<td><a id="attach{{ submission.pk }}" href="{% url "ietf.submit.views.show_submission_email_attachment" submission_id=submission.pk message_id=message.pk filename=a.filename %}">{{ a.filename }}</a></td> </dd>
</tr> <dt class="col-sm-2">
{% endfor %} Attachment
</dt>
{% if user|has_role:"Secretariat" %} <dd class="col-sm-10">
<tr> {% for a in attachments %}
<td><a id="reply{{ submission.pk }}" class="btn btn-primary" href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk message_id=message.pk %}" title="Reply"><span class="bi bi-envelope" aria-hidden="true"></span> Reply</a></td> <a id="attach{{ submission.pk }}"
</tr> href="{% url "ietf.submit.views.show_submission_email_attachment" submission_id=submission.pk message_id=message.pk filename=a.filename %}">
{% endif %} {{ a.filename }}
</table> </a>
{% endblock %} <br>
{% endfor %}
{% block js %} </dd>
<script src="{% static "ietf/js/list.js" %}"></script> </dl>
{% endblock %} {% if user|has_role:"Secretariat" %}
<a id="reply{{ submission.pk }}"
class="btn btn-primary"
href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk message_id=message.pk %}"
title="Reply">
<span class="bi bi-envelope" aria-hidden="true"></span> Reply
</a>
{% endif %}
{% endblock %}

View file

@ -1,9 +1,12 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}{% load origin %}{% origin %} {# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% origin %}
{% for file in files %} {% for file in files %}
{% if file.exists %} {% if file.exists %}
<a class="btn btn-primary btn-sm" href="{{ file.url }}" target="_blank"> <a class="btn btn-primary btn-sm float-end ms-1" href="{{ file.url }}" target="_blank">
<span class="bi bi-file-{% if file.ext == "txt" %}text-o{% elif file.ext == "xml" %}code-o{% elif file.ext == "pdf" %}pdf-o{% else %}o{% endif %}"></span> <span class="bi bi-file-{% if file.ext == 'txt' %}text{% elif file.ext == 'xml' %}code{% elif file.ext == 'pdf' %}pdf{% else %}code{% endif %}"></span>
{{ file.ext }} {{ file.ext }}
</a> </a>
{% endif %} {% endif %}
{% endfor %} {% endfor %}

View file

@ -1,141 +1,167 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% load static %} {% load static ietf_filters textfilters person_filters %}
{% load ietf_filters submit_tags misc_filters %} {% load ietf_filters submit_tags misc_filters %}
{% block title %}Submission status of {{ submission.name }}-{{ submission.rev }}{% endblock %} {% block title %}Submission status of {{ submission.name }}-{{ submission.rev }}{% endblock %}
{% block pagehead %} {% block pagehead %}
{{ block.super }} {{ block.super }}
{{ all_forms|merge_media:'css' }} {{ all_forms|merge_media:'css' }}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %} {% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
{% if submission.state_id != "uploaded" %} {% if submission.state_id != "uploaded" %}
<h2>Submission status: {{ submission.state.name }}</h2> <h2 class="mt-5">Submission status: {{ submission.state.name }}</h2>
{% endif %} {% endif %}
{% if message %} {% if message %}
<p class="alert alert-info">{{ message.1 }}</p> <p class="alert alert-info my-3">
{{ message.1 }}
</p>
{% endif %} {% endif %}
{% if submission.state_id == "aut-appr" and submission.submitter_parsed.email not in confirmation_list|join:", " %} {% if submission.state_id == "aut-appr" and submission.submitter_parsed.email not in confirmation_list|join:", " %}
<p class="alert alert-warning"> <p class="alert alert-warning my-3">
Please note that since the database does not have your email address in the list of authors of previous Please note that since the database does not have your email address in the list of authors of previous
revisions of the document, you are <b>not</b> receiving a confirmation email yourself; one of the revisions of the document, you are <b>not</b> receiving a confirmation email yourself; one of the
addressees above will have to send a confirmation in order to complete the submission. This is done addressees above will have to send a confirmation in order to complete the submission. This is done
to avoid document hijacking. If none of the known previous authors will be able to confirm the to avoid document hijacking. If none of the known previous authors will be able to confirm the
submission, please contact <a href="mailto:ietf-draft-submission@ietf.org">the Secretariat</a> for action. submission, please contact
<a href="mailto:ietf-draft-submission@ietf.org">the Secretariat</a>
for action.
</p> </p>
{% endif %} {% endif %}
{% if submitter_form.errors or replaces_form.errors or extresources_form.errors %} {% if submitter_form.errors or replaces_form.errors or extresources_form.errors %}
<p class="alert alert-danger">Please fix errors in the form below.</p> <p class="alert alert-danger my-3">
Please fix errors in the form below.
</p>
{% endif %} {% endif %}
<h2 class="mt-5">Submission checks</h2>
<h2>Submission checks</h2> <p class="alert {% if passes_checks %}alert-success{% else %}alert-warning{% endif %} my-3">
<p>
{% if passes_checks %} {% if passes_checks %}
Your draft has been verified to pass the submission checks. Your draft has been verified to pass the submission checks.
{% else %} {% else %}
Your draft has <b>NOT</b> been verified to pass the submission checks. Your draft has <b>NOT</b> been verified to pass the submission checks.
{% endif %} {% endif %}
</p> </p>
{% if submission.authors|length > 5 %}
{% if submission.authors|length > 5 %}<p class="alert alert-danger"><b> <p class="alert alert-danger my-3">
This document has more than five authors listed, which is considered excessive <b>
under normal circumstances.</b> If you plan to request publication as an RFC, this This document has more than five authors listed, which is considered excessive
will require additional consideration by the stream manager (for example, the under normal circumstances.</b> If you plan to request publication as an RFC, this
IESG), and publication may be declined unless sufficient justification is will require additional consideration by the stream manager (for example, the
provided. See <a href="https://datatracker.ietf.org/doc/html/rfc7322#section-4.1.1"> IESG), and publication may be declined unless sufficient justification is
RFC 7322, section 4.1.1</a> for details.</p> provided. See
<a href="https://datatracker.ietf.org/doc/html/rfc7322#section-4.1.1">RFC 7322, section 4.1.1</a>
for details.
</p>
{% endif %} {% endif %}
{% for check in submission.latest_checks %} {% for check in submission.latest_checks %}
{% if check.errors %} {% if check.errors %}
<p class="alert alert-warning"> <p class="alert alert-warning my-3">
The {{check.checker}} returned {{ check.errors }} error{{ check.errors|pluralize }} The {{ check.checker }} returned {{ check.errors }} error{{ check.errors|pluralize }}
and {{ check.warnings }} warning{{ check.warnings|pluralize }}; click the button and {{ check.warnings }} warning{{ check.warnings|pluralize }}; click the button
below to see details. Please fix those, and resubmit. below to see details. Please fix those, and resubmit.
</p> </p>
{% elif check.warnings %} {% elif check.warnings %}
<p class="alert alert-warning"> <p class="alert alert-warning my-3">
The {{check.checker}} returned {{ check.warnings }} warning{{ check.warnings|pluralize }}. The {{ check.checker }} returned {{ check.warnings }} warning{{ check.warnings|pluralize }}.
</p> </p>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% for check in submission.latest_checks %} {% for check in submission.latest_checks %}
{% if check.passed != None %} {% if check.passed != None %}
<button class="btn btn-{% if check.passed %}{% if check.warnings %}warning{% elif check.errors %}warning{% else %}success{% endif %}{% else %}danger{% endif %}" data-bs-toggle="modal" data-bs-target="#check-{{check.pk}}">View {{ check.checker }}</button> <button class="btn btn-{% if check.passed %}{% if check.warnings %}warning{% elif check.errors %}danger{% else %}success{% endif %}{% else %}danger{% endif %}"
data-bs-toggle="modal"
<div class="modal fade" id="check-{{check.pk}}" tabindex="-1" role="dialog" aria-labelledby="check-{{check.pk}}" aria-hidden="true"> data-bs-target="#check-{{ check.pk }}">
<div class="modal-dialog modal-xl"> View {{ check.checker }}
</button>
<div class="modal fade"
id="check-{{ check.pk }}"
tabindex="-1"
role="dialog"
aria-labelledby="check-{{ check.pk }}"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-bs-dismiss="modal" aria-hidden="true">&times;</button> <h5 class="modal-title" id="{{ check.checker|slugify }}-label">
<h4 class="modal-title" id="{{check.checker|slugify}}-label">{{ check.checker|title }} for {{ submission.name }}-{{ submission.rev }}</h4> {{ check.checker|title }} for {{ submission.name }}-{{ submission.rev }}
</h5>
<button type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div> </div>
<div class="modal-body" id="{{check.checker|slugify}}-message"> <div class="modal-body" id="{{ check.checker|slugify }}-message">
<pre>{{ check.message }}</pre> <pre>{{ check.message|linkify|urlize_ietf_docs }}</pre>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
<div class="modal fade"
<div class="modal fade" id="twopages" tabindex="-1" role="dialog" aria-labelledby="twopageslabel" aria-hidden="true"> id="twopages"
<div class="modal-dialog modal-xl"> tabindex="-1"
role="dialog"
aria-labelledby="twopageslabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-bs-dismiss="modal" aria-hidden="true">&times;</button> <h5 class="modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</h5>
<h4 class="modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</h4> <button type="button"
</div> class="btn-close"
<div class="modal-body"> data-bs-dismiss="modal"
{{ submission|two_pages_decorated_with_errors:errors }} aria-label="Close"></button>
</div> </div>
<div class="modal-body">{{ submission|two_pages_decorated_with_errors:errors }}</div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% if submission.state_id == "waiting-for-draft" %} {% if submission.state_id == "waiting-for-draft" %}
<p class="alert alert-warning"> <p class="alert alert-warning my-3">
This submission is awaiting the first draft upload. This submission is awaiting the first draft upload.
</p> </p>
{% else %} {% else %}
<h2>Meta-data from the submission</h2> <h2 class="mt-5">Meta-data from the submission</h2>
{% if errors %} {% if errors %}
<div class="alert alert-danger"> <div class="alert alert-danger my-3">
<p><b>Meta-Data errors found!</b></p> <p>
<p >Please make sure that your Internet-Draft includes all of the required meta-data in the proper format.</p> <b>Meta-Data errors found!</b>
</p>
<p>If your Internet-Draft <b>does</b> include all of the required meta-data in the proper format, and if <p >
the error(s) identified below are due to the failure of the tool to extract the meta-data correctly, Please make sure that your Internet-Draft includes all of the required meta-data in the proper format.
then please use the "Adjust meta-data" button below, which will take you to the "Adjust screen" where </p>
you can correct the improperly extracted meta-data. You will then be able to submit your Internet-Draft <ul>
to the Secretariat for manual posting.</p> <li>
If your Internet-Draft <b>does</b> include all of the required meta-data in the proper format, and if
<p>If your Internet-Draft <b>does not</b> include all of the required meta-data in the proper format, then the error(s) identified below are due to the failure of the tool to extract the meta-data correctly,
please cancel this submission, update your Internet-Draft, and resubmit it.</p> then please use the "Adjust meta-data" button below, which will take you to the "Adjust screen" where
you can correct the improperly extracted meta-data. You will then be able to submit your Internet-Draft
<p><b>Note:</b> The secretariat will <b>not</b> add any to the Secretariat for manual posting.
</li>
<li>
If your Internet-Draft <b>does not</b> include all of the required meta-data in the proper format, then
please cancel this submission, update your Internet-Draft, and resubmit it.
</li>
</ul>
<p class="mb-0">
<b>Note:</b> The secretariat will <b>not</b> add any
meta-data to your Internet-Draft or edit the meta-data. An meta-data to your Internet-Draft or edit the meta-data. An
Internet-Draft that does not include all of the required meta-data in Internet-Draft that does not include all of the required meta-data in
the proper format <b>will</b> be returned to the submitter.</p> the proper format <b>will</b> be returned to the submitter.
</p>
</div> </div>
{% endif %} {% endif %}
{% endif %} {% endif %}
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr> <tr>
<th>Document</th> <th>Document</th>
@ -145,190 +171,238 @@
{% else %} {% else %}
{{ submission.name }} {{ submission.name }}
{% endif %} {% endif %}
<button class="btn btn-primary btn-sm float-end ms-1"
<button class="btn btn-primary btn-sm float-end" data-bs-toggle="modal" data-bs-target="#twopages">View first two pages</button> data-bs-toggle="modal"
data-bs-target="#twopages">
View first two pages
</button>
{% show_submission_files submission %} {% show_submission_files submission %}
{% if errors.files %} {% if errors.files %}
<p class="text-danger bg-danger"><b>{{ errors.files|safe }}</b></p> <p class="mt-1 mb-0 text-danger">
{{ errors.files|safe }}
</p>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>Revision</th> <th>Revision</th>
<td> <td>
{{ submission.rev }} {{ submission.rev }}
{% if errors.rev %} {% if errors.rev %}
<button class="btn btn-primary btn-sm float-end" data-bs-toggle="modal" data-bs-target="#twopages">View errors in document</button> <button class="btn btn-primary btn-sm float-end"
<p class="text-danger bg-danger"><b>{{ errors.rev }}</b></p> data-bs-toggle="modal"
data-bs-target="#twopages">
View errors in document
</button>
<p class="mt-1 mb-0 text-danger">
{{ errors.rev }}
</p>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<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 errors.group %} {% if errors.group %}
<p class="text-danger bg-danger"><b>{{ errors.group }}</b></p> <p class="mt-1 mb-0 text-danger">
{{ errors.group }}
</p>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>Document date</th> <th>Document date</th>
<td> <td>
{{ submission.document_date }} {{ submission.document_date }}
{% if errors.document_date %} {% if errors.document_date %}
<p class="text-danger bg-danger"><b>{{ errors.document_date }}</b></p> <p class="mt-1 mb-0 text-danger">
{{ errors.document_date }}
</p>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>Submission date</th> <th>Submission date</th>
<td>{{ submission.submission_date }}</td> <td>{{ submission.submission_date }}</td>
</tr> </tr>
<tr> <tr>
<th>Title</th> <th>Title</th>
<td> <td>
{{ submission.title|default:"" }} {{ submission.title|default:"" }}
{% if errors.title %}<p class="text-danger bg-danger"><b>{{ errors.title }}</b></p>{% endif %} {% if errors.title %}
<p class="mt-1 mb-0 text-danger">
{{ errors.title }}
</p>
{% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>Authors</th> <th>Author count</th>
<td> <td>
{{ submission.authors|length }} author{{ submission.authors|pluralize }} {{ submission.authors|length }} author{{ submission.authors|pluralize }}
{% if errors.authors %}<p class="text-danger bg-danger"><b>{{ errors.authors|safe }}</b></p>{% endif %} {% if errors.authors %}
<p class="mt-1 mb-0 text-danger">
{{ errors.authors|safe }}
</p>
{% endif %}
</td> </td>
</tr> </tr>
{% for author in submission.authors %} {% for author in submission.authors %}
<tr> <tr>
<th>Author {{ forloop.counter }}</th> <th>Author {{ forloop.counter }}</th>
<td> <td>
{{ author.name }} {% if author.email %}&lt;{{ author.email }}&gt;{% endif %} {{ author.name }}
- {% if author.email %}&lt;{{ author.email|linkify }}&gt;{% endif %}
<br>
{% if author.affiliation %} {% if author.affiliation %}
{{ author.affiliation }} {{ author.affiliation }}
{% else %} {% else %}
<i>unknown affiliation</i> <i>unknown affiliation</i>
{% endif %} {% endif %}
- <br>
{% if author.country %} {% if author.country %}
{{ author.country }} {{ author.country }}
{% if author.cleaned_country and author.country != author.cleaned_country %} {% if author.cleaned_country and author.country != author.cleaned_country %}
(understood to be {{ author.cleaned_country }}) <span class="text-muted">(understood to be {{ author.cleaned_country }})</span>
{% endif %} {% endif %}
{% else %} {% else %}
<i>unknown country</i> <i>unknown country</i>
{% endif %} {% endif %}
{% if author.country and not author.cleaned_country %} {% if author.country and not author.cleaned_country %}
<br> <br>
<b class="text-warning">Unrecognized country: "{{ author.country }}"</b>: See <a href="{% url "ietf.stats.views.known_countries_list" %}">recognized country names</a>. <span class="text-warning">Unrecognized country: "{{ author.country }}"</span>: See
<a href="{% url "ietf.stats.views.known_countries_list" %}">
recognized country names
</a>.
{% endif %} {% endif %}
{% for auth_err in author.errors %} {% for auth_err in author.errors %}
<p class="text-danger bg-danger"><b>{{ auth_err }}</b></p> <p class="mt-1 mb-0 text-danger">
{{ auth_err }}
</p>
{% endfor %} {% endfor %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
<tr> <tr>
<th>Abstract</th> <th>
Abstract
</th>
<td> <td>
{{ submission.abstract|linebreaksbr }} {{ submission.abstract|urlize_ietf_docs|linkify|linebreaksbr }}
{% if errors.abstract %}<p class="text-danger bg-danger"><b>{{ errors.abstract }}</b></p>{% endif %} {% if errors.abstract %}
<p class="mt-1 mb-0 text-danger">
{{ errors.abstract }}
</p>
{% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>Pages</th> <th>
Page count
</th>
<td> <td>
{{ submission.pages }} {{ submission.pages }}
{% if errors.pages %}<p class="text-danger bg-danger"><b>{{ errors.pages }}</b></p>{% endif %} {% if errors.pages %}
<p class="mt-1 mb-0 text-danger">
{{ errors.pages }}
</p>
{% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>File size</th> <th>
<td>{{ submission.file_size|filesizeformat }}</td> File size
</tr> </th>
<tr>
<th>Formal languages used</th>
<td> <td>
{% for l in submission.formal_languages.all %}{{ l.name }}{% if not forloop.last %}, {% endif %}{% empty %}None recognized{% endfor %} {{ submission.file_size|filesizeformat }}
{% if errors.formal_languages %}<p class="text-danger bg-danger"><b>{{ errors.formal_languages }}</b></p>{% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th>Submission additional resources</th> <th>
Formal languages used
</th>
<td> <td>
{% for r in external_resources.current %}{% with res=r.res added=r.added %} {% for l in submission.formal_languages.all %}
<div> {{ l.name }}
{{ res.name.name }}: {{ res.value }} {% if not forloop.last %},{% endif %}
{% if res.display_name %} (as &quot;{{ res.display_name }}&quot;) {% endif %} {% empty %}None recognized
{% if external_resources.show_changes and added %} {% endfor %}
<span class="badge bg-success">New</span> {% if errors.formal_languages %}
{% endif %} <p class="mt-1 mb-0 text-danger">
</div> {{ errors.formal_languages }}
{% endwith %} </p>
{% endif %}
</td>
</tr>
<tr>
<th>
Submission additional resources
</th>
<td>
{% for r in external_resources.current %}
{% with res=r.res added=r.added %}
<div>
{{ res.name.name }}: {{ res.value }}
{% if res.display_name %}(as &quot;{{ res.display_name }}&quot;){% endif %}
{% if external_resources.show_changes and added %}<span class="badge bg-success">New</span>{% endif %}
</div>
{% endwith %}
{% empty %} {% empty %}
None None
{% endfor %} {% endfor %}
</td> </td>
</tr> </tr>
{% if external_resources.show_changes %}
{% if external_resources.show_changes %}<tr> <tr>
<th>Current document additional resources</th> <th>
<td> Current document additional resources
{% for r in external_resources.previous %}{% with res=r.res removed=r.removed %} </th>
<div> <td>
{{ res.name.name }}: {{ res.value }} {% for r in external_resources.previous %}
{% if res.display_name %} (as &quot;{{ res.display_name }}&quot;) {% endif %} {% with res=r.res removed=r.removed %}
{% if removed %} <div>
<span class="badge bg-warning">Removed</span> {{ res.name.name }}: {{ res.value }}
{% endif %} {% if res.display_name %}(as &quot;{{ res.display_name }}&quot;){% endif %}
</div> {% if removed %}<span class="badge bg-warning">Removed</span>{% endif %}
{% endwith %} </div>
{% empty %} {% endwith %}
None {% empty %}
{% endfor %} None
</td> {% endfor %}
</tr>{% endif %} </td>
</tr>
{% endif %}
</table> </table>
{% if can_edit %} {% if can_edit %}
<p></p>
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="edit"> <input type="hidden" name="action" value="edit">
<button class="btn btn-warning" type="submit" value="adjust">Adjust meta-data</button> <button class="btn btn-warning" type="submit" value="adjust">
Adjust meta-data
</button>
</form> </form>
<p>Leads to manual post by the secretariat.</p> <p class="form-text">
Leads to manual post by the secretariat.
</p>
{% if passes_checks and not errors and not submission.errors %} {% if passes_checks and not errors and not submission.errors %}
<h2>Please edit the following meta-data before posting:</h2> <h2 class="mt-5">
Please edit the following meta-data before posting:
</h2>
<form class="idsubmit" method="post"> <form class="idsubmit" method="post">
{% csrf_token %} {% csrf_token %}
{% include "submit/submitter_form.html" %} {% include "submit/submitter_form.html" %}
{% include "submit/replaces_form.html" %} {% include "submit/replaces_form.html" %}
{% include "submit/extresources_form.html" %} {% include "submit/extresources_form.html" %}
<input type="hidden" name="action" value="autopost"> <input type="hidden" name="action" value="autopost">
<h3>Post submission</h3> <h2 class="mt-5">
<button class="btn btn-primary" type="submit">Post submission</button> Post submission
</h2>
<button class="btn btn-primary" type="submit">
Post submission
</button>
</form> </form>
<p> <p>
{% if requires_group_approval %} {% if requires_group_approval %}
Notifies group chairs to get approval. Notifies group chairs to get approval.
@ -339,112 +413,178 @@
{% endif %} {% endif %}
</p> </p>
{% endif %} {% endif %}
{% else %} {% else %}
{% if submission.submitter %} {% if submission.submitter %}
<h3>Submitter information</h3> <h2 class="mt-5">
Submitter information
</h2>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr><th>Name</th><td>{{ submission.submitter_parsed.name }}</td></tr> <tr>
<tr><th>Email address</th><td>{{ submission.submitter_parsed.email }}</td></tr> <th>
Name
</th>
<td>
{{ submission.submitter_parsed.name }}
</td>
</tr>
<tr>
<th>
Email address
</th>
<td>
{{ submission.submitter_parsed.email|linkify }}
</td>
</tr>
</table> </table>
{% endif %} {% endif %}
{% if submission.replaces %} {% if submission.replaces %}
<h3>Replaced documents</h3> <h2 class="mt-5">
Replaced documents
</h2>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr><th>Replaces</th><td>{{ submission.replaces|split:","|join:", "|urlize_ietf_docs }}</td></tr> <tr>
<th>
Replaces
</th>
<td>
{{ submission.replaces|split:","|join:", "|urlize_ietf_docs }}
</td>
</tr>
</table> </table>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if can_cancel %} {% if can_cancel %}
<h3>Cancel submission</h3> <form class="mt-3" id="cancel-submission" method="post">
<form id="cancel-submission" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="cancel"> <input type="hidden" name="action" value="cancel">
<button class="btn btn-danger" type="submit" data-bs-toggle="tooltip" title="Deletes the uploaded file{{ submission.file_types|split:","|pluralize }} permanently.">Cancel submission</button> <button class="btn btn-danger"
type="submit"
data-bs-toggle="tooltip"
title="Deletes the uploaded file{{ submission.file_types|split:","|pluralize }} permanently.">
Cancel submission
</button>
</form> </form>
{% endif %} {% endif %}
{% if can_group_approve %} {% if can_group_approve %}
<h2>Approve submission</h2> <form class="mt-3" method="post">
<form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="approve"> <input type="hidden" name="action" value="approve">
<button class="btn btn-danger" type="submit">Approve this submission</button> <button class="btn btn-success" type="submit">
Approve this submission
</button>
</form> </form>
{% endif %} {% endif %}
{% if can_force_post %} {% if can_force_post %}
<p></p> <form class="mt-3" method="post">
<form method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="forcepost"> <input type="hidden" name="action" value="forcepost">
<button class="btn btn-danger" type="submit">Force post of submission</button> <button class="btn btn-warning" type="submit">
Force post of submission
</button>
</form> </form>
{% endif %} {% endif %}
{% if user|has_role:"Secretariat" %} {% if user|has_role:"Secretariat" %}
<p></p> <a id="send{{ submission.pk }}"
<a id="send{{ submission.pk }}" class="btn btn-primary" href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk %}" title="Email submitter"><span class="bi bi-envelope" aria-hidden="true"></span> Send Email</a> class="btn btn-primary mt-3"
href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk %}"
title="Email submitter">
<span class="bi bi-envelope" aria-hidden="true"></span> Send Email
</a>
{% endif %} {% endif %}
{% if show_send_full_url %} {% if show_send_full_url %}
<div class="alert alert-danger"> <div class="alert alert-danger my-3">
<p>You are not allowed to modify or cancel this submission. You can <p>
You are not allowed to modify or cancel this submission. You can
only modify or cancel this submission from the same URL you were only modify or cancel this submission from the same URL you were
redirected to after the submission.</p> redirected to after the submission.
</p>
<p>If you are the submitter check your browser history to find this <p>
URL. You can share it with any person you need.</p> If you are the submitter check your browser history to find this
URL. You can share it with any person you need.
<p>If you are one of the authors you can request the URL from which </p>
<p>
If you are one of the authors you can request the URL from which
you can modify or cancel this submission by clicking the next you can modify or cancel this submission by clicking the next
button. An email will then be sent to the authors and submitter button. An email will then be sent to the authors and submitter
(if submitter email was entered): {{ confirmation_list|join:", " }}.</p> (if submitter email was entered): {{ confirmation_list|join:", " }}.
</p>
<p></p> <form class="mt-3" method="post">
<form method="post">{% csrf_token %} {% csrf_token %}
<input type="hidden" name="action" value="sendfullurl"> <input type="hidden" name="action" value="sendfullurl">
<button class="btn btn-danger" type="submit">Request full access URL</button> <button class="btn btn-danger" type="submit">
Request full access URL
</button>
</form> </form>
</div> </div>
{% endif %} {% endif %}
<h2 class="mt-5">
<h2>History</h2> History
</h2>
<table id="history" class="table table-sm table-striped"> <table id="history" class="table table-sm table-striped tablesorter">
<thead> <thead>
<tr><th>Date</th><th>By</th><th>Event</th></tr> <tr>
<th data-sort="date">
Date
</th>
<th data-sort="by">
By
</th>
<th data-sort="event">
Event
</th>
</tr>
</thead> </thead>
<tbody> <tbody>
{% for e in submission.submissionevent_set.all %} {% for e in submission.submissionevent_set.all %}
<tr> <tr>
<td class="text-nowrap">{{ e.time|date:"Y-m-d" }}</td> <td class="text-nowrap">
<td>{{ e.by|default:"" }}</td> {{ e.time|date:"Y-m-d" }}
</td>
<td>
{% if e.by %}
{% person_link e.by %}
{% endif %}
</td>
{% if e.desc|startswith:"Received message" or e.desc|startswith:"Sent message" %} {% if e.desc|startswith:"Received message" or e.desc|startswith:"Sent message" %}
{% with m=e.submissionemailevent.message %} {% with m=e.submissionemailevent.message %}
{% if user.is_authenticated %} {% if user.is_authenticated %}
<td> <td>
{% if e.desc|startswith:"Received message" and user|has_role:"Secretariat" %} {% if e.desc|startswith:"Received message" and user|has_role:"Secretariat" %}
<a id="reply{{ submission.pk }}" class="btn btn-primary btn-sm" href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk message_id=e.submissionemailevent.pk %}" title="Reply"><span class="bi bi-envelope" aria-hidden="true"></span> Reply</a> <a id="reply{{ submission.pk }}"
class="btn btn-primary btn-sm"
href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk message_id=e.submissionemailevent.pk %}"
title="Reply">
<span class="bi bi-envelope" aria-hidden="true"></span> Reply
</a>
{% endif %} {% endif %}
Email: <a id="aw{{ submission.pk }}-{{ m.pk }}" href="{% url "ietf.submit.views.show_submission_email_message" submission_id=submission.pk message_id=e.submissionemailevent.pk access_token=submission.access_token %}">{{ e.desc }}</a></td> Email:
<a id="aw{{ submission.pk }}-{{ m.pk }}"
href="{% url "ietf.submit.views.show_submission_email_message" submission_id=submission.pk message_id=e.submissionemailevent.pk access_token=submission.access_token %}">
{{ e.desc }}
</a>
</td>
{% else %} {% else %}
<td>Email: <a id="aw{{ submission.pk }}-{{ m.pk }}" href="{% url "ietf.submit.views.show_submission_email_message" submission_id=submission.pk message_id=e.submissionemailevent.pk %}">{{ e.desc }}</a></td> <td>
Email:
<a id="aw{{ submission.pk }}-{{ m.pk }}"
href="{% url "ietf.submit.views.show_submission_email_message" submission_id=submission.pk message_id=e.submissionemailevent.pk %}">
{{ e.desc }}
</a>
</td>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
{% else %} {% else %}
<td>{{ e.desc }}</td> <td>
{{ e.desc|urlize_ietf_docs|linkify }}
</td>
{% endif %} {% endif %}
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% include "submit/problem-reports-footer.html" %} {% include "submit/problem-reports-footer.html" %}
{% endblock %} {% endblock %}
{% block js %} {% block js %}
{{ all_forms|merge_media:'js' }} {{ all_forms|merge_media:'js' }}<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,34 +1,42 @@
{# 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 %}
{% block pagehead %}{{ block.super }}{% endblock %}
{% block pagehead %}
{{ block.super }}
{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Internet-Draft submission </h1> <h1>Internet-Draft submission</h1>
<ul class="nav nav-tabs my-3">
<ul class="nav nav-tabs mb-3">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if selected == "index" %}active{% endif %}" href="{% url "ietf.submit.views.upload_submission" %}">Upload</a> <a class="nav-link {% if selected == "index" %}active{% endif %}"
href="{% url "ietf.submit.views.upload_submission" %}">
Upload
</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if selected == "status" %}active{% endif %}" href="{% url "ietf.submit.views.search_submission" %}">Status</a> <a class="nav-link {% if selected == "status" %}active{% endif %}"
href="{% url "ietf.submit.views.search_submission" %}">
Status
</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if selected == "instructions" %}active{% endif %}" href="{% url "ietf.submit.views.tool_instructions" %}">Instructions</a> <a class="nav-link {% if selected == "instructions" %}active{% endif %}"
href="{% url "ietf.submit.views.tool_instructions" %}">
Instructions
</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if selected == "approvals" %}active{% endif %}" href="{% url "ietf.submit.views.approvals" %}">Approvals</a> <a class="nav-link {% if selected == "approvals" %}active{% endif %}"
href="{% url "ietf.submit.views.approvals" %}">
Approvals
</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if selected == "manual_posts" %}active{% endif %}" href="{% url "ietf.submit.views.manualpost" %}">Manual Post Requests</a> <a class="nav-link {% if selected == "manual_posts" %}active{% endif %}"
href="{% url "ietf.submit.views.manualpost" %}">
Manual Post Requests
</a>
</li> </li>
</ul> </ul>
{% block submit_content %}{% endblock %}
{% block submit_content %} {% endblock %}
{% endblock %}
{% endblock %}

View file

@ -1,27 +1,26 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}{% load origin %}{% origin %} {# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% origin %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
<h3 class="mt-5">Submitter</h3>
<h3>Submitter</h3>
<p> <p>
If you are one of the authors, please click the button below If you are one of the authors, please click the button below
with your name on it to automatically fill in the with your name on it to automatically fill in the
submitter information. Otherwise, submitter information. Otherwise,
please manually enter your name and email address. please manually enter your name and email address.
</p> </p>
{% load ietf_filters %} {% load ietf_filters %}
{% for author in submission.authors %} {% for author in submission.authors %}
<input type="button" class="author btn btn-primary" data-name="{{ author.name }}" data-email="{% if author.email %}{{ author.email }}{% endif %}" value="{{ author.name }}"> <input type="button"
class="author btn btn-primary mb-3"
data-name="{{ author.name }}"
data-email="{% if author.email %}{{ author.email }}{% endif %}"
value="{{ author.name }}">
{% endfor %} {% endfor %}
{% bootstrap_form_errors submitter_form %} {% bootstrap_form_errors submitter_form %}
{% bootstrap_field submitter_form.name %} {% bootstrap_field submitter_form.name %}
{% bootstrap_field submitter_form.email %} {% bootstrap_field submitter_form.email %}
{% if user|has_role:"Secretariat" %} {% if user|has_role:"Secretariat" %}
{% bootstrap_field submitter_form.approvals_received %} {% bootstrap_field submitter_form.approvals_received %}
{% endif %} {% endif %}

View file

@ -1,169 +1,220 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% block title %}I-D Submission tool instructions{% endblock %} {% block title %}I-D Submission tool instructions{% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
<h2>I-D submission tool instructions</h2> <h2 class="mt-3">I-D submission tool instructions</h2>
<p class="alert alert-info my-3">
<p><b>Tool URL:</b> <a href="{% url "ietf.submit.views.upload_submission" %}">https://datatracker.ietf.org{% url "ietf.submit.views.upload_submission" %}</a></p> <b>Tool URL:</b>
<a href="{% url "ietf.submit.views.upload_submission" %}">
https://datatracker.ietf.org{% url "ietf.submit.views.upload_submission" %}
</a>
</p>
<p> <p>
This page will explain the purpose and content of each screen in the I-D Submission Tool, and the actions that result by clicking the form buttons on each screen. This page will explain the purpose and content of each screen in the I-D Submission Tool, and the actions that result by clicking the form buttons on each screen.
</p> </p>
<p> <p>
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that other Task Force (IETF), its areas, and its working groups. Note that other
groups may also distribute working documents as Internet-Drafts. groups may also distribute working documents as Internet-Drafts.
</p> </p>
<p> <p>
Internet-Drafts are draft documents, and are valid for a maximum of Internet-Drafts are draft documents, and are valid for a maximum of
six months. They may be updated, replaced, or obsoleted by other six months. They may be updated, replaced, or obsoleted by other
documents at any time. documents at any time.
</p> </p>
<p> <p>
The list of current Internet-Drafts can be accessed at The list of current Internet-Drafts can be accessed at
<a href="https://www.ietf.org/ietf/1id-abstracts.txt">https://www.ietf.org/ietf/1id-abstracts.txt</a>. <a href="https://www.ietf.org/ietf/1id-abstracts.txt">https://www.ietf.org/ietf/1id-abstracts.txt</a>.
</p> </p>
<p> <p>
An API for automated draft submission is available as an alternative to this webpage at An API for automated draft submission is available as an alternative to this webpage at
<a href="https://datatracker.ietf.org/api/submit/">https://datatracker.ietf.org/api/submit/</a>. <a href="https://datatracker.ietf.org/api/submit/">https://datatracker.ietf.org/api/submit/</a>.
</p> </p>
<p>
<h3>Upload screen</h3> The specification for this tool can be found in
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc4228' %}">RFC 4228</a>.
</p>
<h3 class="mt-4">Upload screen</h3>
<p> <p>
The Upload screen is the first screen that a user will see when he or she starts the I-D submission process. A user can submit three different formats of an I-D, XML, plain-text, and PDF, at the same time. Failure to submit at least one of a plain-text or xml version will cause an error, and an error screen will be displayed. A single v3 .xml source is preferred. A single v2 .xml source will be accepted. If neither of those are available, a plain-text document may be provided. The Upload screen is the first screen that a user will see when he or she starts the I-D submission process. A user can submit three different formats of an I-D, XML, plain-text, and PDF, at the same time. Failure to submit at least one of a plain-text or xml version will cause an error, and an error screen will be displayed. A single v3 .xml source is preferred. A single v2 .xml source will be accepted. If neither of those are available, a plain-text document may be provided.
</p> </p>
<p> <p>
By submitting your I-D, you are granting some rights to the IETF Trust. Before you submit your I-D, By submitting your I-D, you are granting some rights to the IETF Trust. Before you submit your I-D,
review the information in the review the information in the
<a href="https://www.ietf.org/about/note-well/">Note Well</a> and <a href="https://www.ietf.org/about/note-well/">Note Well</a>
and
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc5378' %}">BCP 78</a>, <a href="{% url 'ietf.doc.views_doc.document_html' name='rfc5378' %}">BCP 78</a>,
"Rights Contributors Provide to the IETF Trust". "Rights Contributors Provide to the IETF Trust".
</p> </p>
<p> <p>
Before you submit your I-D, it is recommended that you check it for nits Before you submit your I-D, it is recommended that you check it for nits
using the <b><a href="{{settings.IDNITS_BASE_URL}}">idnits tool</a></b>. using the
</p> <a href="{{ settings.IDNITS_BASE_URL }}">idnits tool</a>.
<p>
<b>Form buttons and resulting actions</b>:
</p> </p>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr> <thead>
<th>.txt format</th> <tr class="table-info">
<td>Button to select a plain-text file of an I-D from a user's local file system.</td> <th colspan="2">Form buttons and resulting actions:</th>
</tr> </tr>
<tr> </thead>
<th>.xml format</th> <tbody>
<td>Button to select an XML file of an I-D from a user's local file system. </td> <tr>
</tr> <th class="text-nowrap">.txt format</th>
<tr> <td>Button to select a plain-text file of an I-D from a user's local file system.</td>
<th>.pdf format</th> </tr>
<td>Button to select a PDF file of an I-D from a user's local file system. </td> <tr>
</tr> <th class="text-nowrap">.xml format</th>
<tr> <td>Button to select an XML file of an I-D from a user's local file system.</td>
<th>Upload</th> </tr>
<td>Button to upload the document(s). The tool will begin parsing the plain-text document (or creating it from the xml if only xml is provided) and validate the document. The parsed meta-data will be displayed for user confirmation along with the validation results.</td> <tr>
</tr> <th class="text-nowrap">.pdf format</th>
<td>Button to select a PDF file of an I-D from a user's local file system.</td>
</tr>
<tr>
<th class="text-nowrap">Upload</th>
<td>
Button to upload the document(s). The tool will begin parsing the plain-text document (or creating it from the xml if only xml is provided) and validate the document. The parsed meta-data will be displayed for user confirmation along with the validation results.
</td>
</tr>
</tbody>
</table> </table>
<h3 class="mt-4">Validation screen</h3>
<h3>Validation screen</h3>
<p> <p>
After a user uploads the document(s), the tool will parse the plain-text version, validate the I-D, and display the validation results with option(s) for next steps. The validation includes: checking for all IPR-related notices and I-D boilerplate described in <a href="https://www.ietf.org/ietf/1id-guidelines.html">Guidelines to Authors of Internet-Drafts</a>; the required sections described in <a href="https://www.ietf.org/ID-Checklist.html">the I-D Check List</a>; the version number; and the creation date. After a user uploads the document(s), the tool will parse the plain-text version, validate the I-D, and display the validation results with option(s) for next steps. The validation includes: checking for all IPR-related notices and I-D boilerplate described in
<a href="https://www.ietf.org/ietf/1id-guidelines.html">Guidelines to Authors of Internet-Drafts</a>;
the required sections described in
<a href="https://www.ietf.org/ID-Checklist.html">the I-D Check List</a>;
the version number; and the creation date.
</p> </p>
<p> <p>
If the submission does not have any validation errors, then the user will be allowed to proceed with the automated posting process. This process will begin with submitter authentication, which will be done by e-mail. If the submission does not have any validation errors, then the user will be allowed to proceed with the automated posting process. This process will begin with submitter authentication, which will be done by e-mail.
</p> </p>
<p> <p>
A user must carefully examine the meta-data that are displayed on this screen, and make sure that these data were extracted correctly. If the data were not extracted correctly, then the user can correct the errors via the Adjust page. In such a case, the user will pass the draft to the Secretariat for manual posting. A user must carefully examine the meta-data that are displayed on this screen, and make sure that these data were extracted correctly. If the data were not extracted correctly, then the user can correct the errors via the Adjust page. In such a case, the user will pass the draft to the Secretariat for manual posting.
</p> </p>
<p><b>Form buttons and resulting actions:</b></p>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr> <thead>
<th>Adjust meta-data</th> <tr class="table-info">
<td>Button to proceed to a screen with editable form fields for correcting the meta-data. A user can use this button to request manual posting by the Secretariat.</td> <th colspan="2">Form buttons and resulting actions:</th>
</tr> </tr>
<tr> </thead>
<th>Cancel</th> <tbody>
<td>Button to cancel the current submission. A user will be prompted for a confirmation before the submission is canceled. Once confirmed, the current submission will be canceled, the uploaded document(s) will be deleted permanently from the server, and a notification message will be sent to all authors with the IP address of the user who just canceled the submission.</td> <tr>
</tr> <th>Adjust meta-data</th>
<td>
Button to proceed to a screen with editable form fields for correcting the meta-data. A user can use this button to request manual posting by the Secretariat.
</td>
</tr>
<tr>
<th>Cancel</th>
<td>
Button to cancel the current submission. A user will be prompted for a confirmation before the submission is canceled. Once confirmed, the current submission will be canceled, the uploaded document(s) will be deleted permanently from the server, and a notification message will be sent to all authors with the IP address of the user who just canceled the submission.
</td>
</tr>
</tbody>
<thead>
<tr class="table-info">
<th colspan="2">
When no meta-data error is detected:
</th>
</tr>
</thead>
<tbody>
<tr>
<th>
Button(s) with author's name(s)
</th>
<td>
Button(s) to automatically fill out the given name, family name, and email address of the authors. If the submitter is one of the authors, then the submitter's information will be automatically inserted in the appropriate fields. If the submitter is not one of the authors, then the submitter will need to manually fill out these fields.
</td>
</tr>
<tr>
<th>
Post now
</th>
<td>
<p>
Button to start the automated posting process with submitter authentication. Once clicked, an email message will be sent to the parties who can verify the sybmission. For a new draft (-00), that will be the authors listed in the document. For -01 and subsequent drafts, the confirmation message is sent to the authors of the <b>previous</b> version. One of the recipients of the confirmation message will need to open the email message via his or her email application, and click the link provided in the message body.
</p>
<p>
Once a link in the email body is clicked, the document gets pushed to the IETF Web and FTP sites, a notification is sent to the authors of the document, and an I-D Action announcement will be sent out within the next 15 minutes.
</p>
<p>
If the document requires an additional approval from a chair of a working group, i.e., for submission of a 00 version of a working group document, then a message will be sent to the chairs of the working group for the approval. Once approved, the document will be immediately announced and available via the IETF Web and FTP sites.
</p>
</td>
</tr>
</tbody>
</table> </table>
<h3 class="mt-4">
Adjust screen
<p><b>When no meta-data error is detected:</b></p> </h3>
<table class="table table-sm table-striped">
<tr>
<th>Button(s) with author's name(s)</th>
<td>Button(s) to automatically fill out the given name, family name, and email address of the authors. If the submitter is one of the authors, then the submitter's information will be automatically inserted in the appropriate fields. If the submitter is not one of the authors, then the submitter will need to manually fill out these fields.</td>
</tr>
<tr>
<th>Post now</th>
<td>
<p>Button to start the automated posting process with submitter authentication. Once clicked, an email message will be sent to the parties who can verify the sybmission. For a new draft (-00), that will be the authors listed in the document. For -01 and subsequent drafts, the confirmation message is sent to the authors of the <b>previous</b> version. One of the recipients of the confirmation message will need to open the email message via his or her email application, and click the link provided in the message body.</p>
<p>Once a link in the email body is clicked, the document gets pushed to the IETF Web and FTP sites, a notification is sent to the authors of the document, and an I-D Action announcement will be sent out within the next 15 minutes.</p>
<p>If the document requires an additional approval from a chair of a working group, i.e., for submission of a 00 version of a working group document, then a message will be sent to the chairs of the working group for the approval. Once approved, the document will be immediately announced and available via the IETF Web and FTP sites.</p>
</td>
</tr>
</table>
<h3>Adjust screen</h3>
<p> <p>
This is the screen where a user can adjust any meta-data that could have been incorrectly parsed from the submitted document. The document with adjusted meta-data will be submitted to the Secretariat for manual posting. This is the screen where a user can adjust any meta-data that could have been incorrectly parsed from the submitted document. The document with adjusted meta-data will be submitted to the Secretariat for manual posting.
</p> </p>
<p><b>Form buttons and resulting actions:</b></p>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
<tr> <thead>
<th>Button(s) with author's name(s)</th> <tr class="table-info">
<td>Button(s) to automatically fill out the given name, family name, and email address of the authors. If the submitter is one of the authors, then the submitter's information will be automatically inserted in the appropriate fields. If the submitter is not one of the authors, then the submitter will need to manually fill out these fields.</td> <th colspan="2">
</tr> Form buttons and resulting actions:
<tr> </th>
<th>Submit for manual posting</th> </tr>
<td>Button to send a manual posting request to the Secretariat including any corrected meta-data and comments for the Secretariat. Once clicked, a notification message will be sent to the Secretariat, and a receipt page will be displayed. </thead>
<tbody>
<tr>
<th>
Button(s) with author's name(s)
</th>
<td>
Button(s) to automatically fill out the given name, family name, and email address of the authors. If the submitter is one of the authors, then the submitter's information will be automatically inserted in the appropriate fields. If the submitter is not one of the authors, then the submitter will need to manually fill out these fields.
</td>
</tr> </tr>
<tr> <tr>
<th>Cancel</th> <th>
<td>Button to cancel the current submission. A user will be prompted for a confirmation before the submission is canceled. Once confirmed, the current suissio Submit for manual posting
n will be canceled, the uploaded document(s) will be deleted permanently from the server, and a notification message will be sent to all authors with the IP address of the user who just canceled the submission.</td> </th>
<td>
Button to send a manual posting request to the Secretariat including any corrected meta-data and comments for the Secretariat. Once clicked, a notification message will be sent to the Secretariat, and a receipt page will be displayed.
</td>
</tr> </tr>
</table>
<h3>Status screen</h3>
<p>
The Status screen is the screen where a user can view the current status of a document that has just been submitted by the user, or a document that was submitted previously via the tool. If a link 'Status' is clicked from the tool's first page, then a form field will be provided for a user to look up a document by name.
</p>
<p><b>Form buttons and resulting actions:</b></p>
<table class="table table-sm table-striped">
<tr> <tr>
<th>Cancel</th> <th>
<td>Button to cancel the current submission. This button will be displayed only when the document is in the process of being submitted. A user will be prompted for a confirmation before the submission is canceled. Once confirmed, the current submission will be canceled, the uploaded document(s) will be deleted permanently from the server, and a notification message will be sent to all authors with the IP address of the user who just canceled the submission.</td> Cancel
</th>
<td>
Button to cancel the current submission. A user will be prompted for a confirmation before the submission is canceled. Once confirmed, the current suissio
n will be canceled, the uploaded document(s) will be deleted permanently from the server, and a notification message will be sent to all authors with the IP address of the user who just canceled the submission.
</td>
</tr> </tr>
</table> </tbody>
</table>
<h3>Problem report</h3> <h3 class="mt-4">
Status screen
{% include "submit/problem-reports-footer.html" %} </h3>
<p>
<p> The Status screen is the screen where a user can view the current status of a document that has just been submitted by the user, or a document that was submitted previously via the tool. If a link 'Status' is clicked from the tool's first page, then a form field will be provided for a user to look up a document by name.
The specification for this tool can be found in <a href="{% url 'ietf.doc.views_doc.document_html' name='rfc4228' %}">RFC 4228</a>. </p>
</p> <table class="table table-sm table-striped">
<thead>
{% endblock %} <tr class="table-info">
<th colspan="2">
Form buttons and resulting actions:
</th>
</tr>
</thead>
<tbody>
<tr>
<th>
Cancel
</th>
<td>
Button to cancel the current submission. This button will be displayed only when the document is in the process of being submitted. A user will be prompted for a confirmation before the submission is canceled. Once confirmed, the current submission will be canceled, the uploaded document(s) will be deleted permanently from the server, and a notification message will be sent to all authors with the IP address of the user who just canceled the submission.
</td>
</tr>
</tbody>
</table>
{% include "submit/problem-reports-footer.html" %}
{% endblock %}

View file

@ -1,94 +1,81 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %} {% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% load ietf_filters %} {% load ietf_filters %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
{% block title %}Upload{% endblock %} {% block title %}Upload{% endblock %}
{% block submit_content %} {% block submit_content %}
{% origin %} {% origin %}
{% if form.shutdown and user|has_role:"Secretariat" %} {% if form.shutdown and user|has_role:"Secretariat" %}
<p class="alert alert-warning"> <p class="alert alert-warning my-3">
<b>Warning:</b> Currently in I-D submission blackout period. <b>Warning:</b> Currently in I-D submission blackout period.
</p> </p>
{% endif %} {% endif %}
{% if form.cutoff_warning %}<div class="alert alert-info my-3">{{ form.cutoff_warning|safe }}</div>{% endif %}
{% if form.cutoff_warning %}
<div class="alert alert-info">
{{ form.cutoff_warning|safe }}
</div>
{% endif %}
{% if not form.shutdown or user|has_role:"Secretariat" %} {% if not form.shutdown or user|has_role:"Secretariat" %}
<p class="alert alert-warning"> <div class="alert alert-warning my-3">
By submitting your I-D, you are granting some rights to the IETF Trust. By submitting your I-D, you are granting some rights to the IETF Trust.
Before you submit your I-D, review the information in the Before you submit your I-D, review the information in the
<a href="https://www.ietf.org/about/note-well/">Note Well</a> and <a href="https://www.ietf.org/about/note-well/">Note Well</a>
and
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc5378' %}">BCP 78</a>, <a href="{% url 'ietf.doc.views_doc.document_html' name='rfc5378' %}">BCP 78</a>,
"Rights Contributors Provide to the IETF Trust". "Rights Contributors Provide to the IETF Trust".
</p> <hr>
<p>
Before you submit your I-D, it is recommended that you check it for nits Before you submit your I-D, it is recommended that you check it for nits
using the <a href="{{settings.IDNITS_BASE_URL}}">idnits</a> tool, and using the
fix them. <a href="{{ settings.IDNITS_BASE_URL }}">idnits</a>
</p> tool, and fix them.
<div class="card">
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_label '<i class="bi bi-file-code"></i> XML source of the I-D' label_class="fw-bold" %}
{% bootstrap_field form.xml show_label=False %}
<p class="form-text">
Preferably, submit a standalone
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc7991' %}">xml2rfc version 3</a>
source file. You can use this online
<a href="https://author-tools.ietf.org/">conversion service</a>
to convert your I-D to this format.
(You may submit an older
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc7749' %}">xml2rfc version 2</a>
file if you must.)
</p>
<div class="form-check mb-3">
<label class="form-check-label" data-bs-toggle="collapse" data-bs-target="#other-formats" aria-expanded="false" aria-controls="other-formats">
<input class="form-check-input" id="checkbox" type="checkbox" type="checkbox" /> Submit other formats
</label>
</div>
<div class="collapse" id="other-formats">
{% bootstrap_label '<i class="bi bi-file-text"></i> Plaintext rendering of the I-D' label_class="fw-bold" %}
{% bootstrap_field form.txt show_label=False %}
<p class="form-text">
Optional to submit, will be auto-generated based
on the submitted XML.
However, if you cannot for some reason submit XML, you must
submit a plaintext rendering of your I-D.
</p>
{% bootstrap_label '<i class="bi bi-file-pdf"></i> PDF rendering of the I-D' label_class="fw-bold" %}
{% bootstrap_field form.pdf show_label=False %}
<p class="form-text">
Optional to submit, will be auto-generated based
on the submitted XML.
</p>
</div>
{% bootstrap_form_errors form %}
{% bootstrap_button button_type="submit" name="upload" content="Upload" %}
</form>
</div>
</div> </div>
<form method="post" enctype="multipart/form-data" class="my-3">
{% include "submit/problem-reports-footer.html" %}{% endif %} {% csrf_token %}
{% bootstrap_label '<i class="bi bi-file-code"></i> XML source of the I-D' label_class="form-label fw-bold" %}
{% bootstrap_field form.xml show_label=False %}
<p class="form-text">
Preferably, submit a standalone
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc7991' %}">xml2rfc version 3</a>
source file. You can use this online
<a href="https://author-tools.ietf.org/">conversion service</a>
to convert your I-D to this format.
(You may submit an older
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc7749' %}">xml2rfc version 2</a>
file if you must.)
</p>
<div class="form-check mb-3">
<label class="form-check-label"
data-bs-toggle="collapse"
data-bs-target="#other-formats"
aria-expanded="false"
aria-controls="other-formats">
<input class="form-check-input"
id="checkbox"
type="checkbox"
type="checkbox"/>
Submit other formats
</label>
</div>
<div class="collapse" id="other-formats">
{% bootstrap_label '<i class="bi bi-file-text"></i> Plaintext rendering of the I-D' label_class="form-label fw-bold" %}
{% bootstrap_field form.txt show_label=False %}
<p class="form-text">
Optional to submit, will be auto-generated based
on the submitted XML.
However, if you cannot for some reason submit XML, you must
submit a plaintext rendering of your I-D.
</p>
{% bootstrap_label '<i class="bi bi-file-pdf"></i> PDF rendering of the I-D' label_class="form-label fw-bold" %}
{% bootstrap_field form.pdf show_label=False %}
<p class="form-text">
Optional to submit, will be auto-generated based
on the submitted XML.
</p>
</div>
{% bootstrap_form_errors form %}
{% bootstrap_button button_type="submit" name="upload" content="Upload" %}
</form>
{% include "submit/problem-reports-footer.html" %}
{% endif %}
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script> <script>
$(document).ready(function() { $(document).ready(function() {

View file

@ -76,7 +76,7 @@ def texescape_filter(value):
@register.filter @register.filter
@stringfilter @stringfilter
def linkify(value): def linkify(value):
text = mark_safe(bleach.linkify(escape(value), parse_email=True)) text = mark_safe(bleach.linkify(value, parse_email=True))
return text return text
@register.filter @register.filter

View file

@ -55,6 +55,7 @@
"ietf/static/js/datepicker.js", "ietf/static/js/datepicker.js",
"ietf/static/js/doc-search.js", "ietf/static/js/doc-search.js",
"ietf/static/js/document_timeline.js", "ietf/static/js/document_timeline.js",
"ietf/static/js/draft-submit.js",
"ietf/static/js/edit-meeting-schedule.js", "ietf/static/js/edit-meeting-schedule.js",
"ietf/static/js/edit-meeting-timeslots-and-misc-sessions.js", "ietf/static/js/edit-meeting-timeslots-and-misc-sessions.js",
"ietf/static/js/edit-milestones.js", "ietf/static/js/edit-milestones.js",