forked from CGM_Public/pretix_original
Allow filtering by payment provider in order search
This commit is contained in:
@@ -50,6 +50,17 @@ class BasePaymentProvider:
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.identifier
|
return self.identifier
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_meta(self) -> bool:
|
||||||
|
"""
|
||||||
|
Returns whether or whether not this payment provider is a "meta" payment provider that only
|
||||||
|
works as a settings holder for other payment providers and should never be used directly. This
|
||||||
|
is a trick to implement payment gateways with multiple payment methods but unified payment settings.
|
||||||
|
Take a look at the built-in stripe provider to see how this might be used.
|
||||||
|
By default, this returns ``False``.
|
||||||
|
"""
|
||||||
|
return False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_enabled(self) -> bool:
|
def is_enabled(self) -> bool:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -1,12 +1,47 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
from django.apps import apps
|
||||||
from django.db.models import Exists, OuterRef, Q
|
from django.db.models import Exists, OuterRef, Q
|
||||||
from django.db.models.functions import Concat
|
from django.db.models.functions import Concat
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
|
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
|
||||||
|
|
||||||
from pretix.base.models import Invoice, Item, Order, Organizer, SubEvent
|
from pretix.base.models import Event, Invoice, Item, Order, Organizer, SubEvent
|
||||||
from pretix.base.signals import register_payment_providers
|
from pretix.base.signals import register_payment_providers
|
||||||
from pretix.control.utils.i18n import i18ncomp
|
from pretix.control.utils.i18n import i18ncomp
|
||||||
|
from pretix.helpers.database import rolledback_transaction
|
||||||
|
|
||||||
|
PAYMENT_PROVIDERS = []
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_payment_providers():
|
||||||
|
global PAYMENT_PROVIDERS
|
||||||
|
|
||||||
|
if PAYMENT_PROVIDERS:
|
||||||
|
return PAYMENT_PROVIDERS
|
||||||
|
|
||||||
|
with rolledback_transaction():
|
||||||
|
event = Event.objects.create(
|
||||||
|
plugins=",".join([app.name for app in apps.get_app_configs()]),
|
||||||
|
name="INTERNAL",
|
||||||
|
date_from=now(),
|
||||||
|
organizer=Organizer.objects.create(name="INTERNAL")
|
||||||
|
)
|
||||||
|
provs = register_payment_providers.send(
|
||||||
|
sender=event
|
||||||
|
)
|
||||||
|
choices = []
|
||||||
|
for recv, prov in provs:
|
||||||
|
if isinstance(prov, list):
|
||||||
|
for p in prov:
|
||||||
|
p = p(event)
|
||||||
|
if not p.is_meta:
|
||||||
|
choices.append((p.identifier, p.verbose_name))
|
||||||
|
else:
|
||||||
|
prov = prov(event)
|
||||||
|
if not prov.is_meta:
|
||||||
|
choices.append((prov.identifier, prov.verbose_name))
|
||||||
|
PAYMENT_PROVIDERS = choices
|
||||||
|
return choices
|
||||||
|
|
||||||
|
|
||||||
class FilterForm(forms.Form):
|
class FilterForm(forms.Form):
|
||||||
@@ -36,6 +71,13 @@ class OrderFilterForm(FilterForm):
|
|||||||
}),
|
}),
|
||||||
required=False
|
required=False
|
||||||
)
|
)
|
||||||
|
provider = forms.ChoiceField(
|
||||||
|
label=_('Payment provider'),
|
||||||
|
choices=[
|
||||||
|
('', _('All payment providers')),
|
||||||
|
],
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
status = forms.ChoiceField(
|
status = forms.ChoiceField(
|
||||||
label=_('Order status'),
|
label=_('Order status'),
|
||||||
choices=(
|
choices=(
|
||||||
@@ -96,6 +138,9 @@ class OrderFilterForm(FilterForm):
|
|||||||
if fdata.get('ordering'):
|
if fdata.get('ordering'):
|
||||||
qs = qs.order_by(dict(self.fields['ordering'].choices)[fdata.get('ordering')])
|
qs = qs.order_by(dict(self.fields['ordering'].choices)[fdata.get('ordering')])
|
||||||
|
|
||||||
|
if fdata.get('provider'):
|
||||||
|
qs = qs.filter(payment_provider=fdata.get('provider'))
|
||||||
|
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
|
||||||
@@ -109,13 +154,6 @@ class EventOrderFilterForm(OrderFilterForm):
|
|||||||
required=False,
|
required=False,
|
||||||
empty_label=_('All products')
|
empty_label=_('All products')
|
||||||
)
|
)
|
||||||
provider = forms.ChoiceField(
|
|
||||||
label=_('Payment provider'),
|
|
||||||
choices=[
|
|
||||||
('', _('All payment providers')),
|
|
||||||
],
|
|
||||||
required=False,
|
|
||||||
)
|
|
||||||
subevent = forms.ModelChoiceField(
|
subevent = forms.ModelChoiceField(
|
||||||
label=pgettext_lazy('subevent', 'Date'),
|
label=pgettext_lazy('subevent', 'Date'),
|
||||||
queryset=SubEvent.objects.none(),
|
queryset=SubEvent.objects.none(),
|
||||||
@@ -123,17 +161,6 @@ class EventOrderFilterForm(OrderFilterForm):
|
|||||||
empty_label=pgettext_lazy('subevent', 'All dates')
|
empty_label=pgettext_lazy('subevent', 'All dates')
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_payment_providers(self):
|
|
||||||
providers = []
|
|
||||||
responses = register_payment_providers.send(self.event)
|
|
||||||
for receiver, response in responses:
|
|
||||||
provider = response(self.event)
|
|
||||||
providers.append({
|
|
||||||
'name': provider.identifier,
|
|
||||||
'verbose_name': provider.verbose_name
|
|
||||||
})
|
|
||||||
return providers
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.event = kwargs.pop('event')
|
self.event = kwargs.pop('event')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@@ -156,9 +183,6 @@ class EventOrderFilterForm(OrderFilterForm):
|
|||||||
if fdata.get('subevent'):
|
if fdata.get('subevent'):
|
||||||
qs = qs.filter(positions__subevent=fdata.get('subevent'))
|
qs = qs.filter(positions__subevent=fdata.get('subevent'))
|
||||||
|
|
||||||
if fdata.get('provider'):
|
|
||||||
qs = qs.filter(payment_provider=fdata.get('provider'))
|
|
||||||
|
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
|
||||||
@@ -183,6 +207,7 @@ class OrderSearchFilterForm(OrderFilterForm):
|
|||||||
self.fields['organizer'].queryset = Organizer.objects.filter(
|
self.fields['organizer'].queryset = Organizer.objects.filter(
|
||||||
pk__in=request.user.teams.values_list('organizer', flat=True)
|
pk__in=request.user.teams.values_list('organizer', flat=True)
|
||||||
)
|
)
|
||||||
|
self.fields['provider'].choices += get_all_payment_providers()
|
||||||
|
|
||||||
def filter_qs(self, qs):
|
def filter_qs(self, qs):
|
||||||
fdata = self.cleaned_data
|
fdata = self.cleaned_data
|
||||||
|
|||||||
@@ -7,15 +7,18 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>{% trans "Order search" %}</h1>
|
<h1>{% trans "Order search" %}</h1>
|
||||||
<form class="row filter-form" action="" method="get">
|
<form class="row filter-form" action="" method="get">
|
||||||
<div class="col-md-4 col-sm-6 col-xs-12">
|
<div class="col-md-3 col-sm-6 col-xs-12">
|
||||||
{% bootstrap_field filter_form.query layout='inline' %}
|
{% bootstrap_field filter_form.query layout='inline' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12">
|
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||||
{% bootstrap_field filter_form.status layout='inline' %}
|
{% bootstrap_field filter_form.status layout='inline' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12">
|
<div class="col-md-3 col-sm-6 col-xs-12">
|
||||||
{% bootstrap_field filter_form.organizer layout='inline' %}
|
{% bootstrap_field filter_form.organizer layout='inline' %}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-2 col-xs-6">
|
||||||
|
{% bootstrap_field filter_form.provider layout='inline' %}
|
||||||
|
</div>
|
||||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||||
<button class="btn btn-primary btn-block" type="submit">
|
<button class="btn btn-primary btn-block" type="submit">
|
||||||
<span class="fa fa-filter"></span>
|
<span class="fa fa-filter"></span>
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ class StripeSettingsHolder(BasePaymentProvider):
|
|||||||
identifier = 'stripe_settings'
|
identifier = 'stripe_settings'
|
||||||
verbose_name = _('Stripe')
|
verbose_name = _('Stripe')
|
||||||
is_enabled = False
|
is_enabled = False
|
||||||
|
is_meta = True
|
||||||
|
|
||||||
def __init__(self, event: Event):
|
def __init__(self, event: Event):
|
||||||
super().__init__(event)
|
super().__init__(event)
|
||||||
|
|||||||
Reference in New Issue
Block a user