feat: rebuild math life around marks and directed endings
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# Generated by Django 4.2.23 on 2026-08-09 16:51
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('math_life', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='StoryMark',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('code', models.CharField(max_length=60)),
|
||||
('name', models.CharField(max_length=80)),
|
||||
('domain', models.CharField(max_length=40)),
|
||||
('acquired_at', models.DateTimeField(auto_now_add=True)),
|
||||
('source_run', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='acquired_marks', to='math_life.storyrun')),
|
||||
('story', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collected_marks', to='math_life.story')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='story_marks', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['acquired_at'],
|
||||
},
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='storymark',
|
||||
constraint=models.UniqueConstraint(fields=('user', 'story', 'code'), name='unique_user_story_mark'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,69 @@
|
||||
from django.db import migrations
|
||||
from django.utils import timezone
|
||||
|
||||
from math_life.story_v12 import V12_IDENTITY_SCORES, build_v12_story
|
||||
|
||||
|
||||
def publish_marks_story(apps, schema_editor):
|
||||
MathIdentity = apps.get_model("math_life", "MathIdentity")
|
||||
Story = apps.get_model("math_life", "Story")
|
||||
StoryRun = apps.get_model("math_life", "StoryRun")
|
||||
StoryVersion = apps.get_model("math_life", "StoryVersion")
|
||||
|
||||
for code, scores in V12_IDENTITY_SCORES.items():
|
||||
MathIdentity.objects.filter(code=code).update(initial_abilities=scores)
|
||||
|
||||
story = Story.objects.filter(slug="believer").first()
|
||||
if story is None:
|
||||
story = Story.objects.filter(slug="believer-math-teen").first()
|
||||
if story is None:
|
||||
return
|
||||
if story.slug != "believer":
|
||||
story.slug = "believer"
|
||||
story.save(update_fields=["slug"])
|
||||
source = (
|
||||
StoryVersion.objects.filter(story=story)
|
||||
.order_by("-version")
|
||||
.values_list("content", flat=True)
|
||||
.first()
|
||||
)
|
||||
if not source:
|
||||
return
|
||||
document = (
|
||||
source
|
||||
if source.get("system_version") == "marks-v1"
|
||||
else build_v12_story(source)
|
||||
)
|
||||
old_version_ids = list(
|
||||
StoryVersion.objects.filter(story=story)
|
||||
.exclude(version=2)
|
||||
.values_list("id", flat=True)
|
||||
)
|
||||
if old_version_ids:
|
||||
StoryRun.objects.filter(
|
||||
story_version_id__in=old_version_ids,
|
||||
status="active",
|
||||
).update(status="abandoned")
|
||||
StoryVersion.objects.filter(story=story).update(is_published=False)
|
||||
StoryVersion.objects.update_or_create(
|
||||
story=story,
|
||||
version=2,
|
||||
defaults={
|
||||
"content": document,
|
||||
"is_published": True,
|
||||
"published_at": timezone.now(),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("math_life", "0002_storymark_storymark_unique_user_story_mark"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(
|
||||
publish_marks_story,
|
||||
migrations.RunPython.noop,
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user