collapse migrations: 41 epic + 20 lyric + 12 applets + others → fresh initials + 4 themed seeds
All checks were successful
ci/woodpecker/push/pyswiss Pipeline was successful
ci/woodpecker/push/main Pipeline was successful

- Delete all incremental migration files across all apps; regenerate 0001_initial.py
  per app via makemigrations (schema unchanged, no model edits)
- applets/0003_seed_applets.py: all 20 Applet rows in one migration
- epic/0003_seed_fiorentine_deck.py: Fiorentine Minchiate DeckVariant + 78 cards
- epic/0004_seed_earthman_deck.py: Earthman DeckVariant + 50 major + 56 minor/middle
  arcana (106 cards); stray PENTACLES courts absent — clean from the start
- epic/0005_seed_astro_reference_tables.py: 12 signs, 10 planets, 9 aspect types
  (incl. Semisquare + Sesquiquadrate), 12 house labels
- 706 ITs green on fresh DB

Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-04-27 21:06:23 -04:00
parent e2c9dc4e8a
commit 2b4f20c0e8
91 changed files with 916 additions and 3540 deletions

View File

@@ -1,6 +1,8 @@
# Generated by Django 6.0 on 2026-02-20 00:48
# Generated by Django 6.0 on 2026-04-28 00:59
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
@@ -9,9 +11,18 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('drama', '0001_initial'),
('epic', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='LoginToken',
fields=[
('email', models.EmailField(max_length=254)),
('uid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
],
),
migrations.CreateModel(
name='User',
fields=[
@@ -19,18 +30,63 @@ class Migration(migrations.Migration):
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('email', models.EmailField(max_length=254, unique=True)),
('username', models.CharField(blank=True, max_length=35, null=True, unique=True)),
('searchable', models.BooleanField(default=False)),
('palette', models.CharField(default='palette-default', max_length=32)),
('stripe_customer_id', models.CharField(blank=True, max_length=255, null=True)),
('ap_public_key', models.TextField(blank=True, default='')),
('ap_private_key', models.TextField(blank=True, default='')),
('sky_birth_dt', models.DateTimeField(blank=True, null=True)),
('sky_birth_lat', models.DecimalField(blank=True, decimal_places=4, max_digits=9, null=True)),
('sky_birth_lon', models.DecimalField(blank=True, decimal_places=4, max_digits=9, null=True)),
('sky_birth_place', models.CharField(blank=True, max_length=255)),
('sky_birth_tz', models.CharField(blank=True, max_length=64)),
('sky_house_system', models.CharField(blank=True, default='O', max_length=1)),
('sky_chart_data', models.JSONField(blank=True, null=True)),
('is_staff', models.BooleanField(default=False)),
('is_superuser', models.BooleanField(default=False)),
('active_title', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='drama.note')),
('equipped_deck', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='epic.deckvariant')),
('unlocked_decks', models.ManyToManyField(blank=True, related_name='unlocked_by', to='epic.deckvariant')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='PaymentMethod',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('stripe_pm_id', models.CharField(max_length=255)),
('last4', models.CharField(max_length=4)),
('brand', models.CharField(max_length=32)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payment_methods', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Token',
fields=[
('email', models.EmailField(max_length=254)),
('uid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('token_type', models.CharField(choices=[('coin', 'Coin-on-a-String'), ('Free', 'Free Token'), ('tithe', 'Tithe Token'), ('pass', 'Backstage Pass'), ('carte', 'Carte Blanche')], max_length=8)),
('expires_at', models.DateTimeField(blank=True, null=True)),
('next_ready_at', models.DateTimeField(blank=True, null=True)),
('slots_claimed', models.PositiveSmallIntegerField(blank=True, default=0)),
('current_room', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='coin_tokens', to='epic.room')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tokens', to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='user',
name='equipped_trinket',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='lyric.token'),
),
migrations.CreateModel(
name='Wallet',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('writs', models.IntegerField(default=0)),
('esteem', models.IntegerField(default=0)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='wallet', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -1,23 +0,0 @@
# Generated by Django 6.0 on 2026-03-02 01:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='user',
name='searchable',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='user',
name='username',
field=models.CharField(blank=True, max_length=35, null=True, unique=True),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 6.0 on 2026-03-02 04:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0002_user_searchable_user_username'),
]
operations = [
migrations.AddField(
model_name='user',
name='theme',
field=models.CharField(default='theme-default', max_length=32),
),
]

View File

@@ -1,22 +0,0 @@
# Generated by Django 6.0 on 2026-03-05 19:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0003_user_theme'),
]
operations = [
migrations.RemoveField(
model_name='user',
name='theme',
),
migrations.AddField(
model_name='user',
name='palette',
field=models.CharField(default='palette-default', max_length=32),
),
]

View File

@@ -1,14 +0,0 @@
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('lyric', '0004_remove_user_theme_user_palette'),
]
operations = [
migrations.RenameModel(
old_name="Token",
new_name="LoginToken",
),
]

View File

@@ -1,33 +0,0 @@
# Generated by Django 6.0 on 2026-03-08 18:19
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0005_rename_logintoken'),
]
operations = [
migrations.CreateModel(
name='Token',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('token_type', models.CharField(choices=[('coin', 'Coin-on-a-String'), ('Free', 'Free Token'), ('tithe', 'Tithe Token')], max_length=8)),
('expires_at', models.DateTimeField(blank=True, null=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tokens', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Wallet',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('writs', models.IntegerField(default=0)),
('esteem', models.IntegerField(default=0)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='wallet', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -1,30 +0,0 @@
# Generated by Django 6.0 on 2026-03-08 20:26
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0006_token_wallet'),
]
operations = [
migrations.AddField(
model_name='user',
name='stripe_customer_id',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.CreateModel(
name='PaymentMethod',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('stripe_pm_id', models.CharField(max_length=255)),
('last4', models.CharField(max_length=4)),
('brand', models.CharField(max_length=32)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payment_methods', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -1,25 +0,0 @@
# Generated by Django 6.0 on 2026-03-13 20:17
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('epic', '0001_initial'),
('lyric', '0007_user_stripe_customer_id_paymentmethod'),
]
operations = [
migrations.AddField(
model_name='token',
name='current_room',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='coin_tokens', to='epic.room'),
),
migrations.AddField(
model_name='token',
name='next_ready_at',
field=models.DateTimeField(blank=True, null=True),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 6.0 on 2026-03-15 00:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0008_token_current_room_token_next_ready_at'),
]
operations = [
migrations.AlterField(
model_name='token',
name='token_type',
field=models.CharField(choices=[('coin', 'Coin-on-a-String'), ('Free', 'Free Token'), ('tithe', 'Tithe Token'), ('pass', 'Backstage Pass')], max_length=8),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 6.0 on 2026-03-15 23:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0009_alter_token_token_type'),
]
operations = [
migrations.AlterField(
model_name='token',
name='token_type',
field=models.CharField(choices=[('coin', 'Coin-on-a-String'), ('Free', 'Free Token'), ('tithe', 'Tithe Token'), ('pass', 'Backstage Pass'), ('carte', 'Carte Blanche')], max_length=8),
),
]

View File

@@ -1,19 +0,0 @@
# Generated by Django 6.0 on 2026-03-15 23:44
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0010_carte_blanche_token_type'),
]
operations = [
migrations.AddField(
model_name='user',
name='equipped_trinket',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='lyric.token'),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 6.0 on 2026-03-16 03:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0011_user_equipped_trinket_fk'),
]
operations = [
migrations.AddField(
model_name='token',
name='slots_claimed',
field=models.PositiveSmallIntegerField(default=0),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 6.0 on 2026-03-17 01:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0012_carte_slots_claimed'),
]
operations = [
migrations.AlterField(
model_name='token',
name='slots_claimed',
field=models.PositiveSmallIntegerField(blank=True, default=0),
),
]

View File

@@ -1,20 +0,0 @@
# Generated by Django 6.0 on 2026-03-25 00:48
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('epic', '0009_deckvariant_alter_tarotcard_options_and_more'),
('lyric', '0013_alter_token_slots_claimed'),
]
operations = [
migrations.AddField(
model_name='user',
name='equipped_deck',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='epic.deckvariant'),
),
]

View File

@@ -1,19 +0,0 @@
# Generated by Django 6.0 on 2026-03-25 02:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('epic', '0010_seed_deck_variants_and_earthman'),
('lyric', '0014_user_equipped_deck'),
]
operations = [
migrations.AddField(
model_name='user',
name='unlocked_decks',
field=models.ManyToManyField(blank=True, related_name='unlocked_by', to='epic.deckvariant'),
),
]

View File

@@ -1,24 +0,0 @@
from django.db import migrations
def backfill_unlocked_decks(apps, schema_editor):
User = apps.get_model("lyric", "User")
DeckVariant = apps.get_model("epic", "DeckVariant")
try:
earthman = DeckVariant.objects.get(slug="earthman")
except DeckVariant.DoesNotExist:
return
for user in User.objects.filter(unlocked_decks__isnull=True):
user.unlocked_decks.add(earthman)
class Migration(migrations.Migration):
dependencies = [
("lyric", "0015_user_unlocked_decks"),
("epic", "0010_seed_deck_variants_and_earthman"),
]
operations = [
migrations.RunPython(backfill_unlocked_decks, migrations.RunPython.noop),
]

View File

@@ -1,23 +0,0 @@
# Generated by Django 6.0 on 2026-04-02 19:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0016_backfill_unlocked_decks'),
]
operations = [
migrations.AddField(
model_name='user',
name='ap_private_key',
field=models.TextField(blank=True, default=''),
),
migrations.AddField(
model_name='user',
name='ap_public_key',
field=models.TextField(blank=True, default=''),
),
]

View File

@@ -1,40 +0,0 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0017_ap_keypair_fields'),
]
operations = [
migrations.AddField(
model_name='user',
name='sky_birth_dt',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='user',
name='sky_birth_lat',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=9, null=True),
),
migrations.AddField(
model_name='user',
name='sky_birth_lon',
field=models.DecimalField(blank=True, decimal_places=4, max_digits=9, null=True),
),
migrations.AddField(
model_name='user',
name='sky_birth_place',
field=models.CharField(blank=True, max_length=255),
),
migrations.AddField(
model_name='user',
name='sky_house_system',
field=models.CharField(blank=True, default='O', max_length=1),
),
migrations.AddField(
model_name='user',
name='sky_chart_data',
field=models.JSONField(blank=True, null=True),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 6.0 on 2026-04-22 01:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lyric', '0018_user_sky_fields'),
]
operations = [
migrations.AddField(
model_name='user',
name='sky_birth_tz',
field=models.CharField(blank=True, max_length=64),
),
]

View File

@@ -1,20 +0,0 @@
# Generated by Django 6.0 on 2026-04-23 05:37
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('drama', '0005_rename_recognition_to_note'),
('lyric', '0019_sky_birth_tz'),
]
operations = [
migrations.AddField(
model_name='user',
name='active_title',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='drama.note'),
),
]