coulomb-social/coulomb_social/apps/spaces/migrations/0001_initial.py
tegwick be32432d39 Add Space metadata model and provisional Forgejo content ADR
Introduce tenant-scoped Space/SpaceMembership with list and detail views.
Document markdown-in-Forgejo as content SoR (ADR-0002). Run migrations on
container start so app.coulomb.social picks up the new tables.
2026-08-12 01:30:05 +02:00

150 lines
5 KiB
Python

# Generated by Django 6.1 on 2026-08-11 23:29
import coulomb_social.apps.spaces.models
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("members", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="Space",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("tenant_id", models.CharField(db_index=True, max_length=64)),
(
"slug",
models.SlugField(
max_length=80,
validators=[
coulomb_social.apps.spaces.models.validate_space_slug
],
),
),
("title", models.CharField(max_length=255)),
("description", models.TextField(blank=True)),
(
"forgejo_owner",
models.CharField(
blank=True,
help_text="Forgejo org or user owning the repo (e.g. coulomb).",
max_length=128,
),
),
(
"forgejo_repo",
models.CharField(
blank=True,
help_text="Repository name (e.g. space-my-space).",
max_length=128,
),
),
(
"default_branch",
models.CharField(blank=True, default="main", max_length=128),
),
(
"content_root",
models.CharField(
blank=True,
default="pages",
help_text="Path prefix inside the repo for markdown pages.",
max_length=255,
),
),
("is_active", models.BooleanField(default=True)),
("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.PROTECT,
related_name="spaces_created",
to="members.member",
),
),
],
options={
"ordering": ["title", "slug"],
},
),
migrations.CreateModel(
name="SpaceMembership",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
(
"role",
models.CharField(
choices=[
("owner", "Owner"),
("member", "Member"),
("viewer", "Viewer"),
],
default="member",
max_length=16,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
(
"member",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="space_memberships",
to="members.member",
),
),
(
"space",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="memberships",
to="spaces.space",
),
),
],
),
migrations.AddIndex(
model_name="space",
index=models.Index(
fields=["tenant_id", "is_active"], name="spaces_spac_tenant__c3a447_idx"
),
),
migrations.AddConstraint(
model_name="space",
constraint=models.UniqueConstraint(
fields=("tenant_id", "slug"), name="spaces_space_tenant_slug_uniq"
),
),
migrations.AddConstraint(
model_name="spacemembership",
constraint=models.UniqueConstraint(
fields=("space", "member"), name="spaces_membership_space_member_uniq"
),
),
]