diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index a9d2bc15ac..85b89583da 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -13,7 +13,7 @@ from django.utils.translation import ugettext as _, ugettext_lazy from pretix.base.models import InvoiceAddress, Order, OrderPosition from ..exporter import BaseExporter -from ..signals import register_data_exporters, register_payment_providers +from ..signals import register_data_exporters class OrderListExporter(BaseExporter): @@ -73,11 +73,10 @@ class OrderListExporter(BaseExporter): writer.writerow(headers) - provider_names = {} - responses = register_payment_providers.send(self.event) - for rec, response in responses: - provider = response(self.event) - provider_names[provider.identifier] = provider.verbose_name + provider_names = { + k: v.verbose_name + for k, v in self.event.get_payment_providers().items() + } sum_cache = { (o['order__id'], o['tax_rate']): o for o in diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 400fa07dc3..52128a0208 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -313,6 +313,19 @@ class Event(LoggedModel): event_copy_data.send(sender=self, other=other) + def get_payment_providers(self) -> dict: + from ..signals import register_payment_providers + + responses = register_payment_providers.send(self) + providers = {} + for receiver, response in responses: + if not isinstance(response, list): + response = [response] + for p in response: + pp = p(self) + providers[pp.identifier] = pp + return providers + def generate_invite_token(): return get_random_string(length=32, allowed_chars=string.ascii_lowercase + string.digits) diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index b4bd94b8ea..4fca7791c7 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -24,7 +24,6 @@ from reportlab.platypus import ( from pretix.base.i18n import language from pretix.base.models import Invoice, InvoiceAddress, InvoiceLine, Order from pretix.base.services.async import TransactionAwareTask -from pretix.base.signals import register_payment_providers from pretix.celery_app import app from pretix.helpers.database import rolledback_transaction @@ -32,12 +31,7 @@ from pretix.helpers.database import rolledback_transaction @transaction.atomic def build_invoice(invoice: Invoice) -> Invoice: with language(invoice.locale): - responses = register_payment_providers.send(invoice.event) - for receiver, response in responses: - provider = response(invoice.event) - if provider.identifier == invoice.order.payment_provider: - payment_provider = provider - break + payment_provider = invoice.event.get_payment_providers().get(invoice.order.payment_provider) invoice.invoice_from = invoice.event.settings.get('invoice_address_from') diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index cc60765d5a..77bccf9729 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -30,9 +30,7 @@ from pretix.base.services.invoices import ( ) from pretix.base.services.locking import LockTimeoutException from pretix.base.services.mail import SendMailException, mail -from pretix.base.signals import ( - order_paid, order_placed, periodic_task, register_payment_providers, -) +from pretix.base.signals import order_paid, order_placed, periodic_task from pretix.celery_app import app from pretix.multidomain.urlreverse import build_absolute_uri @@ -366,12 +364,7 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str], email: str, locale: str, address: int, meta_info: dict=None): event = Event.objects.get(id=event) - responses = register_payment_providers.send(event) - pprov = None - for rec, response in responses: - provider = response(event) - if provider.identifier == payment_provider: - pprov = provider + pprov = event.get_payment_providers().get(payment_provider) if not pprov: raise OrderError(error_messages['internal']) @@ -637,10 +630,11 @@ class OrderChangeManager: def _recalculate_total_and_payment_fee(self): self.order.total = sum([p.price for p in self.order.positions.all()]) - if self.order.total == 0: - payment_fee = Decimal('0.00') - else: - payment_fee = self._get_payment_provider().calculate_fee(self.order.total) + payment_fee = Decimal('0.00') + if self.order.total != 0: + prov = self._get_payment_provider() + if prov: + payment_fee = prov.calculate_fee(self.order.total) self.order.payment_fee = payment_fee self.order.total += payment_fee self.order._calculate_tax() @@ -703,12 +697,7 @@ class OrderChangeManager: CachedTicket.objects.filter(order_position__order=self.order).delete() def _get_payment_provider(self): - responses = register_payment_providers.send(self.order.event) - pprov = None - for rec, response in responses: - provider = response(self.order.event) - if provider.identifier == self.order.payment_provider: - return provider + pprov = self.order.event.get_payment_providers().get(self.order.payment_provider) if not pprov: raise OrderError(error_messages['internal']) diff --git a/src/pretix/base/services/stats.py b/src/pretix/base/services/stats.py index 828b83038e..0b84414c89 100644 --- a/src/pretix/base/services/stats.py +++ b/src/pretix/base/services/stats.py @@ -5,7 +5,6 @@ from django.db.models import Count, Sum from django.utils.translation import ugettext_lazy as _ from pretix.base.models import Event, Item, ItemCategory, Order, OrderPosition -from pretix.base.signals import register_payment_providers class DummyObject: @@ -182,11 +181,10 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]], } num_total = dictsum(num_pending, num_paid) - provider_names = {} - responses = register_payment_providers.send(event) - for receiver, response in responses: - provider = response(event) - provider_names[provider.identifier] = provider.verbose_name + provider_names = { + k: v.verbose_name + for k, v in event.get_payment_providers().items() + } for pprov, total in num_total.items(): ppobj = DummyObject() diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 121fad66f0..d26fec04a9 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -102,7 +102,8 @@ class EventOrderFilterForm(OrderFilterForm): self.event = kwargs.pop('event') super().__init__(*args, **kwargs) self.fields['item'].queryset = self.event.items.all() - self.fields['provider'].choices += [(p['name'], p['verbose_name']) for p in self.get_payment_providers()] + self.fields['provider'].choices += [(k, v.verbose_name) for k, v + in self.event.get_payment_providers().items()] def filter_qs(self, qs): fdata = self.cleaned_data diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index e85602d2a4..b76367d41d 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -26,9 +26,7 @@ from pretix.base.models import ( ) from pretix.base.services import tickets from pretix.base.services.invoices import build_preview_invoice_pdf -from pretix.base.signals import ( - event_live_issues, register_payment_providers, register_ticket_outputs, -) +from pretix.base.signals import event_live_issues, register_ticket_outputs from pretix.control.forms.event import ( DisplaySettingsForm, EventSettingsForm, EventUpdateForm, InvoiceSettingsForm, MailSettingsForm, PaymentSettingsForm, ProviderForm, @@ -183,9 +181,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi @cached_property def provider_forms(self) -> list: providers = [] - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) + for provider in self.request.event.get_payment_providers().values(): provider.form = ProviderForm( obj=self.request.event, settingspref='payment_%s_' % provider.identifier, @@ -655,9 +651,7 @@ class EventLive(EventPermissionRequiredMixin, TemplateView): ) has_payment_provider = False - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) + for provider in self.request.event.get_payment_providers().values(): if provider.is_enabled and provider.identifier != 'free': has_payment_provider = True break diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 6fa00761f6..3149343805 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -27,9 +27,7 @@ from pretix.base.services.orders import ( OrderChangeManager, OrderError, cancel_order, mark_order_paid, ) from pretix.base.services.stats import order_overview -from pretix.base.signals import ( - register_data_exporters, register_payment_providers, -) +from pretix.base.signals import register_data_exporters from pretix.base.views.async import AsyncAction from pretix.control.forms.filter import EventOrderFilterForm from pretix.control.forms.orders import ( @@ -106,11 +104,7 @@ class OrderView(EventPermissionRequiredMixin, DetailView): @cached_property def payment_provider(self): - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if provider.identifier == self.order.payment_provider: - return provider + return self.request.event.get_payment_providers().get(self.order.payment_provider) def get_order_url(self): return reverse('control:event.order', kwargs={ diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index 099d9ba162..cdaf475567 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -13,7 +13,6 @@ from pretix.base.models import Order from pretix.base.models.orders import InvoiceAddress from pretix.base.services.cart import set_cart_addons from pretix.base.services.orders import perform_order -from pretix.base.signals import register_payment_providers from pretix.multidomain.urlreverse import eventreverse from pretix.presale.forms.checkout import ( AddOnsForm, ContactForm, InvoiceAddressForm, @@ -353,9 +352,7 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep): @cached_property def provider_forms(self): providers = [] - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) + for provider in self.request.event.get_payment_providers().values(): if not provider.is_enabled or not provider.is_allowed(self.request): continue fee = provider.calculate_fee(self._total_order_value) @@ -392,11 +389,7 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep): @cached_property def payment_provider(self): - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if provider.identifier == self.request.session['payment']: - return provider + return self.request.event.get_payment_providers().get(self.request.session['payment']) def is_completed(self, request, warn=False): self.request = request @@ -464,11 +457,7 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep): @cached_property def payment_provider(self): - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if provider.identifier == self.request.session['payment']: - return provider + return self.request.event.get_payment_providers().get(self.request.session['payment']) @cached_property def invoice_address(self): diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index 813be0f97e..7f25422854 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -8,7 +8,6 @@ from django.utils.timezone import now from pretix.base.decimal import round_decimal from pretix.base.models import CartPosition, OrderPosition -from pretix.base.signals import register_payment_providers class CartMixin: @@ -117,11 +116,9 @@ class CartMixin: return Decimal('0.00') payment_fee = 0 if 'payment' in self.request.session: - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if provider.identifier == self.request.session['payment']: - payment_fee = provider.calculate_fee(total) + provider = self.request.event.get_payment_providers().get(self.request.session['payment']) + if provider: + payment_fee = provider.calculate_fee(total) return payment_fee diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index e422367a3c..1de61fb391 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -18,9 +18,7 @@ from pretix.base.services.orders import cancel_order from pretix.base.services.tickets import ( get_cachedticket_for_order, get_cachedticket_for_position, ) -from pretix.base.signals import ( - register_payment_providers, register_ticket_outputs, -) +from pretix.base.signals import register_ticket_outputs from pretix.multidomain.urlreverse import eventreverse from pretix.presale.forms.checkout import InvoiceAddressForm from pretix.presale.views import CartMixin, EventViewMixin @@ -46,11 +44,7 @@ class OrderDetailMixin: @cached_property def payment_provider(self): - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) - if provider.identifier == self.order.payment_provider: - return provider + return self.request.event.get_payment_providers().get(self.order.payment_provider) def get_order_url(self): return eventreverse(self.request.event, 'presale:event.order', kwargs={ @@ -112,9 +106,7 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TemplateView): ) ctx['can_change_method'] = False - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) + for provider in self.request.event.get_payment_providers().values(): if (provider.identifier != self.order.payment_provider and provider.is_enabled and provider.order_change_allowed(self.order)): ctx['can_change_method'] = True @@ -295,9 +287,7 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView): @cached_property def provider_forms(self): providers = [] - responses = register_payment_providers.send(self.request.event) - for receiver, response in responses: - provider = response(self.request.event) + for provider in self.request.event.get_payment_providers().values(): if provider.identifier == self.order.payment_provider: continue if not provider.is_enabled or not provider.order_change_allowed(self.order):