| |
|
|
| 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" |
| ), |
| ], |
| }, |
| ), |
| ] |
|
|