feat: add AirShelf core implementation

This commit is contained in:
zyc
2026-06-05 10:21:40 +08:00
parent 2ba1058329
commit cfdcd84a30
252 changed files with 70828 additions and 0 deletions
@@ -0,0 +1,232 @@
# Generated by Django 5.1.15 on 2026-05-29 03:59
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("accounts", "0001_initial"),
("ai", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Asset",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("name", models.CharField(max_length=255)),
(
"asset_type",
models.CharField(
choices=[
("image", "Image"),
("video", "Video"),
("audio", "Audio"),
("subtitle", "Subtitle"),
("document", "Document"),
],
max_length=24,
),
),
(
"source",
models.CharField(
choices=[
("upload", "Upload"),
("ai_generated", "AI Generated"),
("exported", "Exported"),
("system", "System"),
],
max_length=32,
),
),
(
"category",
models.CharField(
choices=[
("person", "Person"),
("scene", "Scene"),
("product_image", "Product Image"),
("video_clip", "Video Clip"),
("final_video", "Final Video"),
("upload", "Upload"),
("uncategorized", "Uncategorized"),
],
default="uncategorized",
max_length=32,
),
),
("description", models.TextField(blank=True)),
("metadata", models.JSONField(blank=True, default=dict)),
("is_deleted", models.BooleanField(default=False)),
(
"created_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="created_%(class)s_set",
to=settings.AUTH_USER_MODEL,
),
),
(
"origin_task",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="generated_assets",
to="ai.aitask",
),
),
(
"team",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(class)s_set",
to="accounts.team",
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="AssetFile",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("object_key", models.CharField(max_length=512)),
("bucket", models.CharField(max_length=128)),
("content_type", models.CharField(blank=True, max_length=128)),
("size_bytes", models.BigIntegerField(default=0)),
("checksum", models.CharField(blank=True, max_length=128)),
("width", models.PositiveIntegerField(blank=True, null=True)),
("height", models.PositiveIntegerField(blank=True, null=True)),
("duration_ms", models.PositiveIntegerField(blank=True, null=True)),
("preview_url", models.URLField(blank=True)),
("is_primary", models.BooleanField(default=True)),
(
"asset",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="files",
to="assets.asset",
),
),
],
),
migrations.CreateModel(
name="AssetTag",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("name", models.CharField(max_length=64)),
(
"team",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="asset_tags",
to="accounts.team",
),
),
],
),
migrations.CreateModel(
name="AssetTagging",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"asset",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="taggings",
to="assets.asset",
),
),
(
"tag",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="taggings",
to="assets.assettag",
),
),
],
),
migrations.CreateModel(
name="AssetUsage",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("usage_type", models.CharField(max_length=64)),
("context", models.JSONField(blank=True, default=dict)),
(
"asset",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="usages",
to="assets.asset",
),
),
],
options={
"abstract": False,
},
),
]
@@ -0,0 +1,42 @@
# Generated by Django 5.1.15 on 2026-05-29 03:59
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("assets", "0001_initial"),
("projects", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="assetusage",
name="project",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="asset_usages",
to="projects.project",
),
),
migrations.AddIndex(
model_name="assetfile",
index=models.Index(
fields=["bucket", "object_key"], name="assets_asse_bucket_94a505_idx"
),
),
migrations.AlterUniqueTogether(
name="assettag",
unique_together={("team", "name")},
),
migrations.AlterUniqueTogether(
name="assettagging",
unique_together={("asset", "tag")},
),
]
@@ -0,0 +1 @@