- Author{% if doc.pk %}{{ doc.authors|pluralize }}{% endif %}
+ Author{% if doc.pk %}{{ doc.author_persons_or_names|pluralize }}{% endif %}
{% if can_edit_authors %}
{# Implementation that uses the current primary email for each author #}
- {% if doc.pk %}{% for author in doc.authors %}
- {% person_link author %}{% if not forloop.last %},{% endif %}
+ {% if doc.pk %}{% for author in doc.author_persons_or_names %}
+ {% if author.person %}{% person_link author.person titlepage_name=author.titlepage_name %}{% else %}{{ author.titlepage_name }}{% endif %}{% if not forloop.last %},{% endif %}
{% endfor %}{% endif %}
{% if document_html and not snapshot or document_html and doc.rev == latest_rev%}
diff --git a/ietf/templates/doc/document_rfc.html b/ietf/templates/doc/document_rfc.html
index 7612ef89106..d4b309a9645 100644
--- a/ietf/templates/doc/document_rfc.html
+++ b/ietf/templates/doc/document_rfc.html
@@ -124,6 +124,15 @@
Referenced by
+ {% if doc.rfc_number >= settings.FIRST_V3_RFC %}
+
+
+
+ Get editor source
+
+ {% endif %}
State
-
+ {% if can_manage %}
+
+ Edit
+
+ {% endif %}
{% if doc.get_state %}
{{ doc.get_state.name }}
diff --git a/ietf/templates/doc/draft/ask_about_ietf_adoption.html b/ietf/templates/doc/draft/ask_about_ietf_adoption.html
new file mode 100644
index 00000000000..d19e4572b79
--- /dev/null
+++ b/ietf/templates/doc/draft/ask_about_ietf_adoption.html
@@ -0,0 +1,22 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2015-2025, All Rights Reserved #}
+{% load django_bootstrap5 ietf_filters origin %}
+{% block title %}Manage Adoption of {{ doc }}{% endblock %}
+{% block content %}
+ {% origin %}
+
+ Manage Adoption
+
+ {{ doc }}
+
+
+ Do you wish to issue an IETF Working Group call for adoption to one of these working groups?
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/draft/change_stream_state.html b/ietf/templates/doc/draft/change_stream_state.html
index 0b13e02fdf6..7f3132b3c8a 100644
--- a/ietf/templates/doc/draft/change_stream_state.html
+++ b/ietf/templates/doc/draft/change_stream_state.html
@@ -1,7 +1,6 @@
{% extends "base.html" %}
-{# Copyright The IETF Trust 2015, All Rights Reserved #}
-{% load origin %}
-{% load django_bootstrap5 %}
+{# Copyright The IETF Trust 2015-2025, All Rights Reserved #}
+{% load django_bootstrap5 ietf_filters origin %}
{% block title %}Change {{ state_type.label }} for {{ doc }}{% endblock %}
{% block content %}
{% origin %}
@@ -14,12 +13,10 @@
- Move document to {{ next_states|pluralize:"to one of" }} the recommended next state{{ next_states|pluralize }}:
+ Move document to {{ next_states|pluralize:"one of" }} the recommended next state{{ next_states|pluralize }}:
{% for state in next_states %}
- {% if state.slug == 'sub-pub' %}
- {{ state.name }}
- {% else %}
+ {% if state.slug != 'sub-pub' and state.slug != "wg-lc" %}
{{ state.name }}
{% endif %}
{% endfor %}
@@ -28,7 +25,13 @@
{% csrf_token %}
{% bootstrap_form form %}
Submit
- Back
+ Back
{% endblock %}
{% block js %}
diff --git a/ietf/templates/doc/draft/id_expired_email.txt b/ietf/templates/doc/draft/id_expired_email.txt
index afbf253ee28..161146a3010 100644
--- a/ietf/templates/doc/draft/id_expired_email.txt
+++ b/ietf/templates/doc/draft/id_expired_email.txt
@@ -1,4 +1,4 @@
-{% autoescape off %}{{ doc.file_tag|safe }} was just expired.
+{% autoescape off %}{{ doc.file_tag|safe }} just expired.
This Internet-Draft is in the state "{{ state }}" in the Datatracker.
diff --git a/ietf/templates/doc/draft/issue_working_group_call_for_adoption.html b/ietf/templates/doc/draft/issue_working_group_call_for_adoption.html
new file mode 100644
index 00000000000..61094b053a5
--- /dev/null
+++ b/ietf/templates/doc/draft/issue_working_group_call_for_adoption.html
@@ -0,0 +1,61 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2025, All Rights Reserved #}
+{% load origin django_bootstrap5 static %}
+={% block title %}Issue Working Group Call for Adoption of {{ doc }}{% endblock %}
+{% block pagehead %}
+
+{% endblock %}
+{% block content %}
+ {% origin %}
+
+ Issue Working Group Call for Adoption
+
+ {{ doc }}
+
+ {% if form.errors %}
+
+ Please correct the following:
+
+ {% endif %}
+ {% bootstrap_form_errors form %}
+
+{% endblock %}
+{% block js %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/draft/issue_working_group_last_call.html b/ietf/templates/doc/draft/issue_working_group_last_call.html
new file mode 100644
index 00000000000..d6f35a0e82e
--- /dev/null
+++ b/ietf/templates/doc/draft/issue_working_group_last_call.html
@@ -0,0 +1,61 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2025, All Rights Reserved #}
+{% load origin django_bootstrap5 static %}
+={% block title %}Issue Working Group Last Call for {{ doc }}{% endblock %}
+{% block pagehead %}
+
+{% endblock %}
+{% block content %}
+ {% origin %}
+
+ Issue Working Group Last Call
+
+ {{ doc }}
+
+ {% if form.errors %}
+
+ Please correct the following:
+
+ {% endif %}
+ {% bootstrap_form_errors form %}
+
+{% endblock %}
+{% block js %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/draft/rfceditor_post_approved_draft_failed.html b/ietf/templates/doc/draft/rfceditor_post_approved_draft_failed.html
deleted file mode 100644
index f976ead9265..00000000000
--- a/ietf/templates/doc/draft/rfceditor_post_approved_draft_failed.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{% extends "base.html" %}
-{# Copyright The IETF Trust 2015, All Rights Reserved #}
-{% load origin %}
-{% block title %}Posting approved I-D to RFC Editor failed{% endblock %}
-{% block content %}
- {% origin %}
- Posting approved I-D to RFC Editor failed
-
- Sorry, when trying to notify the RFC Editor through HTTP, we hit an
- error.
-
-
- We have not changed the Internet-Draft state or sent the announcement
- yet so if this is an intermittent error, you can go back and try
- again.
-
-
- The error was: {{ error }}
-
- {% if response %}
-
- The response from the RFC Editor was:
- {{ response|linebreaksbr }}
-
- {% endif %}
-{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/draft/wg_action_helpers.html b/ietf/templates/doc/draft/wg_action_helpers.html
new file mode 100644
index 00000000000..d21f3c0926e
--- /dev/null
+++ b/ietf/templates/doc/draft/wg_action_helpers.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2015-2025, All Rights Reserved #}
+{% load django_bootstrap5 ietf_filters origin %}
+{% block title %}Change IETF WG state for {{ doc }}{% endblock %}
+{% block content %}
+ {% origin %}
+
+ Change IETF WG state
+
+ {{ doc }}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/drafts_for_iesg.html b/ietf/templates/doc/drafts_for_iesg.html
new file mode 100644
index 00000000000..d7a79fb714c
--- /dev/null
+++ b/ietf/templates/doc/drafts_for_iesg.html
@@ -0,0 +1,20 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2015, All Rights Reserved #}
+{% load origin static %}
+{% load cache %}
+{% load ietf_filters %}
+{% load person_filters %}
+{% block pagehead %}
+
+{% endblock %}
+{% block title %}Documents for the IESG{% endblock %}
+{% block content %}
+ {% cache 300 ietf_doc_drafts_for_iesg using="slowpages" %}
+ {% origin %}
+ Documents for the IESG
+ {% include "doc/search/search_results.html" with start_table=True end_table=True %}
+ {% endcache %}
+{% endblock %}
+{% block js %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/drafts_in_iesg_process.html b/ietf/templates/doc/drafts_in_iesg_process.html
deleted file mode 100644
index f128e528a50..00000000000
--- a/ietf/templates/doc/drafts_in_iesg_process.html
+++ /dev/null
@@ -1,82 +0,0 @@
-{% extends "base.html" %}
-{# Copyright The IETF Trust 2015, All Rights Reserved #}
-{% load origin %}
-{% load ietf_filters static %}
-{% load textfilters person_filters %}
-{% block pagehead %}
-
-{% endblock %}
-{% block title %}{{ title }}{% endblock %}
-{% block content %}
- {% origin %}
- {{ title }}
-
-
-
- Area
-
- {% if state.slug == "lc" %}
- Expires at
- {% else %}
- Date
- {% endif %}
-
- Document
- Intended level
- AD
-
-
- {% for state, docs in grouped_docs %}
-
-
- {{ state.name }}
-
-
-
- {% for doc in docs %}
-
-
- {% if doc.area_acronym %}
- {{ doc.area_acronym }}
- {% endif %}
-
-
- {% if state.slug == "lc" %}
- {% if doc.lc_expires %}{{ doc.lc_expires|date:"Y-m-d" }}{% endif %}
- {% else %}
- {{ doc.time|date:"Y-m-d" }}
- {% endif %}
-
-
- {{ doc.name }}
-
- {{ doc.title }}
- {% if doc.action_holders_enabled and doc.action_holders.exists %}
-
- Action holder{{ doc.documentactionholder_set.all|pluralize }}:
- {% for action_holder in doc.documentactionholder_set.all %}
- {% person_link action_holder.person title=action_holder.role_for_doc %}{% if action_holder|action_holder_badge %} {{ action_holder|action_holder_badge }}{% endif %}{% if not forloop.last %},{% endif %}
- {% endfor %}
- {% endif %}
- {% if doc.note %}
-
- Note: {{ doc.note|urlize_ietf_docs|linkify|linebreaksbr }}
- {% endif %}
-
-
- {% if doc.intended_std_level %}
- {{ doc.intended_std_level.name }}
- {% else %}
- (None)
- {% endif %}
-
- {% person_link doc.ad %}
-
- {% endfor %}
-
- {% endfor %}
-
-{% endblock %}
-{% block js %}
-
-{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/index_active_drafts.html b/ietf/templates/doc/index_active_drafts.html
index 06ea2c4ff5f..607385f56fd 100644
--- a/ietf/templates/doc/index_active_drafts.html
+++ b/ietf/templates/doc/index_active_drafts.html
@@ -29,7 +29,7 @@ Active Internet-Drafts
{% for group in groups %}
{{ group.name }} ({{ group.acronym }})
- {% for d in group.active_drafts %}
+ {% for d in group.active_drafts %}{# n.b., d is a dict, not a Document #}
{{ d.title }}.
diff --git a/ietf/templates/doc/investigate.html b/ietf/templates/doc/investigate.html
index bdcf644406b..8b613117d5c 100644
--- a/ietf/templates/doc/investigate.html
+++ b/ietf/templates/doc/investigate.html
@@ -6,112 +6,124 @@
{% endblock %}
{% block content %}
- {% origin %}
-
Investigate
-
- {% if results %}
-
- {% if results.can_verify %}
-
These can be authenticated
-
-
-
- Name
- Last Modified On
- Link
- Source
-
-
-
- {% for path in results.can_verify %}
- {% with url=path|url_for_path %}
-
- {{path.name}}
-
- {% if path|mtime_is_epoch %}
- Timestamp has been lost (is Unix Epoch)
- {% else %}
- {{path|mtime|date:"DATETIME_FORMAT"}}
- {% endif %}
-
- {{url}}
- {{path}}
-
- {% endwith %}
- {% endfor %}
-
-
- {% else %}
-
Nothing with this name fragment can be authenticated
- {% endif %}
-
- {% if results.unverifiable_collections %}
-
These are in the archive, but cannot be authenticated
-
-
-
- Name
- Last Modified On
- Link
- Source
-
-
-
- {% for path in results.unverifiable_collections %}
- {% with url=path|url_for_path %}
-
- {{path.name}}
-
- {% if path|mtime_is_epoch %}
- Timestamp has been lost (is Unix Epoch)
- {% else %}
- {{path|mtime|date:"DATETIME_FORMAT"}}
- {% endif %}
-
- {{url}}
- {{path}}
-
- {% endwith %}
- {% endfor %}
-
-
- {% endif %}
- {% if results.unexpected %}
-
These are unexpected and we do not know what their origin is. These cannot be authenticated
-
-
-
- Name
- Last Modified On
- Link
-
-
-
- {% for path in results.unexpected %}
- {% with url=path|url_for_path %}
-
- {{path.name}}
-
- {% if path|mtime_is_epoch %}
- Timestamp has been lost (is Unix Epoch)
- {% else %}
- {{path|mtime|date:"DATETIME_FORMAT"}}
- {% endif %}
-
- {{url}}
-
- {% endwith %}
- {% endfor %}
-
-
- {% endif %}
+ {% origin %}
+
Investigate
+
- {% endif %}
+ {% if results %}
+
+ {% if results.can_verify %}
+
These can be authenticated
+
+
+
+ Name
+ Last Modified On
+ Link
+ Source
+
+
+
+ {% for path in results.can_verify %}
+ {% with url=path|url_for_path %}
+
+ {{ path.name }}
+
+ {% if path|mtime_is_epoch %}
+ Timestamp has been lost (is Unix Epoch)
+ {% else %}
+ {{ path|mtime|date:"DATETIME_FORMAT" }}
+ {% endif %}
+
+ {{ url }}
+ {{ path }}
+
+ {% endwith %}
+ {% endfor %}
+
+
+ {% else %}
+
Nothing with this name fragment can be authenticated
+ {% endif %}
+
+ {% if results.unverifiable_collections %}
+
These are in the archive, but cannot be authenticated
+
+
+
+ Name
+ Last Modified On
+ Link
+ Source
+
+
+
+ {% for path in results.unverifiable_collections %}
+ {% with url=path|url_for_path %}
+
+ {{ path.name }}
+
+ {% if path|mtime_is_epoch %}
+ Timestamp has been lost (is Unix Epoch)
+ {% else %}
+ {{ path|mtime|date:"DATETIME_FORMAT" }}
+ {% endif %}
+
+ {{ url }}
+ {{ path }}
+
+ {% endwith %}
+ {% endfor %}
+
+
+ {% endif %}
+ {% if results.unexpected %}
+
These are unexpected and we do not know what their origin is. These cannot be authenticated
+
+
+
+ Name
+ Last Modified On
+ Link
+
+
+
+ {% for path in results.unexpected %}
+ {% with url=path|url_for_path %}
+
+ {{ path.name }}
+
+ {% if path|mtime_is_epoch %}
+ Timestamp has been lost (is Unix Epoch)
+ {% else %}
+ {{ path|mtime|date:"DATETIME_FORMAT" }}
+ {% endif %}
+
+ {{ url }}
+
+ {% endwith %}
+ {% endfor %}
+
+
+ {% endif %}
+
+ {% endif %}
{% endblock %}
{% block js %}
+
{% endblock %}
\ No newline at end of file
diff --git a/ietf/templates/doc/mail/wg_call_for_adoption_issued.txt b/ietf/templates/doc/mail/wg_call_for_adoption_issued.txt
new file mode 100644
index 00000000000..15ace9495b2
--- /dev/null
+++ b/ietf/templates/doc/mail/wg_call_for_adoption_issued.txt
@@ -0,0 +1,31 @@
+{% load ietf_filters %}{% load mail_filters %}{% autoescape off %}{% filter wordwrap:78 %}This message starts a {{group.acronym}} WG Call for Adoption of:
+{{ doc.name }}-{{ doc.rev }}
+
+
+This Working Group Call for Adoption ends on {{ end_date }}
+
+Abstract:
+{{ doc.abstract }}
+
+Please reply to this message and indicate whether or not you support adoption of this Internet-Draft by the {{group.acronym}} WG. Comments to explain your preference are greatly appreciated. Please reply to all recipients of this message and include this message in your response.
+
+Authors, and WG participants in general, are reminded of the Intellectual Property Rights (IPR) disclosure obligations described in BCP 79 [2]. Appropriate IPR disclosures required for full conformance with the provisions of BCP 78 [1] and BCP 79 [2] must be filed, if you are aware of any. Sanctions available for application to violators of IETF IPR Policy can be found at [3].
+
+Thank you.
+[1] https://datatracker.ietf.org/doc/bcp78/
+[2] https://datatracker.ietf.org/doc/bcp79/
+[3] https://datatracker.ietf.org/doc/rfc6701/
+
+The IETF datatracker status page for this Internet-Draft is:
+{{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.doc.views_doc.document_main' name=doc.name %}
+{% if doc.submission.xml_version == "3" %}
+There is also an HTML version available at:
+{{ settings.IETF_ID_ARCHIVE_URL }}{{ doc.name }}-{{ doc.rev }}.html{% else %}
+There is also an HTMLized version available at:
+{{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.doc.views_doc.document_html' name=doc.name rev=doc.rev %}{% endif %}
+{% if doc.rev != "00" %}
+A diff from the previous version is available at:
+{{settings.RFCDIFF_BASE_URL}}?url2={{ doc.name }}-{{ doc.rev }}
+{% endif %}
+{% endfilter %}
+{% endautoescape %}
diff --git a/ietf/templates/doc/mail/wg_last_call_issued.txt b/ietf/templates/doc/mail/wg_last_call_issued.txt
new file mode 100644
index 00000000000..114f8bc5e22
--- /dev/null
+++ b/ietf/templates/doc/mail/wg_last_call_issued.txt
@@ -0,0 +1,34 @@
+{% load ietf_filters %}{% load mail_filters %}{% autoescape off %}{% filter wordwrap:78 %}This message starts a WG Last Call for:
+{{ doc.name }}-{{ doc.rev }}
+
+This Working Group Last Call ends on {{ end_date }}
+
+Abstract:
+{{ doc.abstract }}
+
+File can be retrieved from:
+{{ url }}
+
+Please review and indicate your support or objection to proceed with the publication of this document by replying to this email keeping {{ wg_list }} in copy. Objections should be explained and suggestions to resolve them are highly appreciated.
+
+Authors, and WG participants in general, are reminded of the Intellectual Property Rights (IPR) disclosure obligations described in BCP 79 [1]. Appropriate IPR disclosures required for full conformance with the provisions of BCP 78 [1] and BCP 79 [2] must be filed, if you are aware of any. Sanctions available for application to violators of IETF IPR Policy can be found at [3].
+
+Thank you.
+
+[1] https://datatracker.ietf.org/doc/bcp78/
+[2] https://datatracker.ietf.org/doc/bcp79/
+[3] https://datatracker.ietf.org/doc/rfc6701/
+
+The IETF datatracker status page for this Internet-Draft is:
+{{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.doc.views_doc.document_main' name=doc.name %}
+{% if doc.submission.xml_version == "3" %}
+There is also an HTML version available at:
+{{ settings.IETF_ID_ARCHIVE_URL }}{{ doc.name }}-{{ doc.rev }}.html{% else %}
+There is also an HTMLized version available at:
+{{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.doc.views_doc.document_html' name=doc.name rev=doc.rev %}{% endif %}
+{% if doc.rev != "00" %}
+A diff from the previous version is available at:
+{{settings.RFCDIFF_BASE_URL}}?url2={{ doc.name }}-{{ doc.rev }}
+{% endif %}
+{% endfilter %}
+{% endautoescape %}
diff --git a/ietf/templates/doc/notprepped_wrapper.html b/ietf/templates/doc/notprepped_wrapper.html
new file mode 100644
index 00000000000..078db7bc51a
--- /dev/null
+++ b/ietf/templates/doc/notprepped_wrapper.html
@@ -0,0 +1,26 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2026, All Rights Reserved #}
+{% load origin %}
+{% block title %}RFC {{ rfc.rfc_number }} — Not-prepped XML{% endblock %}
+{% block content %}
+ {% origin %}
+
RFC {{ rfc.rfc_number }} — Not-prepped XML
+
+ The not-prepped XML
+ is the RFC XML v3 source for an RFC at the moment in the publication process
+ just before the prep tool was used to expand default
+ values, generate section numbers, resolve cross-references, and embed
+ boilerplate.
+
+ It is useful for authors who want to begin a new draft based on
+ the RFC's text, such as when creating a bis-draft, and for tools that process
+ author-facing RFC XML.
+
+
+
+
+ Download not-prepped XML for RFC {{ rfc.rfc_number }}
+
+
+{% endblock %}
diff --git a/ietf/templates/doc/opengraph.html b/ietf/templates/doc/opengraph.html
index 4fe39b6209f..1c8c5abe912 100644
--- a/ietf/templates/doc/opengraph.html
+++ b/ietf/templates/doc/opengraph.html
@@ -1,4 +1,4 @@
-{# Copyright The IETF Trust 2016-2020, All Rights Reserved #}
+{# Copyright The IETF Trust 2016-2025, All Rights Reserved #}
{% load origin %}
{% load static %}
{% load ietf_filters %}
@@ -36,7 +36,7 @@
{% else %}{# TODO: We need a card image for individual I-Ds. #}
{% endif %}
-{% if doc.pk %}{% for author in doc.documentauthor_set.all %}
+{% if doc.pk %}{% for author_name in doc.author_names %}
{% endfor %}{% endif %}
{% if published %}
{% endif %}
{% if expires %}
{% endif %}
\ No newline at end of file
diff --git a/ietf/templates/doc/review/complete_review.html b/ietf/templates/doc/review/complete_review.html
index f30c641e466..8aeb1486a4c 100644
--- a/ietf/templates/doc/review/complete_review.html
+++ b/ietf/templates/doc/review/complete_review.html
@@ -93,14 +93,20 @@
Back
{% endif %}
- {% if mail_archive_query_urls %}
-
+ {% if mail_archive_query_data %}
+
{% endif %}
- {% if review_req.doc.authors %}
+ {% if review_req.doc.author_persons_or_names %}