# Generated by Django 6.0 on 2025-12-23 11:09
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("methodology", "0004_add_last_accessed_at"),
]
operations = [
migrations.CreateModel(
name="Artifact",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"name",
models.CharField(
help_text="Artifact name. Example: 'API Specification'",
max_length=200,
),
),
(
"description",
models.TextField(
blank=True,
help_text="Detailed description. Example: 'REST API contract with endpoints...'",
),
),
(
"type",
models.CharField(
choices=[
("Document", "Document"),
("Template", "Template"),
("Code", "Code"),
("Diagram", "Diagram"),
("Data", "Data"),
("Other", "Other"),
],
default="Document",
help_text="Artifact type. Example: 'Document'",
max_length=50,
),
),
(
"is_required",
models.BooleanField(
default=False,
help_text="Whether this artifact is required. Example: True",
),
),
(
"template_file",
models.FileField(
blank=True,
help_text="Optional template file. Example: 'component_template.tsx'",
null=True,
upload_to="artifacts/templates/",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"playbook",
models.ForeignKey(
help_text="Playbook containing this artifact (via activity->workflow->playbook)",
on_delete=django.db.models.deletion.CASCADE,
related_name="artifacts",
to="methodology.playbook",
),
),
(
"produced_by",
models.ForeignKey(
help_text="Activity that produces this artifact as output",
on_delete=django.db.models.deletion.CASCADE,
related_name="output_artifacts",
to="methodology.activity",
),
),
],
options={
"verbose_name": "Artifact",
"verbose_name_plural": "Artifacts",
"ordering": ["playbook", "produced_by", "name"],
},
),
migrations.CreateModel(
name="ArtifactInput",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"is_required",
models.BooleanField(
default=True,
help_text="Whether this input is required for activity execution",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"activity",
models.ForeignKey(
help_text="Activity consuming this artifact",
on_delete=django.db.models.deletion.CASCADE,
related_name="input_artifacts",
to="methodology.activity",
),
),
(
"artifact",
models.ForeignKey(
help_text="Artifact being consumed as input",
on_delete=django.db.models.deletion.CASCADE,
related_name="inputs",
to="methodology.artifact",
),
),
],
options={
"verbose_name": "Artifact Input",
"verbose_name_plural": "Artifact Inputs",
"ordering": ["activity", "artifact"],
},
),
migrations.AddIndex(
model_name="artifact",
index=models.Index(
fields=["playbook", "type"], name="methodology_playboo_345833_idx"
),
),
migrations.AddIndex(
model_name="artifact",
index=models.Index(
fields=["produced_by"], name="methodology_produce_9da52c_idx"
),
),
migrations.AddIndex(
model_name="artifact",
index=models.Index(
fields=["is_required"], name="methodology_is_requ_6ec81f_idx"
),
),
migrations.AddConstraint(
model_name="artifact",
constraint=models.UniqueConstraint(
fields=("playbook", "name"),
name="unique_artifact_per_playbook",
violation_error_message="An artifact with this name already exists in this playbook",
),
),
migrations.AddIndex(
model_name="artifactinput",
index=models.Index(
fields=["artifact", "activity"], name="methodology_artifac_9b31dd_idx"
),
),
migrations.AddIndex(
model_name="artifactinput",
index=models.Index(
fields=["is_required"], name="methodology_is_requ_514c36_idx"
),
),
migrations.AddConstraint(
model_name="artifactinput",
constraint=models.UniqueConstraint(
fields=("artifact", "activity"),
name="unique_artifact_input_per_activity",
violation_error_message="This artifact is already an input to this activity",
),
),
]