fix: preserve RelatedDocument references to subseries

This commit is contained in:
Robert Sparks 2023-10-31 15:52:11 -05:00
parent 466921728f
commit 0afe496aa3
No known key found for this signature in database
GPG key ID: 6E2A6A5775F91318
5 changed files with 60 additions and 8 deletions

View file

@ -3,6 +3,7 @@
# This script requires that the proper virtual python environment has been
# invoked before start
import datetime
import io
import os

View file

@ -2,14 +2,15 @@
from django.db import migrations
import django.db.models.deletion
from django.db.models import F, Subquery, OuterRef
from django.db.models import F, Subquery, OuterRef, CharField
import ietf.utils.models
def forward(apps, schema_editor):
RelatedDocument = apps.get_model("doc", "RelatedDocument")
DocAlias = apps.get_model("doc", "DocAlias")
subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
RelatedDocument.objects.annotate(firstdoc=subquery).update(target=F("firstdoc"))
target_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
name_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("name")[:1])
RelatedDocument.objects.annotate(firstdoc=target_subquery).annotate(aliasname=name_subquery).update(target=F("firstdoc"),originaltargetaliasname=F("aliasname"))
def reverse(apps, schema_editor):
pass
@ -55,6 +56,12 @@ class Migration(migrations.Migration):
),
preserve_default=False,
),
migrations.AddField(
model_name="relateddocument",
name="originaltargetaliasname",
field=CharField(max_length=255,null=True),
preserve_default=True,
),
migrations.RunPython(forward, reverse),
migrations.AlterField(
model_name="relateddocument",

View file

@ -2,14 +2,15 @@
from django.db import migrations
import django.db.models.deletion
from django.db.models import F, Subquery, OuterRef
from django.db.models import F, Subquery, OuterRef, CharField
import ietf.utils.models
def forward(apps, schema_editor):
RelatedDocHistory = apps.get_model("doc", "RelatedDocHistory")
DocAlias = apps.get_model("doc", "DocAlias")
subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
RelatedDocHistory.objects.annotate(firstdoc=subquery).update(target=F("firstdoc"))
target_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("docs")[:1])
name_subquery = Subquery(DocAlias.objects.filter(pk=OuterRef("deprecated_target")).values("name")[:1])
RelatedDocHistory.objects.annotate(firstdoc=target_subquery).annotate(aliasname=name_subquery).update(target=F("firstdoc"),originaltargetaliasname=F("aliasname"))
def reverse(apps, schema_editor):
pass
@ -57,6 +58,12 @@ class Migration(migrations.Migration):
),
preserve_default=False,
),
migrations.AddField(
model_name="relateddochistory",
name="originaltargetaliasname",
field=CharField(max_length=255,null=True),
preserve_default=True,
),
migrations.RunPython(forward, reverse),
migrations.AlterField(
model_name="relateddochistory",

View file

@ -684,6 +684,7 @@ class RelatedDocument(models.Model):
source = ForeignKey('Document')
target = ForeignKey('Document', related_name='targets_related')
relationship = ForeignKey(DocRelationshipName)
originaltargetaliasname = models.CharField(max_length=255,null=True)
def action(self):
return self.relationship.name
def __str__(self):
@ -1118,6 +1119,7 @@ class RelatedDocHistory(models.Model):
source = ForeignKey('DocHistory')
target = ForeignKey('Document', related_name="reversely_related_document_history_set")
relationship = ForeignKey(DocRelationshipName)
originaltargetaliasname = models.CharField(max_length=255,null=True)
def __str__(self):
return u"%s %s %s" % (self.source.doc.name, self.relationship.name.lower(), self.target.name)

View file

@ -12,13 +12,14 @@ from urllib.parse import urlencode
from xml.dom import pulldom, Node
from django.conf import settings
from django.db.models import Subquery, OuterRef, F, Q
from django.utils import timezone
from django.utils.encoding import smart_bytes, force_str
import debug # pyflakes:ignore
from ietf.doc.models import ( Document, State, StateType, DocEvent, DocRelationshipName,
DocTagName, RelatedDocument )
DocTagName, RelatedDocument, RelatedDocHistory )
from ietf.doc.expire import move_draft_files_to_archive
from ietf.doc.utils import add_state_change_event, prettify_std_name, update_action_holders
from ietf.group.models import Group
@ -327,7 +328,7 @@ def parse_index(response):
log("node: %s" % node)
raise
for d in data:
k = "RFC%04d" % d[0]
k = "RFC%d" % d[0]
if k in also_list:
d[9].extend(also_list[k])
return data
@ -735,6 +736,40 @@ def update_docs_from_rfc_index(
)
doc.save_with_history(rfc_events)
yield rfc_changes, doc, rfc_published # yield changes to the RFC
if first_sync_creating_subseries:
# First - create the known subseries documents that have ghosted.
# The RFC editor (as of 31 Oct 2023) claims these subseries docs do not exist.
# The datatracker, on the other hand, will say that the series doc currently contains no RFCs.
for name in ["fyi17", "std1", "bcp12", "bcp113", "bcp66"]:
# Leaving most things to the default intentionally
# Of note, title and stream are left to the defaults of "" and none.
subseries_doc, created = Document.objects.get_or_create(type_id=name[:3], name=name)
if not created:
log(f"Warning: {name} unexpectedly already exists")
else:
subseries_slug = name[:3]
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")
RelatedDocument.objects.filter(
Q(originaltargetaliasname__startswith="bcp") |
Q(originaltargetaliasname__startswith="std") |
Q(originaltargetaliasname__startswith="fyi")
).annotate(
subseries_target=Subquery(
Document.objects.filter(name=OuterRef("originaltargetaliasname")).values_list("pk",flat=True)[:1]
)
).update(target=F("subseries_target"))
RelatedDocHistory.objects.filter(
Q(originaltargetaliasname__startswith="bcp") |
Q(originaltargetaliasname__startswith="std") |
Q(originaltargetaliasname__startswith="fyi")
).annotate(
subseries_target=Subquery(
Document.objects.filter(name=OuterRef("originaltargetaliasname")).values_list("pk",flat=True)[:1]
)
).update(target=F("subseries_target"))
def post_approved_draft(url, name):