sendmail: Do not copy rules with subevent when closing an event (Z#23233683) (#6156)

This commit is contained in:
pajowu
2026-05-06 15:56:06 +02:00
committed by GitHub
parent 14708eef80
commit 5bbbf0334d
3 changed files with 60 additions and 2 deletions

View File

@@ -0,0 +1,19 @@
from django.db import migrations
from django.db.models import F
def remove_cross_event_scheduled_mails(apps, schema_editor):
Rule = apps.get_model("sendmail", "Rule")
ScheduledMail = apps.get_model("sendmail", "ScheduledMail")
ScheduledMail.objects.filter(rule__subevent__isnull=False).exclude(rule__subevent__event=F('rule__event')).delete()
Rule.objects.filter(subevent__isnull=False).exclude(subevent__event=F('event')).delete()
class Migration(migrations.Migration):
dependencies = [
("sendmail", "0010_auto_20250801_1342"),
]
operations = [
migrations.RunPython(remove_cross_event_scheduled_mails),
]

View File

@@ -232,7 +232,7 @@ def sendmail_copy_data_receiver(sender, other, item_map, **kwargs):
if sender.sendmail_rules.exists(): # idempotency
return
for r in other.sendmail_rules.prefetch_related('limit_products'):
for r in other.sendmail_rules.filter(subevent__isnull=True).prefetch_related('limit_products'):
limit_products = list(r.limit_products.all())
r = copy.copy(r)
r.pk = None

View File

@@ -25,10 +25,11 @@ from zoneinfo import ZoneInfo
import pytest
from django.core import mail as djmail
from django.db.models import F
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import InvoiceAddress, Order
from pretix.base.models import Event, InvoiceAddress, Order
from pretix.base.services.checkin import perform_checkin
from pretix.plugins.sendmail.models import Rule, ScheduledMail
from pretix.plugins.sendmail.signals import sendmail_run_rules
@@ -687,3 +688,41 @@ def test_sendmail_context_localization(event, order, pos):
sendmail_run_rules(None)
assert "Hallo Herr Mustermann" in djmail.outbox[0].body
@pytest.mark.django_db
@scopes_disabled()
def test_event_clone_ignores_rules_with_subevent(event, order, pos):
event.has_subevents = True
event.save()
se1 = event.subevents.create(name="subevent 1", date_from=dt_now)
event.sendmail_rules.create(date_is_absolute=False, send_offset_days=1, send_offset_time=datetime.time(hour=12),
subject='Mail To Subevent', template='TestBody', subevent=se1)
event.sendmail_rules.create(date_is_absolute=False, send_offset_days=1, send_offset_time=datetime.time(hour=12),
subject='Mail To All', template='TestBody')
assert event.sendmail_rules.count() == 2
assert event.scheduledmail_set.count() == 2
for rule in event.sendmail_rules.all():
assert rule.scheduledmail_set.count() == 1
copied_event = Event.objects.create(
organizer=event.organizer, name='Dummy2', slug='dummy2',
date_from=datetime.datetime(2022, 4, 15, 9, 0, 0, tzinfo=datetime.timezone.utc),
has_subevents=True
)
copied_event.copy_data_from(event)
copied_event.refresh_from_db()
event.refresh_from_db()
assert copied_event.sendmail_rules.count() == 1
assert copied_event.sendmail_rules.first().scheduledmail_set.count() == 0
assert str(copied_event.sendmail_rules.first().subject) == "Mail To All"
copied_event.subevents.create(name="subevent 1 in copied", date_from=dt_now)
assert copied_event.sendmail_rules.first().scheduledmail_set.count() == 1
# Double-Check: no scheduled mails and rules exist where subevent.event and event do not align
assert ScheduledMail.objects.filter(rule__subevent__isnull=False).exclude(rule__subevent__event=F('rule__event')).count() == 0
assert Rule.objects.filter(subevent__isnull=False).exclude(subevent__event=F('event')).count() == 0