From 2a2deea67c7cd1e7f4a15b3b2af3ccbeed2b1ad3 Mon Sep 17 00:00:00 2001 From: Phin Wolkwitz Date: Mon, 27 Apr 2026 12:40:45 +0200 Subject: [PATCH] Extend PDF placeholder and copying tests --- .../0299_itemprogramtime_location.py | 2 +- src/pretix/base/pdf.py | 23 +++++++++++-------- src/pretix/control/forms/item.py | 2 +- src/tests/base/test_event_clone.py | 7 +++++- src/tests/control/test_items.py | 4 +++- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/pretix/base/migrations/0299_itemprogramtime_location.py b/src/pretix/base/migrations/0299_itemprogramtime_location.py index 882d97a786..390b33d72d 100644 --- a/src/pretix/base/migrations/0299_itemprogramtime_location.py +++ b/src/pretix/base/migrations/0299_itemprogramtime_location.py @@ -1,7 +1,7 @@ # Generated by Django 4.2.27 on 2026-01-21 12:06 -from django.db import migrations, models import i18nfield.fields +from django.db import migrations class Migration(migrations.Migration): diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index 21a62e7e07..85ccad03c2 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -60,6 +60,7 @@ from django.dispatch import receiver from django.utils.deconstruct import deconstructible from django.utils.formats import date_format from django.utils.html import conditional_escape +from django.utils.text import normalize_newlines from django.utils.timezone import now from django.utils.translation import gettext_lazy as _, pgettext from i18nfield.strings import LazyI18nString @@ -498,9 +499,9 @@ DEFAULT_VARIABLES = OrderedDict(( ) if op.valid_until else "" }), ("program_times", { - "label": _("Program times: date and time"), + "label": _("Program times"), "editor_sample": _( - "2017-05-31 10:00 – 12:00\n2017-05-31 14:00 – 16:00\n2017-05-31 14:00 – 2017-06-01 14:00"), + "2017-05-31 10:00 – 12:00 Room 1\n2017-05-31 14:00 – 16:00 Room 2\n2017-05-31 14:00 – 2017-06-01 14:00 Building A"), "evaluate": lambda op, order, ev: get_program_times(op, ev) }), ("medium_identifier", { @@ -748,13 +749,17 @@ def get_seat(op: OrderPosition): def get_program_times(op: OrderPosition, ev: Event): - return '\n'.join([ - datetimerange( - pt.start.astimezone(ev.timezone), - pt.end.astimezone(ev.timezone), - as_html=False - ) for pt in op.item.program_times.all() - ]) + ptstr = [] + for pt in op.item.program_times.all(): + ptstr.append([ + datetimerange( + pt.start.astimezone(ev.timezone), + pt.end.astimezone(ev.timezone), + as_html=False + ), + ', ' + normalize_newlines(str(pt.location)).replace('\n', ', ') if pt.location else '', + ]) + return '\n'.join(''.join(l) for l in ptstr) def generate_compressed_addon_list(op, order, event, only_checked_in=False): diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 93d5839fc1..6c097f2b88 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -574,7 +574,7 @@ class ItemCreateForm(I18nModelForm): instance.bundles.create(bundled_item=b.bundled_item, bundled_variation=b.bundled_variation, count=b.count, designated_price=b.designated_price) for pt in self.cleaned_data['copy_from'].program_times.all(): - instance.program_times.create(start=pt.start, end=pt.end) + instance.program_times.create(start=pt.start, end=pt.end, location=pt.location) item_copy_data.send(sender=self.event, source=self.cleaned_data['copy_from'], target=instance) diff --git a/src/tests/base/test_event_clone.py b/src/tests/base/test_event_clone.py index 784bd079a4..a003bf54ec 100644 --- a/src/tests/base/test_event_clone.py +++ b/src/tests/base/test_event_clone.py @@ -82,7 +82,11 @@ def test_full_clone_same_organizer(): assert item1.meta_data ItemProgramTime.objects.create(item=item1, start=datetime.datetime(2017, 12, 27, 0, 0, 0, tzinfo=datetime.timezone.utc), - end=datetime.datetime(2017, 12, 28, 0, 0, 0, tzinfo=datetime.timezone.utc)) + end=datetime.datetime(2017, 12, 28, 0, 0, 0, tzinfo=datetime.timezone.utc), + location={ + "en": "Testlocation", + "de": "Testort" + }) assert item1.program_times item2 = event.items.create(category=category, tax_rule=tax_rule, name="T-shirt", default_price=15, hidden_if_item_available=item1) @@ -169,6 +173,7 @@ def test_full_clone_same_organizer(): assert copied_item1.meta_data == item1.meta_data assert copied_item1.program_times.first().start == item1.program_times.first().start assert copied_item1.program_times.first().end == item1.program_times.first().end + assert copied_item1.program_times.first().location == item1.program_times.first().location assert copied_item2.variations.get().meta_data == item2v.meta_data assert copied_item1.hidden_if_available == copied_q2 assert copied_item1.grant_membership_type == membership_type diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index d7d37eaaac..4d274e8ca6 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -692,7 +692,8 @@ class ItemsTest(ItemFormTest): self.item2.program_times.create(start=datetime.datetime(2017, 12, 27, 0, 0, 0, tzinfo=datetime.timezone.utc), end=datetime.datetime(2017, 12, 28, 0, 0, 0, - tzinfo=datetime.timezone.utc)) + tzinfo=datetime.timezone.utc), + location={"en": "Testlocation", "de": "Testort"}) doc = self.get_doc('/control/event/%s/%s/items/add?copy_from=%d' % (self.orga1.slug, self.event1.slug, self.item2.pk)) data = extract_form_fields(doc.select("form")[0]) @@ -723,6 +724,7 @@ class ItemsTest(ItemFormTest): assert set([str(v.value) for v in i_new.variations.all()]) == set([str(v.value) for v in i_old.variations.all()]) assert i_old.program_times.first().start == i_new.program_times.first().start assert i_old.program_times.first().end == i_new.program_times.first().end + assert i_old.program_times.first().location == i_new.program_times.first().location def test_add_to_existing_quota(self): with scopes_disabled():