From 720f31b6ba53ec44353e0794c67b21a9216c2853 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Thu, 23 May 2024 10:55:21 -0500 Subject: [PATCH] feat: Add disclaimer banner for unadopted I-Ds and non-IETF RFCs (#6786) * feat: Add disclaimer banners for unadopted I-Ds and non-IETF RFCs Fixes #6539 * Fixes * Add test * Use BofreqFactory * Fix disclaimer logic * fix: Wording changes from stream owners * fix: Only insert when there isn't a space before or after (#6821) * fix: Only insert when there isn't a space before or after. * Fix @cabo's issue * fix: Remove debug info from template (#6897) Fixes #6895 * fix: remove link to Warren's draft from disclaimer text (#7429) --------- Co-authored-by: Lars Eggert --- ietf/doc/templatetags/ietf_filters.py | 25 +++++++++++++++++ ietf/doc/templatetags/tests_ietf_filters.py | 31 +++++++++++++++++++-- ietf/static/js/ietf.js | 2 +- ietf/templates/doc/disclaimer.html | 28 +++++++++++++++++++ ietf/templates/doc/document_draft.html | 1 + ietf/templates/doc/document_info.html | 5 +++- ietf/templates/doc/document_rfc.html | 1 + 7 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 ietf/templates/doc/disclaimer.html diff --git a/ietf/doc/templatetags/ietf_filters.py b/ietf/doc/templatetags/ietf_filters.py index 35c79ac28..35f9f91b4 100644 --- a/ietf/doc/templatetags/ietf_filters.py +++ b/ietf/doc/templatetags/ietf_filters.py @@ -933,3 +933,28 @@ def url_for_path(path): return f"{settings.IETF_ID_ARCHIVE_URL}{path.name}" else: return "#" + + +@register.filter +def is_in_stream(doc): + """ + Check if the doc is in one of the states in it stream that + indicate that is actually adopted, i.e., part of the stream. + (There are various "candidate" states that necessitate this + filter.) + """ + if not doc.stream: + return False + stream = doc.stream.slug + state = doc.get_state_slug(f"draft-stream-{doc.stream.slug}") + if not state: + return True + if stream == "ietf": + return state not in ["wg-cand", "c-adopt"] + elif stream == "irtf": + return state != "candidat" + elif stream == "iab": + return state not in ["candidat", "diff-org"] + elif stream == "editorial": + return True + return False diff --git a/ietf/doc/templatetags/tests_ietf_filters.py b/ietf/doc/templatetags/tests_ietf_filters.py index 72796abeb..f018b7d9b 100644 --- a/ietf/doc/templatetags/tests_ietf_filters.py +++ b/ietf/doc/templatetags/tests_ietf_filters.py @@ -7,9 +7,20 @@ from ietf.doc.factories import ( IndividualDraftFactory, CharterFactory, NewRevisionDocEventFactory, + StatusChangeFactory, + RgDraftFactory, + EditorialDraftFactory, + WgDraftFactory, + ConflictReviewFactory, + BofreqFactory, + StatementFactory, ) from ietf.doc.models import DocEvent -from ietf.doc.templatetags.ietf_filters import urlize_ietf_docs, is_valid_url +from ietf.doc.templatetags.ietf_filters import ( + urlize_ietf_docs, + is_valid_url, + is_in_stream, +) from ietf.person.models import Person from ietf.utils.test_utils import TestCase @@ -19,13 +30,28 @@ import debug # pyflakes: ignore class IetfFiltersTests(TestCase): + def test_is_in_stream(self): + for draft in [ + IndividualDraftFactory(), + CharterFactory(), + StatusChangeFactory(), + ConflictReviewFactory(), + StatementFactory(), + BofreqFactory(), + ]: + self.assertFalse(is_in_stream(draft)) + for draft in [RgDraftFactory(), WgDraftFactory(), EditorialDraftFactory()]: + self.assertTrue(is_in_stream(draft)) + for stream in ["iab", "ietf", "irtf", "ise", "editorial"]: + self.assertTrue(is_in_stream(IndividualDraftFactory(stream_id=stream))) + def test_is_valid_url(self): cases = [(settings.IDTRACKER_BASE_URL, True), ("not valid", False)] for url, result in cases: self.assertEqual(is_valid_url(url), result) def test_urlize_ietf_docs(self): - rfc = WgRfcFactory(rfc_number=123456,std_level_id="bcp") + rfc = WgRfcFactory(rfc_number=123456, std_level_id="bcp") rfc.save_with_history( [ DocEvent.objects.create( @@ -57,7 +83,6 @@ class IetfFiltersTests(TestCase): cases = [ ("no change", "no change"), - # TODO: rework subseries when we add them # ("bCp123456", 'bCp123456'), # ("Std 00123456", 'Std 00123456'), diff --git a/ietf/static/js/ietf.js b/ietf/static/js/ietf.js index 215d80553..74fd39a85 100644 --- a/ietf/static/js/ietf.js +++ b/ietf/static/js/ietf.js @@ -57,7 +57,7 @@ $(document) var text = $(this) .text(); // insert some at strategic places - var newtext = text.replace(/([@._+])/g, "$1"); + var newtext = text.replace(/(\S)([@._+])(\S)/g, "$1$2$3"); if (newtext === text) { return; } diff --git a/ietf/templates/doc/disclaimer.html b/ietf/templates/doc/disclaimer.html new file mode 100644 index 000000000..31ce6c397 --- /dev/null +++ b/ietf/templates/doc/disclaimer.html @@ -0,0 +1,28 @@ +{# Copyright The IETF Trust 2016-2023, All Rights Reserved #} +{% load origin %} +{% load ietf_filters %} +{% origin %} +{% if doc.type_id == "rfc" %} + {% if doc.stream.slug != "ietf" and doc.std_level.slug|default:"unk" not in "bcp,ds,ps,std"|split:"," %} + + {% endif %} +{% elif doc|is_in_stream %} + {% if doc.stream.slug != "ietf" and doc.std_level.slug|default:"unk" not in "bcp,ds,ps,std"|split:"," %} + + {% endif %} +{% else %} + +{% endif %} \ No newline at end of file diff --git a/ietf/templates/doc/document_draft.html b/ietf/templates/doc/document_draft.html index 0dc64e9f3..befbc759f 100644 --- a/ietf/templates/doc/document_draft.html +++ b/ietf/templates/doc/document_draft.html @@ -27,6 +27,7 @@ {% origin %} {{ top|safe }} {% include "doc/revisions_list.html" with document_html=document_html %} + {% include "doc/disclaimer.html" with document_html=document_html %}
{% if doc.rev != latest_rev %}
The information below is for an old version of the document.
diff --git a/ietf/templates/doc/document_info.html b/ietf/templates/doc/document_info.html index e30656e16..97cd49cf7 100644 --- a/ietf/templates/doc/document_info.html +++ b/ietf/templates/doc/document_info.html @@ -63,7 +63,7 @@ {% if doc.became_rfc %} This is an older version of an Internet-Draft that was ultimately published as {{doc.became_rfc.name|prettystdname}}. {% elif snapshot and doc.rev != latest_rev %} - This is an older version of an Internet-Draft whose latest revision state is "{{ doc.doc.get_state }}". + This is an older version of an Internet-Draft whose latest revision state is "{{ doc.doc.get_state }}". {% else %} {% if snapshot and doc.rev == latest_rev %}{{ doc.doc.get_state }}{% else %}{{ doc.get_state }}{% endif %} Internet-Draft {% if submission %}({{ submission|safe }}){% endif %} @@ -75,6 +75,9 @@ Expired & archived {% endif %} + {% if document_html %} + {% include "doc/disclaimer.html" with document_html=document_html %} + {% endif %} {% if document_html %} diff --git a/ietf/templates/doc/document_rfc.html b/ietf/templates/doc/document_rfc.html index b25d434de..7612ef891 100644 --- a/ietf/templates/doc/document_rfc.html +++ b/ietf/templates/doc/document_rfc.html @@ -22,6 +22,7 @@ {% block content %} {% origin %} {{ top|safe }} + {% include "doc/disclaimer.html" with document_html=document_html %}
{% include "doc/document_info.html" %}