# Generated by Django 5.2.6 on 2026-05-27 14:19

import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ("dms", "0009_phase11_ai_ocr"),
        ("organizations", "0001_initial"),
        ("tenants", "0001_initial"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="AccessLog",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                (
                    "access_type",
                    models.CharField(
                        choices=[
                            ("viewed", "Viewed"),
                            ("downloaded", "Downloaded"),
                            ("previewed", "Previewed"),
                            ("share_link", "Accessed via Share Link"),
                        ],
                        db_index=True,
                        max_length=30,
                        verbose_name="access type",
                    ),
                ),
                (
                    "ip_address",
                    models.GenericIPAddressField(blank=True, null=True, verbose_name="IP address"),
                ),
                (
                    "user_agent",
                    models.CharField(
                        blank=True, default="", max_length=500, verbose_name="user agent"
                    ),
                ),
                ("metadata", models.JSONField(blank=True, default=dict, verbose_name="metadata")),
                (
                    "occurred_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="occurred at"
                    ),
                ),
                (
                    "actor",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="actor",
                    ),
                ),
                (
                    "document",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="access_logs",
                        to="dms.document",
                        verbose_name="document",
                    ),
                ),
                (
                    "organization_node",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to="organizations.organizationnode",
                        verbose_name="organization node",
                    ),
                ),
                (
                    "tenant",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="+",
                        to="tenants.tenant",
                        verbose_name="tenant",
                    ),
                ),
                (
                    "version_ref",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="access_logs",
                        to="dms.documentversion",
                        verbose_name="version",
                    ),
                ),
            ],
            options={
                "verbose_name": "access log",
                "verbose_name_plural": "access logs",
                "ordering": ("-occurred_at",),
                "indexes": [
                    models.Index(
                        fields=["document_id", "access_type"], name="dms_access_doc_type_idx"
                    ),
                    models.Index(
                        fields=["tenant_id", "occurred_at"], name="dms_access_tenant_time_idx"
                    ),
                ],
            },
        ),
        migrations.CreateModel(
            name="DocumentAuditLog",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                (
                    "action",
                    models.CharField(
                        choices=[
                            ("created", "Created"),
                            ("published", "Published"),
                            ("archived", "Archived"),
                            ("deleted", "Deleted"),
                            ("restored", "Restored"),
                            ("version_added", "Version Added"),
                            ("version_rolled_back", "Version Rolled Back"),
                            ("metadata_updated", "Metadata Updated"),
                            ("type_changed", "Type Changed"),
                            ("moved", "Moved"),
                            ("renamed", "Renamed"),
                            ("locked", "Locked"),
                            ("unlocked", "Unlocked"),
                            ("hold_placed", "Legal Hold Placed"),
                            ("hold_released", "Legal Hold Released"),
                            ("ocr_submitted", "OCR Submitted"),
                            ("ocr_completed", "OCR Completed"),
                            ("classified", "AI Classified"),
                            ("share_link_created", "Share Link Created"),
                            ("share_link_revoked", "Share Link Revoked"),
                        ],
                        db_index=True,
                        max_length=50,
                        verbose_name="action",
                    ),
                ),
                (
                    "before_state",
                    models.JSONField(blank=True, default=dict, verbose_name="before state"),
                ),
                (
                    "after_state",
                    models.JSONField(blank=True, default=dict, verbose_name="after state"),
                ),
                ("metadata", models.JSONField(blank=True, default=dict, verbose_name="metadata")),
                (
                    "ip_address",
                    models.GenericIPAddressField(blank=True, null=True, verbose_name="IP address"),
                ),
                (
                    "user_agent",
                    models.CharField(
                        blank=True, default="", max_length=500, verbose_name="user agent"
                    ),
                ),
                (
                    "occurred_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="occurred at"
                    ),
                ),
                (
                    "actor",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="actor",
                    ),
                ),
                (
                    "document",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="audit_logs",
                        to="dms.document",
                        verbose_name="document",
                    ),
                ),
                (
                    "organization_node",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to="organizations.organizationnode",
                        verbose_name="organization node",
                    ),
                ),
                (
                    "tenant",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="+",
                        to="tenants.tenant",
                        verbose_name="tenant",
                    ),
                ),
                (
                    "version_ref",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="audit_logs",
                        to="dms.documentversion",
                        verbose_name="version reference",
                    ),
                ),
            ],
            options={
                "verbose_name": "document audit log",
                "verbose_name_plural": "document audit logs",
                "ordering": ("-occurred_at",),
                "indexes": [
                    models.Index(fields=["document_id", "action"], name="dms_audit_doc_action_idx"),
                    models.Index(
                        fields=["tenant_id", "occurred_at"], name="dms_audit_tenant_time_idx"
                    ),
                ],
            },
        ),
        migrations.CreateModel(
            name="SecurityEvent",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
                    ),
                ),
                (
                    "public_id",
                    models.UUIDField(
                        db_index=True,
                        default=uuid.uuid4,
                        editable=False,
                        unique=True,
                        verbose_name="public id",
                    ),
                ),
                (
                    "event_type",
                    models.CharField(
                        choices=[
                            ("unauthorized_access", "Unauthorized Access Attempt"),
                            ("permission_denied", "Permission Denied"),
                            ("legal_hold_check", "Legal Hold Consulted"),
                            ("policy_violation", "Policy Violation"),
                            ("bulk_download", "Bulk Download Detected"),
                            ("suspicious_activity", "Suspicious Activity"),
                        ],
                        db_index=True,
                        max_length=50,
                        verbose_name="event type",
                    ),
                ),
                (
                    "severity",
                    models.CharField(
                        choices=[
                            ("info", "Info"),
                            ("warning", "Warning"),
                            ("critical", "Critical"),
                        ],
                        db_index=True,
                        default="warning",
                        max_length=20,
                        verbose_name="severity",
                    ),
                ),
                (
                    "description",
                    models.TextField(blank=True, default="", verbose_name="description"),
                ),
                (
                    "ip_address",
                    models.GenericIPAddressField(blank=True, null=True, verbose_name="IP address"),
                ),
                ("metadata", models.JSONField(blank=True, default=dict, verbose_name="metadata")),
                (
                    "occurred_at",
                    models.DateTimeField(
                        auto_now_add=True, db_index=True, verbose_name="occurred at"
                    ),
                ),
                (
                    "actor",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="+",
                        to=settings.AUTH_USER_MODEL,
                        verbose_name="actor",
                    ),
                ),
                (
                    "document",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="security_events",
                        to="dms.document",
                        verbose_name="document",
                    ),
                ),
                (
                    "tenant",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="+",
                        to="tenants.tenant",
                        verbose_name="tenant",
                    ),
                ),
            ],
            options={
                "verbose_name": "security event",
                "verbose_name_plural": "security events",
                "ordering": ("-occurred_at",),
                "indexes": [
                    models.Index(
                        fields=["tenant_id", "event_type", "severity"],
                        name="dms_sec_tenant_type_sev_idx",
                    ),
                    models.Index(
                        fields=["tenant_id", "occurred_at"], name="dms_sec_tenant_time_idx"
                    ),
                ],
            },
        ),
    ]
