Skip to content

Commit 511cac0

Browse files
authored
fix: preserve RelatedDocument references to subseries
2 parents 6e502fa + e65c4c3 commit 511cac0

5 files changed

Lines changed: 66 additions & 11 deletions

File tree

ietf/doc/migrations/0014_relate_no_aliases.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
from django.db import migrations
44
import django.db.models.deletion
5-
from django.db.models import F, Subquery, OuterRef
5+
from django.db.models import F, Subquery, OuterRef, CharField
66
import ietf.utils.models
77

88
def forward(apps, schema_editor):
99
RelatedDocument = apps.get_model("doc", "RelatedDocument")
1010
DocAlias = apps.get_model("doc", "DocAlias")
11-
subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
12-
RelatedDocument.objects.annotate(firstdoc=subquery).update(target=F("firstdoc"))
11+
target_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
12+
name_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("name")[:1])
13+
RelatedDocument.objects.annotate(firstdoc=target_subquery).annotate(aliasname=name_subquery).update(target=F("firstdoc"),originaltargetaliasname=F("aliasname"))
1314

1415
def reverse(apps, schema_editor):
1516
pass
@@ -55,6 +56,12 @@ class Migration(migrations.Migration):
5556
),
5657
preserve_default=False,
5758
),
59+
migrations.AddField(
60+
model_name="relateddocument",
61+
name="originaltargetaliasname",
62+
field=CharField(max_length=255,null=True),
63+
preserve_default=True,
64+
),
5865
migrations.RunPython(forward, reverse),
5966
migrations.AlterField(
6067
model_name="relateddocument",

ietf/doc/migrations/0015_relate_hist_no_aliases.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
from django.db import migrations
44
import django.db.models.deletion
5-
from django.db.models import F, Subquery, OuterRef
5+
from django.db.models import F, Subquery, OuterRef, CharField
66
import ietf.utils.models
77

88
def forward(apps, schema_editor):
99
RelatedDocHistory = apps.get_model("doc", "RelatedDocHistory")
1010
DocAlias = apps.get_model("doc", "DocAlias")
11-
subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
12-
RelatedDocHistory.objects.annotate(firstdoc=subquery).update(target=F("firstdoc"))
11+
target_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
12+
name_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("name")[:1])
13+
RelatedDocHistory.objects.annotate(firstdoc=target_subquery).annotate(aliasname=name_subquery).update(target=F("firstdoc"),originaltargetaliasname=F("aliasname"))
1314

1415
def reverse(apps, schema_editor):
1516
pass
@@ -57,6 +58,12 @@ class Migration(migrations.Migration):
5758
),
5859
preserve_default=False,
5960
),
61+
migrations.AddField(
62+
model_name="relateddochistory",
63+
name="originaltargetaliasname",
64+
field=CharField(max_length=255,null=True),
65+
preserve_default=True,
66+
),
6067
migrations.RunPython(forward, reverse),
6168
migrations.AlterField(
6269
model_name="relateddochistory",

ietf/doc/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,7 @@ class RelatedDocument(models.Model):
684684
source = ForeignKey('Document')
685685
target = ForeignKey('Document', related_name='targets_related')
686686
relationship = ForeignKey(DocRelationshipName)
687+
originaltargetaliasname = models.CharField(max_length=255,null=True)
687688
def action(self):
688689
return self.relationship.name
689690
def __str__(self):
@@ -1118,6 +1119,7 @@ class RelatedDocHistory(models.Model):
11181119
source = ForeignKey('DocHistory')
11191120
target = ForeignKey('Document', related_name="reversely_related_document_history_set")
11201121
relationship = ForeignKey(DocRelationshipName)
1122+
originaltargetaliasname = models.CharField(max_length=255,null=True)
11211123
def __str__(self):
11221124
return u"%s %s %s" % (self.source.doc.name, self.relationship.name.lower(), self.target.name)
11231125

ietf/mailtrigger/migrations/0003_rfc_recipients.py renamed to ietf/mailtrigger/migrations/0004_rfc_recipients.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def reverse(apps, schema_editor):
1919

2020
class Migration(migrations.Migration):
2121
dependencies = [
22-
("mailtrigger", "0002_slidesubmitter"),
22+
("mailtrigger", "0003_ballot_approved_charter"),
2323
]
2424

2525
operations = [migrations.RunPython(forward, reverse)]

ietf/sync/rfceditor.py

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
from xml.dom import pulldom, Node
1313

1414
from django.conf import settings
15+
from django.db.models import Subquery, OuterRef, F, Q
1516
from django.utils import timezone
1617
from django.utils.encoding import smart_bytes, force_str
1718

1819
import debug # pyflakes:ignore
1920

2021
from ietf.doc.models import ( Document, State, StateType, DocEvent, DocRelationshipName,
21-
DocTagName, RelatedDocument )
22+
DocTagName, RelatedDocument, RelatedDocHistory )
2223
from ietf.doc.expire import move_draft_files_to_archive
2324
from ietf.doc.utils import add_state_change_event, prettify_std_name, update_action_holders
2425
from ietf.group.models import Group
@@ -327,7 +328,7 @@ def extract_doc_list(parentNode, tagName):
327328
log("node: %s" % node)
328329
raise
329330
for d in data:
330-
k = "RFC%04d" % d[0]
331+
k = "RFC%d" % d[0]
331332
if k in also_list:
332333
d[9].extend(also_list[k])
333334
return data
@@ -680,13 +681,17 @@ def parse_relation_list(l):
680681
if created:
681682
if first_sync_creating_subseries:
682683
subseries_doc.docevent_set.create(type=f"{subseries_slug}_history_marker", by=system, desc=f"No history of this {subseries_slug.upper()} document is currently available in the datatracker before this point")
683-
subseries_doc.docevent_set.create(type=f"{subseries_slug}_doc_created", by=system, desc=f"Created {subseries_doc_name} via sync to the rfc-index")
684+
subseries_doc.docevent_set.create(type=f"{subseries_slug}_doc_created", by=system, desc=f"Imported {subseries_doc_name} into the datatracker via sync to the rfc-index")
685+
else:
686+
subseries_doc.docevent_set.create(type=f"{subseries_slug}_doc_created", by=system, desc=f"Created {subseries_doc_name} via sync to the rfc-index")
684687
_, relationship_created = subseries_doc.relateddocument_set.get_or_create(relationship_id="contains", target=doc)
685688
if relationship_created:
686689
subseries_doc.docevent_set.create(type="sync_from_rfc_editor", by=system, desc=f"Added {doc.name} to {subseries_doc.name}")
687690
if first_sync_creating_subseries:
688691
rfc_events.append(doc.docevent_set.create(type=f"{subseries_slug}_history_marker", by=system, desc=f"No history of {subseries_doc.name.upper()} is currently available in the datatracker before this point"))
689-
rfc_events.append(doc.docevent_set.create(type="sync_from_rfc_editor", by=system, desc=f"Added {doc.name} to {subseries_doc.name}"))
692+
rfc_events.append(doc.docevent_set.create(type="sync_from_rfc_editor", by=system, desc=f"Imported membership of {doc.name} in {subseries_doc.name} via sync to the rfc-index"))
693+
else:
694+
rfc_events.append(doc.docevent_set.create(type="sync_from_rfc_editor", by=system, desc=f"Added {doc.name} to {subseries_doc.name}"))
690695

691696
for subdoc in doc.related_that("contains"):
692697
if subdoc.name not in also:
@@ -735,6 +740,40 @@ def parse_relation_list(l):
735740
)
736741
doc.save_with_history(rfc_events)
737742
yield rfc_changes, doc, rfc_published # yield changes to the RFC
743+
744+
if first_sync_creating_subseries:
745+
# First - create the known subseries documents that have ghosted.
746+
# The RFC editor (as of 31 Oct 2023) claims these subseries docs do not exist.
747+
# The datatracker, on the other hand, will say that the series doc currently contains no RFCs.
748+
for name in ["fyi17", "std1", "bcp12", "bcp113", "bcp66"]:
749+
# Leaving most things to the default intentionally
750+
# Of note, title and stream are left to the defaults of "" and none.
751+
subseries_doc, created = Document.objects.get_or_create(type_id=name[:3], name=name)
752+
if not created:
753+
log(f"Warning: {name} unexpectedly already exists")
754+
else:
755+
subseries_slug = name[:3]
756+
subseries_doc.docevent_set.create(type=f"{subseries_slug}_history_marker", by=system, desc=f"No history of this {subseries_slug.upper()} document is currently available in the datatracker before this point")
757+
758+
759+
RelatedDocument.objects.filter(
760+
Q(originaltargetaliasname__startswith="bcp") |
761+
Q(originaltargetaliasname__startswith="std") |
762+
Q(originaltargetaliasname__startswith="fyi")
763+
).annotate(
764+
subseries_target=Subquery(
765+
Document.objects.filter(name=OuterRef("originaltargetaliasname")).values_list("pk",flat=True)[:1]
766+
)
767+
).update(target=F("subseries_target"))
768+
RelatedDocHistory.objects.filter(
769+
Q(originaltargetaliasname__startswith="bcp") |
770+
Q(originaltargetaliasname__startswith="std") |
771+
Q(originaltargetaliasname__startswith="fyi")
772+
).annotate(
773+
subseries_target=Subquery(
774+
Document.objects.filter(name=OuterRef("originaltargetaliasname")).values_list("pk",flat=True)[:1]
775+
)
776+
).update(target=F("subseries_target"))
738777

739778

740779
def post_approved_draft(url, name):

0 commit comments

Comments
 (0)