From 55588abd448d0917a13afc8b41035395bf48490b Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Fri, 26 Jan 2024 17:55:50 +0100 Subject: [PATCH] add test cases --- src/pretix/base/models/orders.py | 5 +- src/pretix/base/services/orders.py | 14 ++--- src/pretix/base/services/tickets.py | 10 +--- src/pretix/base/settings.py | 1 + .../plugins/ticketoutputpdf/ticketoutput.py | 1 - src/pretix/presale/views/order.py | 4 +- src/tests/base/test_orders.py | 55 ++++++++++++++++++- src/tests/testdummy/ticketoutput.py | 4 ++ 8 files changed, 70 insertions(+), 24 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 1a991f8ea..a973d2f98 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -44,7 +44,7 @@ from datetime import datetime, time, timedelta from decimal import Decimal from functools import reduce from time import sleep -from typing import Any, Dict, List, Union, Iterable +from typing import Any, Dict, Iterable, List, Union from zoneinfo import ZoneInfo import dateutil @@ -79,7 +79,7 @@ from pretix.base.i18n import language from pretix.base.models import Customer, User from pretix.base.reldate import RelativeDateWrapper from pretix.base.settings import PERSON_NAME_SCHEMES -from pretix.base.signals import order_gracefully_delete, allow_ticket_download +from pretix.base.signals import allow_ticket_download, order_gracefully_delete from ...helpers import OF_SELF from ...helpers.countries import CachedCountries, FastCountryField @@ -1209,7 +1209,6 @@ class Order(LockModel, LoggedModel): return create - def answerfile_name(instance, filename: str) -> str: secret = get_random_string(length=32, allowed_chars=string.ascii_letters + string.digits) event = (instance.cartposition if instance.cartposition else instance.orderposition.order).event diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index f168de4a2..79b5cafa3 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -98,10 +98,9 @@ from pretix.base.services.pricing import ( from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.tasks import ProfiledEventTask, ProfiledTask from pretix.base.signals import ( - allow_ticket_download, order_approved, order_canceled, order_changed, - order_denied, order_expired, order_fee_calculation, order_paid, - order_placed, order_split, order_valid_if_pending, periodic_task, - validate_order, + order_approved, order_canceled, order_changed, order_denied, order_expired, + order_fee_calculation, order_paid, order_placed, order_split, + order_valid_if_pending, periodic_task, validate_order, ) from pretix.celery_app import app from pretix.helpers import OF_SELF @@ -1409,7 +1408,7 @@ def send_download_reminders(sender, **kwargs): # Race condition continue positions = o.positions_with_tickets - if not positions: + if not list(positions): continue if not o.ticket_download_available: @@ -1435,10 +1434,7 @@ def send_download_reminders(sender, **kwargs): logger.exception('Reminder email could not be sent') if event.settings.mail_send_download_reminder_attendee: - for p in o.positions.all(): - if not p.generate_ticket: - continue - + for p in o.positions_with_tickets: if p.subevent_id: reminder_date = (p.subevent.date_from - timedelta(days=days)).replace( hour=0, minute=0, second=0, microsecond=0 diff --git a/src/pretix/base/services/tickets.py b/src/pretix/base/services/tickets.py index dd7826145..b667c3611 100644 --- a/src/pretix/base/services/tickets.py +++ b/src/pretix/base/services/tickets.py @@ -21,7 +21,6 @@ # import logging import os -from typing import Iterable from django.core.files.base import ContentFile from django.utils.timezone import now @@ -35,7 +34,7 @@ from pretix.base.models import ( ) from pretix.base.services.tasks import EventTask, ProfiledTask from pretix.base.settings import PERSON_NAME_SCHEMES -from pretix.base.signals import allow_ticket_download, register_ticket_outputs +from pretix.base.signals import register_ticket_outputs from pretix.celery_app import app from pretix.helpers.database import rolledback_transaction @@ -125,8 +124,8 @@ def preview(event: int, provider: str): def get_tickets_for_order(order, base_position=None): - positions_with_ticket = order.positions_with_tickets - if not positions_with_ticket: + positions = list(order.positions_with_tickets) + if not positions: return [] if not order.ticket_download_available: return [] @@ -136,10 +135,8 @@ def get_tickets_for_order(order, base_position=None): for receiver, response in register_ticket_outputs.send(order.event) ] - tickets = [] - positions = list(positions_with_ticket) if base_position: # Only the given position and its children positions = [ @@ -203,7 +200,6 @@ def get_tickets_for_order(order, base_position=None): )) except: logger.exception('Failed to generate ticket.') - return tickets diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 88e5aa789..8b486b3b7 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -3733,6 +3733,7 @@ class SettingsSandbox: del self._event.settings[self._convert_key(key)] def get(self, key: str, default: Any = None, as_type: type = str, binary_file: bool = False): + print(self._convert_key(key)) return self._event.settings.get( self._convert_key(key), default=default, as_type=as_type, binary_file=binary_file ) diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index c62137c1c..66e926165 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -116,7 +116,6 @@ class PdfTicketOutput(BaseTicketOutput): merger = PdfWriter() with language(order.locale, self.event.settings.region): for op in self.get_tickets_to_print(order): - print("generating ticket ",op) layout = override_layout.send_chained( order.event, 'layout', orderposition=op, layout=self.layout_map.get( (op.item_id, self.override_channel or order.sales_channel), diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index ba26b416a..e418c830a 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -80,9 +80,7 @@ from pretix.base.services.orders import ( ) from pretix.base.services.pricing import get_price from pretix.base.services.tickets import generate, invalidate_cache -from pretix.base.signals import ( - allow_ticket_download, order_modified, register_ticket_outputs, -) +from pretix.base.signals import order_modified, register_ticket_outputs from pretix.base.templatetags.money import money_filter from pretix.base.views.mixins import OrderQuestionsViewMixin from pretix.base.views.tasks import AsyncAction diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index d0f9ba4f9..93565535c 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -55,6 +55,7 @@ from pretix.base.services.orders import ( send_expiry_warnings, ) from pretix.plugins.banktransfer.payment import BankTransfer +from pretix.testutils.mock import mocker_context from pretix.testutils.scope import classscope @@ -820,7 +821,7 @@ class DownloadReminderTests(TestCase): self.event = Event.objects.create( organizer=self.o, name='Dummy', slug='dummy', date_from=now() + timedelta(days=2), - plugins='pretix.plugins.banktransfer' + plugins='pretix.plugins.banktransfer,tests.testdummy' ) self.order = Order.objects.create( code='FOO', event=self.event, email='dummy@dummy.test', @@ -853,6 +854,58 @@ class DownloadReminderTests(TestCase): send_download_reminders(sender=self.event) assert len(djmail.outbox) == 0 + @classscope(attr='o') + def test_downloads_disabled_by_plugin(self): + with mocker_context() as mocker: + self.event.settings.mail_days_download_reminder = 2 + + from pretix.base.signals import allow_ticket_download + mocker.patch('pretix.base.signals.allow_ticket_download.send') + allow_ticket_download.send.return_value = [(None, [])] + + send_download_reminders(sender=self.event) + assert len(djmail.outbox) == 0 + + @classscope(attr='o') + def test_downloads_all_allowed_by_plugin(self): + with mocker_context() as mocker: + self.event.settings.mail_days_download_reminder = 2 + self.event.settings.mail_attach_tickets = True + self.event.settings.ticketoutput_testdummy__enabled = True + + self.op2 = OrderPosition.objects.create( + order=self.order, item=self.ticket, variation=None, + price=Decimal("42.00"), attendee_name_parts={"full_name": "Mary"}, positionid=2 + ) + + from pretix.base.signals import allow_ticket_download + mocker.patch('pretix.base.signals.allow_ticket_download.send') + allow_ticket_download.send.return_value = [(None, True)] + + send_download_reminders(sender=self.event) + assert len(djmail.outbox) == 1 + assert len(djmail.outbox[0].attachments) == 2 + + @classscope(attr='o') + def test_downloads_partially_disabled_by_plugin(self): + with mocker_context() as mocker: + self.event.settings.mail_days_download_reminder = 2 + self.event.settings.mail_attach_tickets = True + self.event.settings.ticketoutput_testdummy__enabled = True + + self.op2 = OrderPosition.objects.create( + order=self.order, item=self.ticket, variation=None, + price=Decimal("42.00"), attendee_name_parts={"full_name": "Mary"}, positionid=2 + ) + + from pretix.base.signals import allow_ticket_download + mocker.patch('pretix.base.signals.allow_ticket_download.send') + allow_ticket_download.send.return_value = [(None, [self.op2])] + + send_download_reminders(sender=self.event) + assert len(djmail.outbox) == 1 + assert len(djmail.outbox[0].attachments) == 1 + @classscope(attr='o') def test_disabled(self): send_download_reminders(sender=self.event) diff --git a/src/tests/testdummy/ticketoutput.py b/src/tests/testdummy/ticketoutput.py index 12c496d11..df02557ad 100644 --- a/src/tests/testdummy/ticketoutput.py +++ b/src/tests/testdummy/ticketoutput.py @@ -33,3 +33,7 @@ class DummyTicketOutput(BaseTicketOutput): def generate(self, op): return 'test.txt', 'text/plain', str(op.order.id) + + @property + def multi_download_enabled(self) -> bool: + return False