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):
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"(?<!>)(BCP\s*?)0{0,3}(\d+)", "<a href=\"/doc/bcp\\2/\">\\1\\2</a>", string)
string = re.sub(r"(?<!>)(STD\s*?)0{0,3}(\d+)", "<a href=\"/doc/std\\2/\">\\1\\2</a>", string)
string = re.sub(r"(?<!>)(FYI\s*?)0{0,3}(\d+)", "<a href=\"/doc/fyi\\2/\">\\1\\2</a>", string)
string = re.sub(r"(?<!>)(draft-[-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)
string = re.sub(r"(?<!>)(status-change-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</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, flags=re.IGNORECASE)
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, flags=re.IGNORECASE)
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, flags=re.IGNORECASE)
string = re.sub(r"(?<!>)(status-change-[-0-9a-zA-Z._+]+)", "<a href=\"/doc/\\1/\">\\1</a>", string, flags=re.IGNORECASE)
return mark_safe(string)
urlize_ietf_docs = stringfilter(urlize_ietf_docs)

View file

@ -92,12 +92,12 @@ class PersonTests(TestCase):
#debug.show('person.photo_name()')
self.assertContains(r, person.photo_name(), status_code=200)
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()
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)
self.assertEqual(r.status_code, 200)
@ -399,4 +399,3 @@ class PersonUtilsTests(TestCase):

View file

@ -38,7 +38,7 @@ $popover-max-width: 100%;
@import "~/node_modules/bootstrap/scss/pagination";
@import "~/node_modules/bootstrap/scss/badge";
@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/close";
// @import "~/node_modules/bootstrap/scss/toasts";

View file

@ -5,7 +5,6 @@
// @import "~/node_modules/bootstrap/scss/utilities";
table .sort {
// white-space: nowrap;
cursor: pointer;
}
@ -14,16 +13,18 @@ table .sort:hover {
color: var(--#{$variable-prefix}table-hover-color);
}
table .sort:before {
table .sort:after {
white-space: nowrap;
font-family: 'bootstrap-icons';
content: '\f127';
content: '\f283'; // chevron-expand
float: right;
padding-right: .25em;
}
table .sort.asc:before {
content: '\f128';
table .sort.asc:after {
content: '\f282'; // chevron-down
}
table .sort.desc:before {
content: '\f148';
table .sort.desc:after {
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)
.children("[data-sort]")
.addClass("sort");
$(header_row)
.children("th, td")
.each((i, e) => field_magic(i, e, fields));
// $(header_row)
// .children("th, td")
// .wrapInner("<span class='tablesorter-th'></span>");
// // .each((i, e) => field_magic(i, e, fields));
if ($(header_row)
.text()

View file

@ -1,7 +1,7 @@
// 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
// the django-password-strength component.
(function($, window, document, undefined){
(function ($, window, document, undefined) {
window.djangoPasswordStrength = {
config: {
passwordClass: 'password_strength',
@ -15,64 +15,108 @@
$.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();
},
initListeners: function() {
initListeners: function () {
var self = this;
var body = $('body');
$('.' + self.config.passwordClass).on('keyup', function() {
var password_strength_bar = $(this).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');
$('.' + self.config.passwordClass)
.on('keyup', function () {
var password_strength_bar = $(this)
.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() ) {
var result = zxcvbn( $(this).val() );
if ($(this)
.val()) {
var result = zxcvbn($(this)
.val());
if( result.score < 3 ) {
password_strength_bar.removeClass('progress-bar-success').addClass('progress-bar-warning');
password_strength_info.find('.label').removeClass('hidden');
if (result.score < 3) {
password_strength_bar.removeClass('bg-success')
.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 {
password_strength_bar.removeClass('progress-bar-warning').addClass('progress-bar-success');
password_strength_info.find('.label').addClass('hidden');
password_strength_bar.removeClass('bg-success')
.addClass('bg-warning');
password_strength_bar.width('0%')
.attr('aria-valuenow', 0);
password_strength_info.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('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));
});
self.match_passwords($(this));
});
var timer = null;
$('.' + self.config.confirmationClass).on('keyup', function() {
var password_field;
var confirm_with = $(this).data('confirm-with');
$('.' + self.config.confirmationClass)
.on('keyup', function () {
var password_field;
var confirm_with = $(this)
.data('confirm-with');
if( confirm_with ) {
password_field = $('#' + confirm_with);
} else {
password_field = $('.' + self.config.passwordClass);
}
if (confirm_with) {
password_field = $('#' + confirm_with);
} else {
password_field = $('.' + self.config.passwordClass);
}
if (timer !== null) clearTimeout(timer);
if (timer !== null) clearTimeout(timer);
timer = setTimeout(function(){
self.match_passwords(password_field);
}, 400);
});
timer = setTimeout(function () {
self.match_passwords(password_field);
}, 400);
});
},
display_time: function(seconds) {
display_time: function (seconds) {
var minute = 60;
var hour = minute * 60;
var day = hour * 24;
@ -81,46 +125,57 @@
var century = year * 100;
// 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 < hour) return (1 + Math.ceil(seconds / minute)) + ' ' + gettext('minutes');
if( seconds < day) return (1 + Math.ceil(seconds / hour)) + ' ' + gettext('hours');
if( seconds < month) return (1 + Math.ceil(seconds / day)) + ' ' + gettext('days');
if( seconds < year) return (1 + Math.ceil(seconds / month)) + ' ' + gettext('months');
if( seconds < century) return (1 + Math.ceil(seconds / year)) + ' ' + gettext('years');
if (seconds < minute) return gettext('only an instant');
if (seconds < hour) return (1 + Math.ceil(seconds / minute)) + ' ' + gettext('minutes');
if (seconds < day) return (1 + Math.ceil(seconds / hour)) + ' ' + gettext('hours');
if (seconds < month) return (1 + Math.ceil(seconds / day)) + ' ' + gettext('days');
if (seconds < year) return (1 + Math.ceil(seconds / month)) + ' ' + gettext('months');
if (seconds < century) return (1 + Math.ceil(seconds / year)) + ' ' + gettext('years');
return gettext('centuries');
},
match_passwords: function(password_field, confirmation_fields) {
match_passwords: function (password_field, confirmation_fields) {
var self = this;
// Optional parameter: if no specific confirmation field is given, check all
if( confirmation_fields === undefined ) { confirmation_fields = $('.' + self.config.confirmationClass) }
if( confirmation_fields === undefined ) { return; }
if (confirmation_fields === undefined) { confirmation_fields = $('.' + self.config.confirmationClass); }
if (confirmation_fields === undefined) { return; }
var password = password_field.val();
confirmation_fields.each(function(index, confirm_field) {
var confirm_value = $(confirm_field).val();
var confirm_with = $(confirm_field).data('confirm-with');
confirmation_fields.each(function (index, confirm_field) {
var confirm_value = $(confirm_field)
.val();
var confirm_with = $(confirm_field)
.data('confirm-with');
if( confirm_with && confirm_with == password_field.attr('id')) {
if( confirm_value && password ) {
if (confirm_with && confirm_with == password_field.attr('id')) {
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 {
$(confirm_field).parent().find('.password_strength_info').removeClass('hidden');
$(confirm_field)
.parent()
.find('.password_strength_info')
.removeClass('visually-hidden');
}
} 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( !password_field.hasClass(self.config.passwordClass) && !password_field.data('password-listener') ) {
password_field.on('keyup', function() {
if (!password_field.hasClass(self.config.passwordClass) && !password_field.data('password-listener')) {
password_field.on('keyup', function () {
self.match_passwords($(this));
});
password_field.data('password-listener', true);

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'):
result += escape(line)
result += '\n'
result += '</pre>pre>\n'
result += '</pre>\n'
return mark_safe(result)

View file

@ -202,7 +202,7 @@ class SubmitTests(BaseSubmitTestCase):
sys.stderr.write("Author initials: %s\n" % author.initials())
self.assertEqual(len(submission.authors), 1)
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["affiliation"], "Test Centre Inc.")
self.assertEqual(a["country"], "UK")
@ -2516,7 +2516,7 @@ ZSBvZiBsaW5lcyAtIGJ1dCBpdCBjb3VsZCBiZSBhIGRyYWZ0Cg==
if is_secretariat:
# 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:
# No reply button
@ -2591,7 +2591,7 @@ Thank you
# check the page
r = self.client.get(the_url)
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)
subject = post_button.parents("form").find('input[name="subject"]').val()
frm = post_button.parents("form").find('input[name="frm"]').val()

View file

@ -1,10 +1,14 @@
{# bs5ok #}
{% load ietf_filters session_filters origin %}
{% if not session.past_cutoff_date %}
{% origin %}
{% with gt=session.group.type_id %}
{%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>
{%endcomment%}
<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>
<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' %}{% else %}#session_{{session.pk}}{% endif %}">Edit</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 %}
{% endif %}

View file

@ -1,3 +1,4 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015-2019, All Rights Reserved #}
{% load origin %}
{% origin %}
@ -5,11 +6,6 @@
{% load tz %}
<tr>
<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 %}
<div id="{{ session.name|slugify }}">{{ session.name }}</div>
{% else %}
@ -22,15 +18,9 @@
{% endif %}
</td>
{% if session.all_meeting_sessions_cancelled %}
{% if user|has_role:"Secretariat" or user_groups %}
<td colspan="7">
<span class="badge bg-danger">Session cancelled</span>
</td>
{% else %}
<td colspan="6">
<span class="badge bg-danger">Session cancelled</span>
</td>
{% endif %}
<td colspan="{% if user|has_role:'Secretariat' or user_groups %}7{% else %}6{% endif %}">
<span class="badge bg-danger">Session cancelled</span>
</td>
{% else %}
<td>
{% if session.all_meeting_agendas %}
@ -38,7 +28,7 @@
{% if session.all_meeting_agendas|length == 1 %}
{% if agenda.time > old %}
<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 %}
<a href="{{ session.all_meeting_agendas.0|meeting_href:session.meeting }}">Agenda</a>
<br>
@ -85,7 +75,7 @@
{% endfor %}
{% endif %}
{% else %}
<span class="badge bg-bluesheets">No bluesheets</span>
<span class="badge bg-warning">No bluesheets</span>
{% endif %}
{% endif %}
</td>
@ -94,7 +84,7 @@
{% for slide in slides %}
{% if slide.time > old %}
<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 %}
<a href="{{ slide|meeting_href:session.meeting }}">{{ slide.title|clean_whitespace }}</a>
<br>
@ -108,7 +98,7 @@
{% for draft in drafts %}
{% if draft.time > old %}
<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 %}
<a href="{{ draft.get_href }}">{{ draft.name }}</a>
<br>
@ -126,7 +116,7 @@
</td>
<td>
{% 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 %}
</td>
{% endif %}

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 proceedings_filters %}
<tr>
<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 %}
<div id="{{ session.name|slugify }}">{{ session.name }}</div>
{% else %}
<div id="{{session.group.acronym}}"><a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{session.group.acronym}}</a></div>
{% if session.group.state_id == "bof" %}
<span class="badge bg-success">BOF</span>
{% endif %}
<div id="{{ session.group.acronym }}">
<a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{ session.group.acronym }}</a>
</div>
{% if session.group.state_id == "bof" %}<span class="badge bg-success">BOF</span>{% endif %}
{% endif %}
</td>
{% 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 %}
<td>
{% if session.all_meeting_agendas %}
{% 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 %}
{% 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 %}
{% endif %}
{% else %}
{% 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 %}
{% if session.all_meeting_minutes %}
{% 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 %}
{% 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 %}
{% endif %}
{% else %}
{% 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 %}
{% if session.all_meeting_bluesheets %}
{% 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 %}
{% 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 %}
{% endif %}
{% endif %}
{% with session.group|status_for_meeting:meeting as 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 %}
{% endwith %}
</td>
<td>
{% if session.all_meeting_sessions_for_group|length == 1 %}
{% 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 %}
{% else %}
{% 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 %}
{% endif %}
</td>
@ -81,20 +98,17 @@
<a href="{{ slide|meeting_href:meeting }}">{{ slide.title|clean_whitespace }}</a>
<br>
{% empty %}
{% if not meeting.proceedings_final %}
<span class="badge bg-warning">No slides</span>
{% endif %}
{% if not meeting.proceedings_final %}<span class="badge bg-warning">No slides</span>{% endif %}
{% endfor %}
{% endwith %}
</td>
<td>
{% with session.all_meeting_drafts as 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 %}
{% if not meeting.proceedings_final %}
<span class="badge bg-warning">No drafts</span>
{% endif %}
{% if not meeting.proceedings_final %}<span class="badge bg-warning">No drafts</span>{% endif %}
{% endfor %}
{% endwith %}
</td>

View file

@ -1,20 +1,37 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2020, All Rights Reserved #}
{% load origin staticfiles django_bootstrap5 %}
{% block title %}Approved Slides for {{ submission.session.meeting }} : {{ submission.session.group.acronym }}{% endblock %}
{% block title %}
Approved Slides for {{ submission.session.meeting }} : {{ submission.session.group.acronym }}
{% endblock %}
{% block content %}
{% origin %}
<h1>These slides have already been {% if submission.status.slug == 'approved' %} approved {% else %} rejected {% endif %}</h1>
<p>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
<h1 class ="mb-3">
These slides have already been
{% if submission.status.slug == 'approved' %}
approved
{% else %}
rejected
{% 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>
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 %}
{% if not_meeting_sessions %}
<p>
<small class="text-muted">{{ area.name }} groups not meeting:</small>
{{ area.name }} groups not meeting:
{% for session in not_meeting_sessions %}
{% ifchanged session.group.acronym %}
<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" %}
{# Copyright The IETF Trust 2021, All Rights Reserved #}
{% load tz %}
{% block intro %}
<p class="form-text">
{% 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 %}
This item currently will not appear on the proceedings.<br>
This item currently will not appear on the proceedings.
{% endif %}
</p>
{% endblock %}

View file

@ -1,25 +1,21 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2021, All Rights Reserved #}
{% load origin %}
{% 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 %}
{% origin %}
<h1>{{ action|capfirst }} material</h1>
<p>{{ action|capfirst }} <strong>{{material}}</strong> for the {{ material.meeting }} proceedings?</p>
<p class="alert alert-warning my-3">
{{ action|capfirst }} <strong>{{ material }}</strong> for the {{ material.meeting }} proceedings?
</p>
<form method="post">
{% csrf_token %}
<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>
{% endblock %}

View file

@ -1,26 +1,28 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static django_bootstrap5 %}
{% block title %}Propose Slides for {{ session.meeting }} : {{ session.group.acronym }}{% endblock %}
{% block content %}
{% origin %}
<h1>Propose Slides for {{ session.meeting }} : {{ session.group.acronym }}{% if session.name %} : {{session.name}}{% endif %}</h1>
{% if session_number %}<h2> Session {{session_number}} : {{session.official_timeslotassignment.timeslot.time|date:"D M-d-Y Hi"}}</h2>{% endif %}
<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>
<h1>
Propose Slides for {{ session.meeting }}
<br>
<small class="text-muted">{{ session.group.acronym }}
{% 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">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Upload</button>
</form>
{% endblock %}

View file

@ -1,33 +1,44 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}Remove {{sp.document}} from session{% endblock %}
{% block title %}Remove {{ sp.document }} from session{% endblock %}
{% block content %}
{% 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 %}
<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 %}
<h2>Document</h2>
<p><strong>{{sp.document.name}}{% if sp.rev %}-{{sp.rev}}{% else %} (current version){% endif %}</strong></p>
<p>{{sp.document.title}}</p>
<h2>Session</h2>
<p>{{sp.session}}</p>
<h2 class="mt-3">Document</h2>
<p>
<strong>{{ sp.document.name }}
{% if sp.rev %}
-{{ sp.rev }}
{% else %}
(current version)
{% endif %}
</strong>
</p>
<p>
{{ sp.document.title }}
</p>
<h2 class="mt-3">Session</h2>
<p>
{{ sp.session }}
</p>
<form method="post">
{% csrf_token %}
<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>
<a class="btn btn-primary href="{% url 'ietf.meeting.views.session_details' num=sp.session.meeting.number acronym=sp.session.group.acronym%}">Cancel</a>
<button type="submit"
class="btn btn-{% if sp.session.is_material_submission_cutoff %}warning{% else %}primary{% endif %}"
name="remove_session">
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>
{% endblock %}

View file

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

View file

@ -1,79 +1,61 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load django_bootstrap5 %}
{% load static %}
{% block title %}Change password{% endblock %}
{% block js %}
{{ block.super }}
<script src="{% static 'ietf/js/zxcvbn.js' %}"></script>
<script src="{% static 'ietf/js/password_strength.js' %}"></script>
{% endblock %}
{% block content %}
{% origin %}
{% 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 %}
<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 %}
{% else %}
<div class="row">
<div class="col-md-2 col-sm-0"></div>
<div class="col-md-8 col-sm-12">
<h1>Change password</h1>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Change password</button>
</form>
<div class="form-text">
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 estimage given above assume online attack without rate
limiting, at a rate of 10 attempts per second.
</div>
<h4>Offline cracking</h4>
<div class="form-text">
The datatracker currently uses the <b>{{ hasher.algorithm }}</b>
password hasher with
<b>
{% if hasher.iterations %}
{{ hasher.iterations }} iterations
{% elif hasher.rounds %}
{{ 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>
<h1>Change password</h1>
<form method="post" class="my-3">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Change password</button>
</form>
<div class="alert alert-info mt-5">
<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
limiting, at a rate of 10 attempts per second.
<hr>
<b>Offline cracking: </b>
The datatracker currently uses the <code>{{ hasher.algorithm }}</code>
password hasher with
{% if hasher.iterations %}
{{ hasher.iterations }} iterations
{% elif hasher.rounds %}
{{ hasher.rounds }} rounds
{% elif hasher.time_cost and hasher.memory_cost and hasher.parallelism %}
<code>time cost {{ hasher.time_cost }}</code>, <code>memory cost {{ hasher.memory_cost }}</code>
and <code>parallelism {{ hasher.parallelism }}</code>
{% endif %}
.
Calculating offline attack time if password hashes should leak is left
as an exercise for the reader.
<span class="password_strength_offline_info visually-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 <em class="password_strength_time"></em> to crack.
</span>
</div>
{% endif %}
</div>
{% endif %}
{% endblock %}

View file

@ -1,42 +1,23 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load django_bootstrap5 %}
{% load static %}
{% block title %}Change username{% endblock %}
{% block content %}
{% origin %}
<div class="row">
<div class="col-md-2 col-sm-0"></div>
<div class="col-md-8 col-sm-12">
<h1>Change username</h1>
<div class="form-text">
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>
<h1>Change username</h1>
<div class="alert alert-info my-3">
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" class="my-3">
{% 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" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load static %}
{% load django_bootstrap5 %}
{% load django_bootstrap5 textfilters %}
{% block title %}Complete account creation{% endblock %}
{% block js %}
{{ block.super }}
<script src="{% static 'ietf/js/zxcvbn.js' %}"></script>
<script src="{% static 'ietf/js/password_strength.js' %}"></script>
{% endblock %}
{% block content %}
{% origin %}
{% if success %}
<h1>Account creation successful</h1>
<p>Your account with login {{ email }} has been created, using the password you have selected.</p>
<a type="a" class="btn btn-primary" href="{% url "ietf.ietfauth.views.login" %}" rel="nofollow">Sign in</a>
<p class="alert alert-success my-3">
Your account with login {{ email|linkify }} has been created, using the password you have selected.
</p>
<a type="a"
class="btn btn-primary"
href="{% url "ietf.ietfauth.views.login" %}"
rel="nofollow">Sign in</a>
{% else %}
<h1>Complete account creation</h1>
<p>In order to complete the setup of your account with login {{ email }}, please choose a password:</p>
<p class="alert alert-info my-3">
In order to complete the setup of your account with login {{ email|linkify }}, please provide the following information:
</p>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Set name and password</button>
</form>
{% endif %}
{% endblock %}

View file

@ -1,37 +1,31 @@
{# bs5ok #}
{% extends "base.html" %}
{# 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 content %}
{% origin %}
<h1>Confirm new email address</h1>
{% 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 %}
<p>
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
</p>
<a class="btn btn-primary my-3"
href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% elif new_email_obj %}
<p>Your account {{ username }} has been updated to include the email address {{ email }}.</p>
<p>
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
<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 my-3"
href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% else %}
<p>Confirm that you want to add the email address {{ email }} to your account {{ username }}.</p>
<form method="post">
<p class="alert alert-info my-3">
Confirm that you want to add the email address {{ email|linkify }} to your account {{ username }}.
</p>
<form method="post" class="my-3">
{% csrf_token %}
<button type="submit" class="btn btn-warning" name="action" value="confirm">Confirm email address</button>
</form>
{% endif %}
{% endblock %}

View file

@ -1,21 +1,19 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}Profile update successful{% endblock%}
{% block content %}
{% origin %}
<h1>Profile update successful</h1>
<p>Your account has been updated to reflect the changes you submitted.</p>
{% for email in email_confirmations %}
<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>
{% endfor %}
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% endblock %}
{% load origin textfilters %}
{% block title %}Profile update successful{% endblock %}
{% block content %}
{% origin %}
<h1>Profile update successful</h1>
<p class="my-3">
Your account has been updated to reflect the changes you submitted.
</p>
{% for email in email_confirmations %}
<p class="alert alert-success my-3">
<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>
{% endfor %}
<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 #}
{% extends "base.html" %}
{% load origin %}
{% load django_bootstrap5 %}
{% load django_bootstrap5 textfilters %}
{% block title %}Account creation{% endblock %}
{% block content %}
{% origin %}
{% if to_email %}
<h1>Account request received.</h1>
<p>Your account creation request has been successfully received.</p>
<p>We have sent an email to {{ to_email }} with instructions on how to complete the process.</p>
<div class="alert alert-info my-3">
Your account creation request has been successfully received.
<hr>
We have sent an email to {{ to_email|linkify }} with instructions on how to complete the process.
</div>
{% else %}
<h1>Account creation</h1>
<p>
<b>If you already have an account and want to use a new email address,</b>
please go to your account profile page and
<div class="row">
<div class="col-md-6">
<div class="alert alert-info">
<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>
<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">
{% csrf_token %}
{% bootstrap_form form %}

View file

@ -1,116 +1,125 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load widget_tweaks django_bootstrap5 %}
{% load widget_tweaks django_bootstrap5 textfilters ietf_filters %}
{% load person_filters %}
{% block title %}Profile for {{ user }}{% endblock %}
{% block content %}
{% origin %}
<h1>Profile information for {{ user.person.name }}</h1>
<p>
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>
<p class="my-3">
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>
</p>
<form class="form-horizontal" method="post">
{% csrf_token %}
{% bootstrap_form_errors person_form %}
{% for f in new_email_forms %}
{% bootstrap_form_errors f %}
{% endfor %}
<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">
<p class="form-control-plaintext">
{{ user.username }}
</p>
<a class="btn btn-primary" href="/accounts/username/">Edit</a>
</div>
</div>
<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">
<a class="btn btn-primary" href="/accounts/password/">Change password</a>
</div>
</div>
{% if person.photo %}
<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>
<div class="col-sm-10">
<p class="form-control-plaintext">
<a href="{{ person.photo.url }}">
<img class="photo" src="{{ person.photo.url }}" alt="Photo of {{ person }}" />
</a>
</p>
</div>
<label class="col-sm-2 col-form-label fw-bold">
Photo
<a href="#pi">
<i class="bi bi-exclamation-circle"></i>
</a>
</label>
<div class="col-sm-10">{% include "person/photo.html" with person=person %}</div>
</div>
{% endif %}
<div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">NomCom Eligible</label>
<div class="col-sm-10">
<p class="form-control-plaintext">
{{ person|is_nomcom_eligible|yesno:'Yes,No,No' }}
</p>
{% with person|is_nomcom_eligible|yesno:'Yes,No,No' as is_eligible %}
<p class="form-control-plaintext {% if is_eligible == 'Yes' %}text-success fw-bold{% endif %}">
{{ is_eligible }}
</p>
{% endwith %}
{% 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 %}
</div>
</div>
<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' %}
<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.
</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 %}
</div>
<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">
{% for extres in person.personextresource_set.all %}
<div class="row">
<div class="col-3">
{% firstof extres.display_name extres.name.name %}
</div>
<div class="col">
{{ extres.value }}
</div>
</div>
{% empty %}
None
{% endfor %}
<a class="btn btn-primary mt-1" href="{% url 'ietf.ietfauth.views.edit_person_externalresources' %}">Edit</a>
<div class="form-control-plaintext">
<dl class="row mb-0">
{% for extres in person.personextresource_set.all %}
<dt class="col-sm-3">
{% firstof extres.display_name extres.name.name %}
</dt>
<dd class="col-sm-9">
{{ extres.value|linkify }}
</dd>
{% empty %}
None
{% endfor %}
</dl>
</div>
<a class="btn btn-primary"
href="{% url 'ietf.ietfauth.views.edit_person_externalresources' %}">Edit</a>
</div>
</div>
<div class="row mb-3">
<label class="col-sm-2 col-form-label fw-bold">Email addresses</label>
<div class="col-sm-10 emails">
@ -119,31 +128,42 @@
<th class="text-center">Primary</th>
<th class="text-center">Active</th>
<th>Address</th>
<th>Origin</th></tr>
<th>Origin</th>
</tr>
{% for email in emails %}
<tr>
<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 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>
{% 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 %}
{{ email }}
</td>
<td>{{ email.origin|default:'(unknown)' }}</td>
<td>{{ email.origin|default:'(unknown)'|urlize_ietf_docs }}</td>
</tr>
{% endfor %}
</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 %}
{% bootstrap_field f.new_email layout="horizontal" show_label=False %}
{% endfor %}
<div class="new-emails"></div>
<div>
<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 %}
{% endfor %}
</div>
</div>
{% bootstrap_form person_form layout="horizontal" exclude="ascii_short" %}
{% bootstrap_button button_type="submit" content="Submit" extra_classes="offset-sm-2" %}
</form>
<div class="small text-muted mt-5">
<div class="form-text mt-5">
<p id="pi">
<b><i class="bi bi-exclamation-circle"></i> Personal information requiring consent</b>
</p>
<p>
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
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
for the internet. See also the page on <a href="/help/personal-information">handling
of personal information</a>.
for the internet. See also the page on
<a href="/help/personal-information">
handling
of personal information
</a>.
</p>
<p>
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
<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
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.
</p>
<p>
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
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
that requires Consent.
</p>
</div>
{% endblock %}
{% block js %}
<script>
$(document)

View file

@ -1,22 +1,22 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% block title %}Account management{% endblock %}
{% block content %}
{% origin %}
<h1>Account management</h1>
<div class="buttonlist">
{% if user.username %}
<a type="a" class="btn btn-primary" href="/accounts/profile/">View/edit profile</a>
{% 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 %}
<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-primary" href="/accounts/settings/">Change browser preferences</a>
</div>
{% endblock %}

View file

@ -1,15 +1,13 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% block title %}Signed out{% endblock %}
{% block content %}
{% origin %}
<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 %}
{% block js %}
{% if request.META.HTTP_REFERER %}
<script>

View file

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

View file

@ -1,19 +1,17 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}Complete account creation{% endblock %}
{% block content %}
{% origin %}
<h1>Additional Assistance Required</h1>
<p>
<p class="alert alert-info my-3">
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>
<a class="btn btn-primary"
href="mailto:{{ settings.SECRETARIAT_SUPPORT_EMAIL }}">Email IETF secretariat</a>
{% endblock %}

View file

@ -1,14 +1,16 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% block content %}
{% origin %}
<h1>Missing person info</h1>
<p>
<h1>Missing person record</h1>
<p class="alert alert-danger my-3">
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.
</p>
<a class="btn btn-primary"
href="mailto:{{ settings.SECRETARIAT_INFO_EMAIL }}">Contact the secretariat</a>
{% endblock %}

View file

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

View file

@ -1,78 +1,77 @@
{# bs5ok #}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}About the Datatracker{% endblock %}
{% block content %}
{% origin %}
<h1>About the IETF Datatracker</h1>
<p>
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,
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>
All the Datatracker code is publicly available from the
<a href="https://svn.ietf.org/svn/tools/ietfdb">IETF tools SVN repository</a>.
Bug tickets and wiki notes are available from the
<a href="https://trac.ietf.org/trac/ietfdb">Issue Tracker</a>, and
there are also <a href="/release">release notes</a> available since version 2.00.
<a href="https://trac.ietf.org/trac/ietfdb">Issue Tracker</a>,
and
there are also
<a href="/release">release notes</a>
available since version 2.00.
</p>
<p>
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
notes or the commit log.
</p>
<h2>Version 6.x Work</h2>
<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
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.
</p>
<h2>Version 6.0.0: Facelift using Bootstrap</h2>
<p>
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
took
<a href="https://trac.ietf.org/trac/ietfdb/log/personal/lars?rev=8652&amp;stop_rev=5871&amp;limit=500">
287 separate commits
</a>, and comprised changes to 1016 different files.
</a>,
and comprised changes to 1016 different files.
</p>
<p>
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.
</p>
<p>
The work relies heavily on the capabilities of <a href="https://getbootstrap.com">
Bootstrap</a>, and continues to use the <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
The work relies heavily on the capabilities of
<a href="https://getbootstrap.com">Bootstrap</a>,
and continues to use the
<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>.
</p>
<p>
Additional
<a href="https://trac.ietf.org/trac/ietfdb/log/branch/iola?rev=9116&amp;stop_rev=8520&amp;limit=200">
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">
final style tweaks, bug-fixes and adaptations
</a>
@ -81,47 +80,60 @@
(with the addition of complementing green and red colours for success and error indications),
and a selection of fonts from
<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?2G2G">PT Sans Caption</a> for headers,
<a href="https://www.identifont.com/show?2G2F">PT Sans</a> for menus,
(<a href="https://www.identifont.com/show?2G32">PT Serif</a>
for body text,
<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
created as a 'Caption' (6-8pt) <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.)
created as a 'Caption' (6-8pt)
<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>
<h2>Version 5.x Work</h2>
<p>
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
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
href="/group/edu">Teams</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>.
the addition of pages for
<a href="/rg/">Research Groups</a>
and
<a href="/group/edu">Teams</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>
<h2>Version 5.0.0: Shim Removal</h2>
<h2>
Version 5.0.0: Shim Removal
</h2>
<div class="alert alert-info">
To be written.
</div>
<h2>Version 4.00: New Database Schema</h2>
<h2>
Version 4.00: New Database Schema
</h2>
<div class="alert alert-info">
To be written.
</div>
<h2>Version 3.00: Django Port of the IESG Datatracker Pages</h2>
<h2>
Version 3.00: Django Port of the IESG Datatracker Pages
</h2>
<div class="alert alert-info">
To be written.
</div>
<h2>Version 2.00: Django Port of the Public Datatracker Pages</h2>
<h2>
Version 2.00: Django Port of the Public Datatracker Pages
</h2>
<p>
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
@ -134,16 +146,19 @@
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 :-))
</p>
<h2>Version 1.0: Initial Perl/MySQL database and web-pages</h2>
<h2>
Version 1.0: Initial Perl/MySQL database and web-pages
</h2>
<p>
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
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.
The first <a href="https://www.ietf.org/proceedings/55/slides/plenary-6/plenary-6.ppt">
public presentation</a> of it and its capabilities was made 2002-11-20
in Atlanta by Thomas Narten.
</p>
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
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">
public presentation
</a>
of it and its capabilities was made 2002-11-20
in Atlanta by Thomas Narten.
</p>
{% endblock %}

View file

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

View file

@ -1,59 +1,56 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load humanize %}
{% load django_bootstrap5 %}
{% block title %}Add pre-approval{% endblock %}
{% load ietf_filters %}
{% block submit_content %}
{% origin %}
<h2>Add pre-approval</h2>
<p>You can register a pre-approved draft name. Then the chair
approval step of group -00 submissions is suspended for that draft name
so a future submission is posted to the data tracker immediately.</p>
<p>When the revision -00 draft is submitted, the pre-approval will not
be shown anymore as it has fulfilled its purpose (only revision -00 submissions are
<h2 class="mt-3">Add pre-approval</h2>
<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
so a future submission is posted to the data tracker immediately.
</p>
<p>
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 <code>-00</code> submissions are
subject to approval). If the draft never shows up, you can instead
later cancel the pre-approval to get rid of it.</p>
<h3>Instructions</h3>
<p class="alert alert-warning">Do not include <code>-00</code> and do not include a file extension
like <code>.txt</code> in the name.</p>
later cancel the pre-approval to get rid of it.
</p>
<h2 class="mt-3">Instructions</h2>
<p class="alert alert-warning my-3">
Do not include a version (like <code>-00</code>) and do not include a file extension
(like <code>.txt</code>) in the name.
</p>
{% 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 %}
<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">
{% 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 %}
</p>
{% endif %}
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<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>
{% endblock %}
{% block js %}
<script>
$(".name-template").click(function (){

View file

@ -1,39 +1,33 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}{% if submission == None %}Add new submission request email{% else %}Add submission request email to {{ submission.name }}{% endif %}{% endblock %}
{% block title %}
{% if submission == None %}
Add new submission request email
{% else %}
Add submission request email to {{ submission.name }}
{% endif %}
{% endblock %}
{% block content %}
{% origin %}
<h1>Add email</h1>
{% if submission == None %}
<p>
<p class="my-3">
{% if submission == None %}
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
and nn is the revision number - 00 for the initial revision. For example<br/>
&nbsp;&nbsp;&nbsp;draft-my-spec-00
</p>
{% else %}
<p>
The email will be added to the submission history for {{ submission.name }}
</p>
{% endif %}
<form class="add-email" method="post">
name must take the form <code>draft-xxx-nn</code> where <code>xxx</code> is lowercase letters, digits or dashes
and <code>nn</code> is the revision number, <code>00</code> for the initial revision. For example,
<code>draft-my-spec-00</code>.
{% else %}
The email will be added to the submission history for {{ submission.name }}.
{% endif %}
</p>
<form class="add-email my-3" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<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>
{% endblock %}

View file

@ -1,21 +1,19 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% block title %}Draft submission API instructions{% endblock %}
{% block content %}
{% origin %}
<h2>Draft submission API instructions</h2>
<h1 class="mb-3">Draft submission API instructions</h1>
<p>
A simplified draft submission interface, intended for automation,
is available at <code>{% url 'ietf.submit.views.api_submit' %}</code>.
</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
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>.
</p>
<p>
@ -23,16 +21,21 @@
Some limitations:
</p>
<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>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>
<p>
It takes 2 parameters:
It takes two parameters:
</p>
<ul>
<li><code>user</code> which is the user login</li>
<li><code>xml</code>, which is the submitted file
<li>
<code>user</code> which is the user login
</li>
<li>
<code>xml</code>, which is the submitted file
</ul>
<p>
It returns an appropriate http result code, and a brief explanatory text message.
@ -40,11 +43,8 @@
<p>
Here is an example:
</p>
<pre>
$ 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:
User Name &lt;user.name@example.com&gt;
</pre>
{% endblock %}
<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
Upload of draft-user-example OK, confirmation requests sent to:
User Name &lt;user.name@example.com&gt;</pre>
{% endblock %}

View file

@ -1,22 +1,20 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static %}
{% load origin static person_filters ietf_filters %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block title %}Draft submission approvals{% endblock %}
{% load ietf_filters %}
{% block submit_content %}
{% origin %}
{% 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 %}
<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 %}
<table class="approvals table table-sm table-striped tablesorter">
<thead>
@ -28,22 +26,28 @@
<tbody>
{% for s in approvals %}
<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>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<h2 id="preapprovals">Pre-approved drafts not yet submitted</h2>
<h2 class="mt-5" id="preapprovals">Pre-approved drafts not yet submitted</h2>
{% 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 %}
{% 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 %}
<table class="preapprovals table table-sm table-striped tablesorter">
<thead>
@ -57,20 +61,25 @@
<tbody>
{% for p in preapprovals %}
<tr>
<td>{{ p.name }}</td>
<td>{{ p.name|urlize_ietf_docs }}</td>
<td>{{ p.time|date:"Y-m-d" }}</td>
<td>{{ 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>{% person_link p.by %}</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>
{% endfor %}
</tbody>
</table>
{% endif %}
<h2 id="recently-approved">Approved drafts within the past {{ days }} days</h2>
<h2 class="mt-5" id="recently-approved">Approved drafts within the past {{ days }} days</h2>
{% if not recently_approved %}
<p>No drafts approved.</p>
<p class="alert alert-info my-3">
No drafts approved.
</p>
{% else %}
<table class="recently-approved table table-sm table-striped tablesorter">
<thead>
@ -82,26 +91,31 @@
<tbody>
{% for d in recently_approved %}
<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>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% else %}
<h2>Submission of approvals</h2>
<p>
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>
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>
{% endif %}
{% endblock %}
{% block js %}
<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %}

View file

@ -1,30 +1,21 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load origin person_filters %}
{% load django_bootstrap5 %}
{% block title %}Cancel pre-approval{% endblock %}
{% block submit_content %}
{% origin %}
<h2>Cancel pre-approval</h2>
<p>
Pre-approval of <b>{{ preapproval.name }}</b> by <b>{{ preapproval.by }}</b>
<p class="alert alert-info my-3">
Pre-approval of <b>{{ preapproval.name }}</b> by <b>{% person_link preapproval.by %}</b>
on <b>{{ preapproval.time }}</b>.
</p>
<form class="actions" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="cancel">
<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>
{% endblock %}

View file

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

View file

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

View file

@ -1,32 +1,26 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load static %}
{% load django_bootstrap5 %}
{% block title %}Email related to{{ submission.name }}{% endblock %}
{% block pagehead %}
<link rel="stylesheet" href="{% static 'ietf/css/datepicker.css' %}">
{% endblock %}
{% block content %}
{% origin %}
<h1>Email related to<br><small class="text-muted">{{ submission.name }}</small></h1>
<form method="post" class="show-required">
<h1>
Email related to
<br>
<small class="text-muted">{{ submission.name }}</small>
</h1>
<form method="post" class="show-required" class="my-3">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-primary">Send Email</button>
<button type="submit" class="btn btn-primary">Send email</button>
</form>
{% endblock %}
{% block js %}
<script src="{% static 'ietf/js/datepicker.js' %}"></script>
{% endblock %}

View file

@ -1,4 +1,7 @@
{# bs5ok #}
{% load django_bootstrap5 %}
<h3>Additional resource information</h3>
<h3 class="mt-3">Additional resource information</h3>
{% 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" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block title %}Draft submissions awaiting manual posting{% endblock %}
{% load ietf_filters %}
{% block submit_content %}
{% origin %}
<h2 id="man_post">Submissions needing manual posting</h2>
<h2 class="mt-3" id="man_post">Submissions needing manual posting</h2>
{% 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 %}
<table id="manual" class="submissions table table-sm table-striped tablesorter">
<table id="manual"
class="submissions table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort="draft">Draft</th>
@ -31,25 +29,44 @@
{% for s in manual %}
<tr>
{% 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 %}
<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 %}
<td>{{ s.submission_date }}</td>
<td>{% if s.passes_checks %}Ok{% else %}Fails{% endif %}</td>
<td>{% if s.errors %}Errors{% else %}Ok{% endif %}</td>
<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>
{% endfor %}
</tbody>
</table>
{% endif %}
<h2 id="id_upload">Submissions awaiting draft upload</h2>
<h2 class="mt-3" id="id_upload">Submissions awaiting draft upload</h2>
{% 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 %}
<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>
<tr>
<th data-sort="name">Name</th>
@ -61,38 +78,57 @@
{% for s in waiting_for_draft %}
<tr>
{% 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 %}
<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 %}
<td>{{ s.rev }}</td>
<td>{{ s.submission_date }}</td>
{% if user|has_role:"Secretariat" %}
<td>
<form id="cancel-submission" action="/submit/awaitingdraft/cancel" method="post">
<td>
{% if user|has_role:"Secretariat" %}
<form id="cancel-submission"
action="/submit/awaitingdraft/cancel"
method="post">
{% csrf_token %}
<input type="hidden" name="submission_id" value="{{ s.pk }}">
<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>
</td>
{% endif %}
{% if user|has_role:"Secretariat" %}
<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>
{% endif %}
{% endif %}
{% if user|has_role:"Secretariat" %}
<a id="add-submission-email{{ s.pk }}"
class="btn btn-primary btn-sm float-end ms-1"
href="{% url "ietf.submit.views.add_manualpost_email" submission_id=s.pk access_token=s.access_token %}">
Add email
</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% 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 %}
{% endblock %}
{% block js %}
<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %}

View file

@ -1,14 +1,13 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}{% load origin %}{% origin %}
<p>
{# bs5ok #}
{# 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
of the Bug Report links at the bottom of the page.
</p>
<p>
<hr>
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.
</p>
</div>

View file

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

View file

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

View file

@ -1,60 +1,62 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin static %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% load origin static textfilters ietf_filters %}
{% block title %}Submission email{% endblock %}
{% load ietf_filters %}
{% block submit_content %}
{% origin %}
<h2 id="approvals">Email for {{ submission.name }}</h2>
<table id="email-details" class="emails table table-sm table-striped tablesorter">
<tr>
<th>Uploaded</th>
<td>{{ message.time }}</td>
</tr>
<tr>
<th>Date</th>
<td>{{ message.message.time }}</td>
</tr>
<tr>
<th>From</th>
<td>{{ message.message.frm }}</td>
</tr>
<tr>
<th>Subject</th>
<td>{{ message.message.subject }}</td>
</tr>
<tr>
<th>Message</th>
<td>{{ message.message.body|linebreaksbr }}</td>
</tr>
{% for a in attachments %}
<tr>
<th>Attachment</th>
<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>
</tr>
{% endfor %}
{% if user|has_role:"Secretariat" %}
<tr>
<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>
</tr>
{% endif %}
</table>
{% endblock %}
{% block js %}
<script src="{% static "ietf/js/list.js" %}"></script>
<dl id="email-details" class="emails row my-3">
<dt class="col-sm-2">
Uploaded
</dt>
<dd class="col-sm-10">
{{ message.time }}
</dd>
<dt class="col-sm-2">
Date
</dt>
<dd class="col-sm-10">
{{ message.message.time }}
</dd>
<dt class="col-sm-2">
From
</dt>
<dd class="col-sm-10">
{{ message.message.frm|linkify }}
</dd>
<dt class="col-sm-2">
Subject
</dt>
<dd class="col-sm-10">
{{ message.message.subject }}
</dd>
<dt class="col-sm-2">
Message
</dt>
<dd class="col-sm-10">
<pre>{{ message.message.body|linkify|urlize_ietf_docs|linebreaksbr }}</pre>
</dd>
<dt class="col-sm-2">
Attachment
</dt>
<dd class="col-sm-10">
{% for a in attachments %}
<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>
<br>
{% endfor %}
</dd>
</dl>
{% 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,8 +1,11 @@
{# 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 %}
{% if file.exists %}
<a class="btn btn-primary btn-sm" 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>
<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{% elif file.ext == 'xml' %}code{% elif file.ext == 'pdf' %}pdf{% else %}code{% endif %}"></span>
{{ file.ext }}
</a>
{% endif %}

View file

@ -1,141 +1,167 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load static %}
{% load static ietf_filters textfilters person_filters %}
{% load ietf_filters submit_tags misc_filters %}
{% block title %}Submission status of {{ submission.name }}-{{ submission.rev }}{% endblock %}
{% block pagehead %}
{{ block.super }}
{{ all_forms|merge_media:'css' }}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block submit_content %}
{% origin %}
{% if submission.state_id != "uploaded" %}
<h2>Submission status: {{ submission.state.name }}</h2>
<h2 class="mt-5">Submission status: {{ submission.state.name }}</h2>
{% endif %}
{% if message %}
<p class="alert alert-info">{{ message.1 }}</p>
<p class="alert alert-info my-3">
{{ message.1 }}
</p>
{% endif %}
{% 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
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
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>
{% endif %}
{% 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 %}
<h2>Submission checks</h2>
<p>
<h2 class="mt-5">Submission checks</h2>
<p class="alert {% if passes_checks %}alert-success{% else %}alert-warning{% endif %} my-3">
{% if passes_checks %}
Your draft has been verified to pass the submission checks.
{% else %}
Your draft has <b>NOT</b> been verified to pass the submission checks.
{% endif %}
</p>
{% if submission.authors|length > 5 %}<p class="alert alert-danger"><b>
This document has more than five authors listed, which is considered excessive
under normal circumstances.</b> If you plan to request publication as an RFC, this
will require additional consideration by the stream manager (for example, the
IESG), and publication may be declined unless sufficient justification is
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>
{% if submission.authors|length > 5 %}
<p class="alert alert-danger my-3">
<b>
This document has more than five authors listed, which is considered excessive
under normal circumstances.</b> If you plan to request publication as an RFC, this
will require additional consideration by the stream manager (for example, the
IESG), and publication may be declined unless sufficient justification is
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 %}
{% for check in submission.latest_checks %}
{% if check.errors %}
<p class="alert alert-warning">
The {{check.checker}} returned {{ check.errors }} error{{ check.errors|pluralize }}
<p class="alert alert-warning my-3">
The {{ check.checker }} returned {{ check.errors }} error{{ check.errors|pluralize }}
and {{ check.warnings }} warning{{ check.warnings|pluralize }}; click the button
below to see details. Please fix those, and resubmit.
</p>
{% elif check.warnings %}
<p class="alert alert-warning">
The {{check.checker}} returned {{ check.warnings }} warning{{ check.warnings|pluralize }}.
<p class="alert alert-warning my-3">
The {{ check.checker }} returned {{ check.warnings }} warning{{ check.warnings|pluralize }}.
</p>
{% endif %}
{% endfor %}
{% for check in submission.latest_checks %}
{% 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>
<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-xl">
<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"
data-bs-target="#check-{{ check.pk }}">
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-header">
<button type="button" class="close" data-bs-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="{{check.checker|slugify}}-label">{{ check.checker|title }} for {{ submission.name }}-{{ submission.rev }}</h4>
<h5 class="modal-title" id="{{ check.checker|slugify }}-label">
{{ 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 class="modal-body" id="{{check.checker|slugify}}-message">
<pre>{{ check.message }}</pre>
<div class="modal-body" id="{{ check.checker|slugify }}-message">
<pre>{{ check.message|linkify|urlize_ietf_docs }}</pre>
</div>
<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>
{% endif %}
{% endfor %}
<div class="modal fade" id="twopages" tabindex="-1" role="dialog" aria-labelledby="twopageslabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal fade"
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-header">
<button type="button" class="close" data-bs-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</h4>
</div>
<div class="modal-body">
{{ submission|two_pages_decorated_with_errors:errors }}
<h5 class="modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</h5>
<button type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">{{ submission|two_pages_decorated_with_errors:errors }}</div>
<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>
{% 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.
</p>
{% else %}
<h2>Meta-data from the submission</h2>
<h2 class="mt-5">Meta-data from the submission</h2>
{% if errors %}
<div class="alert alert-danger">
<p><b>Meta-Data errors found!</b></p>
<p >Please make sure that your Internet-Draft includes all of the required meta-data in the proper format.</p>
<p>If your Internet-Draft <b>does</b> include all of the required meta-data in the proper format, and if
the error(s) identified below are due to the failure of the tool to extract the meta-data correctly,
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
to the Secretariat for manual posting.</p>
<p>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.</p>
<p><b>Note:</b> The secretariat will <b>not</b> add any
<div class="alert alert-danger my-3">
<p>
<b>Meta-Data errors found!</b>
</p>
<p >
Please make sure that your Internet-Draft includes all of the required meta-data in the proper format.
</p>
<ul>
<li>
If your Internet-Draft <b>does</b> include all of the required meta-data in the proper format, and if
the error(s) identified below are due to the failure of the tool to extract the meta-data correctly,
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
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
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>
{% endif %}
{% endif %}
<table class="table table-sm table-striped">
<tr>
<th>Document</th>
@ -145,190 +171,238 @@
{% else %}
{{ submission.name }}
{% endif %}
<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 %}
{% 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 %}
</td>
</tr>
<tr>
<th>Revision</th>
<td>
{{ submission.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>
<p class="text-danger bg-danger"><b>{{ errors.rev }}</b></p>
<button class="btn btn-primary btn-sm float-end"
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 %}
</td>
</tr>
<tr>
<th>Group</th>
<td>
{{ submission.group|default:"Individual Submission" }}
{% if submission.group %}<a href="{{ doc.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if 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 %}
</td>
</tr>
<tr>
<th>Document date</th>
<td>
{{ submission.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 %}
</td>
</tr>
<tr>
<th>Submission date</th>
<td>{{ submission.submission_date }}</td>
</tr>
<tr>
<th>Title</th>
<td>
{{ 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>
</tr>
<tr>
<th>Authors</th>
<th>Author count</th>
<td>
{{ 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>
</tr>
{% for author in submission.authors %}
<tr>
<th>Author {{ forloop.counter }}</th>
<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 %}
{{ author.affiliation }}
{% else %}
<i>unknown affiliation</i>
{% endif %}
-
<br>
{% if author.country %}
{{ author.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 %}
{% else %}
<i>unknown country</i>
{% endif %}
{% if author.country and not author.cleaned_country %}
<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 %}
{% 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 %}
</td>
</tr>
{% endfor %}
<tr>
<th>Abstract</th>
<th>
Abstract
</th>
<td>
{{ submission.abstract|linebreaksbr }}
{% if errors.abstract %}<p class="text-danger bg-danger"><b>{{ errors.abstract }}</b></p>{% endif %}
{{ submission.abstract|urlize_ietf_docs|linkify|linebreaksbr }}
{% if errors.abstract %}
<p class="mt-1 mb-0 text-danger">
{{ errors.abstract }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th>Pages</th>
<th>
Page count
</th>
<td>
{{ 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>
</tr>
<tr>
<th>File size</th>
<td>{{ submission.file_size|filesizeformat }}</td>
</tr>
<tr>
<th>Formal languages used</th>
<th>
File size
</th>
<td>
{% for l in submission.formal_languages.all %}{{ l.name }}{% if not forloop.last %}, {% endif %}{% empty %}None recognized{% endfor %}
{% if errors.formal_languages %}<p class="text-danger bg-danger"><b>{{ errors.formal_languages }}</b></p>{% endif %}
{{ submission.file_size|filesizeformat }}
</td>
</tr>
<tr>
<th>Submission additional resources</th>
<th>
Formal languages used
</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 %}
{% for l in submission.formal_languages.all %}
{{ l.name }}
{% if not forloop.last %},{% endif %}
{% empty %}None recognized
{% endfor %}
{% if errors.formal_languages %}
<p class="mt-1 mb-0 text-danger">
{{ errors.formal_languages }}
</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 %}
None
{% endfor %}
</td>
</tr>
{% if external_resources.show_changes %}<tr>
<th>Current document additional resources</th>
<td>
{% for r in external_resources.previous %}{% with res=r.res removed=r.removed %}
<div>
{{ res.name.name }}: {{ res.value }}
{% if res.display_name %} (as &quot;{{ res.display_name }}&quot;) {% endif %}
{% if removed %}
<span class="badge bg-warning">Removed</span>
{% endif %}
</div>
{% endwith %}
{% empty %}
None
{% endfor %}
</td>
</tr>{% endif %}
{% if external_resources.show_changes %}
<tr>
<th>
Current document additional resources
</th>
<td>
{% for r in external_resources.previous %}
{% with res=r.res removed=r.removed %}
<div>
{{ res.name.name }}: {{ res.value }}
{% if res.display_name %}(as &quot;{{ res.display_name }}&quot;){% endif %}
{% if removed %}<span class="badge bg-warning">Removed</span>{% endif %}
</div>
{% endwith %}
{% empty %}
None
{% endfor %}
</td>
</tr>
{% endif %}
</table>
{% if can_edit %}
<p></p>
<form method="post">
{% csrf_token %}
<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>
<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 %}
<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">
{% csrf_token %}
{% include "submit/submitter_form.html" %}
{% include "submit/replaces_form.html" %}
{% include "submit/extresources_form.html" %}
<input type="hidden" name="action" value="autopost">
<h3>Post submission</h3>
<button class="btn btn-primary" type="submit">Post submission</button>
<h2 class="mt-5">
Post submission
</h2>
<button class="btn btn-primary" type="submit">
Post submission
</button>
</form>
<p>
{% if requires_group_approval %}
Notifies group chairs to get approval.
@ -339,112 +413,178 @@
{% endif %}
</p>
{% endif %}
{% else %}
{% if submission.submitter %}
<h3>Submitter information</h3>
<h2 class="mt-5">
Submitter information
</h2>
<table class="table table-sm table-striped">
<tr><th>Name</th><td>{{ submission.submitter_parsed.name }}</td></tr>
<tr><th>Email address</th><td>{{ submission.submitter_parsed.email }}</td></tr>
<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>
{% endif %}
{% if submission.replaces %}
<h3>Replaced documents</h3>
<h2 class="mt-5">
Replaced documents
</h2>
<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>
{% endif %}
{% endif %}
{% if can_cancel %}
<h3>Cancel submission</h3>
<form id="cancel-submission" method="post">
<form class="mt-3" id="cancel-submission" method="post">
{% csrf_token %}
<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>
{% endif %}
{% if can_group_approve %}
<h2>Approve submission</h2>
<form method="post">
<form class="mt-3" method="post">
{% csrf_token %}
<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>
{% endif %}
{% if can_force_post %}
<p></p>
<form method="post">
<form class="mt-3" method="post">
{% csrf_token %}
<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>
{% endif %}
{% if user|has_role:"Secretariat" %}
<p></p>
<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>
<a id="send{{ submission.pk }}"
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 %}
{% if show_send_full_url %}
<div class="alert alert-danger">
<p>You are not allowed to modify or cancel this submission. You can
<div class="alert alert-danger my-3">
<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
redirected to after the submission.</p>
<p>If you are the submitter check your browser history to find this
URL. You can share it with any person you need.</p>
<p>If you are one of the authors you can request the URL from which
redirected to after the submission.
</p>
<p>
If you are the submitter check your browser history to find this
URL. You can share it with any person you need.
</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
button. An email will then be sent to the authors and submitter
(if submitter email was entered): {{ confirmation_list|join:", " }}.</p>
<p></p>
<form method="post">{% csrf_token %}
(if submitter email was entered): {{ confirmation_list|join:", " }}.
</p>
<form class="mt-3" method="post">
{% csrf_token %}
<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>
</div>
{% endif %}
<h2>History</h2>
<table id="history" class="table table-sm table-striped">
<h2 class="mt-5">
History
</h2>
<table id="history" class="table table-sm table-striped tablesorter">
<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>
<tbody>
{% for e in submission.submissionevent_set.all %}
<tr>
<td class="text-nowrap">{{ e.time|date:"Y-m-d" }}</td>
<td>{{ e.by|default:"" }}</td>
<td class="text-nowrap">
{{ 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" %}
{% with m=e.submissionemailevent.message %}
{% if user.is_authenticated %}
<td>
{% 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 %}
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 %}
<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 %}
{% endwith %}
{% else %}
<td>{{ e.desc }}</td>
<td>
{{ e.desc|urlize_ietf_docs|linkify }}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% include "submit/problem-reports-footer.html" %}
{% endblock %}
{% block js %}
{{ all_forms|merge_media:'js' }}
{{ all_forms|merge_media:'js' }}<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %}

View file

@ -1,34 +1,42 @@
{# bs5ok #}
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% block pagehead %}
{{ block.super }}
{% endblock %}
{% block pagehead %}{{ block.super }}{% endblock %}
{% block content %}
{% origin %}
<h1>Internet-Draft submission </h1>
<ul class="nav nav-tabs mb-3">
<h1>Internet-Draft submission</h1>
<ul class="nav nav-tabs my-3">
<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 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 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 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 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>
</ul>
{% block submit_content %}
{% endblock %}
{% block submit_content %}{% endblock %}
{% endblock %}

View file

@ -1,24 +1,23 @@
{# 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 %}
<h3>Submitter</h3>
<h3 class="mt-5">Submitter</h3>
<p>
If you are one of the authors, please click the button below
with your name on it to automatically fill in the
submitter information. Otherwise,
please manually enter your name and email address.
</p>
{% load ietf_filters %}
{% 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 %}
{% bootstrap_form_errors submitter_form %}
{% bootstrap_field submitter_form.name %}
{% bootstrap_field submitter_form.email %}

View file

@ -1,169 +1,220 @@
{# bs5ok #}
{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% block title %}I-D Submission tool instructions{% endblock %}
{% block submit_content %}
{% origin %}
<h2>I-D submission tool instructions</h2>
<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>
<h2 class="mt-3">I-D submission tool instructions</h2>
<p class="alert alert-info my-3">
<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>
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>
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that other
groups may also distribute working documents as Internet-Drafts.
</p>
<p>
Internet-Drafts are draft documents, and are valid for a maximum of
six months. They may be updated, replaced, or obsoleted by other
documents at any time.
</p>
<p>
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>.
</p>
<p>
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>.
</p>
<h3>Upload screen</h3>
<p>
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>
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>
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
<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>,
"Rights Contributors Provide to the IETF Trust".
</p>
<p>
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>.
</p>
<p>
<b>Form buttons and resulting actions</b>:
using the
<a href="{{ settings.IDNITS_BASE_URL }}">idnits tool</a>.
</p>
<table class="table table-sm table-striped">
<tr>
<th>.txt format</th>
<td>Button to select a plain-text file of an I-D from a user's local file system.</td>
</tr>
<tr>
<th>.xml format</th>
<td>Button to select an XML file of an I-D from a user's local file system. </td>
</tr>
<tr>
<th>.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>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>
<thead>
<tr class="table-info">
<th colspan="2">Form buttons and resulting actions:</th>
</tr>
</thead>
<tbody>
<tr>
<th class="text-nowrap">.txt format</th>
<td>Button to select a plain-text file of an I-D from a user's local file system.</td>
</tr>
<tr>
<th class="text-nowrap">.xml format</th>
<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">.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>
<h3>Validation screen</h3>
<h3 class="mt-4">Validation screen</h3>
<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>
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>
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><b>Form buttons and resulting actions:</b></p>
<table class="table table-sm table-striped">
<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>
<thead>
<tr class="table-info">
<th colspan="2">Form buttons and resulting actions:</th>
</tr>
</thead>
<tbody>
<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>
<p><b>When no meta-data error is detected:</b></p>
<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>
<h3 class="mt-4">
Adjust screen
</h3>
<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.
</p>
<p><b>Form buttons and resulting actions:</b></p>
<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>Submit for manual posting</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.
<thead>
<tr class="table-info">
<th colspan="2">
Form buttons and resulting actions:
</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>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>
<th>
Submit for manual posting
</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>
</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>
<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>
<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 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>
</table>
<h3>Problem report</h3>
{% include "submit/problem-reports-footer.html" %}
<p>
The specification for this tool can be found in <a href="{% url 'ietf.doc.views_doc.document_html' name='rfc4228' %}">RFC 4228</a>.
</p>
</tbody>
</table>
<h3 class="mt-4">
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>
<table class="table table-sm table-striped">
<thead>
<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" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load ietf_filters %}
{% load django_bootstrap5 %}
{% block title %}Upload{% endblock %}
{% block submit_content %}
{% origin %}
{% 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.
</p>
{% endif %}
{% if form.cutoff_warning %}
<div class="alert alert-info">
{{ form.cutoff_warning|safe }}
</div>
{% endif %}
{% if form.cutoff_warning %}<div class="alert alert-info my-3">{{ form.cutoff_warning|safe }}</div>{% endif %}
{% 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.
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>,
"Rights Contributors Provide to the IETF Trust".
</p>
<p>
<hr>
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
fix them.
</p>
<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>
using the
<a href="{{ settings.IDNITS_BASE_URL }}">idnits</a>
tool, and fix them.
</div>
{% include "submit/problem-reports-footer.html" %}{% endif %}
<form method="post" enctype="multipart/form-data" class="my-3">
{% 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 %}
{% block js %}
<script>
$(document).ready(function() {

View file

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

View file

@ -55,6 +55,7 @@
"ietf/static/js/datepicker.js",
"ietf/static/js/doc-search.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-timeslots-and-misc-sessions.js",
"ietf/static/js/edit-milestones.js",