Unify all calls to register_payment_providers

This commit is contained in:
Raphael Michel
2017-06-29 12:09:48 +02:00
parent d5d1fcf331
commit 2add8d671a
11 changed files with 48 additions and 90 deletions

View File

@@ -13,7 +13,7 @@ from django.utils.translation import ugettext as _, ugettext_lazy
from pretix.base.models import InvoiceAddress, Order, OrderPosition from pretix.base.models import InvoiceAddress, Order, OrderPosition
from ..exporter import BaseExporter from ..exporter import BaseExporter
from ..signals import register_data_exporters, register_payment_providers from ..signals import register_data_exporters
class OrderListExporter(BaseExporter): class OrderListExporter(BaseExporter):
@@ -73,11 +73,10 @@ class OrderListExporter(BaseExporter):
writer.writerow(headers) writer.writerow(headers)
provider_names = {} provider_names = {
responses = register_payment_providers.send(self.event) k: v.verbose_name
for rec, response in responses: for k, v in self.event.get_payment_providers().items()
provider = response(self.event) }
provider_names[provider.identifier] = provider.verbose_name
sum_cache = { sum_cache = {
(o['order__id'], o['tax_rate']): o for o in (o['order__id'], o['tax_rate']): o for o in

View File

@@ -313,6 +313,19 @@ class Event(LoggedModel):
event_copy_data.send(sender=self, other=other) 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(): def generate_invite_token():
return get_random_string(length=32, allowed_chars=string.ascii_lowercase + string.digits) return get_random_string(length=32, allowed_chars=string.ascii_lowercase + string.digits)

View File

@@ -24,7 +24,6 @@ from reportlab.platypus import (
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.base.models import Invoice, InvoiceAddress, InvoiceLine, Order from pretix.base.models import Invoice, InvoiceAddress, InvoiceLine, Order
from pretix.base.services.async import TransactionAwareTask from pretix.base.services.async import TransactionAwareTask
from pretix.base.signals import register_payment_providers
from pretix.celery_app import app from pretix.celery_app import app
from pretix.helpers.database import rolledback_transaction from pretix.helpers.database import rolledback_transaction
@@ -32,12 +31,7 @@ from pretix.helpers.database import rolledback_transaction
@transaction.atomic @transaction.atomic
def build_invoice(invoice: Invoice) -> Invoice: def build_invoice(invoice: Invoice) -> Invoice:
with language(invoice.locale): with language(invoice.locale):
responses = register_payment_providers.send(invoice.event) payment_provider = invoice.event.get_payment_providers().get(invoice.order.payment_provider)
for receiver, response in responses:
provider = response(invoice.event)
if provider.identifier == invoice.order.payment_provider:
payment_provider = provider
break
invoice.invoice_from = invoice.event.settings.get('invoice_address_from') invoice.invoice_from = invoice.event.settings.get('invoice_address_from')

View File

@@ -30,9 +30,7 @@ from pretix.base.services.invoices import (
) )
from pretix.base.services.locking import LockTimeoutException from pretix.base.services.locking import LockTimeoutException
from pretix.base.services.mail import SendMailException, mail from pretix.base.services.mail import SendMailException, mail
from pretix.base.signals import ( from pretix.base.signals import order_paid, order_placed, periodic_task
order_paid, order_placed, periodic_task, register_payment_providers,
)
from pretix.celery_app import app from pretix.celery_app import app
from pretix.multidomain.urlreverse import build_absolute_uri 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): email: str, locale: str, address: int, meta_info: dict=None):
event = Event.objects.get(id=event) event = Event.objects.get(id=event)
responses = register_payment_providers.send(event) pprov = event.get_payment_providers().get(payment_provider)
pprov = None
for rec, response in responses:
provider = response(event)
if provider.identifier == payment_provider:
pprov = provider
if not pprov: if not pprov:
raise OrderError(error_messages['internal']) raise OrderError(error_messages['internal'])
@@ -637,10 +630,11 @@ class OrderChangeManager:
def _recalculate_total_and_payment_fee(self): def _recalculate_total_and_payment_fee(self):
self.order.total = sum([p.price for p in self.order.positions.all()]) self.order.total = sum([p.price for p in self.order.positions.all()])
if self.order.total == 0: payment_fee = Decimal('0.00')
payment_fee = Decimal('0.00') if self.order.total != 0:
else: prov = self._get_payment_provider()
payment_fee = self._get_payment_provider().calculate_fee(self.order.total) if prov:
payment_fee = prov.calculate_fee(self.order.total)
self.order.payment_fee = payment_fee self.order.payment_fee = payment_fee
self.order.total += payment_fee self.order.total += payment_fee
self.order._calculate_tax() self.order._calculate_tax()
@@ -703,12 +697,7 @@ class OrderChangeManager:
CachedTicket.objects.filter(order_position__order=self.order).delete() CachedTicket.objects.filter(order_position__order=self.order).delete()
def _get_payment_provider(self): def _get_payment_provider(self):
responses = register_payment_providers.send(self.order.event) pprov = self.order.event.get_payment_providers().get(self.order.payment_provider)
pprov = None
for rec, response in responses:
provider = response(self.order.event)
if provider.identifier == self.order.payment_provider:
return provider
if not pprov: if not pprov:
raise OrderError(error_messages['internal']) raise OrderError(error_messages['internal'])

View File

@@ -5,7 +5,6 @@ from django.db.models import Count, Sum
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from pretix.base.models import Event, Item, ItemCategory, Order, OrderPosition from pretix.base.models import Event, Item, ItemCategory, Order, OrderPosition
from pretix.base.signals import register_payment_providers
class DummyObject: class DummyObject:
@@ -182,11 +181,10 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
} }
num_total = dictsum(num_pending, num_paid) num_total = dictsum(num_pending, num_paid)
provider_names = {} provider_names = {
responses = register_payment_providers.send(event) k: v.verbose_name
for receiver, response in responses: for k, v in event.get_payment_providers().items()
provider = response(event) }
provider_names[provider.identifier] = provider.verbose_name
for pprov, total in num_total.items(): for pprov, total in num_total.items():
ppobj = DummyObject() ppobj = DummyObject()

View File

@@ -102,7 +102,8 @@ class EventOrderFilterForm(OrderFilterForm):
self.event = kwargs.pop('event') self.event = kwargs.pop('event')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['item'].queryset = self.event.items.all() 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): def filter_qs(self, qs):
fdata = self.cleaned_data fdata = self.cleaned_data

View File

@@ -26,9 +26,7 @@ from pretix.base.models import (
) )
from pretix.base.services import tickets from pretix.base.services import tickets
from pretix.base.services.invoices import build_preview_invoice_pdf from pretix.base.services.invoices import build_preview_invoice_pdf
from pretix.base.signals import ( from pretix.base.signals import event_live_issues, register_ticket_outputs
event_live_issues, register_payment_providers, register_ticket_outputs,
)
from pretix.control.forms.event import ( from pretix.control.forms.event import (
DisplaySettingsForm, EventSettingsForm, EventUpdateForm, DisplaySettingsForm, EventSettingsForm, EventUpdateForm,
InvoiceSettingsForm, MailSettingsForm, PaymentSettingsForm, ProviderForm, InvoiceSettingsForm, MailSettingsForm, PaymentSettingsForm, ProviderForm,
@@ -183,9 +181,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi
@cached_property @cached_property
def provider_forms(self) -> list: def provider_forms(self) -> list:
providers = [] providers = []
responses = register_payment_providers.send(self.request.event) for provider in self.request.event.get_payment_providers().values():
for receiver, response in responses:
provider = response(self.request.event)
provider.form = ProviderForm( provider.form = ProviderForm(
obj=self.request.event, obj=self.request.event,
settingspref='payment_%s_' % provider.identifier, settingspref='payment_%s_' % provider.identifier,
@@ -655,9 +651,7 @@ class EventLive(EventPermissionRequiredMixin, TemplateView):
) )
has_payment_provider = False has_payment_provider = False
responses = register_payment_providers.send(self.request.event) for provider in self.request.event.get_payment_providers().values():
for receiver, response in responses:
provider = response(self.request.event)
if provider.is_enabled and provider.identifier != 'free': if provider.is_enabled and provider.identifier != 'free':
has_payment_provider = True has_payment_provider = True
break break

View File

@@ -27,9 +27,7 @@ from pretix.base.services.orders import (
OrderChangeManager, OrderError, cancel_order, mark_order_paid, OrderChangeManager, OrderError, cancel_order, mark_order_paid,
) )
from pretix.base.services.stats import order_overview from pretix.base.services.stats import order_overview
from pretix.base.signals import ( from pretix.base.signals import register_data_exporters
register_data_exporters, register_payment_providers,
)
from pretix.base.views.async import AsyncAction from pretix.base.views.async import AsyncAction
from pretix.control.forms.filter import EventOrderFilterForm from pretix.control.forms.filter import EventOrderFilterForm
from pretix.control.forms.orders import ( from pretix.control.forms.orders import (
@@ -106,11 +104,7 @@ class OrderView(EventPermissionRequiredMixin, DetailView):
@cached_property @cached_property
def payment_provider(self): def payment_provider(self):
responses = register_payment_providers.send(self.request.event) return self.request.event.get_payment_providers().get(self.order.payment_provider)
for receiver, response in responses:
provider = response(self.request.event)
if provider.identifier == self.order.payment_provider:
return provider
def get_order_url(self): def get_order_url(self):
return reverse('control:event.order', kwargs={ return reverse('control:event.order', kwargs={

View File

@@ -13,7 +13,6 @@ from pretix.base.models import Order
from pretix.base.models.orders import InvoiceAddress from pretix.base.models.orders import InvoiceAddress
from pretix.base.services.cart import set_cart_addons from pretix.base.services.cart import set_cart_addons
from pretix.base.services.orders import perform_order from pretix.base.services.orders import perform_order
from pretix.base.signals import register_payment_providers
from pretix.multidomain.urlreverse import eventreverse from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.forms.checkout import ( from pretix.presale.forms.checkout import (
AddOnsForm, ContactForm, InvoiceAddressForm, AddOnsForm, ContactForm, InvoiceAddressForm,
@@ -353,9 +352,7 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
@cached_property @cached_property
def provider_forms(self): def provider_forms(self):
providers = [] providers = []
responses = register_payment_providers.send(self.request.event) for provider in self.request.event.get_payment_providers().values():
for receiver, response in responses:
provider = response(self.request.event)
if not provider.is_enabled or not provider.is_allowed(self.request): if not provider.is_enabled or not provider.is_allowed(self.request):
continue continue
fee = provider.calculate_fee(self._total_order_value) fee = provider.calculate_fee(self._total_order_value)
@@ -392,11 +389,7 @@ class PaymentStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
@cached_property @cached_property
def payment_provider(self): def payment_provider(self):
responses = register_payment_providers.send(self.request.event) return self.request.event.get_payment_providers().get(self.request.session['payment'])
for receiver, response in responses:
provider = response(self.request.event)
if provider.identifier == self.request.session['payment']:
return provider
def is_completed(self, request, warn=False): def is_completed(self, request, warn=False):
self.request = request self.request = request
@@ -464,11 +457,7 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
@cached_property @cached_property
def payment_provider(self): def payment_provider(self):
responses = register_payment_providers.send(self.request.event) return self.request.event.get_payment_providers().get(self.request.session['payment'])
for receiver, response in responses:
provider = response(self.request.event)
if provider.identifier == self.request.session['payment']:
return provider
@cached_property @cached_property
def invoice_address(self): def invoice_address(self):

View File

@@ -8,7 +8,6 @@ from django.utils.timezone import now
from pretix.base.decimal import round_decimal from pretix.base.decimal import round_decimal
from pretix.base.models import CartPosition, OrderPosition from pretix.base.models import CartPosition, OrderPosition
from pretix.base.signals import register_payment_providers
class CartMixin: class CartMixin:
@@ -117,11 +116,9 @@ class CartMixin:
return Decimal('0.00') return Decimal('0.00')
payment_fee = 0 payment_fee = 0
if 'payment' in self.request.session: if 'payment' in self.request.session:
responses = register_payment_providers.send(self.request.event) provider = self.request.event.get_payment_providers().get(self.request.session['payment'])
for receiver, response in responses: if provider:
provider = response(self.request.event) payment_fee = provider.calculate_fee(total)
if provider.identifier == self.request.session['payment']:
payment_fee = provider.calculate_fee(total)
return payment_fee return payment_fee

View File

@@ -18,9 +18,7 @@ from pretix.base.services.orders import cancel_order
from pretix.base.services.tickets import ( from pretix.base.services.tickets import (
get_cachedticket_for_order, get_cachedticket_for_position, get_cachedticket_for_order, get_cachedticket_for_position,
) )
from pretix.base.signals import ( from pretix.base.signals import register_ticket_outputs
register_payment_providers, register_ticket_outputs,
)
from pretix.multidomain.urlreverse import eventreverse from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.forms.checkout import InvoiceAddressForm from pretix.presale.forms.checkout import InvoiceAddressForm
from pretix.presale.views import CartMixin, EventViewMixin from pretix.presale.views import CartMixin, EventViewMixin
@@ -46,11 +44,7 @@ class OrderDetailMixin:
@cached_property @cached_property
def payment_provider(self): def payment_provider(self):
responses = register_payment_providers.send(self.request.event) return self.request.event.get_payment_providers().get(self.order.payment_provider)
for receiver, response in responses:
provider = response(self.request.event)
if provider.identifier == self.order.payment_provider:
return provider
def get_order_url(self): def get_order_url(self):
return eventreverse(self.request.event, 'presale:event.order', kwargs={ return eventreverse(self.request.event, 'presale:event.order', kwargs={
@@ -112,9 +106,7 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TemplateView):
) )
ctx['can_change_method'] = False ctx['can_change_method'] = False
responses = register_payment_providers.send(self.request.event) for provider in self.request.event.get_payment_providers().values():
for receiver, response in responses:
provider = response(self.request.event)
if (provider.identifier != self.order.payment_provider and provider.is_enabled if (provider.identifier != self.order.payment_provider and provider.is_enabled
and provider.order_change_allowed(self.order)): and provider.order_change_allowed(self.order)):
ctx['can_change_method'] = True ctx['can_change_method'] = True
@@ -295,9 +287,7 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView):
@cached_property @cached_property
def provider_forms(self): def provider_forms(self):
providers = [] providers = []
responses = register_payment_providers.send(self.request.event) for provider in self.request.event.get_payment_providers().values():
for receiver, response in responses:
provider = response(self.request.event)
if provider.identifier == self.order.payment_provider: if provider.identifier == self.order.payment_provider:
continue continue
if not provider.is_enabled or not provider.order_change_allowed(self.order): if not provider.is_enabled or not provider.order_change_allowed(self.order):