backend/code_review_backend/issues/migrations/0006_issuelink_initial.py (94 lines of code) (raw):

# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Generated by Django 4.1.2 on 2022-12-07 16:59 import django.db.models.deletion from django.db import migrations, models def clean_unlinked_issue(apps, schema_editor): """Delete issues that have no diff""" Issue = apps.get_model("issues", "Issue") deleted, _ = Issue.objects.filter(diff__isnull=True).delete() print(f"Deleted {deleted} issues that were missing a diff.") class Migration(migrations.Migration): dependencies = [ ("issues", "0005_rename_check_issue_analyzer_check"), ] operations = [ # Create the M2M table migrations.CreateModel( name="IssueLink", fields=[ ("id", models.BigAutoField(primary_key=True, serialize=False)), ( "diff", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="issue_links", to="issues.diff", ), ), ( "issue", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="issue_links", to="issues.issue", ), ), ( "revision", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="issue_links", to="issues.revision", ), ), ], ), migrations.AddConstraint( model_name="issuelink", constraint=models.UniqueConstraint( condition=models.Q(("diff__isnull", True)), fields=("issue", "revision"), name="issue_link_unique_revision", ), ), migrations.AddConstraint( model_name="issuelink", constraint=models.UniqueConstraint( condition=models.Q(("diff__isnull", False)), fields=("issue", "revision", "diff"), name="issue_link_unique_diff", ), ), # Update Issue model to support both relations migrations.AlterField( model_name="issue", name="diff", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="old_issues", to="issues.diff", ), ), migrations.AlterModelOptions( name="issue", options={"ordering": ("created",)}, ), # Add relational fields migrations.AddField( model_name="issue", name="revisions", field=models.ManyToManyField( related_name="issues", through="issues.IssueLink", to="issues.revision" ), ), migrations.AddField( model_name="issue", name="diffs", field=models.ManyToManyField( related_name="issues", through="issues.IssueLink", to="issues.diff" ), ), # Clean issues that are linked to no diff (such issues should not exist) migrations.RunPython( clean_unlinked_issue, # Make that step non reversible so we do not loose newly published annotations reverse_code=None, elidable=True, ), ]