From 6b5230e5766b81e1824b99c227afd4008430641f Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Tue, 12 Dec 2023 20:13:59 -0400 Subject: [PATCH 01/10] fix: Avoid accessing slug when state is None --- ietf/group/views.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index f2abe73caab..0e00d56a040 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -772,11 +772,10 @@ def dependencies(request, acronym, group_type=None): "nodes": [ { "id": x.name, - "rfc": x.get_state("draft").slug == "rfc", - "post-wg": not x.get_state("draft-iesg").slug - in ["idexists", "watching", "dead"], - "expired": x.get_state("draft").slug == "expired", - "replaced": x.get_state("draft").slug == "repl", + "rfc": x.type_id == "rfc", + "post-wg": x.get_state_slug("draft-iesg") not in ["idexists", "watching", "dead"], + "expired": x.get_state_slug("draft") == "expired", + "replaced": x.get_state_slug("draft") == "repl", "group": x.group.acronym if x.group.acronym != "none" else "", "url": x.get_absolute_url(), "level": x.intended_std_level.name From 05f701c51c00dca0d079dfe593fa79b28a9a44c1 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 12:21:21 -0400 Subject: [PATCH 02/10] fix: ignore pre-rfc drafts as rfc-to-rfc references --- ietf/group/views.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index 0e00d56a040..fef6736befe 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -737,17 +737,21 @@ def dependencies(request, acronym, group_type=None): references = Q( Q(source__group=group) | Q(source__in=cl_docs), - source__type="draft", + source__type="draft", # does this need to be type__in=["draft", "rfc"]? Check for informative ref rfc->draft relationship__slug__startswith="ref", ) - - both_rfcs = Q(source__type_id="rfc", target__type_id="rfc") + rfc_or_subseries = {"rfc", "bcp", "fyi", "std"} + both_rfcs = Q(source__type_id="rfc", target__type_id__in=rfc_or_subseries) + pre_rfc_draft_to_rfc = Q(source__type_id="draft", source__states__slug="rfc", target__type_id__in=rfc_or_subseries) + rfc_to_pre_rfc_draft = Q(source__type_id__in=rfc_or_subseries, target__type_id="draft", target__states__slug="rfc") inactive = Q(source__states__slug__in=["expired", "repl"]) attractor = Q(target__name__in=["rfc5000", "rfc5741"]) removed = Q(source__states__slug__in=["auth-rm", "ietf-rm"]) relations = ( RelatedDocument.objects.filter(references) .exclude(both_rfcs) + .exclude(pre_rfc_draft_to_rfc) + .exclude(rfc_to_pre_rfc_draft) .exclude(inactive) .exclude(attractor) .exclude(removed) @@ -776,7 +780,7 @@ def dependencies(request, acronym, group_type=None): "post-wg": x.get_state_slug("draft-iesg") not in ["idexists", "watching", "dead"], "expired": x.get_state_slug("draft") == "expired", "replaced": x.get_state_slug("draft") == "repl", - "group": x.group.acronym if x.group.acronym != "none" else "", + "group": x.group.acronym if x.group and x.group.acronym != "none" else "", "url": x.get_absolute_url(), "level": x.intended_std_level.name if x.intended_std_level From a3d09a8f5c6b7e7f1fcc32d7072d0108055edc9b Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 12:43:34 -0400 Subject: [PATCH 03/10] fix: also ignore pre-rfc to pre-rfc refs --- ietf/group/views.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ietf/group/views.py b/ietf/group/views.py index fef6736befe..81c5057d3e7 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -744,6 +744,10 @@ def dependencies(request, acronym, group_type=None): both_rfcs = Q(source__type_id="rfc", target__type_id__in=rfc_or_subseries) pre_rfc_draft_to_rfc = Q(source__type_id="draft", source__states__slug="rfc", target__type_id__in=rfc_or_subseries) rfc_to_pre_rfc_draft = Q(source__type_id__in=rfc_or_subseries, target__type_id="draft", target__states__slug="rfc") + both_pre_rfcs = Q( + source__type_id="draft", source__states__slug="rfc", + target__type_id="draft", target__states__slug="rfc", + ) inactive = Q(source__states__slug__in=["expired", "repl"]) attractor = Q(target__name__in=["rfc5000", "rfc5741"]) removed = Q(source__states__slug__in=["auth-rm", "ietf-rm"]) @@ -752,10 +756,12 @@ def dependencies(request, acronym, group_type=None): .exclude(both_rfcs) .exclude(pre_rfc_draft_to_rfc) .exclude(rfc_to_pre_rfc_draft) + .exclude(both_pre_rfcs) .exclude(inactive) .exclude(attractor) .exclude(removed) ) + import pdb; pdb.set_trace() links = set() for x in relations: From a2008c11d7ee91d7b43c9e3e6e78d13d026e42f3 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 12:44:02 -0400 Subject: [PATCH 04/10] chore: remove breakpoint --- ietf/group/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index 81c5057d3e7..83b8bb8286c 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -761,7 +761,6 @@ def dependencies(request, acronym, group_type=None): .exclude(attractor) .exclude(removed) ) - import pdb; pdb.set_trace() links = set() for x in relations: From 368d525f71b2ebc5910e85e2e591aabc8df25018 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 16:44:51 -0400 Subject: [PATCH 05/10] fix: ignore subseries non-downrefs --- ietf/group/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index 83b8bb8286c..ffc25e286d1 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -764,8 +764,8 @@ def dependencies(request, acronym, group_type=None): links = set() for x in relations: - target_state = x.target.get_state_slug("draft") - if target_state != "rfc" or x.is_downref(): + always_include = x.target.type_id not in rfc_or_subseries and x.target.get_state_slug("draft") != "rfc" + if always_include or x.is_downref(): links.add(x) replacements = RelatedDocument.objects.filter( From 7d835765f4148128547eca0e7645e58f055131fd Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 17:13:58 -0400 Subject: [PATCH 06/10] fix: label nodes as RFCS when possible --- ietf/group/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index ffc25e286d1..376a1e12149 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -780,7 +780,7 @@ def dependencies(request, acronym, group_type=None): graph = { "nodes": [ { - "id": x.name, + "id": x.became_rfc().name if x.became_rfc() else x.name, "rfc": x.type_id == "rfc", "post-wg": x.get_state_slug("draft-iesg") not in ["idexists", "watching", "dead"], "expired": x.get_state_slug("draft") == "expired", @@ -797,8 +797,8 @@ def dependencies(request, acronym, group_type=None): ], "links": [ { - "source": x.source.name, - "target": x.target.name, + "source": x.source.became_rfc().name if x.source.became_rfc() else x.source.name, + "target": x.target.became_rfc().name if x.target.became_rfc() else x.target.name, "rel": "downref" if x.is_downref() else x.relationship.slug, } for x in links From 79b5f3b8b6875b2c124ba28f3d28f8300e5e04ab Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 17:25:52 -0400 Subject: [PATCH 07/10] fix: get "rfc" flag right --- ietf/group/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index 376a1e12149..2d613995c75 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -781,7 +781,7 @@ def dependencies(request, acronym, group_type=None): "nodes": [ { "id": x.became_rfc().name if x.became_rfc() else x.name, - "rfc": x.type_id == "rfc", + "rfc": x.type_id == "rfc" or x.became_rfc() is not None, "post-wg": x.get_state_slug("draft-iesg") not in ["idexists", "watching", "dead"], "expired": x.get_state_slug("draft") == "expired", "replaced": x.get_state_slug("draft") == "repl", From 2a20e34113a0c742505d9d42dd4b0c3a27e2379d Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 13 Dec 2023 17:47:21 -0400 Subject: [PATCH 08/10] chore: Remove comment, answer seems to be "no" --- ietf/group/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index 2d613995c75..a2415c8e3bc 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -737,7 +737,7 @@ def dependencies(request, acronym, group_type=None): references = Q( Q(source__group=group) | Q(source__in=cl_docs), - source__type="draft", # does this need to be type__in=["draft", "rfc"]? Check for informative ref rfc->draft + source__type="draft", relationship__slug__startswith="ref", ) rfc_or_subseries = {"rfc", "bcp", "fyi", "std"} From db1386076ed23d4d7edc689e2f199e393d2fe901 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 14 Dec 2023 09:10:35 -0400 Subject: [PATCH 09/10] refactor: Specify state type; drop redundant source doc type check We're only admitting source__type="draft", so no need to check it again in filter queries --- ietf/group/views.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index a2415c8e3bc..0949ada4ccc 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -742,11 +742,17 @@ def dependencies(request, acronym, group_type=None): ) rfc_or_subseries = {"rfc", "bcp", "fyi", "std"} both_rfcs = Q(source__type_id="rfc", target__type_id__in=rfc_or_subseries) - pre_rfc_draft_to_rfc = Q(source__type_id="draft", source__states__slug="rfc", target__type_id__in=rfc_or_subseries) - rfc_to_pre_rfc_draft = Q(source__type_id__in=rfc_or_subseries, target__type_id="draft", target__states__slug="rfc") + pre_rfc_draft_to_rfc = Q( + source__states__type="draft", + source__states__slug="rfc", + target__type_id__in=rfc_or_subseries, + ) both_pre_rfcs = Q( - source__type_id="draft", source__states__slug="rfc", - target__type_id="draft", target__states__slug="rfc", + source__states__type="draft", + source__states__slug="rfc", + target__type_id="draft", + target__states__type="draft", + target__states__slug="rfc", ) inactive = Q(source__states__slug__in=["expired", "repl"]) attractor = Q(target__name__in=["rfc5000", "rfc5741"]) @@ -755,7 +761,6 @@ def dependencies(request, acronym, group_type=None): RelatedDocument.objects.filter(references) .exclude(both_rfcs) .exclude(pre_rfc_draft_to_rfc) - .exclude(rfc_to_pre_rfc_draft) .exclude(both_pre_rfcs) .exclude(inactive) .exclude(attractor) From fdaa6d31def271ffe16abef4bb9a5310b1bb1905 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 14 Dec 2023 09:11:31 -0400 Subject: [PATCH 10/10] refactor: Specify state type in old code --- ietf/group/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ietf/group/views.py b/ietf/group/views.py index 0949ada4ccc..991a1b8d879 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -754,9 +754,12 @@ def dependencies(request, acronym, group_type=None): target__states__type="draft", target__states__slug="rfc", ) - inactive = Q(source__states__slug__in=["expired", "repl"]) + inactive = Q( + source__states__type="draft", + source__states__slug__in=["expired", "repl"], + ) attractor = Q(target__name__in=["rfc5000", "rfc5741"]) - removed = Q(source__states__slug__in=["auth-rm", "ietf-rm"]) + removed = Q(source__states__type="draft", source__states__slug__in=["auth-rm", "ietf-rm"]) relations = ( RelatedDocument.objects.filter(references) .exclude(both_rfcs)