# Generated by Django 5.2.17 on 2026-09-24 14:10 import django.db.models.deletion from django.conf import settings from django.db import migrations, models import infrasynth.shared.enums class Migration(migrations.Migration): initial = True dependencies = [ ("tenancy", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="Workflow", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("slug", models.SlugField(max_length=100)), ("name", models.CharField(max_length=200)), ("description", models.TextField(blank=True)), ("is_active", models.BooleanField(default=True)), ( "created_by", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="+", to=settings.AUTH_USER_MODEL, ), ), ( "tenant", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenancy.tenant", ), ), ], options={ "db_table": "workflows_definition", }, ), migrations.CreateModel( name="WorkflowNode", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("name", models.CharField(max_length=200)), ( "node_type", models.CharField( choices=[("start", "Start"), ("intermediate", "Intermediate"), ("end", "End")], default="intermediate", max_length=20, ), ), ("min_approvals", models.PositiveSmallIntegerField(default=1)), ( "approval_strategy", models.CharField( choices=infrasynth.shared.enums.ApprovalStrategy.choices, default=infrasynth.shared.enums.ApprovalStrategy["ALL"], max_length=20, ), ), ("position_x", models.IntegerField(default=0)), ("position_y", models.IntegerField(default=0)), ( "tenant", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenancy.tenant", ), ), ( "workflow", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="nodes", to="infrasynth_workflows.workflow", ), ), ], options={ "db_table": "workflows_node", }, ), migrations.CreateModel( name="WorkflowInstance", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "status", models.CharField( choices=[ ("in_progress", "In Progress"), ("completed", "Completed"), ("cancelled", "Cancelled"), ], default="in_progress", max_length=20, ), ), ("started_at", models.DateTimeField(auto_now_add=True)), ("completed_at", models.DateTimeField(blank=True, null=True)), ("metadata", models.JSONField(default=dict)), ( "owner", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="+", to=settings.AUTH_USER_MODEL, ), ), ( "tenant", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenancy.tenant", ), ), ( "workflow", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="instances", to="infrasynth_workflows.workflow", ), ), ( "current_node", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="+", to="infrasynth_workflows.workflownode", ), ), ], options={ "db_table": "workflows_instance", }, ), migrations.CreateModel( name="Transition", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("condition_slug", models.CharField(blank=True, max_length=100)), ("is_default", models.BooleanField(default=False)), ( "tenant", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenancy.tenant", ), ), ( "from_node", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="outgoing_transitions", to="infrasynth_workflows.workflownode", ), ), ( "to_node", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="incoming_transitions", to="infrasynth_workflows.workflownode", ), ), ], options={ "db_table": "workflows_transition", }, ), migrations.CreateModel( name="NodeAssignment", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("visit_number", models.IntegerField(default=1)), ("is_required", models.BooleanField(default=True)), ("has_processed", models.BooleanField(default=False)), ("decision", models.CharField(blank=True, max_length=50, null=True)), ("comments", models.TextField(blank=True)), ("submitted_data", models.JSONField(blank=True, default=dict, null=True)), ("processed_at", models.DateTimeField(blank=True, null=True)), ( "tenant", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenancy.tenant", ), ), ( "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="+", to=settings.AUTH_USER_MODEL ), ), ( "instance", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="assignments", to="infrasynth_workflows.workflowinstance", ), ), ( "node", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="assignments", to="infrasynth_workflows.workflownode", ), ), ], options={ "db_table": "workflows_node_assignment", }, ), migrations.CreateModel( name="WorkflowObserver", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "instance", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="observers", to="infrasynth_workflows.workflowinstance", ), ), ( "tenant", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="tenancy.tenant", ), ), ( "user", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="+", to=settings.AUTH_USER_MODEL ), ), ], options={ "db_table": "workflows_observer", }, ), migrations.AddConstraint( model_name="workflow", constraint=models.UniqueConstraint(fields=("tenant", "slug"), name="uniq_workflow_slug_per_tenant"), ), migrations.AddConstraint( model_name="workflownode", constraint=models.UniqueConstraint(fields=("workflow", "name"), name="uniq_node_name_per_workflow"), ), migrations.AddIndex( model_name="workflowinstance", index=models.Index(fields=["tenant_id", "status"], name="workflows_i_tenant__b74e9f_idx"), ), migrations.AddConstraint( model_name="transition", constraint=models.UniqueConstraint( fields=("from_node", "condition_slug"), name="uniq_transition_condition" ), ), migrations.AddIndex( model_name="nodeassignment", index=models.Index(fields=["tenant_id", "has_processed"], name="workflows_n_tenant__cd39b7_idx"), ), migrations.AddConstraint( model_name="workflowobserver", constraint=models.UniqueConstraint(fields=("instance", "user"), name="uniq_observer_per_instance"), ), ]