Allow hidden payment methods on payment method change (#3682)

* Allow hidden payment methods on payment method change

* Save hashes to meta data
This commit is contained in:
Raphael Michel
2023-11-03 13:42:34 +01:00
committed by GitHub
parent 10b515f1d1
commit e0e2b2d7f7
3 changed files with 30 additions and 6 deletions

View File

@@ -817,7 +817,7 @@ class BasePaymentProvider:
""" """
return "" return ""
def order_change_allowed(self, order: Order) -> bool: def order_change_allowed(self, order: Order, request: HttpRequest=None) -> bool:
""" """
Will be called to check whether it is allowed to change the payment method of Will be called to check whether it is allowed to change the payment method of
an order to this one. an order to this one.
@@ -835,7 +835,12 @@ class BasePaymentProvider:
return False return False
if self.settings.get('_hidden', as_type=bool): if self.settings.get('_hidden', as_type=bool):
return False if request:
hashes = set(request.session.get('pretix_unlock_hashes', [])) | set(order.meta_info_data.get('unlock_hashes', []))
if hashlib.sha256((self.settings._hidden_seed + self.event.slug).encode()).hexdigest() not in hashes:
return False
else:
return False
restricted_countries = self.settings.get('_restricted_countries', as_type=list) restricted_countries = self.settings.get('_restricted_countries', as_type=list)
if restricted_countries: if restricted_countries:

View File

@@ -1515,6 +1515,9 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
str(m) for m in self.confirm_messages.values() str(m) for m in self.confirm_messages.values()
] ]
} }
unlock_hashes = request.session.get('pretix_unlock_hashes', [])
if unlock_hashes:
meta_info['unlock_hashes'] = unlock_hashes
for receiver, response in order_meta_from_request.send(sender=request.event, request=request): for receiver, response in order_meta_from_request.send(sender=request.event, request=request):
meta_info.update(response) meta_info.update(response)

View File

@@ -289,9 +289,17 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TicketPageMixin,
ctx['can_pay'] = False ctx['can_pay'] = False
for provider in self.request.event.get_payment_providers().values(): for provider in self.request.event.get_payment_providers().values():
if provider.is_enabled and provider.order_change_allowed(self.order): if provider.is_enabled:
ctx['can_pay'] = True
break if 'request' in inspect.signature(provider.order_change_allowed).parameters:
if provider.is_enabled and provider.order_change_allowed(self.order, request=self.request):
ctx['can_pay'] = True
break
else:
if provider.is_enabled and provider.order_change_allowed(self.order):
ctx['can_pay'] = True
break
if lp and lp.state not in (OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED, if lp and lp.state not in (OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED,
OrderPayment.PAYMENT_STATE_CANCELED): OrderPayment.PAYMENT_STATE_CANCELED):
@@ -665,8 +673,16 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView):
providers = [] providers = []
pending_sum = self.order.pending_sum pending_sum = self.order.pending_sum
for provider in self.request.event.get_payment_providers().values(): for provider in self.request.event.get_payment_providers().values():
if not provider.is_enabled or not provider.order_change_allowed(self.order): if not provider.is_enabled:
continue continue
if 'request' in inspect.signature(provider.order_change_allowed).parameters:
if not provider.order_change_allowed(self.order, request=self.request):
continue
else:
if not provider.order_change_allowed(self.order):
continue
current_fee = sum(f.value for f in self.open_fees) or Decimal('0.00') current_fee = sum(f.value for f in self.open_fees) or Decimal('0.00')
fee = provider.calculate_fee(pending_sum - current_fee) fee = provider.calculate_fee(pending_sum - current_fee)
if 'order' in inspect.signature(provider.payment_form_render).parameters: if 'order' in inspect.signature(provider.payment_form_render).parameters: