Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Remove DocAlias from RelatedDocument #5841

Merged
merged 20 commits into from
Jul 28, 2023
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions ietf/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -934,7 +934,7 @@ def do_draft_test(self, name):
self.assertNotIn('previous', received, 'Rev 00 has no previous name when not replacing a draft')

replaced = IndividualDraftFactory()
RelatedDocument.objects.create(relationship_id='replaces',source=draft,target=replaced.docalias.first())
RelatedDocument.objects.create(relationship_id='replaces',source=draft,target=replaced)
received = self.getJson(dict(name=draft.name, rev='00'))
self.assertEqual(received['previous'], f'{replaced.name}-{replaced.rev}',
'Rev 00 has a previous name when replacing a draft')
Expand Down Expand Up @@ -965,7 +965,7 @@ def test_draft_with_broken_history(self):
def do_rfc_test(self, draft_name):
draft = WgDraftFactory(name=draft_name, create_revisions=range(0,2))
rfc = WgRfcFactory(group=draft.group, rfc_number=self.next_rfc_number())
draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc.docalias.first())
draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc)
draft.set_state(State.objects.get(type_id='draft',slug='rfc'))
draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub'))
draft, rfc = reload_db_objects(draft, rfc)
Expand Down Expand Up @@ -1017,7 +1017,7 @@ def test_rfc(self):
def test_rfc_with_tombstone(self):
draft = WgDraftFactory(create_revisions=range(0,2))
rfc = WgRfcFactory(rfc_number=3261,group=draft.group)# See views_doc.HAS_TOMBSTONE
draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc.docalias.first())
draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc)
draft.set_state(State.objects.get(type_id='draft',slug='rfc'))
draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub'))
draft = reload_db_objects(draft)
Expand All @@ -1029,7 +1029,7 @@ def test_rfc_with_tombstone(self):
def do_rfc_with_broken_history_test(self, draft_name):
draft = WgDraftFactory(rev='10', name=draft_name)
rfc = WgRfcFactory(group=draft.group, rfc_number=self.next_rfc_number())
draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc.docalias.first())
draft.relateddocument_set.create(relationship_id="became_rfc", target=rfc)
draft.set_state(State.objects.get(type_id='draft',slug='rfc'))
draft.set_state(State.objects.get(type_id='draft-iesg', slug='pub'))
draft = reload_db_objects(draft)
Expand Down
4 changes: 2 additions & 2 deletions ietf/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ def rfcdiff_latest_json(request, name, rev=None):
response['previous'] = f'{draft.name}-{prev_rev}'
response['previous_url'] = get_previous_url(draft.name, prev_rev)
elif doc.type_id == "draft" and not found_rev and doc.relateddocument_set.filter(relationship_id="became_rfc").exists():
rfc = doc.related_that_doc("became_rfc")[0].document
rfc = doc.related_that_doc("became_rfc")[0]
response['content_url'] = rfc.get_href()
response['name']=rfc.name
prev_rev = doc.rev
Expand All @@ -359,7 +359,7 @@ def rfcdiff_latest_json(request, name, rev=None):
if doc.rev == '00':
replaces_docs = (history.doc if condition=='historic version' else doc).related_that_doc('replaces')
if replaces_docs:
replaces = replaces_docs[0].document
replaces = replaces_docs[0]
response['previous'] = f'{replaces.name}-{replaces.rev}'
response['previous_url'] = get_previous_url(replaces.name, replaces.rev)
else:
Expand Down
3 changes: 2 additions & 1 deletion ietf/doc/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class DocActionHolderInline(admin.TabularInline):

class RelatedDocumentInline(admin.TabularInline):
model = RelatedDocument
fk_name= 'source'
def this(self, instance):
return instance.source.canonical_name()
readonly_fields = ['this', ]
Expand Down Expand Up @@ -125,7 +126,7 @@ class DocReminderAdmin(admin.ModelAdmin):
class RelatedDocumentAdmin(admin.ModelAdmin):
list_display = ['source', 'target', 'relationship', ]
list_filter = ['relationship', ]
search_fields = ['source__name', 'target__name', 'target__docs__name', ]
search_fields = ['source__name', 'target__name', 'target__name', ]
jennifer-richards marked this conversation as resolved.
Show resolved Hide resolved
raw_id_fields = ['source', 'target', ]
admin.site.register(RelatedDocument, RelatedDocumentAdmin)

Expand Down
14 changes: 4 additions & 10 deletions ietf/doc/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,7 @@ def authors(obj, create, extracted, **kwargs): # pylint: disable=no-self-argumen
def relations(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
if create and extracted:
for (rel_id, doc) in extracted:
if isinstance(doc, Document):
docalias = doc.docalias.first()
elif isinstance(doc, DocAlias):
docalias = doc
else:
continue
obj.relateddocument_set.create(relationship_id=rel_id, target=docalias)
obj.relateddocument_set.create(relationship_id=rel_id, target=doc)

@factory.post_generation
def create_revisions(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
Expand Down Expand Up @@ -244,7 +238,7 @@ def changes_status_of(obj, create, extracted, **kwargs):
for (rel, target) in extracted:
obj.relateddocument_set.create(relationship_id=rel,target=target)
else:
obj.relateddocument_set.create(relationship_id='tobcp', target=WgRfcFactory().docalias.first())
obj.relateddocument_set.create(relationship_id='tobcp', target=WgRfcFactory())

@factory.post_generation
def states(obj, create, extracted, **kwargs):
Expand All @@ -271,9 +265,9 @@ def review_of(obj, create, extracted, **kwargs):
if not create:
return
if extracted:
obj.relateddocument_set.create(relationship_id='conflrev',target=extracted.docalias.first())
obj.relateddocument_set.create(relationship_id='conflrev',target=extracted)
else:
obj.relateddocument_set.create(relationship_id='conflrev',target=DocumentFactory(name=obj.name.replace('conflict-review-','draft-'),type_id='draft',group=Group.objects.get(type_id='individ')).docalias.first())
obj.relateddocument_set.create(relationship_id='conflrev',target=DocumentFactory(name=obj.name.replace('conflict-review-','draft-'),type_id='draft',group=Group.objects.get(type_id='individ')))


@factory.post_generation
Expand Down
30 changes: 15 additions & 15 deletions ietf/doc/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.validators import validate_email

from ietf.doc.fields import SearchableDocAliasesField, SearchableDocAliasField
from ietf.doc.fields import SearchableDocumentField, SearchableDocumentsField
from ietf.doc.models import RelatedDocument, DocExtResource
from ietf.iesg.models import TelechatDate
from ietf.iesg.utils import telechat_page_count
Expand Down Expand Up @@ -134,11 +134,11 @@ class ActionHoldersForm(forms.Form):
IESG_APPROVED_STATE_LIST = ("ann", "rfcqueue", "pub")

class AddDownrefForm(forms.Form):
rfc = SearchableDocAliasField(
rfc = SearchableDocumentField(
label="Referenced RFC",
help_text="The RFC that is approved for downref",
required=True)
drafts = SearchableDocAliasesField(
drafts = SearchableDocumentsField(
label="Internet-Drafts that makes the reference",
help_text="The Internet-Drafts that approve the downref in their Last Call",
required=True)
Expand All @@ -148,7 +148,7 @@ def clean_rfc(self):
raise forms.ValidationError("Please provide a referenced RFC and a referencing Internet-Draft")

rfc = self.cleaned_data['rfc']
if rfc.document.type_id != "rfc":
if rfc.type_id != "rfc":
raise forms.ValidationError("Cannot find the RFC: " + rfc.name)
return rfc

Expand All @@ -158,10 +158,10 @@ def clean_drafts(self):

v_err_names = []
drafts = self.cleaned_data['drafts']
for da in drafts:
state = da.document.get_state("draft-iesg")
for d in drafts:
state = d.get_state("draft-iesg")
if not state or state.slug not in IESG_APPROVED_STATE_LIST:
v_err_names.append(da.name)
v_err_names.append(d.name)
if v_err_names:
raise forms.ValidationError("Internet-Draft is not yet approved: " + ", ".join(v_err_names))
return drafts
Expand All @@ -173,23 +173,23 @@ def clean(self):
v_err_pairs = []
rfc = self.cleaned_data['rfc']
drafts = self.cleaned_data['drafts']
for da in drafts:
if RelatedDocument.objects.filter(source=da.document, target=rfc, relationship_id='downref-approval'):
v_err_pairs.append(f"{da.name} --> RFC {rfc.document.rfc_number}")
for d in drafts:
if RelatedDocument.objects.filter(source=d, target=rfc, relationship_id='downref-approval'):
v_err_pairs.append(f"{d.name} --> RFC {rfc.rfc_number}")
if v_err_pairs:
raise forms.ValidationError("Downref is already in the registry: " + ", ".join(v_err_pairs))

if 'save_downref_anyway' not in self.data:
# this check is skipped if the save_downref_anyway button is used
v_err_refnorm = ""
for da in drafts:
if not RelatedDocument.objects.filter(source=da.document, target=rfc, relationship_id='refnorm'):
for d in drafts:
if not RelatedDocument.objects.filter(source=d, target=rfc, relationship_id='refnorm'):
if v_err_refnorm:
v_err_refnorm = v_err_refnorm + " or " + da.name
v_err_refnorm = v_err_refnorm + " or " + d.name
else:
v_err_refnorm = da.name
v_err_refnorm = d.name
if v_err_refnorm:
v_err_refnorm_prefix = f"There does not seem to be a normative reference to RFC {rfc.document.rfc_number} by "
v_err_refnorm_prefix = f"There does not seem to be a normative reference to RFC {rfc.rfc_number} by "
raise forms.ValidationError(v_err_refnorm_prefix + v_err_refnorm)


Expand Down
2 changes: 1 addition & 1 deletion ietf/doc/mails.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def email_ad_approved_doc(request, doc, text):

def email_ad_approved_conflict_review(request, review, ok_to_publish):
"""Email notification when AD approves a conflict review"""
conflictdoc = review.relateddocument_set.get(relationship__slug='conflrev').target.document
conflictdoc = review.relateddocument_set.get(relationship__slug='conflrev').target
(to, cc) = gather_address_lists("ad_approved_conflict_review")
frm = request.user.person.formatted_email()
send_mail(request,
Expand Down
5 changes: 2 additions & 3 deletions ietf/doc/management/commands/generate_draft_aliases.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,8 @@ def handle(self, *args, **options):
for draft in interesting_drafts.distinct().iterator():
# Omit drafts that became RFCs, unless they were published in the last DEFAULT_YEARS
if draft.get_state_slug()=="rfc":
rfc_alias = next(iter(draft.related_that_doc("became_rfc")), None)
log.assertion("rfc_alias is not None")
rfc = rfc_alias.document
rfc = next(iter(draft.related_that_doc("became_rfc")), None)
log.assertion("rfc is not None")
if rfc.latest_event(type='published_rfc').time < show_since:
continue

Expand Down
77 changes: 77 additions & 0 deletions ietf/doc/migrations/0005_relate_no_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Generated by Django 4.2.2 on 2023-06-16 13:40

from django.db import migrations
import django.db.models.deletion
from django.db.models import F, Subquery, OuterRef
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"))

def reverse(apps, schema_editor):
pass

class Migration(migrations.Migration):
dependencies = [
("doc", "0004_alter_dochistory_ad_alter_dochistory_shepherd_and_more"),
]

operations = [
migrations.AlterField(
model_name='relateddocument',
name='target',
field=ietf.utils.models.ForeignKey(
db_index=False,
on_delete=django.db.models.deletion.CASCADE,
to='doc.docalias',
),
),
migrations.RenameField(
model_name="relateddocument",
old_name="target",
new_name="deprecated_target"
),
migrations.AlterField(
model_name='relateddocument',
name='deprecated_target',
field=ietf.utils.models.ForeignKey(
db_index=True,
on_delete=django.db.models.deletion.CASCADE,
to='doc.docalias',
),
),
migrations.AddField(
model_name="relateddocument",
name="target",
field=ietf.utils.models.ForeignKey(
default=1, # A lie, but a convenient one - no relations point here.
on_delete=django.db.models.deletion.CASCADE,
related_name="targets_related",
to="doc.document",
db_index=False,
),
preserve_default=False,
),
migrations.RunPython(forward, reverse),
migrations.AlterField(
model_name="relateddocument",
name="target",
field=ietf.utils.models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="targets_related",
to="doc.document",
db_index=True,
),
),
migrations.RemoveField(
model_name="relateddocument",
name="deprecated_target",
field=ietf.utils.models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to='doc.DocAlias',
),
),
]
80 changes: 80 additions & 0 deletions ietf/doc/migrations/0006_relate_hist_no_aliases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Generated by Django 4.2.2 on 2023-06-16 13:40

from django.db import migrations
import django.db.models.deletion
from django.db.models import F, Subquery, OuterRef
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"))

def reverse(apps, schema_editor):
pass

class Migration(migrations.Migration):
dependencies = [
("doc", "0005_relate_no_aliases"),
]

operations = [
migrations.AlterField(
model_name='relateddochistory',
name='target',
field=ietf.utils.models.ForeignKey(
db_index=False,
on_delete=django.db.models.deletion.CASCADE,
to='doc.docalias',
related_name='reversely_related_document_history_set',
),
),
migrations.RenameField(
model_name="relateddochistory",
old_name="target",
new_name="deprecated_target"
),
migrations.AlterField(
model_name='relateddochistory',
name='deprecated_target',
field=ietf.utils.models.ForeignKey(
db_index=True,
on_delete=django.db.models.deletion.CASCADE,
to='doc.docalias',
related_name='deprecated_reversely_related_document_history_set',
),
),
migrations.AddField(
model_name="relateddochistory",
name="target",
field=ietf.utils.models.ForeignKey(
default=1, # A lie, but a convenient one - no relations point here.
on_delete=django.db.models.deletion.CASCADE,
to="doc.document",
db_index=False,
related_name='reversely_related_document_history_set',
),
preserve_default=False,
),
migrations.RunPython(forward, reverse),
migrations.AlterField(
model_name="relateddochistory",
name="target",
field=ietf.utils.models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="doc.document",
db_index=True,
related_name='reversely_related_document_history_set',
),
),
migrations.RemoveField(
model_name="relateddochistory",
name="deprecated_target",
field=ietf.utils.models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to='doc.DocAlias',
related_name='deprecated_reversely_related_document_history_set',
),
),
]
Loading
Loading