PyRunner / core /migrations /0001_initial.py
Akoda35's picture
Upload 22 files
71d5253 verified
Raw
History Blame Contribute Delete
15.8 kB
# 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"
),
],
},
),
]