Template fixes, and changes needed to fix templates.

- Legacy-Id: 19642
This commit is contained in:
Lars Eggert 2021-11-11 18:31:43 +00:00
parent 868f583afc
commit 408f45a9bf
16 changed files with 630 additions and 672 deletions

View file

@ -14,5 +14,9 @@ module.exports = {
},
globals: {
d3: true
},
parserOptions: {
sourceType: "module",
ecmaVersion: 2015
}
};

View file

@ -33,18 +33,18 @@ $enable-negative-margins: true;
@import "~/node_modules/bootstrap/scss/card";
@import "~/node_modules/bootstrap/scss/accordion";
// @import "~/node_modules/bootstrap/scss/breadcrumb";
// @import "~/node_modules/bootstrap/scss/pagination";
@import "~/node_modules/bootstrap/scss/pagination";
@import "~/node_modules/bootstrap/scss/badge";
// @import "~/node_modules/bootstrap/scss/alert";
@import "~/node_modules/bootstrap/scss/alert";
// @import "~/node_modules/bootstrap/scss/progress";
// @import "~/node_modules/bootstrap/scss/list-group";
// @import "~/node_modules/bootstrap/scss/close";
@import "~/node_modules/bootstrap/scss/close";
// @import "~/node_modules/bootstrap/scss/toasts";
// @import "~/node_modules/bootstrap/scss/modal";
// @import "~/node_modules/bootstrap/scss/tooltip";
@import "~/node_modules/bootstrap/scss/modal";
@import "~/node_modules/bootstrap/scss/tooltip";
// @import "~/node_modules/bootstrap/scss/popover";
// @import "~/node_modules/bootstrap/scss/carousel";
// @import "~/node_modules/bootstrap/scss/spinners";
@import "~/node_modules/bootstrap/scss/spinners";
// @import "~/node_modules/bootstrap/scss/offcanvas";
// @import "~/node_modules/bootstrap/scss/placeholders";

View file

@ -1,18 +1,18 @@
// Only import what we need:
// https://getbootstrap.com/docs/5.1/customize/optimize/
// import "bootstrap/js/dist/alert";
import "bootstrap/js/dist/alert";
import "bootstrap/js/dist/button";
// import "bootstrap/js/dist/carousel";
import "bootstrap/js/dist/collapse";
import "bootstrap/js/dist/dropdown";
// import "bootstrap/js/dist/modal";
import "bootstrap/js/dist/modal";
// import "bootstrap/js/dist/offcanvas";
// import "bootstrap/js/dist/popover";
// import "bootstrap/js/dist/scrollspy";
import "bootstrap/js/dist/tab";
// import "bootstrap/js/dist/toast";
// import "bootstrap/js/dist/tooltip";
import "bootstrap/js/dist/tooltip";
import jquery from "jquery"
@ -29,6 +29,7 @@ function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
jQuery.ajaxSetup({
crossDomain: false, // obviates need for sameOrigin test
beforeSend: function (xhr, settings) {
@ -38,59 +39,63 @@ jQuery.ajaxSetup({
}
});
function dropdown_hover() {
var navbar = $(this)
.closest(".navbar");
if (navbar.length === 0 || navbar.find(".navbar-toggler")
.is(":hidden")) {
$(this)
.children(".dropdown-toggle")
.dropdown("toggle");
}
}
$(document)
.ready(function () {
if (!("ontouchstart" in document.documentElement)) {
$("ul.nav li.dropdown, ul.nav li.dropend")
.on("mouseenter mouseleave", dropdown_hover);
}
// load data for the menu
$.ajax({
url: $(document.body)
.data("group-menu-data-url"),
type: "GET",
dataType: "json",
success: function (data) {
for (var parentId in data) {
var attachTo = $(".group-menu.group-parent-" + parentId);
if (attachTo.length == 0) {
console.log("Could not find parent " + parentId);
continue;
function dropdown_hover() {
var navbar = $(this)
.closest(".navbar");
if (navbar.length === 0 || navbar.find(".navbar-toggler")
.is(":hidden")) {
$(this)
.children(".dropdown-toggle")
.dropdown("toggle");
}
attachTo.find(".dropdown-menu")
.remove();
var menu = ['<ul class="dropdown-menu ms-n1">'];
var groups = data[parentId];
var gtype = "";
for (var i = 0; i < groups.length; ++i) {
var g = groups[i];
if (g.type != gtype) {
if (i > 0)
menu.push('<li class="dropdown-divider"></li>');
menu.push('<li class="dropdown-header">' + g.type + 's</li>');
gtype = g.type;
}
menu.push('<li><a class="dropdown-item" href="' + g.url + '">' +
g.acronym + ' &mdash; ' + g.name + '</a></li>');
}
menu.push("</ul>");
for (var i = 0; i < attachTo.length; i++) {
attachTo.closest(".dropdown-menu");
}
attachTo.append(menu.join(""));
}
}
});
// load data for the menu
$.ajax({
url: $(document.body)
.data("group-menu-data-url"),
type: "GET",
dataType: "json",
success: function (data) {
for (var parentId in data) {
var attachTo = $(".group-menu.group-parent-" + parentId);
if (attachTo.length == 0) {
console.log("Could not find parent " + parentId);
continue;
}
attachTo.find(".dropdown-menu")
.remove();
var menu = ['<ul class="dropdown-menu ms-n1">'];
var groups = data[parentId];
var gtype = "";
for (var i = 0; i < groups.length; ++i) {
var g = groups[i];
if (g.type != gtype) {
if (i > 0)
menu.push('<li class="dropdown-divider"></li>');
menu.push('<li class="dropdown-header">' + g.type + "s</li>");
gtype = g.type;
}
menu.push('<li><a class="dropdown-item" href="' + g.url + '">' +
g.acronym + " &mdash; " + g.name + "</a></li>");
}
menu.push("</ul>");
for (i = 0; i < attachTo.length; i++) {
attachTo.closest(".dropdown-menu");
}
attachTo.append(menu.join(""));
}
}
});
if (!("ontouchstart" in document.documentElement)) {
$("ul.nav li.dropdown, ul.nav li.dropend")
.on("mouseenter mouseleave", dropdown_hover);
}
});
// This used to be in doc-search.js; consolidate all JS in one file.
$(document)
@ -172,15 +177,15 @@ $(document)
updateAdvanced();
}
$('.review-wish-add-remove-doc.ajax, .track-untrack-doc')
$(".review-wish-add-remove-doc.ajax, .track-untrack-doc")
.on("click", function (e) {
e.preventDefault();
var trigger = $(this);
$.ajax({
url: trigger.attr('href'),
type: 'POST',
url: trigger.attr("href"),
type: "POST",
cache: false,
dataType: 'json',
dataType: "json",
success: function (response) {
if (response.success) {
trigger.parent()
@ -189,12 +194,11 @@ $(document)
trigger.attr("hidden", true);
var target_unhide = null;
if (trigger.hasClass('review-wish-add-remove-doc')) {
target_unhide = '.review-wish-add-remove-doc';
} else if (trigger.hasClass('track-untrack-doc')) {
target_unhide = '.track-untrack-doc';
if (trigger.hasClass("review-wish-add-remove-doc")) {
target_unhide = ".review-wish-add-remove-doc";
} else if (trigger.hasClass("track-untrack-doc")) {
target_unhide = ".track-untrack-doc";
}
if (target_unhide) {}
trigger.parent()
.find(target_unhide)
.not(trigger)
@ -203,5 +207,4 @@ $(document)
}
});
});
});

View file

@ -20,6 +20,7 @@
<link rel="stylesheet" href="{% static 'ietf/css/ietf.css' %}"/>
<style>
{% block morecss %}{% endblock morecss %}
.leftmenu { width: 13em; }
</style>
{% block pagehead %}{% endblock pagehead %}
@ -64,29 +65,29 @@
</nav>
<div class="pt-3 container-fluid">
{% comment %} {% bootstrap_messages %} {% endcomment %}
{% for message in messages %}
<div class="alert{% if message.level_tag %} alert-{% if message.level_tag == 'error' %}danger{% else %}{{ message.level_tag }}{% endif %}{% endif %}{% if message.extra_tags %} {{ message.extra_tags }}{% endif %} alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&#215;</button>{{ message }}</div>
{% endfor %}
{% if request.COOKIES.left_menu == "on" and not hide_menu %}
{# ugly hack for the more or less unported meeting agenda edit pages #}
<div class="row">
<div class="d-none d-md-block border-end lh-sm leftmenu small" style="width: 13em;">
<div class="row">
{% if request.COOKIES.left_menu == "on" and not hide_menu %}
<div class="col-1 d-none d-md-block border-end lh-sm leftmenu small">
<ul class="nav nav-pills flex-column">
{% include "base/menu.html" with flavor="left" %}
</ul>
</div>
{% endif %}
<div class="col" id="content">
{% block content %}{{ content|safe }}{% endblock content %}
{% block content_end %}{% endblock content_end %}
</div>
{% if request.COOKIES.left_menu == "on" and not hide_menu %}
{% endif %}
<div class="col" id="content">
{% comment %} {% bootstrap_messages %} {% endcomment %}
{% for message in messages %}
<div class="alert{% if message.level_tag %} alert-{% if message.level_tag == 'error' %}danger{% else %}{{ message.level_tag }}{% endif %}{% endif %}{% if message.extra_tags %} {{ message.extra_tags }}{% endif %} alert-dismissable fade show">
<button type="button" class="btn-close float-end" data-bs-dismiss="alert" aria-label="Close"></button>
{{ message }}
</div>
{% endfor %}
{% block content %}{{ content|safe }}{% endblock content %}
{% block content_end %}{% endblock content_end %}
</div>
{% endif %}
</div>
<hr/>
{% block footer %}
<footer class="col-md-12 col-sm-12 text-center">
<hr/>
<a href="https://www.ietf.org/" class="p-3">IETF</a>
<a href="https://www.ietf.org/iesg/" class="p-3">IESG</a>
<a href="https://www.iab.org/" class="p-3">IAB</a>

View file

@ -1,8 +1,9 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}User settings{% endblock %}
{% block title %}User settings{% endblock title %}
{% block content %}
{% origin %}
@ -15,51 +16,47 @@
(everything still continues to work by using default settings).
</p>
<h2>How many days is considered "new"?</h2>
<h3>How many days is considered "new"?</h3>
<p>This setting affects how many days are considered "new enough" to get the special highlighting in the documents table. The default setting is {{ defaults.new_enough }} days.</p>
<div class="btn-group btn-group-justified">
<a class="btn btn-primary {% if new_enough == '7' %}active{% endif %}" href="/accounts/settings/new_enough/7">7 days</a>
<a class="btn btn-primary {% if new_enough == '14' %}active{% endif %}" href="/accounts/settings/new_enough/14">14 days</a>
<a class="btn btn-primary {% if new_enough == '21' %}active{% endif %}" href="/accounts/settings/new_enough/21">21 days</a>
<a class="btn btn-primary {% if new_enough == '30' %}active{% endif %}" href="/accounts/settings/new_enough/30">30 days</a>
<a class="btn btn-primary {% if new_enough == '60' %}active{% endif %}" href="/accounts/settings/new_enough/60">60 days</a>
<a class="btn btn-primary {% if new_enough == '90' %}active{% endif %}" href="/accounts/settings/new_enough/90">90 days</a>
</div>
<p class="btn-group d-flex">
<a class="btn btn-outline-primary {% if new_enough == '7' %}active{% endif %}" href="/accounts/settings/new_enough/7">7 days</a>
<a class="btn btn-outline-primary {% if new_enough == '14' %}active{% endif %}" href="/accounts/settings/new_enough/14">14 days</a>
<a class="btn btn-outline-primary {% if new_enough == '21' %}active{% endif %}" href="/accounts/settings/new_enough/21">21 days</a>
<a class="btn btn-outline-primary {% if new_enough == '30' %}active{% endif %}" href="/accounts/settings/new_enough/30">30 days</a>
<a class="btn btn-outline-primary {% if new_enough == '60' %}active{% endif %}" href="/accounts/settings/new_enough/60">60 days</a>
<a class="btn btn-outline-primary {% if new_enough == '90' %}active{% endif %}" href="/accounts/settings/new_enough/90">90 days</a>
</p>
<h2 class="ietf-divider">How many days is considered "soon"?</h2>
<h3>How many days is considered "soon"?</h3>
<p>This setting tells what is considered "soon" when showing documents that are going to be expire soon. The Default setting is {{ defaults.expires_soon }} days.</p>
<div class="btn-group btn-group-justified">
<a class="btn btn-primary {% if expires_soon == '7' %}active{% endif %}" href="/accounts/settings/expires_soon/7">7 days</a>
<a class="btn btn-primary {% if expires_soon == '14' %}active{% endif %}" href="/accounts/settings/expires_soon/14">14 days</a>
<a class="btn btn-primary {% if expires_soon == '21' %}active{% endif %}" href="/accounts/settings/expires_soon/21">21 days</a>
<a class="btn btn-primary {% if expires_soon == '30' %}active{% endif %}" href="/accounts/settings/expires_soon/30">30 days</a>
<a class="btn btn-primary {% if expires_soon == '60' %}active{% endif %}" href="/accounts/settings/expires_soon/60">60 days</a>
<a class="btn btn-primary {% if expires_soon == '90' %}active{% endif %}" href="/accounts/settings/expires_soon/90">90 days</a>
</div>
<p class="btn-group d-flex">
<a class="btn btn-outline-primary {% if expires_soon == '7' %}active{% endif %}" href="/accounts/settings/expires_soon/7">7 days</a>
<a class="btn btn-outline-primary {% if expires_soon == '14' %}active{% endif %}" href="/accounts/settings/expires_soon/14">14 days</a>
<a class="btn btn-outline-primary {% if expires_soon == '21' %}active{% endif %}" href="/accounts/settings/expires_soon/21">21 days</a>
<a class="btn btn-outline-primary {% if expires_soon == '30' %}active{% endif %}" href="/accounts/settings/expires_soon/30">30 days</a>
<a class="btn btn-outline-primary {% if expires_soon == '60' %}active{% endif %}" href="/accounts/settings/expires_soon/60">60 days</a>
<a class="btn btn-outline-primary {% if expires_soon == '90' %}active{% endif %}" href="/accounts/settings/expires_soon/90">90 days</a>
</p>
<h2 class="ietf-divider">Show full document text by default?</h2>
<h3>Show full document text by default?</h3>
<p>Show the full text immediately on the document page instead of only showing beginning of it. This defaults to {{ defaults.full_draft }}.</p>
<div class="btn-group btn-group-justified">
<a class="btn btn-primary {% if full_draft == 'off' %}active{% endif %}" href="/accounts/settings/full_draft/off">Off</a>
<a class="btn btn-primary {% if full_draft == 'on' %}active{% endif %}" href="/accounts/settings/full_draft/on">On</a>
</div>
<p class="btn-group d-flex">
<a class="btn btn-outline-primary {% if full_draft == 'off' %}active{% endif %}" href="/accounts/settings/full_draft/off">Off</a>
<a class="btn btn-outline-primary {% if full_draft == 'on' %}active{% endif %}" href="/accounts/settings/full_draft/on">On</a>
</p>
<h2 class="ietf-divider">Show the left-hand menu?</h2>
<h3>Show the left-hand menu?</h3>
<p>Show the left-hand menu on all regular pages? This defaults to {{ defaults.left_menu }}.</p>
<div class="btn-group btn-group-justified">
<a class="btn btn-primary {% if left_menu == 'off' %}active{% endif %}" href="/accounts/settings/left_menu/off">Off</a>
<a class="btn btn-primary {% if left_menu == 'on' %}active{% endif %}" href="/accounts/settings/left_menu/on">On</a>
</div>
{% endblock %}
<p class="btn-group d-flex">
<a class="btn btn-outline-primary {% if left_menu == 'off' %}active{% endif %}" href="/accounts/settings/left_menu/off">Off</a>
<a class="btn btn-outline-primary {% if left_menu == 'on' %}active{% endif %}" href="/accounts/settings/left_menu/on">On</a>
</p>
{% endblock content %}

View file

@ -11,7 +11,7 @@
{{ form.name|add_class:"form-control"|attr:"placeholder:Document name/title/RFC number" }}
<span class="input-group-btn">
<button class="btn btn-primary" type="submit">
<span class="bi bi-search"></span>
<span class="bi bi-search"/>
Search
</button>
</span>
@ -151,7 +151,7 @@
</div>
<div class="col-sm-4 d-grid">
<button class="btn btn-primary" type="submit">
<span class="bi bi-search"></span>
<span class="bi bi-search"/>
Search
</button>
</div>

View file

@ -1,101 +1,91 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2018-2018, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}Personal Information in the Datatracker{% endblock %}
{% block title %}Personal Information in the Datatracker{% endblock title %}
{% block content %}
{% origin %}
<div class="col-sm-12" style="max-width: 85ex;">
<h1>Personal Information in the Datatracker</h1>
<p>
<h1>Personal Information in the Datatracker</h1>
<p>
<a href="https://datatracker.ietf.org/doc/html/rfc3935">RFC 3935, "A Mission Statement for the IETF"</a> lays out
the goal and the mission of the IETF as follows
</p>
<a href="https://datatracker.ietf.org/doc/html/rfc3935">RFC 3935, "A Mission Statement for the IETF"</a> lays out
the goal and the mission of the IETF as follows:
</p>
<pre>
The goal of the IETF is to make the Internet work better.
<samp class="preformatted small"> The goal of the IETF is to make the Internet work better.
The mission of the IETF is to produce high quality, relevant
technical and engineering documents that influence the way people
design, use, and manage the Internet in such a way as to make the
Internet work better. These documents include protocol standards,
best current practices, and informational documents of various kinds.
</pre>
The mission of the IETF is to produce high quality, relevant
technical and engineering documents that influence the way people
design, use, and manage the Internet in such a way as to make the
Internet work better. These documents include protocol standards,
best current practices, and informational documents of various kinds.
</samp>
{% comment %}
The following text has been reviewed by legal counsel (Thomas Zych)
on Thu, 26 Apr 2018 17:24:03 -0400
*** DO NOT CHANGE WITHOUT LEGAL REVIEW ***
{% endcomment %}
<!-- *** NOTE ***
<p>
In order to fulfil its mission, the IETF provides various ways to distribute
and discuss Internet-Drafts, and otherwise process them until there is
consensus that they are ready for publication.
</p>
The following text has been reviewed by legal counsel (Thomas Zych)
on Thu, 26 Apr 2018 17:24:03 -0400
<p>
This makes the information in the content of the draft documents, as well
as contributions related to the draft documents and their processing as
laid out in the "<a href="https://www.ietf.org/about/note-well/">Note
Well</a>" statement, of legitimate interest to the IETF when it pursues
its mission; not only in general terms, but specifically under Article
6(1)&nbsp;f) of
<a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679#d1e1888-1-1">
EU's General Data Protection Regulation </a>.
</p>
*** DO NOT CHANGE WITHOUT LEGAL REVIEW ***
-->
<p>
The datatracker treats all personal information derived from draft documents and
documents published as RFC, as well as personal information derived from
processing draft documents through the IETF procedures, in accordance with
applicable law, including the GDPR. This includes author names,
email addresses and other address information provided in draft documents or as
contact information for IETF roles such as Working Group chairs, secretaries,
Area Directors and other roles.
</p>
<p>
<p>
There is however additional personal information held in the datatracker that
is used for other purposes. This information requires the consent of the
individuals whose information is stored and processed which IETF secures
through various means, and the person it relates to may at any time request
its correction or removal. This includes:
</p>
In order to fulfil its mission, the IETF provides various ways to distribute
and discuss Internet-Drafts, and otherwise process them until there is
consensus that they are ready for publication.
<ul>
<li>Personal photograph or other likeness;</li>
<li>Personal biography;</li>
<li>Personal email addresses not derived from IETF contributions; and </li>
<li>Personal account login information</li>
<li>Personal notification subscriptions</li>
</ul>
</p>
<p>
<p>
Most of this information can be edited on the individual's
<a href="/accounts/profile/">Account Info</a> page by the individual
after logging in to the account. If the datatracker holds such
information about a person, and they don't have an account, a request to
the <a href="mailto:{{ settings.SECRETARIAT_ACTION_EMAIL }}">IETF secretariat</a> to change
or remove the information will be honoured to the extent feasible and
legally permitted.
</p>
This makes the information in the content of the draft documents, as well
as contributions related to the draft documents and their processing as
laid out in the "<a href="https://www.ietf.org/about/note-well/">Note
Well</a>" statement, of legitimate interest to the IETF when it pursues
its mission; not only in general terms, but specifically under Article
6(1)&nbsp;f) of
<a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679#d1e1888-1-1">
EU's General Data Protection Regulation </a>.
<p>
Please also see the IETF's overall
<a href="https://www.ietf.org/privacy-statement/">Statement concerning personal data</a>
</p>
</p>
<p>
The datatracker treats all personal information derived from draft documents and
documents published as RFC, as well as personal information derived from
processing draft documents through the IETF procedures, in accordance with
applicable law, including the GDPR. This includes author names,
email addresses and other address information provided in draft documents or as
contact information for IETF roles such as Working Group chairs, secretaries,
Area Directors and other roles.
</p>
<p>
There is however additional personal information held in the datatracker that
is used for other purposes. This information requires the consent of the
individuals whose information is stored and processed which IETF secures
through various means, and the person it relates to may at any time request
its correction or removal. This includes:
</p>
<ul>
<li>Personal photograph or other likeness;</li>
<li>Personal biography;</li>
<li>Personal email addresses not derived from IETF contributions; and </li>
<li>Personal account login information</li>
<li>Personal notification subscriptions</li>
</ul>
<p>
Most of this information can be edited on the individual's
<a href="/accounts/profile/">Account Info</a> page by the individual
after logging in to the account. If the datatracker holds such
information about a person, and they don't have an account, a request to
the <a href="mailto:{{settings.SECRETARIAT_ACTION_EMAIL}}">IETF secretariat</a> to change
or remove the information will be honoured to the extent feasible and
legally permitted.
</p>
<p>
Please also see the IETF's overall
<a href="https://www.ietf.org/privacy-statement/">Statement concerning personal data</a>.
</p>
</div>
{% endblock %}
{% endblock content %}

View file

@ -1,35 +1,30 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}
{{ title }} {{ person.plain_name }}
{% endblock %}
{% endblock title %}
{% block content %}
{% origin %}
<h1>{{ title }}<br><small>{{ person.plain_name }}</small></h1>
<p>
<b>
{{ info|safe }}
</b>
<h1>{{ title }}</h1>
<h2>{{ person.plain_name }}</h2>
<p class="fw-bold">
{{ info|striptags }}
</p>
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<!-- Regarding placement of buttons: https://www.lukew.com/ff/entry.asp?571 -->
<button type="submit" class="btn btn-primary" name="submit" value="Save">Submit</button>
<a class="btn btn-primary float-end" href="{% url "ietf.ietfauth.views.profile" %}">Back</a>
{% bootstrap_button button_type="submit" content="Submit" %}
<a class="btn btn-secondary float-end" href="{% url "ietf.ietfauth.views.profile" %}">Back</a>
</form>
{% endblock %}
{% endblock content %}

View file

@ -1,8 +1,10 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}Profile update successful{% endblock %}
{% block title %}Profile update successful{% endblock title%}
{% block content %}
{% origin %}
@ -16,4 +18,4 @@
{% endfor %}
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}">Edit profile</a>
{% endblock %}
{% endblock content %}

View file

@ -1,10 +1,12 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}Account creation{% endblock %}
{% block title %}Account creation{% endblock title %}
{% block content %}
{% origin %}
@ -17,41 +19,34 @@
<p>We have sent an email to {{ to_email }} with instructions on how to complete the process.</p>
{% else %}
<div class="row">
<div class="col-md-2 col-sm-0"></div>
<div class="col-md-8 col-sm-12">
<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
</p>
<p>
<a class="btn btn-primary" href="{% url "ietf.ietfauth.views.profile" %}"> Add a new email address</a>
</p>
<p>&nbsp;</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>
<h1>Account creation</h1>
<p>Please enter your email address in order to create your datatracker account.</p>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<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
</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>
<button type="submit" class="btn btn-primary">Create account</button>
<p>
<a class="btn btn-warning" href="{% url "ietf.ietfauth.views.password_reset" %}">Reset your password</a>
</p>
<hr/>
</form>
</div>
<div class="col-md-2 col-sm-0"></div>
</div>
<p>Please enter your email address in order to create your datatracker account.</p>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Create account" %}
</form>
{% endif %}
{% endblock %}
{% endblock content %}

View file

@ -1,25 +1,23 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load widget_tweaks django_bootstrap5 %}
{% load person_filters %}
{% block title %}Profile for {{ user }}{% endblock %}
{% block title %}Profile for {{ user }}{% endblock title %}
{% block content %}
{% origin %}
<h1>Profile information for {{ user.person.name }}</h1>
<p>&nbsp;</p>
<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>
<hr>
<form class="form-horizontal" method="post">
{% csrf_token %}
@ -28,35 +26,30 @@
{% bootstrap_form_errors f %}
{% endfor %}
<div class="form-group">
<label class="col-sm-2 control-label">User name <a href="#pi">&dagger;</a></label>
<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>
<div class="col-sm-10">
<p class="form-control-static">
<p class="form-control-plaintext">
{{ user.username }}
&nbsp;<a href="/accounts/username/"><span class="bi bi-pencil"></span></a>
</p>
<a class="btn btn-primary" href="/accounts/username/">Edit</a>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Password <a href="#pi">&dagger;</a></label>
<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>
<div class="col-sm-10">
<p class="form-control-static">
<a href="/accounts/password/">Password change form</a>
&nbsp;<a href="/accounts/password/"><span class="bi bi-pencil"></span></a>
</p>
<a class="btn btn-primary" href="/accounts/password/">Change password</a>
</div>
</div>
{% if person.photo %}
<div class="form-group">
<label class="col-sm-2 control-label">Photo <a href="#pi">&dagger;</a></label>
<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-static">
<a href="{{person.photo.url}}">
<p class="form-control-plaintext">
<a href="{{ person.photo.url }}">
<img class="photo" src="{{ person.photo.url }}" alt="Photo of {{ person }}" />
</a>
</p>
@ -64,171 +57,187 @@
</div>
{% endif %}
<div class="form-group">
<label class="col-sm-2 control-label">Nomcom Eligible</label>
<div class="col-sm-1 form-control-static">
{{person|is_nomcom_eligible|yesno:'Yes,No,No'}}
{% if volunteer_status == 'allow' %}
<br>
<a id="volunteer-button" class="btn btn-primary" href="{% url "ietf.nomcom.views.volunteer" %}">Volunteer</a>
{% endif %}
</div>
<div class="col-sm-9">
<p class="alert alert-info form-control-static">
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.<br/>
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>.<br/>
See <a href="{% url 'ietf.doc.views_doc.document_main' name='rfc8713'%}">RFC 8713</a>
for eligibility requirements.
For the 2021 nomcom, see also <a href="{% url 'ietf.doc.views_doc.document_main' name='rfc8989' %}">RFC 8989</a>.
{% if volunteer_status == 'volunteered' %}
<br/><strong id='volunteered'>You have volunteered for the {{nomcom.group.name}}.</strong> To modify your volunteer status, contact the NomCom chair.
{% 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>
{% if volunteer_status == 'allow' %}
<a id="volunteer-button" class="btn btn-primary" href="{% url "ietf.nomcom.views.volunteer" %}">Volunteer</a>
{% endif %}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">External Resources <a href="#pi">&dagger;</a></label>
<div class="col-sm-10 form-control-static">
<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>
<b id="volunteered">You have volunteered for the {{ nomcom.group.name }}.</b> To modify your volunteer status, contact the NomCom chair.
</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>
<div class="col-sm-10">
{% for extres in person.personextresource_set.all %}
<div class="row">
<div class="col-sm-1">
<span title="{{ extres.name.name}}">{% firstof extres.display_name extres.name.name %}</span>
<div class="col-3">
{% firstof extres.display_name extres.name.name %}
</div>
<div class="col-sm-11">{{extres.value}}
{% if forloop.first %}&nbsp;<a href="{% url 'ietf.ietfauth.views.edit_person_externalresources' %}"><span class="bi bi-pencil"></span></a>{% endif %}
<div class="col">
{{ extres.value }}
</div>
</div>
{% empty %}
<div class="row"><div class="col-sm-1">None&nbsp;<a href="{% url 'ietf.ietfauth.views.edit_person_externalresources' %}"><span class="bi bi-pencil"></span></a></div></div>
None
{% endfor %}
<a class="btn btn-primary mt-1" 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">
<table class="table table-sm">
<tr>
<th class="text-center">Primary</th>
<th class="text-center">Active</th>
<th>Address</th>
<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 %}/>
</td>
<td class="text-center">
<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>
{% endif %}
{{ email }}
</td>
<td>{{ email.origin|default:'(unknown)' }}</td>
</tr>
{% endfor %}
</table>
<p class="text-muted">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>
</div>
{% for role in roles %}
{% bootstrap_field role.email_form.email show_label=False %}
{% endfor %}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Email addresses</label>
<div class="col-sm-10">
<div class="row">
<div class="col-sm-10" id="emails">
<table class="table table-sm">
<tr ><th>Primary</th><th>Active</th><th>Address</th><th>Origin</th></tr>
{% for email in emails %}
<tr >
<td><input type="radio" name="primary_email" value="{{ email.pk }}" {% if email.primary %}checked{% endif %}></td>
<td><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">&dagger;</a>{% endif %}
{{ email }}
</td>
<td>{{ email.origin|default:'(unknown)' }}</td>
</tr>
{% endfor %}
</table>
</div>
<div class="col-sm-10">
<div class="help-block">Note: Email addresses cannot be deleted in this form, only deactivated.</div>
</div>
</div>
</div>
</div>
{% for f in new_email_forms %}
{% bootstrap_field f.new_email layout="horizontal" show_label=False %}
{% endfor %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="new-emails"></div>
<button class="btn btn-primary btn-sm add-email">Add a new email address</button>
</div>
</div>
{% for role in roles %}
{% bootstrap_field role.email_form.email layout="horizontal" show_label=False %}
{% endfor %}
{% bootstrap_field person_form.name layout="horizontal" %}
{% bootstrap_field person_form.plain layout="horizontal" %}
{% bootstrap_field person_form.ascii layout="horizontal" %}
{% if roles %}
{% bootstrap_field person_form.biography layout="horizontal" %}
{% endif %}
{% bootstrap_field person_form.consent layout="horizontal" %}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
{% bootstrap_form person_form layout="horizontal" exclude="ascii_short" %}
{% bootstrap_button button_type="submit" content="Submit" extra_classes="offset-sm-2" %}
</form>
<hr>
<div class="small text-muted mt-5">
<p id="pi"><strong>[&dagger;] Personal information requiring consent:</strong></p>
<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>
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>.
<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>
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>.
</p>
</p>
<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>
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
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>
if you wish to update or remove the information.
</p>
Personal information which is <b>not</b> 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>
regarding consent. All such information is visible on this page and shown with the
dagger symbol (<strong>&dagger;</strong>) next to it, or listed on your
<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>
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
you are logged in. It contains both the Legitimate Interest information and the information
that requires Consent.
</p>
{% endblock %}
<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
you are logged in. It contains both the Legitimate Interest information and the information
that requires Consent.
</p>
</div>
{% endblock content %}
{% block js %}
<script>
$(document).ready(function() {
$("input[name=active_emails]").on("change keypress click", function () {
$(document)
.ready(function () {
$("input[name=active_emails]")
.on("change keypress click", function () {
if (this.checked) {
$(this).parent().next().addClass("text-success");;
$(this).parent().next().removeClass("text-danger line-through");
$(this)
.parent()
.next()
.addClass("text-success");;
$(this)
.parent()
.next()
.removeClass("text-danger line-through");
} else {
$(this).parent().next().addClass("text-danger line-through");
$(this).parent().next().removeClass("text-success");
$(this)
.parent()
.next()
.addClass("text-danger line-through");
$(this)
.parent()
.next()
.removeClass("text-success");
}
}).trigger("change");
})
.trigger("change");
$(".add-email").click(function(e) {
$(".add-email")
.on("click", function (e) {
e.preventDefault();
var container = $(this).closest("form").find(".new-emails");
var container = $(this)
.closest("form")
.find(".new-emails");
$('<input class="form-control" name="new_email" placeholder="The address entered here will get a confirmation challenge. To add an address that cannot confirm, contact the secretariat.">').appendTo(container).focus();
$('<div class="float-end pad"><i>Remember to submit the form for the new email challenge to be sent.</i></div>').appendTo(container);
$('<input class="form-control mb-3" name="new_email" placeholder="You will get a confirmation challenge. To add an address that cannot confirm, contact the secretariat.">')
.appendTo(container)
.trigger("focus");
$('<div class="float-end text-muted small">Remember to submit the form for the new email challenge to be sent.</div>')
.appendTo(container);
})
});
</script>
{% endblock %}
{% endblock js %}

View file

@ -1,40 +1,26 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}Sign in{% endblock %}
{% block title %}Sign in{% endblock title %}
{% block content %}
{% origin %}
<div class="col-md-2 col-sm-0"></div>
<div class="col-md-8 col-sm-12">
<h1>Sign in</h1>
<script type="text/javascript">window.scrollTo(0, 0)</script>
<h1>Sign in</h1>
<script type="text/javascript">window.scrollTo(0, 0)</script>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% bootstrap_button button_type="submit" content="Sign in" %}
{% if alert %}
<p class="alert alert-danger">
{{ alert }}
</p>
{% endif %}
<button type="submit" class="btn btn-primary">Sign in</button>
<div class="float-end">
Forgot your password?
<a href="{% url 'ietf.ietfauth.views.password_reset' %}">Request a reset</a>.
</div>
</form>
</div>
<div class="col-md-2 col-sm-0"></div>
{% endblock %}
<div class="float-end">
Forgot your password?
<a href="{% url 'ietf.ietfauth.views.password_reset' %}">Request a reset</a>.
</div>
</form>
{% endblock content %}

View file

@ -1,10 +1,10 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}Complete account creation{% endblock %}
{% block title %}Complete account creation{% endblock title %}
{% block content %}
{% origin %}
@ -13,9 +13,7 @@
<p>
Our apologies, it looks like there was an issue creating your Datatracker account.
Please send an email to support@ietf.org and we'll get you set up promptly.
Best, IETF Secretariat
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>
{% endblock %}
{% endblock content %}

View file

@ -1,10 +1,12 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% load django_bootstrap5 %}
{% block title %}Password reset{% endblock %}
{% block title %}Password reset{% endblock title %}
{% block content %}
{% origin %}
@ -22,12 +24,7 @@
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" class="btn btn-warning">Reset password</button>
{% bootstrap_button button_type="submit" content="Reset password" %}
</form>
{% endif %}
{% endblock %}
{% endblock content %}

View file

@ -1,160 +1,149 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% extends "base.html" %}
{% load origin %}
{% block title %}About the Datatracker{% endblock %}
{% block title %}About the Datatracker{% endblock title %}
{% block content %}
{% origin %}
<div class="col-sm-12">
<h1>About the IETF Datatracker</h1>
<p>
<h1>About the IETF Datatracker</h1>
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.
<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>.
</p>
</p>
<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.
</p>
The primary public face of the IETF is at <a href="https://www.ietf.org/">www.ietf.org</a>.
<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>
<p>
</p>
All the Datatracker code is publicly avaliable 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.
<h2>Version 6.x Work</h2>
</p>
<p>
<p>
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>
gives more information.
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>
</p>
<h2>Version 6.0.0: Facelift using Bootstrap</h2>
<h2>Version 6.x Work</h2>
<p>
<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.
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>
gives more information.
</p>
</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.
<h2>Version 6.0.0: Facelift using Bootstrap</h2>
<p>
</p>
During more than a year, from July 2013 to late 2014, <i>Lars Eggert</i> worked intensively
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.
<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
<a href="https://django-bootstrap3.readthedocs.org/">django-bootstrap3</a>.
</p>
<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>
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 href="https://trac.ietf.org/trac/ietfdb/log/personal/henrik/facelift-r9116">
final style tweaks, bug-fixes and adaptations
</a>
by <i>Henrik Levkowetz</i>, giving it a distinct
<a href="https://www.colourlovers.com/palette/3702908/Key_West_Sunset">colour palette</a>
(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,
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.)
</p>
</p>
<p>
The work relies heavily on the capabilities of <a href="http://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="">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 href="https://trac.ietf.org/trac/ietfdb/log/personal/henrik/facelift-r9116">
final style tweaks, bug-fixes and adaptations
</a>
by <i>Henrik Levkowetz</i>, giving it a distinct
<a href="http://www.colourlovers.com/palette/3702908/Key_West_Sunset">colour palette</a>
(with the addition of complementing green and red colours for success and error indications),
and a selection of fonts from
<a href="http://www.paratype.com/public/">ParaType</a>
(<a href="http://www.identifont.com/show?2G32">PT Serif</a> for body text,
<a href="http://www.identifont.com/show?2G2G">PT Sans Caption</a> for headers,
<a href="http://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="http://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>.
</p>
<h2>Version 5.0.0: Shim Removal</h2>
<div class="alert-info">
To be written.
</div>
<h2>Version 4.00: New Database Schema</h2>
<div class="alert-info">
To be written.
</div>
<h2>Version 3.00: Django Port of the IESG Datatracker Pages</h2>
<div class="alert-info">
To be written.
</div>
<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
Python code, and 6000 lines of template code. The work was done as a
skunkworks project by Bill Fenner and Henrik Levkowetz from mid-April
to mid-May 2007, and continued as an official project from then on. The
aim was to eliminate numerous SQL injection insecurities in the current
code, and also provide a better framework on which to build future enhancements.
During the most intensive period, Bill and Henrik worked 10 hours per day
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>
<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>
<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>.
</p>
<h2>Version 5.0.0: Shim Removal</h2>
<div class="alert alert-info">
To be written.
</div>
{% endblock %}
<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>
<div class="alert alert-info">
To be written.
</div>
<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
Python code, and 6000 lines of template code. The work was done as a
skunkworks project by Bill Fenner and Henrik Levkowetz from mid-April
to mid-May 2007, and continued as an official project from then on. The
aim was to eliminate numerous SQL injection insecurities in the current
code, and also provide a better framework on which to build future enhancements.
During the most intensive period, Bill and Henrik worked 10 hours per day
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>
<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>
{% endblock content %}

View file

@ -1,88 +1,80 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}{% load cache %}
{% block title %}Release information{% endblock %}
{% extends "base.html" %}
{% load origin %}
{% load cache %}
{% block morecss %}
.year-row { background-color: white; }
.version-row { vertical-align: top; }
.version { text-align: right; padding: 0.1em 0.5em; min-width: 4em; }
.date { text-align: right; padding: 0.1em 0.5em; min-width: 8em; }
.release-title { padding: 0.1em 0.5em; }
{% endblock %}
{% block title %}Release information{% endblock title %}
{% block content %}
{% origin %}
<div class="col-sm-12">
<h1>
<a href="https://trac.ietf.org/trac/ietfdb/browser/tags/{{entry.version}}">
<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>Released {{ entry.date }}</small>
<div class="float-end"><a href="{% url "ietf.release.views.stats" %}" class="icon-link">&nbsp;<span class="small bi bi-bar-chart-line">&nbsp;</span></a></div>
<br/><small>Released {{ entry.date }}</small>
</h1>
<ul class="pager">
<li class="previous {% if not entry.prev %}disabled{% endif %}">
<a href="{% if entry.prev %}/release/{{entry.prev.version}}/{% else %}#{% endif %}"><span class="bi bi-arrow-left"></span> Previous release</a>
</li>
<li class="next {% if not entry.next %}disabled{% endif %}">
<a 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:
<b>Code</b>: {{coverage.code.percentage|stringformat:".2f"}}%, &nbsp;
<b>Templates</b>: {{coverage.template.percentage|stringformat:".2f"}}%, &nbsp;
<b>URLs</b>: {{coverage.url.percentage|stringformat:".2f"}}% &nbsp;
{% endif %}
{% if code_coverage_url %}
<br/>
(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>
<pre>{% if entry.title %} <b>{{entry.title}}</b>
{% endif %}{{entry.html|safe}}
-- {{entry.author}} &lt;{{entry.email}}&gt; {{entry.date}}
</pre>
{% cache 3600 ietf_release_list %}
<div id="release-list"></div>
<h2>Release list:</h2>
<table style="margin-left: 3em" class="table-striped">
<tbody>
{% for item in releases %}
{% ifchanged %}
</tbody>
<tbody>
<tr><td colspan="3"></td></tr>
<tr class="year-row">
<th class="h3">{{ item.date|slice:"7:11" }}</th>
<th></th>
<th></th>
</tr>
{% endifchanged %}
<tr class="version-row">
<td class="version"><a href="/release/{{item.version}}/">{{ item.version }}</a></td>
<td class="date">{{ item.date|slice:":11" }}</td>
<td class="release-title">{{ item.title }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endcache %}
<div class="col-1 text-end">
<a href="{% url "ietf.release.views.stats" %}" class="icon-link">
<span class="bi bi-bar-chart-line"></span>
</a>
</div>
</div>
{% endblock %}
<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>
</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>
</li>
</ul>
<p>
{% if coverage %}
Tested:
<b>Code</b>: {{ coverage.code.percentage|stringformat:".2f" }}%,
<b>Templates</b>: {{ coverage.template.percentage|stringformat:".2f" }}%,
<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.)
{% 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>
{% cache 3600 ietf_release_list %}
<div id="release-list"></div>
<h2>Release list:</h2>
<table class="table table-striped table-sm">
{% for item in releases %}
{% ifchanged %}
<tr class="table-info">
<th colspan="3" class="h4">{{ item.date|slice:"7:11" }}</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>
</tr>
{% endfor %}
</table>
{% endcache %}
{% endblock content %}
{% block footer %}
<div class="col-md-12 text-center padded-top">
<a href="https://trac.ietf.org/trac/ietfdb/wiki/ContractorInstructions"><i>Contractor instructions</i></a>
</div>
<p class="text-center">
<a href="https://trac.ietf.org/trac/ietfdb/wiki/ContractorInstructions">Contractor instructions</a>
</p>
{{ block.super }}
{% endblock %}
{% endblock footer %}