mirror of
https://github.com/pretix/pretix.git
synced 2026-11-10 01:17:07 +00:00
add wallet layout chooser to item settings
This commit is contained in:
1 parent
d5749ad823
commit
04769eb628
4 files changed
+63
-8
No files matched your search
@@ -9,6 +9,8 @@ from django.core.files.uploadedfile import SimpleUploadedFile, UploadedFile
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from pretix.control.forms import ClearableBasenameFileInput
|
||||
from django.core.files import File
|
||||
from .models import WalletLayout, WalletLayoutItem
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -18,7 +20,11 @@ def validate_rsa_privkey(value: File):
|
||||
value = value.decode()
|
||||
if not value:
|
||||
return
|
||||
if not re.match(r"^-----BEGIN( (RSA |ENCRYPTED )?PRIVATE KEY-----).*-----END\1$", value, re.DOTALL):
|
||||
if not re.match(
|
||||
r"^-----BEGIN( (RSA |ENCRYPTED )?PRIVATE KEY-----).*-----END\1$",
|
||||
value,
|
||||
re.DOTALL,
|
||||
):
|
||||
raise ValidationError(
|
||||
_(
|
||||
"This does not look like an RSA private key in PEM format (it misses the correct begin or end signifiers)"
|
||||
@@ -99,3 +105,30 @@ class PNGImageField(forms.FileField):
|
||||
)
|
||||
|
||||
return value
|
||||
|
||||
|
||||
class WalletLayoutItemForm(forms.ModelForm):
|
||||
is_layouts = True
|
||||
layout = forms.ModelChoiceField(
|
||||
queryset=WalletLayout.objects.none(),
|
||||
label=_("Wallet Layout"),
|
||||
empty_label=_("(Event default)"),
|
||||
required=False
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = WalletLayoutItem
|
||||
fields = ("layout",)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
event = kwargs.pop("event")
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields["layout"].queryset = event.wallet_layouts.all()
|
||||
|
||||
def save(self, commit=True):
|
||||
if self.cleaned_data["layout"] is None:
|
||||
if self.instance.pk:
|
||||
self.instance.delete()
|
||||
else:
|
||||
self.instance.layout = self.cleaned_data["layout"]
|
||||
return super().save(commit=commit)
|
||||
@@ -78,10 +78,10 @@ class WalletPlatformLayout(LoggedModel):
|
||||
class WalletLayoutItem(models.Model):
|
||||
item = models.OneToOneField('pretixbase.Item', null=True, blank=True, related_name='walletlayout',
|
||||
on_delete=models.CASCADE)
|
||||
layout = models.ForeignKey(WalletLayout, on_delete=models.CASCADE, related_name='item_assignments')
|
||||
layout = models.ForeignKey(WalletLayout, null=True, on_delete=models.CASCADE, related_name='item_assignments')
|
||||
|
||||
def clean(self):
|
||||
if self.item.event != self.layout.event:
|
||||
if self.layout and self.item.event != self.layout.event:
|
||||
raise ValidationError("cannot bind layout to item of different event")
|
||||
|
||||
class WalletLayoutFileSetting(models.Model):
|
||||
|
||||
@@ -20,8 +20,12 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
from pretix.base.signals import register_ticket_outputs, register_global_settings, EventPluginSignal
|
||||
from pretix.base.signals import register_ticket_outputs, register_global_settings
|
||||
from pretix.control.signals import item_forms
|
||||
from .ticketoutput import OUTPUTS
|
||||
from django.dispatch import receiver
|
||||
from .forms import WalletLayoutItemForm
|
||||
from .models import WalletLayoutItem
|
||||
|
||||
def connect_signals():
|
||||
for output in OUTPUTS:
|
||||
@@ -34,4 +38,20 @@ def connect_signals():
|
||||
if hasattr(output, "get_global_settings"):
|
||||
register_global_settings.connect(output.get_global_settings, dispatch_uid=f"wallet_global_settings_{output.identifier}")
|
||||
|
||||
connect_signals()
|
||||
connect_signals()
|
||||
|
||||
|
||||
@receiver(item_forms, dispatch_uid="pretix_wallet_item_forms")
|
||||
def control_item_forms(sender, request, item, **kwargs):
|
||||
forms = []
|
||||
try:
|
||||
inst = WalletLayoutItem.objects.get(item=item)
|
||||
except WalletLayoutItem.DoesNotExist:
|
||||
inst = WalletLayoutItem(item=item)
|
||||
forms.append(WalletLayoutItemForm(
|
||||
instance=inst,
|
||||
event=sender,
|
||||
data=(request.POST if request.method == "POST" else None),
|
||||
prefix="wallet"
|
||||
))
|
||||
return forms
|
||||
@@ -65,7 +65,7 @@ class WalletOutput(BaseTicketOutput):
|
||||
|
||||
def generate(self, op):
|
||||
if hasattr(op.item, "walletlayout"):
|
||||
wallet_layout = op.item.walletlayout
|
||||
wallet_layout = op.item.walletlayout.layout
|
||||
else:
|
||||
wallet_layout = op.event.wallet_layouts.get(default=True)
|
||||
platform_layout = get_object_or_404(
|
||||
@@ -92,7 +92,8 @@ class GoogleWalletTicketOutput(WalletOutput):
|
||||
"\n"
|
||||
"Please be aware, that there is no way to delete the data, once it has been transmitted.\n")
|
||||
|
||||
def get_global_settings(sender, **kwargs):
|
||||
@classmethod
|
||||
def get_global_settings(cls, **kwargs):
|
||||
return OrderedDict(
|
||||
[
|
||||
(
|
||||
@@ -143,7 +144,8 @@ class AppleWalletTicketOutput(WalletOutput):
|
||||
download_button_text = "Add to Apple Wallet"
|
||||
platform = ApplePlatform
|
||||
|
||||
def get_global_settings(sender, **kwargs):
|
||||
@classmethod
|
||||
def get_global_settings(cls, **kwargs):
|
||||
return OrderedDict(
|
||||
[
|
||||
(
|
||||
|
||||
Reference in new issue
Block a user