forked from CGM_Public/pretix_original
Reduced version without schema change and DB migration
This commit is contained in:
@@ -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),
|
|
||||||
]
|
|
||||||
@@ -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")},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1847,7 +1847,6 @@ class EventMetaProperty(LoggedModel):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ("position", "name",)
|
ordering = ("position", "name",)
|
||||||
unique_together = ('organizer', 'name')
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def choice_keys(self):
|
def choice_keys(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user