# Generated by Django 2.2.24 on 2021-12-07 10:56

from django.db import migrations

from sentry.utils.query import RangeQuerySetWrapperWithProgressBar


def delete_codeowners_with_no_integration(apps, schema_editor):
    """
    Delete the rows in the ProjectCodeOwners table that have a codemapping with null organization_integration_id.
    """
    ProjectCodeOwners = apps.get_model("sentry", "ProjectCodeOwners")

    for code_owner in ProjectCodeOwners.objects.filter(
        repository_project_path_config__organization_integration_id=None
    ):
        code_owner.delete()


def delete_code_mappings_with_no_integration(apps, schema_editor):
    """
    Delete the rows in the RepositoryProjectPathConfig table that have null organization_integration_id.
    """
    RepositoryProjectPathConfig = apps.get_model("sentry", "RepositoryProjectPathConfig")

    for code_mapping in RangeQuerySetWrapperWithProgressBar(
        RepositoryProjectPathConfig.objects.filter(organization_integration_id=None)
    ):
        code_mapping.delete()


class Migration(migrations.Migration):
    # This flag is used to mark that a migration shouldn't be automatically run in
    # production. We set this to True for operations that we think are risky and want
    # someone from ops to run manually and monitor.
    # General advice is that if in doubt, mark your migration as `is_dangerous`.
    # Some things you should always mark as dangerous:
    # - Large data migrations. Typically we want these to be run manually by ops so that
    #   they can be monitored. Since data migrations will now hold a transaction open
    #   this is even more important.
    # - Adding columns to highly active tables, even ones that are NULL.
    is_dangerous = True

    # This flag is used to decide whether to run this migration in a transaction or not.
    # By default we prefer to run in a transaction, but for migrations where you want
    # to `CREATE INDEX CONCURRENTLY` this needs to be set to False. Typically you'll
    # want to create an index concurrently when adding one to an existing table.
    # You'll also usually want to set this to `False` if you're writing a data
    # migration, since we don't want the entire migration to run in one long-running
    # transaction.
    atomic = False

    dependencies = [
        ("sentry", "0258_create_docintegrationavatar_table"),
    ]

    operations = [
        migrations.RunPython(
            delete_codeowners_with_no_integration,
            migrations.RunPython.noop,
            hints={"tables": ["sentry_projectcodeowners"]},
        ),
        migrations.RunPython(
            delete_code_mappings_with_no_integration,
            migrations.RunPython.noop,
            hints={"tables": ["sentry_repositoryprojectpathconfig"]},
        ),
    ]
