From affb32c51397286c72ff7f812709ed3dd1524938 Mon Sep 17 00:00:00 2001 From: Kara Engelhardt Date: Thu, 12 Mar 2026 09:50:27 +0100 Subject: [PATCH] Add wallet plugins stub --- setup.cfg | 1 + src/pretix/_base_settings.py | 1 + src/pretix/base/ticketoutput.py | 11 +++++- src/pretix/control/forms/event.py | 2 +- src/pretix/control/views/event.py | 3 ++ src/pretix/plugins/wallet/__init__.py | 21 +++++++++++ src/pretix/plugins/wallet/apps.py | 41 +++++++++++++++++++++ src/pretix/plugins/wallet/signals.py | 41 +++++++++++++++++++++ src/pretix/plugins/wallet/ticketoutput.py | 45 +++++++++++++++++++++++ 9 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/pretix/plugins/wallet/__init__.py create mode 100644 src/pretix/plugins/wallet/apps.py create mode 100644 src/pretix/plugins/wallet/signals.py create mode 100644 src/pretix/plugins/wallet/ticketoutput.py diff --git a/setup.cfg b/setup.cfg index e7cdae97ca..04028a2e4a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,6 +32,7 @@ ignore = src/tests/plugins/stripe/* src/tests/plugins/sendmail/* src/tests/plugins/ticketoutputpdf/* + src/tests/plugins/wallet/* .* CODE_OF_CONDUCT.md CONTRIBUTING.md diff --git a/src/pretix/_base_settings.py b/src/pretix/_base_settings.py index 96121867a4..a401662e93 100644 --- a/src/pretix/_base_settings.py +++ b/src/pretix/_base_settings.py @@ -66,6 +66,7 @@ INSTALLED_APPS = [ 'pretix.plugins.returnurl', 'pretix.plugins.autocheckin', 'pretix.plugins.webcheckin', + 'pretix.plugins.wallet', 'django_countries', 'oauth2_provider', 'phonenumber_field', diff --git a/src/pretix/base/ticketoutput.py b/src/pretix/base/ticketoutput.py index 63087a93a4..6f6047ee85 100644 --- a/src/pretix/base/ticketoutput.py +++ b/src/pretix/base/ticketoutput.py @@ -114,7 +114,7 @@ class BaseTicketOutput: If you override this method, make sure that positions that are addons (i.e. ``addon_to`` is set) are only outputted if the event setting ``ticket_download_addons`` is active. Do the same for positions that are non-admission without ``ticket_download_nonadm`` active. - If you want, you can just iterate over ``order.positions_with_tickets`` which applies the + If you want, you can just iterate over ``self.get_tickets_to_print`` which applies the appropriate filters for you. """ with tempfile.TemporaryDirectory() as d: @@ -192,6 +192,15 @@ class BaseTicketOutput: """ pass + @property + def show_settings(self) -> bool: + """ + Returns whether or not this output should be shown in the ticket settings. + + .. note:: If you set this to false, you need to have some other mechanism to decide whether this output is enabled + """ + return True + @property def download_button_text(self) -> str: """ diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 6d672f204e..94997a470f 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -945,7 +945,7 @@ class TaxSettingsForm(EventSettingsValidationMixin, SettingsForm): class ProviderForm(SettingsForm): """ This is a SettingsForm, but if fields are set to required=True, validation - errors are only raised if the payment method is enabled. + errors are only raised if the provider is enabled. """ def __init__(self, *args, **kwargs): diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index d566050fca..a070c5363e 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -1068,6 +1068,9 @@ class TicketSettings(EventSettingsViewMixin, EventPermissionRequiredMixin, FormV responses = register_ticket_outputs.send(self.request.event) for receiver, response in responses: provider = response(self.request.event) + if not provider.show_settings: + continue + provider.form = ProviderForm( obj=self.request.event, settingspref='ticketoutput_%s_' % provider.identifier, diff --git a/src/pretix/plugins/wallet/__init__.py b/src/pretix/plugins/wallet/__init__.py new file mode 100644 index 0000000000..9616a7bf63 --- /dev/null +++ b/src/pretix/plugins/wallet/__init__.py @@ -0,0 +1,21 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-today pretix GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# diff --git a/src/pretix/plugins/wallet/apps.py b/src/pretix/plugins/wallet/apps.py new file mode 100644 index 0000000000..077e4d1fbb --- /dev/null +++ b/src/pretix/plugins/wallet/apps.py @@ -0,0 +1,41 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-today pretix GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + +from pretix import __version__ as version + + +class WalletApp(AppConfig): + name = 'pretix.plugins.wallet' + verbose_name = _("wallet") + + class PretixPluginMeta: + name = _("wallet") + author = _("the pretix team") + version = version + category = 'FORMAT' + description = _("Issue wallet passes for tickets (e.g. apple wallet, google wallet)") + + def ready(self): + from . import signals # NOQA + diff --git a/src/pretix/plugins/wallet/signals.py b/src/pretix/plugins/wallet/signals.py new file mode 100644 index 0000000000..40a6e5c6d2 --- /dev/null +++ b/src/pretix/plugins/wallet/signals.py @@ -0,0 +1,41 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-today pretix GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# + +from django.dispatch import receiver +from pretix.base.signals import register_ticket_outputs + + +@receiver(register_ticket_outputs, dispatch_uid="output_wallet") +def register_ticket_wallet(sender, **kwargs): + from .ticketoutput import WalletTicketOutput + return WalletTicketOutput + +@receiver(register_ticket_outputs, dispatch_uid="output_wallet_apple") +def register_ticket_wallet_apple(sender, **kwargs): + from .ticketoutput import AppleWalletTicketOutput + return AppleWalletTicketOutput + + +@receiver(register_ticket_outputs, dispatch_uid="output_wallet_google") +def register_ticket_wallet_google(sender, **kwargs): + from .ticketoutput import GoogleWalletTicketOutput + return GoogleWalletTicketOutput diff --git a/src/pretix/plugins/wallet/ticketoutput.py b/src/pretix/plugins/wallet/ticketoutput.py new file mode 100644 index 0000000000..84cb029fe8 --- /dev/null +++ b/src/pretix/plugins/wallet/ticketoutput.py @@ -0,0 +1,45 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-today pretix GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# +from collections import OrderedDict +import logging +from django.utils.translation import gettext_lazy as _ +from pretix.base.ticketoutput import BaseTicketOutput +from django import forms +logger = logging.getLogger('pretix.plugins.wallet') + + +class WalletTicketOutput(BaseTicketOutput): + identifier = 'wallet' + verbose_name = _('Wallet output') + + is_enabeld = False + preview_allowed = False + +class GoogleWalletTicketOutput(BaseTicketOutput): + identifier = 'google_wallet' + verbose_name = _('google') + show_settings = False + +class AppleWalletTicketOutput(BaseTicketOutput): + identifier = 'apple_wallet' + verbose_name = _('apple') + show_settings = False \ No newline at end of file