mirror of
https://github.com/pretix/pretix.git
synced 2026-05-18 17:24:03 +00:00
116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
import json
|
|
from typing import Any
|
|
|
|
from django import forms
|
|
from django.http import Http404
|
|
from django.urls import reverse
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.views.generic import CreateView, DetailView, ListView
|
|
from pretix.base.pdf import get_images, get_variables
|
|
from pretix.control.permissions import EventPermissionRequiredMixin
|
|
from django.conf import settings
|
|
from .models import WalletLayout
|
|
from .styles import AVAILABLE_STYLES, AVAILABLE_PLATFORMS
|
|
|
|
|
|
def get_layout_variables(event):
|
|
return {
|
|
"text": {
|
|
varname: {"label": var["label"], "editor_sample": var["editor_sample"]}
|
|
for varname, var in get_variables(event).items()
|
|
},
|
|
"image": {
|
|
varname: {"label": var["label"]}
|
|
for varname, var in get_images(event).items()
|
|
}
|
|
| {"poweredby": {"label": _("pretix-Logo")}}, # TODO: image upload
|
|
}
|
|
|
|
def get_editor_variables(event):
|
|
return {t: {vid: {"label": v.get("label"), "editor_sample": v.get("editor_sample")} for vid,v in vs.items()} for t,vs in get_layout_variables(event).items()}
|
|
|
|
|
|
# TODO: should this even be a list view?
|
|
class LayoutListView(EventPermissionRequiredMixin, ListView):
|
|
model = WalletLayout
|
|
permission = "can_change_event_settings"
|
|
template_name = "pretixplugins/wallet/layout_list.html"
|
|
context_object_name = "layouts"
|
|
|
|
def get_queryset(self):
|
|
return self.request.event.wallet_layouts
|
|
|
|
def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
|
|
ctx = super().get_context_data(**kwargs)
|
|
ctx["platforms"] = AVAILABLE_PLATFORMS
|
|
return ctx
|
|
|
|
|
|
class LayoutEditorView(DetailView):
|
|
template_name = "pretixplugins/wallet/edit.html"
|
|
model = WalletLayout
|
|
permission = "event.settings.general:write"
|
|
pk_url_kwarg = "layout"
|
|
|
|
def get_platform_styles(self):
|
|
if self.object.platform not in AVAILABLE_STYLES:
|
|
raise Http404(
|
|
_("Unknown platform '{platform}'").format(platform=self.object.platform)
|
|
)
|
|
return AVAILABLE_STYLES[self.object.platform]
|
|
|
|
def get_context_data(self, **kwargs) -> dict[str, Any]:
|
|
context = super().get_context_data(**kwargs)
|
|
context["styles"] = {
|
|
style.identifier: style.asdict() for style in self.get_platform_styles()
|
|
}
|
|
context["variables"] = get_editor_variables(self.request.event)
|
|
context['locales'] = {l: dict(settings.LANGUAGES).get(l, l) for l in self.request.event.settings.get('locales')}
|
|
|
|
return context
|
|
|
|
|
|
class WalletLayoutCreateForm(forms.ModelForm):
|
|
class Meta:
|
|
model = WalletLayout
|
|
fields = ("name",)
|
|
|
|
def __init__(self, *args, platform, event, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.platform = platform
|
|
self.event = event
|
|
|
|
def save(self, *args, **kwargs) -> Any:
|
|
self.instance.platform = self.platform
|
|
self.instance.event = self.event
|
|
return super().save(*args, **kwargs)
|
|
|
|
|
|
class LayoutCreateView(CreateView):
|
|
template_name = "pretixplugins/wallet/create.html"
|
|
form_class = WalletLayoutCreateForm
|
|
permission = "event.settings.general:write"
|
|
|
|
@property
|
|
def platform(self):
|
|
platform = self.kwargs["platform"]
|
|
if platform not in AVAILABLE_PLATFORMS:
|
|
raise Http404(_("Unknown platform '{platform}'").format(platform=platform))
|
|
return platform
|
|
|
|
def get_form_kwargs(self) -> dict[str, Any]:
|
|
kwargs = super().get_form_kwargs()
|
|
kwargs["platform"] = self.platform
|
|
kwargs["event"] = self.request.event
|
|
return kwargs
|
|
|
|
def get_success_url(self) -> str:
|
|
return reverse(
|
|
"plugins:wallet:edit",
|
|
kwargs={
|
|
"organizer": self.request.event.organizer.slug,
|
|
"event": self.request.event.slug,
|
|
"layout": self.object.pk,
|
|
},
|
|
)
|