WIP: use api

This commit is contained in:
Kara Engelhardt
2026-04-13 19:28:38 +02:00
parent 477b1e42d4
commit 30b64546a7
12 changed files with 299 additions and 201 deletions

View File

@@ -1,22 +1,20 @@
import json
from typing import Any
from django import forms
from django.http import Http404
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import FormView, ListView, CreateView, UpdateView
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 .styles import PassLayout, get_platform_styles, get_platforms
from .models import WalletLayout
import json
from django.utils.translation import gettext_lazy as _
from django import forms
from django.core.exceptions import ValidationError
from i18nfield.fields import I18nCharField
from i18nfield.forms import I18nModelForm
from pretix.api.serializers.i18n import I18nAwareModelSerializer
from rest_framework import serializers
from rest_framework.renderers import JSONRenderer
from .styles import get_platform_styles, get_platforms
# TODO: should this even be a list view?
class LayoutListView(EventPermissionRequiredMixin, ListView):
model = WalletLayout
@@ -33,102 +31,24 @@ class LayoutListView(EventPermissionRequiredMixin, ListView):
return ctx
class LayoutEditForm(forms.ModelForm):
style = forms.ChoiceField()
def __init__(self, **kwargs):
self.platform = kwargs.pop('platform')
super().__init__(**kwargs)
class Meta:
model = WalletLayout
fields = ("name","style","layout")
def __init__(self, event, platform, **kwargs):
super().__init__(**kwargs)
self.event = event
self.platform = platform
self.platform_styles = get_platform_styles(platform)
self.fields["style"].choices = [
(id, style.name) for id, style in self.platform_styles.items()
]
def coerce_style(self, value):
return self.platform_styles[value]
def clean_layout(self):
layout = self.cleaned_data["layout"]
if not isinstance(layout, dict):
raise ValidationError(_("Layout must be a dict"))
return layout
def clean(self):
if "style" in self.cleaned_data and "layout" in self.cleaned_data:
layout = PassLayout(
style=self.coerce_style(self.cleaned_data["style"]), layout=self.cleaned_data["layout"]
)
layout.validate(self.event)
return self.cleaned_data
class LayoutSerializer(I18nAwareModelSerializer):
# # TODO: only necessary if we save through this serializer
# style = serializers.ChoiceField(choices={})
# def __init__(self, *args, platform, **kwargs):
# super().__init__(*args, **kwargs)
# self.platform = platform
# self.platform_styles = get_platform_styles(platform)
# self.fields["style"].choices = [
# (id, style.name) for id, style in self.platform_styles.items()
# ]
class Meta:
model = WalletLayout
fields = ("name","style","layout")
class LayoutEditorView(EventPermissionRequiredMixin, UpdateView):
class LayoutEditorView(DetailView):
template_name = "pretixplugins/wallet/edit.html"
form_class = LayoutEditForm
model = WalletLayout
permission = "can_change_event_settings" # TODO: new permission name
permission = "event.settings.general:write"
pk_url_kwarg = "layout"
@property
def platform(self):
return self.kwargs["platform"]
def get_form_kwargs(self) -> dict[str, Any]:
kwargs = super().get_form_kwargs()
kwargs['event'] = self.request.event
kwargs["platform"] = self.platform
return kwargs
def get_platform_styles(self):
if self.platform not in get_platforms():
if self.object.platform not in get_platforms():
raise Http404(
_("Unknown platform '{platform}'").format(platform=self.platform)
_("Unknown platform '{platform}'").format(platform=self.object.platform)
)
return get_platform_styles(self.platform)
return get_platform_styles(self.object.platform)
def get_context_data(self, **kwargs) -> dict[str, Any]:
context = super().get_context_data(**kwargs)
context["styles"] = {
id: style.asdict() for id, style in self.get_platform_styles().items()
}
if self.request.method == "POST":
form = self.get_form()
if not form.is_valid():
layout_data = LayoutSerializer(self.object).data
layout_data.update(form.cleaned_data)
context['layout'] = layout_data
else:
context["layout"] = LayoutSerializer(self.object).data
else:
context["layout"] = LayoutSerializer(self.object).data
context["variables"] = {
"text": {
varname: {"label": var["label"], "editor_sample": var["editor_sample"]}
@@ -140,18 +60,47 @@ class LayoutEditorView(EventPermissionRequiredMixin, UpdateView):
}
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 get_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,
"platform": self.platform,
"layout": self.object.pk,
},
)
class LayoutCreateView(LayoutEditorView):
def get_object(self, queryset=None):
return WalletLayout(event=self.request.event, platform=self.platform)
)