forked from CGM_Public/pretix_original
Basic payment provider settings form API
This commit is contained in:
@@ -1,10 +1,36 @@
|
|||||||
|
from pretix.base.settings import SettingsSandbox
|
||||||
|
|
||||||
|
|
||||||
class BasePaymentProvider:
|
class BasePaymentProvider:
|
||||||
"""
|
"""
|
||||||
This is the base class for all payment providers.
|
This is the base class for all payment providers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def get_identifier(self) -> str:
|
def __init__(self, event):
|
||||||
|
self.event = event
|
||||||
|
self.settings = SettingsSandbox('payment', self.identifier, event)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.identifier
|
||||||
|
|
||||||
|
@property
|
||||||
|
def verbose_name(self) -> str:
|
||||||
"""
|
"""
|
||||||
Return a unique identifier for this payment provider
|
A human-readable name for this payment provider
|
||||||
|
"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
@property
|
||||||
|
def identifier(self) -> str:
|
||||||
|
"""
|
||||||
|
A unique identifier for this payment provider
|
||||||
|
"""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def settings_form_fields(self) -> dict:
|
||||||
|
"""
|
||||||
|
A dictionary. The keys should be (unprefixed) EventSetting keys,
|
||||||
|
the values should be corresponding django form fields
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
{% extends "pretixcontrol/event/settings_base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% block inside %}
|
||||||
|
<form action="" method="post" class="form-horizontal form-plugins">
|
||||||
|
{% csrf_token %}
|
||||||
|
<fieldset>
|
||||||
|
<legend>{% trans "Payment settings" %}</legend>
|
||||||
|
{% if "success" in request.GET %}
|
||||||
|
<div class="alert alert-success">
|
||||||
|
{% trans "Your changes have been saved." %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% for provider in providers %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<h3 class="panel-title">{{ provider.verbose_name }}</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{% bootstrap_form provider.form layout='horizontal' %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</fieldset>
|
||||||
|
<div class="form-group submit-group">
|
||||||
|
<button type="submit" class="btn btn-primary btn-save">
|
||||||
|
{% trans "Save" %}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
@@ -3,11 +3,18 @@
|
|||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
{% block title %}{{ request.event.name }}{% endblock %}
|
{% block title %}{{ request.event.name }}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>{% trans "Settings" %}</h1>
|
<h1>{% trans "Settings" %}</h1>
|
||||||
<ul class="nav nav-pills">
|
<ul class="nav nav-pills">
|
||||||
<li {% if "event.settings" == url_name %}class="active"{% endif %}><a href="{% url 'control:event.settings' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "General settings" %}</a></li>
|
<li {% if "event.settings" == url_name %}class="active"{% endif %}>
|
||||||
<li {% if "event.settings.plugins" == url_name %}class="active"{% endif %}><a href="{% url 'control:event.settings.plugins' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Plugins" %}</a></li>
|
<a href="{% url 'control:event.settings' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "General settings" %}</a>
|
||||||
</ul>
|
</li>
|
||||||
{% block inside %}
|
<li {% if "event.settings.payment" == url_name %}class="active"{% endif %}>
|
||||||
{% endblock %}
|
<a href="{% url 'control:event.settings.payment' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Payment" %}</a>
|
||||||
|
</li>
|
||||||
|
<li {% if "event.settings.plugins" == url_name %}class="active"{% endif %}>
|
||||||
|
<a href="{% url 'control:event.settings.plugins' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Plugins" %}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{% block inside %}
|
||||||
|
{% endblock %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ urlpatterns += patterns(
|
|||||||
url(r'^$', 'event.index', name='event.index'),
|
url(r'^$', 'event.index', name='event.index'),
|
||||||
url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),
|
url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),
|
||||||
url(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'),
|
url(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'),
|
||||||
|
url(r'^settings/payment$', event.PaymentSettings.as_view(), name='event.settings.payment'),
|
||||||
url(r'^items/$', item.ItemList.as_view(), name='event.items'),
|
url(r'^items/$', item.ItemList.as_view(), name='event.items'),
|
||||||
url(r'^items/add$', item.ItemCreate.as_view(), name='event.items.add'),
|
url(r'^items/add$', item.ItemCreate.as_view(), name='event.items.add'),
|
||||||
url(r'^items/(?P<item>[0-9a-f-]+)/$', item.ItemUpdateGeneral.as_view(), name='event.item'),
|
url(r'^items/(?P<item>[0-9a-f-]+)/$', item.ItemUpdateGeneral.as_view(), name='event.item'),
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import render, redirect
|
||||||
|
from django.utils.functional import cached_property
|
||||||
from django.views.generic.edit import UpdateView
|
from django.views.generic.edit import UpdateView
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
from django.views.generic.detail import SingleObjectMixin
|
from django.views.generic.detail import SingleObjectMixin
|
||||||
@@ -7,9 +8,10 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
from pytz import common_timezones
|
from pytz import common_timezones
|
||||||
from pretix.base.forms import VersionedModelForm
|
|
||||||
|
|
||||||
|
from pretix.base.forms import VersionedModelForm, SettingsForm
|
||||||
from pretix.base.models import Event
|
from pretix.base.models import Event
|
||||||
|
from pretix.base.signals import register_payment_providers
|
||||||
from pretix.control.permissions import EventPermissionRequiredMixin
|
from pretix.control.permissions import EventPermissionRequiredMixin
|
||||||
|
|
||||||
|
|
||||||
@@ -106,5 +108,65 @@ class EventPlugins(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin
|
|||||||
}) + '?success=true'
|
}) + '?success=true'
|
||||||
|
|
||||||
|
|
||||||
|
class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
|
||||||
|
|
||||||
|
model = Event
|
||||||
|
context_object_name = 'event'
|
||||||
|
permission = 'can_change_settings'
|
||||||
|
template_name = 'pretixcontrol/event/payment.html'
|
||||||
|
|
||||||
|
def get_object(self, queryset=None) -> Event:
|
||||||
|
return self.request.event
|
||||||
|
|
||||||
|
@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)
|
||||||
|
provider.form = SettingsForm(
|
||||||
|
obj=self.request.event,
|
||||||
|
data=(self.request.POST if self.request.method == 'POST' else None)
|
||||||
|
)
|
||||||
|
provider.form.fields = {
|
||||||
|
'payment_%s_%s' % (provider.identifier, k): v
|
||||||
|
for k, v in provider.settings_form_fields.items()
|
||||||
|
}
|
||||||
|
provider.form.fields['payment_%s' % provider.identifier] = forms.BooleanField(
|
||||||
|
label=_('Enable payment method')
|
||||||
|
)
|
||||||
|
providers.append(provider)
|
||||||
|
return providers
|
||||||
|
|
||||||
|
def get_context_data(self, *args, **kwargs) -> dict:
|
||||||
|
context = super().get_context_data(*args, **kwargs)
|
||||||
|
return context
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
self.object = self.get_object()
|
||||||
|
context = self.get_context_data(object=self.object)
|
||||||
|
context['providers'] = self.provider_forms
|
||||||
|
return self.render_to_response(context)
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
self.object = self.get_object()
|
||||||
|
success = True
|
||||||
|
for provider in self.provider_forms:
|
||||||
|
if provider.form.is_valid():
|
||||||
|
provider.form.save()
|
||||||
|
else:
|
||||||
|
success = False
|
||||||
|
if success:
|
||||||
|
return redirect(self.get_success_url())
|
||||||
|
else:
|
||||||
|
return self.get(request)
|
||||||
|
|
||||||
|
def get_success_url(self) -> str:
|
||||||
|
return reverse('control:event.settings.payment', kwargs={
|
||||||
|
'organizer': self.get_object().organizer.slug,
|
||||||
|
'event': self.get_object().slug,
|
||||||
|
}) + '?success=true'
|
||||||
|
|
||||||
|
|
||||||
def index(request, organizer, event):
|
def index(request, organizer, event):
|
||||||
return render(request, 'pretixcontrol/event/index.html', {})
|
return render(request, 'pretixcontrol/event/index.html', {})
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
from pretix.base.payment import BasePaymentProvider
|
from pretix.base.payment import BasePaymentProvider
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class BankTransfer(BasePaymentProvider):
|
class BankTransfer(BasePaymentProvider):
|
||||||
pass
|
identifier = 'banktransfer'
|
||||||
|
verbose_name = _('Bank transfer')
|
||||||
|
settings_form_fields = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user