# Generated by Django 5.2.13 on 2026-04-24 08:14

import django.db.models.deletion
import simple_history.models
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ("contenttypes", "0002_remove_content_type_name"),
        ("mel_tracking", "0002_activity_activitydependency_correctiveaction_and_more"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="TracerStudy",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("name", models.CharField(max_length=255)),
                ("slug", models.SlugField(max_length=120, unique=True)),
                ("description", models.TextField(blank=True)),
                (
                    "target_population",
                    models.TextField(blank=True, help_text="E.g. 'Graduates of PhD cohort 2023'."),
                ),
                ("opens_at", models.DateField(blank=True, null=True)),
                ("closes_at", models.DateField(blank=True, null=True)),
                ("is_active", models.BooleanField(default=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
            ],
        ),
        migrations.CreateModel(
            name="CourseEvaluation",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "source_system",
                    models.CharField(
                        default="moodle", help_text="E.g. 'moodle', 'rep'.", max_length=32
                    ),
                ),
                ("course_slug", models.CharField(max_length=255)),
                ("course_name", models.CharField(blank=True, max_length=255)),
                ("period_label", models.CharField(blank=True, max_length=40)),
                (
                    "aggregate_score",
                    models.DecimalField(blank=True, decimal_places=3, max_digits=6, null=True),
                ),
                ("response_count", models.PositiveIntegerField(default=0)),
                ("payload", models.JSONField(blank=True, default=dict)),
                ("ingested_at", models.DateTimeField(auto_now_add=True)),
            ],
            options={
                "ordering": ["-ingested_at"],
                "indexes": [
                    models.Index(
                        fields=["source_system", "course_slug", "period_label"],
                        name="mel_feedbac_source__211b90_idx",
                    )
                ],
                "constraints": [
                    models.UniqueConstraint(
                        fields=("source_system", "course_slug", "period_label"),
                        name="uniq_course_evaluation_period",
                    )
                ],
            },
        ),
        migrations.CreateModel(
            name="FeedbackChannel",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "type",
                    models.CharField(
                        choices=[
                            ("report_review", "Report review"),
                            ("beneficiary", "Beneficiary"),
                            ("industry", "Industry / employer"),
                            ("alumni", "Alumni / tracer"),
                            ("moodle", "Moodle course feedback"),
                            ("generic", "Generic"),
                        ],
                        db_index=True,
                        max_length=32,
                    ),
                ),
                ("name", models.CharField(max_length=255)),
                ("slug", models.SlugField(max_length=120, unique=True)),
                ("description", models.TextField(blank=True)),
                ("subject_id", models.PositiveIntegerField(blank=True, null=True)),
                (
                    "token",
                    models.CharField(
                        help_text="Opaque token used in public feedback URLs.",
                        max_length=48,
                        unique=True,
                    ),
                ),
                ("is_public", models.BooleanField(default=False)),
                ("is_active", models.BooleanField(db_index=True, default=True)),
                ("opens_at", models.DateTimeField(blank=True, null=True)),
                ("closes_at", models.DateTimeField(blank=True, null=True)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "created_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="mel_feedback_channels_created",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "subject_type",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="mel_feedback_channels",
                        to="contenttypes.contenttype",
                    ),
                ),
            ],
            options={
                "ordering": ["-created_at"],
            },
        ),
        migrations.CreateModel(
            name="FeedbackSubmission",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("submitter_email", models.EmailField(blank=True, max_length=254)),
                ("submitter_name", models.CharField(blank=True, max_length=255)),
                (
                    "rating",
                    models.SmallIntegerField(
                        blank=True, help_text="1–5 Likert value (optional).", null=True
                    ),
                ),
                ("narrative", models.TextField()),
                (
                    "severity",
                    models.CharField(
                        choices=[
                            ("low", "Low"),
                            ("medium", "Medium"),
                            ("high", "High"),
                            ("critical", "Critical"),
                        ],
                        db_index=True,
                        default="low",
                        max_length=16,
                    ),
                ),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("new", "New"),
                            ("triaged", "Triaged"),
                            ("actioned", "Actioned"),
                            ("closed", "Closed"),
                        ],
                        db_index=True,
                        default="new",
                        max_length=16,
                    ),
                ),
                ("submission_key", models.CharField(blank=True, db_index=True, max_length=128)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("triaged_at", models.DateTimeField(blank=True, null=True)),
                (
                    "channel",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="submissions",
                        to="mel_feedback.feedbackchannel",
                    ),
                ),
                (
                    "corrective_action",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="triggered_by_feedback",
                        to="mel_tracking.correctiveaction",
                    ),
                ),
                (
                    "submitter_user",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="mel_feedback_submitted",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "triaged_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="mel_feedback_triaged",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "ordering": ["-created_at"],
            },
        ),
        migrations.CreateModel(
            name="HistoricalFeedbackSubmission",
            fields=[
                (
                    "id",
                    models.BigIntegerField(
                        auto_created=True, blank=True, db_index=True, verbose_name="ID"
                    ),
                ),
                ("submitter_email", models.EmailField(blank=True, max_length=254)),
                ("submitter_name", models.CharField(blank=True, max_length=255)),
                (
                    "rating",
                    models.SmallIntegerField(
                        blank=True, help_text="1–5 Likert value (optional).", null=True
                    ),
                ),
                ("narrative", models.TextField()),
                (
                    "severity",
                    models.CharField(
                        choices=[
                            ("low", "Low"),
                            ("medium", "Medium"),
                            ("high", "High"),
                            ("critical", "Critical"),
                        ],
                        db_index=True,
                        default="low",
                        max_length=16,
                    ),
                ),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("new", "New"),
                            ("triaged", "Triaged"),
                            ("actioned", "Actioned"),
                            ("closed", "Closed"),
                        ],
                        db_index=True,
                        default="new",
                        max_length=16,
                    ),
                ),
                ("submission_key", models.CharField(blank=True, db_index=True, max_length=128)),
                ("created_at", models.DateTimeField(blank=True, editable=False)),
                ("triaged_at", models.DateTimeField(blank=True, null=True)),
                ("history_id", models.AutoField(primary_key=True, serialize=False)),
                ("history_date", models.DateTimeField(db_index=True)),
                ("history_change_reason", models.CharField(max_length=100, null=True)),
                (
                    "history_type",
                    models.CharField(
                        choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1
                    ),
                ),
                (
                    "channel",
                    models.ForeignKey(
                        blank=True,
                        db_constraint=False,
                        null=True,
                        on_delete=django.db.models.deletion.DO_NOTHING,
                        related_name="+",
                        to="mel_feedback.feedbackchannel",
                    ),
                ),
                (
                    "corrective_action",
                    models.ForeignKey(
                        blank=True,
                        db_constraint=False,
                        null=True,
                        on_delete=django.db.models.deletion.DO_NOTHING,
                        related_name="+",
                        to="mel_tracking.correctiveaction",
                    ),
                ),
                (
                    "history_user",
                    models.ForeignKey(
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "submitter_user",
                    models.ForeignKey(
                        blank=True,
                        db_constraint=False,
                        null=True,
                        on_delete=django.db.models.deletion.DO_NOTHING,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "triaged_by",
                    models.ForeignKey(
                        blank=True,
                        db_constraint=False,
                        null=True,
                        on_delete=django.db.models.deletion.DO_NOTHING,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "verbose_name": "historical feedback submission",
                "verbose_name_plural": "historical feedback submissions",
                "ordering": ("-history_date", "-history_id"),
                "get_latest_by": ("history_date", "history_id"),
            },
            bases=(simple_history.models.HistoricalChanges, models.Model),
        ),
        migrations.CreateModel(
            name="TracerResponse",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                ("respondent_email", models.EmailField(blank=True, max_length=254)),
                ("respondent_name", models.CharField(blank=True, max_length=255)),
                ("employment_status", models.CharField(blank=True, max_length=120)),
                ("employer", models.CharField(blank=True, max_length=255)),
                ("role", models.CharField(blank=True, max_length=255)),
                ("salary_band", models.CharField(blank=True, max_length=60)),
                ("payload", models.JSONField(blank=True, default=dict)),
                ("submitted_at", models.DateTimeField(auto_now_add=True)),
                (
                    "study",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="responses",
                        to="mel_feedback.tracerstudy",
                    ),
                ),
            ],
            options={
                "ordering": ["-submitted_at"],
            },
        ),
        migrations.AddIndex(
            model_name="feedbackchannel",
            index=models.Index(
                fields=["subject_type", "subject_id"], name="mel_feedbac_subject_fdfc6c_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="feedbackchannel",
            index=models.Index(fields=["type", "is_active"], name="mel_feedbac_type_aafd03_idx"),
        ),
        migrations.AddIndex(
            model_name="feedbacksubmission",
            index=models.Index(fields=["channel", "status"], name="mel_feedbac_channel_c303b5_idx"),
        ),
        migrations.AddIndex(
            model_name="feedbacksubmission",
            index=models.Index(fields=["submission_key"], name="mel_feedbac_submiss_5137c5_idx"),
        ),
        migrations.AddConstraint(
            model_name="feedbacksubmission",
            constraint=models.UniqueConstraint(
                condition=models.Q(("submission_key", ""), _negated=True),
                fields=("channel", "submission_key"),
                name="uniq_feedback_submission_key",
            ),
        ),
        migrations.AddIndex(
            model_name="tracerresponse",
            index=models.Index(
                fields=["study", "submitted_at"], name="mel_feedbac_study_i_d3692e_idx"
            ),
        ),
    ]
