add migrations with fixups

This commit is contained in:
Mira Weller
2026-04-28 14:03:56 +02:00
parent f1a4b51604
commit 111127c0fa
2 changed files with 84 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
# Generated by Django 5.2.12 on 2026-04-28 11:34
import logging
from django.db import migrations
from django.db.models import Count, F
logger = logging.getLogger(__name__)
def fix_cross_organizer_eventmetavalues(apps, schema_editor):
EventMetaProperty = apps.get_model("pretixbase", "EventMetaProperty")
EventMetaValue = apps.get_model("pretixbase", "EventMetaValue")
cross_org_values = EventMetaValue.objects.filter(event__organizer__pk__ne=F('property__organizer__pk'))
for emv in cross_org_values:
logger.info(f'Fixup {emv.event.organizer.slug}/{emv.event.slug}\n before: {emv.property.name}({emv.property.id}@{emv.property.organizer.slug}) = {emv.value}')
try:
emv.property = emv.event.organizer.meta_properties.filter(name=emv.property.name).first()
logger.info(f' found existing EventMetaProperty in {emv.event.organizer.slug}')
except EventMetaProperty.DoesNotExist:
meta_prop = emv.property
meta_prop.pk = None
meta_prop.organizer = emv.event.organizer
meta_prop.save(force_insert=True)
logger.info(f' created new EventMetaProperty')
emv.property = meta_prop
# TODO: how to handle new duplicates in EventMetaValue.property
logger.info(f' after: {emv.property.name}({emv.property.id}@{emv.property.organizer.slug}) = {emv.value}')
emv.save()
def make_eventmetaproperties_unique(apps, schema_editor):
EventMetaProperty = apps.get_model("pretixbase", "EventMetaProperty")
EventMetaValue = apps.get_model("pretixbase", "EventMetaValue")
duplicates = EventMetaProperty.objects.values('organizer', 'organizer__slug', 'name').annotate(count=Count('id')).filter(count__gt=1)
for dup in duplicates:
logger.info(f'Fixup {dup['organizer__slug']} {dup['name']}')
props = list(EventMetaProperty.objects.filter(organizer=dup['organizer'], name=dup['name']))
# TODO: any better idea than picking the property to keep more or less randomly (first in database order)?
target = props[0]
invalid = props[1:]
# TODO: how to handle new duplicates in EventMetaValue.property
affected = EventMetaValue.objects.filter(
event__organizer=dup['organizer'], property__in=invalid
).update(
property=target
)
logger.info(f' Switching {affected} value(s) over to {target.name}({target.id}@{target.organizer.slug})')
for prop in invalid:
logger.info(f' Deleting {prop.name}({prop.id}@{prop.organizer.slug})')
prop.delete()
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0298_pluggable_permissions"),
]
operations = [
migrations.RunPython(fix_cross_organizer_eventmetavalues, migrations.RunPython.noop),
migrations.RunPython(make_eventmetaproperties_unique, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.2.12 on 2026-04-28 11:34
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0299_fixup_eventmetaproperties"),
]
operations = [
migrations.AlterUniqueTogether(
name="eventmetaproperty",
unique_together={("organizer", "name")},
),
]