Spaces:
Paused
Paused
| # Generated by Django 6.0.1 on 2026-01-18 17:49 | |
| import django.contrib.auth.models | |
| import django.contrib.auth.validators | |
| import django.db.models.deletion | |
| import django.utils.timezone | |
| import uuid | |
| from django.conf import settings | |
| from django.db import migrations, models | |
| class Migration(migrations.Migration): | |
| initial = True | |
| dependencies = [ | |
| ("auth", "0012_alter_user_first_name_max_length"), | |
| ] | |
| operations = [ | |
| migrations.CreateModel( | |
| name="User", | |
| fields=[ | |
| ( | |
| "id", | |
| models.BigAutoField( | |
| auto_created=True, | |
| primary_key=True, | |
| serialize=False, | |
| verbose_name="ID", | |
| ), | |
| ), | |
| ("password", models.CharField(max_length=128, verbose_name="password")), | |
| ( | |
| "last_login", | |
| models.DateTimeField( | |
| blank=True, null=True, verbose_name="last login" | |
| ), | |
| ), | |
| ( | |
| "is_superuser", | |
| models.BooleanField( | |
| default=False, | |
| help_text="Designates that this user has all permissions without explicitly assigning them.", | |
| verbose_name="superuser status", | |
| ), | |
| ), | |
| ( | |
| "username", | |
| models.CharField( | |
| error_messages={ | |
| "unique": "A user with that username already exists." | |
| }, | |
| help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", | |
| max_length=150, | |
| unique=True, | |
| validators=[ | |
| django.contrib.auth.validators.UnicodeUsernameValidator() | |
| ], | |
| verbose_name="username", | |
| ), | |
| ), | |
| ( | |
| "first_name", | |
| models.CharField( | |
| blank=True, max_length=150, verbose_name="first name" | |
| ), | |
| ), | |
| ( | |
| "last_name", | |
| models.CharField( | |
| blank=True, max_length=150, verbose_name="last name" | |
| ), | |
| ), | |
| ( | |
| "is_staff", | |
| models.BooleanField( | |
| default=False, | |
| help_text="Designates whether the user can log into this admin site.", | |
| verbose_name="staff status", | |
| ), | |
| ), | |
| ( | |
| "is_active", | |
| models.BooleanField( | |
| default=True, | |
| help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", | |
| verbose_name="active", | |
| ), | |
| ), | |
| ( | |
| "date_joined", | |
| models.DateTimeField( | |
| default=django.utils.timezone.now, verbose_name="date joined" | |
| ), | |
| ), | |
| ("email", models.EmailField(max_length=254, unique=True)), | |
| ( | |
| "is_verified", | |
| models.BooleanField( | |
| default=False, | |
| help_text="Whether the user has verified their email via magic link", | |
| ), | |
| ), | |
| ( | |
| "groups", | |
| models.ManyToManyField( | |
| blank=True, | |
| help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", | |
| related_name="user_set", | |
| related_query_name="user", | |
| to="auth.group", | |
| verbose_name="groups", | |
| ), | |
| ), | |
| ( | |
| "user_permissions", | |
| models.ManyToManyField( | |
| blank=True, | |
| help_text="Specific permissions for this user.", | |
| related_name="user_set", | |
| related_query_name="user", | |
| to="auth.permission", | |
| verbose_name="user permissions", | |
| ), | |
| ), | |
| ], | |
| options={ | |
| "verbose_name": "user", | |
| "verbose_name_plural": "users", | |
| "db_table": "users", | |
| }, | |
| managers=[ | |
| ("objects", django.contrib.auth.models.UserManager()), | |
| ], | |
| ), | |
| migrations.CreateModel( | |
| name="Environment", | |
| fields=[ | |
| ( | |
| "id", | |
| models.UUIDField( | |
| default=uuid.uuid4, | |
| editable=False, | |
| primary_key=True, | |
| serialize=False, | |
| ), | |
| ), | |
| ("name", models.CharField(max_length=100)), | |
| ("description", models.TextField(blank=True)), | |
| ( | |
| "path", | |
| models.CharField( | |
| help_text="Directory name within the environments folder", | |
| max_length=255, | |
| unique=True, | |
| ), | |
| ), | |
| ("python_version", models.CharField(blank=True, max_length=20)), | |
| ( | |
| "requirements", | |
| models.TextField( | |
| blank=True, | |
| help_text="Installed packages in pip requirements format", | |
| ), | |
| ), | |
| ( | |
| "is_default", | |
| models.BooleanField( | |
| default=False, | |
| help_text="Whether this is the default environment for new scripts", | |
| ), | |
| ), | |
| ( | |
| "is_active", | |
| models.BooleanField( | |
| default=True, | |
| help_text="Whether this environment is available for use", | |
| ), | |
| ), | |
| ("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="created_environments", | |
| to=settings.AUTH_USER_MODEL, | |
| ), | |
| ), | |
| ], | |
| options={ | |
| "verbose_name": "environment", | |
| "verbose_name_plural": "environments", | |
| "db_table": "environments", | |
| "ordering": ["-is_default", "name"], | |
| }, | |
| ), | |
| migrations.CreateModel( | |
| name="Script", | |
| fields=[ | |
| ( | |
| "id", | |
| models.UUIDField( | |
| default=uuid.uuid4, | |
| editable=False, | |
| primary_key=True, | |
| serialize=False, | |
| ), | |
| ), | |
| ("name", models.CharField(max_length=200)), | |
| ("description", models.TextField(blank=True)), | |
| ("code", models.TextField(help_text="Python code to execute")), | |
| ( | |
| "timeout_seconds", | |
| models.PositiveIntegerField( | |
| default=300, | |
| help_text="Maximum execution time in seconds (default: 5 minutes)", | |
| ), | |
| ), | |
| ( | |
| "is_enabled", | |
| models.BooleanField( | |
| default=True, help_text="Whether this script can be executed" | |
| ), | |
| ), | |
| ("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="scripts", | |
| to=settings.AUTH_USER_MODEL, | |
| ), | |
| ), | |
| ( | |
| "environment", | |
| models.ForeignKey( | |
| help_text="Python environment to use for execution", | |
| on_delete=django.db.models.deletion.PROTECT, | |
| related_name="scripts", | |
| to="core.environment", | |
| ), | |
| ), | |
| ], | |
| options={ | |
| "verbose_name": "script", | |
| "verbose_name_plural": "scripts", | |
| "db_table": "scripts", | |
| "ordering": ["-updated_at"], | |
| }, | |
| ), | |
| migrations.CreateModel( | |
| name="MagicToken", | |
| fields=[ | |
| ( | |
| "id", | |
| models.BigAutoField( | |
| auto_created=True, | |
| primary_key=True, | |
| serialize=False, | |
| verbose_name="ID", | |
| ), | |
| ), | |
| ("token", models.CharField(db_index=True, max_length=64, unique=True)), | |
| ( | |
| "email", | |
| models.EmailField( | |
| help_text="Email address this token was sent to", max_length=254 | |
| ), | |
| ), | |
| ("created_at", models.DateTimeField(auto_now_add=True)), | |
| ("expires_at", models.DateTimeField()), | |
| ("used_at", models.DateTimeField(blank=True, null=True)), | |
| ( | |
| "ip_address", | |
| models.GenericIPAddressField( | |
| blank=True, | |
| help_text="IP address that requested this token", | |
| null=True, | |
| ), | |
| ), | |
| ( | |
| "user", | |
| models.ForeignKey( | |
| blank=True, | |
| null=True, | |
| on_delete=django.db.models.deletion.CASCADE, | |
| related_name="magic_tokens", | |
| to=settings.AUTH_USER_MODEL, | |
| ), | |
| ), | |
| ], | |
| options={ | |
| "verbose_name": "magic token", | |
| "verbose_name_plural": "magic tokens", | |
| "db_table": "magic_tokens", | |
| "indexes": [ | |
| models.Index( | |
| fields=["token", "expires_at"], | |
| name="magic_token_token_b6602a_idx", | |
| ), | |
| models.Index( | |
| fields=["email", "created_at"], | |
| name="magic_token_email_302c69_idx", | |
| ), | |
| ], | |
| }, | |
| ), | |
| migrations.CreateModel( | |
| name="Run", | |
| fields=[ | |
| ( | |
| "id", | |
| models.UUIDField( | |
| default=uuid.uuid4, | |
| editable=False, | |
| primary_key=True, | |
| serialize=False, | |
| ), | |
| ), | |
| ( | |
| "status", | |
| models.CharField( | |
| choices=[ | |
| ("pending", "Pending"), | |
| ("running", "Running"), | |
| ("success", "Success"), | |
| ("failed", "Failed"), | |
| ("timeout", "Timeout"), | |
| ("cancelled", "Cancelled"), | |
| ], | |
| db_index=True, | |
| default="pending", | |
| max_length=20, | |
| ), | |
| ), | |
| ( | |
| "exit_code", | |
| models.IntegerField( | |
| blank=True, | |
| help_text="Process exit code (0 = success)", | |
| null=True, | |
| ), | |
| ), | |
| ( | |
| "stdout", | |
| models.TextField( | |
| blank=True, help_text="Standard output from script execution" | |
| ), | |
| ), | |
| ( | |
| "stderr", | |
| models.TextField( | |
| blank=True, help_text="Standard error from script execution" | |
| ), | |
| ), | |
| ( | |
| "started_at", | |
| models.DateTimeField( | |
| blank=True, help_text="When execution started", null=True | |
| ), | |
| ), | |
| ( | |
| "ended_at", | |
| models.DateTimeField( | |
| blank=True, help_text="When execution ended", null=True | |
| ), | |
| ), | |
| ( | |
| "code_snapshot", | |
| models.TextField( | |
| blank=True, help_text="Copy of script code at time of execution" | |
| ), | |
| ), | |
| ( | |
| "task_id", | |
| models.CharField( | |
| blank=True, | |
| db_index=True, | |
| help_text="django-q2 task ID for tracking async execution", | |
| max_length=100, | |
| ), | |
| ), | |
| ("created_at", models.DateTimeField(auto_now_add=True)), | |
| ( | |
| "triggered_by", | |
| models.ForeignKey( | |
| blank=True, | |
| null=True, | |
| on_delete=django.db.models.deletion.SET_NULL, | |
| related_name="triggered_runs", | |
| to=settings.AUTH_USER_MODEL, | |
| ), | |
| ), | |
| ( | |
| "script", | |
| models.ForeignKey( | |
| on_delete=django.db.models.deletion.CASCADE, | |
| related_name="runs", | |
| to="core.script", | |
| ), | |
| ), | |
| ], | |
| options={ | |
| "verbose_name": "run", | |
| "verbose_name_plural": "runs", | |
| "db_table": "runs", | |
| "ordering": ["-created_at"], | |
| "indexes": [ | |
| models.Index( | |
| fields=["script", "-created_at"], name="runs_script__1182ba_idx" | |
| ), | |
| models.Index( | |
| fields=["status", "-created_at"], name="runs_status_56f7d6_idx" | |
| ), | |
| ], | |
| }, | |
| ), | |
| ] | |