# Generated by Django 5.2 on 2025-04-02 19:27

import django.core.validators
import django.db.models.deletion
import django_extensions.db.fields
import glitchtip.model_utils
import psql_partition.backend.migrations.operations.create_partitioned_model
import psql_partition.manager.manager
import psql_partition.models.partitioned
import psql_partition.types
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
    replaces = [
        (
            "projects",
            "0001_squashed_0009_alter_project_id_alter_projectcounter_id_and_more",
        ),
        ("projects", "0010_eventprojecthourlystatistic"),
        ("projects", "0011_transactioneventprojecthourlystatistic"),
        ("projects", "0012_project_is_deleted"),
        ("projects", "0012_project_event_throttle_rate"),
        ("projects", "0013_merge_20231017_1350"),
        ("projects", "0014_auto_20240318_1449"),
        ("projects", "0015_rename_label_projectkey_name_projectkey_is_active"),
        ("projects", "0016_auto_20250125_1733"),
    ]

    initial = True

    dependencies = [
        (
            "organizations_ext",
            "0001_squashed_0003_alter_organization_id_alter_organization_users_and_more",
        ),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="Project",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                (
                    "slug",
                    django_extensions.db.fields.AutoSlugField(
                        blank=True,
                        editable=False,
                        populate_from=["name", "organization_id"],
                    ),
                ),
                ("name", models.CharField(max_length=64)),
                ("created", models.DateTimeField(auto_now_add=True, db_index=True)),
                ("platform", models.CharField(blank=True, max_length=64, null=True)),
                (
                    "organization",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="projects",
                        to="organizations_ext.organization",
                    ),
                ),
                ("first_event", models.DateTimeField(null=True)),
                (
                    "scrub_ip_addresses",
                    models.BooleanField(
                        default=True, help_text="Should project anonymize IP Addresses"
                    ),
                ),
                ("is_deleted", models.BooleanField(default=False)),
                (
                    "event_throttle_rate",
                    models.PositiveSmallIntegerField(
                        default=0,
                        help_text="Probability (in percent) on how many events are throttled. Used for throttling at project level",
                        validators=[django.core.validators.MaxValueValidator(100)],
                    ),
                ),
            ],
            options={
                "unique_together": {("organization", "slug")},
            },
        ),
        migrations.CreateModel(
            name="ProjectCounter",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("value", models.PositiveIntegerField()),
                (
                    "project",
                    models.OneToOneField(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
            ],
        ),
        migrations.CreateModel(
            name="ProjectKey",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("name", models.CharField(blank=True, max_length=64)),
                (
                    "public_key",
                    models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
                ),
                ("created", models.DateTimeField(auto_now_add=True, db_index=True)),
                (
                    "rate_limit_count",
                    models.PositiveSmallIntegerField(blank=True, null=True),
                ),
                (
                    "rate_limit_window",
                    models.PositiveSmallIntegerField(blank=True, null=True),
                ),
                ("data", models.JSONField(blank=True, null=True)),
                (
                    "project",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
                ("is_active", models.BooleanField(default=True)),
            ],
        ),
        migrations.CreateModel(
            name="UserProjectAlert",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                (
                    "status",
                    models.PositiveSmallIntegerField(choices=[(0, "off"), (1, "on")]),
                ),
                (
                    "project",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
                (
                    "user",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "unique_together": {("user", "project")},
            },
        ),
        migrations.CreateModel(
            name="EventProjectHourlyStatistic",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("date", models.DateTimeField()),
                ("count", models.PositiveIntegerField()),
                (
                    "project",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
            ],
            options={
                "unique_together": {("project", "date")},
            },
        ),
        psql_partition.backend.migrations.operations.create_partitioned_model.PostgresCreatePartitionedModel(
            name="IssueEventProjectHourlyStatistic",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("date", models.DateTimeField()),
                ("count", models.PositiveIntegerField()),
                (
                    "project",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
            ],
            options={
                "abstract": False,
                "unique_together": {("project", "date")},
            },
            partitioning_options={
                "method": psql_partition.types.PostgresPartitioningMethod["RANGE"],
                "key": ["date"],
            },
            bases=(psql_partition.models.partitioned.PostgresPartitionedModel,),
            managers=[
                ("objects", psql_partition.manager.manager.PostgresManager()),
            ],
        ),
        migrations.CreateModel(
            name="TransactionEventProjectHourlyStatistic",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("date", models.DateTimeField()),
                ("count", models.PositiveIntegerField()),
                (
                    "project",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
            ],
            options={
                "abstract": False,
                "unique_together": {("project", "date")},
            },
            managers=[
                ("objects", psql_partition.manager.manager.PostgresManager()),
            ],
        ),
        glitchtip.model_utils.TestDefaultPartition(
            model_name="IssueEventProjectHourlyStatistic",
            name="default",
        ),
        migrations.DeleteModel(
            name="EventProjectHourlyStatistic",
        ),
        migrations.DeleteModel(
            name="TransactionEventProjectHourlyStatistic",
        ),
        psql_partition.backend.migrations.operations.create_partitioned_model.PostgresCreatePartitionedModel(
            name="TransactionEventProjectHourlyStatistic",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("date", models.DateTimeField()),
                ("count", models.PositiveIntegerField()),
                (
                    "project",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        to="projects.project",
                    ),
                ),
            ],
            options={
                "abstract": False,
                "unique_together": {("project", "date")},
            },
            partitioning_options={
                "method": psql_partition.types.PostgresPartitioningMethod["RANGE"],
                "key": ["date"],
            },
            bases=(psql_partition.models.partitioned.PostgresPartitionedModel,),
            managers=[
                ("objects", psql_partition.manager.manager.PostgresManager()),
            ],
        ),
        glitchtip.model_utils.TestDefaultPartition(
            model_name="TransactionEventProjectHourlyStatistic",
            name="default",
        ),
        migrations.RunSQL(
            sql='CREATE OR REPLACE FUNCTION get_project_auth_info(p_project_id BIGINT, p_sentry_key UUID)\nRETURNS TABLE (\n    project_id BIGINT,\n    project_scrub_ip_addresses BOOLEAN,\n    project_event_throttle_rate SMALLINT,\n    organization_id BIGINT,\n    organization_is_accepting_events BOOLEAN,\n    organization_event_throttle_rate SMALLINT,\n    organization_scrub_ip_addresses BOOLEAN\n)\nAS $$\nBEGIN\n    RETURN QUERY\n    SELECT\n        "projects_project"."id",\n        "projects_project"."scrub_ip_addresses",\n        "projects_project"."event_throttle_rate",\n        "projects_project"."organization_id",\n        "organizations_ext_organization"."is_accepting_events",\n        "organizations_ext_organization"."event_throttle_rate",\n        "organizations_ext_organization"."scrub_ip_addresses"\n    FROM\n        "projects_project"\n    INNER JOIN\n        "projects_projectkey" ON ("projects_project"."id" = "projects_projectkey"."project_id")\n    INNER JOIN\n        "organizations_ext_organization" ON ("projects_project"."organization_id" = "organizations_ext_organization"."id")\n    WHERE\n        "projects_project"."id" = p_project_id\n        AND "projects_projectkey"."public_key" = p_sentry_key;\nEND;\n$$ LANGUAGE plpgsql;\n',
            reverse_sql="DROP FUNCTION IF EXISTS get_project_auth_info(INTEGER, UUID);",
        ),
    ]
