46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
|
|
"""Schema 4: split animated symbol palettes from the authoring palette.
|
||
|
|
|
||
|
|
Before schema 4 a symbol's ``:palette`` leaf value was always a channel. It now
|
||
|
|
names the static palette used when that symbol is the viewed root, while the
|
||
|
|
old channel is retained as ``:palette-channel`` compatibility data. New edits
|
||
|
|
use a real lane symbol referenced by ``:palette-track``.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from django.db import migrations, models
|
||
|
|
|
||
|
|
|
||
|
|
def forwards(apps, schema_editor):
|
||
|
|
Leaf = apps.get_model("clips", "Leaf")
|
||
|
|
Project = apps.get_model("clips", "Project")
|
||
|
|
for leaf in Leaf.objects.filter(path__contains="/symbol/"):
|
||
|
|
parts = leaf.path.split("/")
|
||
|
|
if len(parts) != 4 or parts[2] != "symbol":
|
||
|
|
continue
|
||
|
|
value = leaf.value
|
||
|
|
if not (isinstance(value, list) and value[:1] == ["^ "]):
|
||
|
|
continue
|
||
|
|
out = list(value)
|
||
|
|
changed = False
|
||
|
|
for i in range(1, len(out) - 1, 2):
|
||
|
|
if out[i] == "~:palette" and isinstance(out[i + 1], list):
|
||
|
|
out[i] = "~:palette-channel"
|
||
|
|
changed = True
|
||
|
|
if changed:
|
||
|
|
leaf.value = out
|
||
|
|
leaf.version += 1
|
||
|
|
leaf.save(update_fields=["value", "version"])
|
||
|
|
Project.objects.update(schema_version=4)
|
||
|
|
|
||
|
|
|
||
|
|
class Migration(migrations.Migration):
|
||
|
|
dependencies = [("clips", "0012_sound_label")]
|
||
|
|
|
||
|
|
operations = [
|
||
|
|
migrations.AlterField(
|
||
|
|
model_name="project",
|
||
|
|
name="schema_version",
|
||
|
|
field=models.PositiveIntegerField(default=4),
|
||
|
|
),
|
||
|
|
migrations.RunPython(forwards, migrations.RunPython.noop),
|
||
|
|
]
|