From 6df5895d52abc904cb2f92ffb9dd30f4eb769f3e Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Tue, 23 Jun 2026 18:27:57 +0200 Subject: [PATCH] Reduced version without schema change and DB migration --- .../0299_fixup_eventmetaproperties.py | 81 ------------------- ...alter_eventmetaproperty_unique_together.py | 17 ---- src/pretix/base/models/event.py | 1 - 3 files changed, 99 deletions(-) delete mode 100644 src/pretix/base/migrations/0299_fixup_eventmetaproperties.py delete mode 100644 src/pretix/base/migrations/0300_alter_eventmetaproperty_unique_together.py diff --git a/src/pretix/base/migrations/0299_fixup_eventmetaproperties.py b/src/pretix/base/migrations/0299_fixup_eventmetaproperties.py deleted file mode 100644 index d00fb3d69e..0000000000 --- a/src/pretix/base/migrations/0299_fixup_eventmetaproperties.py +++ /dev/null @@ -1,81 +0,0 @@ -# Generated by Django 5.2.12 on 2026-04-28 11:34 -import logging - -from django.db import IntegrityError, migrations, transaction -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 cross-organizer value {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}") - if EventMetaValue.objects.filter(event=emv.event, property=emv.property).exists(): - logger.info(f" EventMetaValue with property in correct organizer already exists, deleting the cross-organizer one") - emv.delete() - continue - 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 - logger.info(f" after: {emv.property.name}({emv.property.id}@{emv.property.organizer.slug}) = {emv.value}") - emv.save(update_fields=["property"]) - - -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 duplicate property {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:] - - try: - with transaction.atomic(): - 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})") - - except IntegrityError as e: - logger.info(f" Failed to switch all value(s) over to {target.name}({target.id}@{target.organizer.slug})") - logger.info(f" {e}") - for prop in invalid: - newname = f'{prop.name}_DUPLICATE_{prop.id}' - logger.info(f" Renaming {prop.name}({prop.id}@{prop.organizer.slug}) to {newname}({prop.id}@{prop.organizer.slug})") - prop.name = newname - prop.save() - - else: - 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), - ] diff --git a/src/pretix/base/migrations/0300_alter_eventmetaproperty_unique_together.py b/src/pretix/base/migrations/0300_alter_eventmetaproperty_unique_together.py deleted file mode 100644 index 5d992fb3ca..0000000000 --- a/src/pretix/base/migrations/0300_alter_eventmetaproperty_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# 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")}, - ), - ] diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index a9cbf40dca..1e6c174611 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -1847,7 +1847,6 @@ class EventMetaProperty(LoggedModel): class Meta: ordering = ("position", "name",) - unique_together = ('organizer', 'name') @property def choice_keys(self):