This commit is contained in:
Kara Engelhardt
2026-07-28 11:30:50 +02:00
parent 02934e7ba0
commit 802a7b3a24
7 changed files with 446 additions and 4 deletions
+202 -2
View File
@@ -1,10 +1,210 @@
from .base import FieldGroupDisplay, PassStyle, PredefinedFieldGroup, TextFieldGroup, WalletPlatform
from django.utils.translation import gettext_lazy as _
from pretix.base.models import Event, OrderPosition
from .base import FieldGroupDisplay, PassLayout, PassStyle, PredefinedFieldGroup, TextFieldGroup, WalletPlatform
from django.utils.translation import gettext_lazy as _, gettext
import json
from walletobjects import ButtonJWT, EventTicketClass, EventTicketObject
from walletobjects.comms import Comms
from walletobjects.constants import (
Barcode, ClassType, ConfirmationCode, DoorsOpen,
MultipleDevicesAndHoldersAllowedStatus, ObjectState, ObjectType,
ReviewStatus, Seat,
)
from pretix.base.settings import GlobalSettingsObject
import uuid
from pretix.multidomain.urlreverse import eventreverse_absolute
from django.utils import translation
def _get_instance_uuid():
gs = GlobalSettingsObject()
if not gs.settings.wallet_google_instance_uuid:
gs.settings.wallet_google_instance_uuid = str(uuid.uuid4())
return gs.settings.get("wallet_google_instance_uuid")
def get_class_id(event: Event):
instance_uuid = _get_instance_uuid()
issuer_id = event.settings.get('wallet_google_issuer_id')
return "%s.pretix-%s-%s-%s" % (issuer_id, instance_uuid, event.organizer.slug, event.slug)
def get_object_id(op: OrderPosition):
instance_uuid = _get_instance_uuid()
issuer_id = op.order.event.settings.get('wallet_google_issuer_id')
return "%s.pretix-%s-%s-%s-%s-%s" % (issuer_id, instance_uuid,
op.order.event.organizer.slug, op.order.event.slug,
op.order.code, op.positionid)
def get_translated_dict(string, locales):
translated = {}
for locale in locales:
translation.activate(locale)
translated[locale] = gettext(string)
translation.deactivate()
return translated
def get_translated_string(string, locale):
translation.activate(locale)
translated = gettext(string)
translation.deactivate()
return translated
class GooglePlatform(WalletPlatform):
identifier = "google"
name = _("Google")
@classmethod
def generate(cls, layout: PassLayout, op: OrderPosition):
class_object = cls._generate_class(op.order.event)
# ticket_object = cls._get_object(op)
# if not ticket_object:
# return False
# generated_jwt = self._comms().sign_jwt(
# ButtonJWT(
# origins=[django_settings.SITE_URL],
# issuer=self._comms().client_email,
# event_ticket_objects=[ticket_object],
# skinny=True
# )
# )
# if generated_jwt:
# return 'googlepaypass', 'text/uri-list', 'https://pay.google.com/gp/v/save/%s' % generated_jwt
# else:
# return False
data = {"class": class_object}
return 'pass.json', 'application/json', json.dumps(data)
# from ..views import get_layout_variables
# order = op.order
# event = order.event
# filename = "{}-{}.pkpass".format(order.event.slug, order.code)
# ticket = str(op.item.name)
# if op.variation:
# ticket += " - " + str(op.variation)
# serialNumber = "%s-%s-%s-%d" % (
# order.event.organizer.slug,
# order.event.slug,
# order.code,
# op.pk,
# )
# context = {
# "placeholders": get_layout_variables(op.order.event),
# "evaluation_context": [op, order, order.event],
# "ca_certificate": order.event.settings.wallet_apple_ca_certificate.read(),
# "certificate": order.event.settings.wallet_apple_certificate.read(),
# "key": order.event.settings.wallet_apple_key.read(),
# "password": order.event.settings.wallet_apple_key_password,
# "description": _("Ticket for {event} ({product})").format( # TODO: i18n
# event=event.name, product=ticket
# ),
# "organizationName": event.organizer.name,
# "passTypeIdentifier": order.event.settings.wallet_apple_pass_type_id,
# "teamIdentifier": order.event.settings.wallet_apple_team_id,
# "serialNumber": serialNumber,
# "locales": event.settings.locales,
# }
# data = layout.generate(context)
# return filename, "application/vnd.apple.pkpass", data
@classmethod
def _generate_class(cls, event: Event):
class_name = get_class_id(event)
output_class = EventTicketClass(
event.organizer.name,
class_name,
MultipleDevicesAndHoldersAllowedStatus.multipleHolders, # TODO: Make configurable
event.name,
ReviewStatus.draft, # TODO: ReviewStatus.underReview,
event.settings.locale
)
output_class.homepage_uri(
eventreverse_absolute(event, 'presale:event.index'),
get_translated_string('Website', event.settings.locale),
get_translated_dict('Website', event.settings.locales)
)
# output_class.callback_url(eventreverse_absolute(event.organizer, 'plugins:pretix_googlepaypasses:webhook'))
# if (event.settings.get('ticketoutput_googlepaypasses_latitude')
# and event.settings.get('ticketoutput_googlepaypasses_longitude')):
# output_class.locations(
# event.settings.get('ticketoutput_googlepaypasses_latitude'),
# event.settings.get('ticketoutput_googlepaypasses_longitude')
# )
# elif event.geo_lat and event.geo_lon:
# output_class.locations(
# event.geo_lat,
# event.geo_lon
# )
output_class.country_code(event.settings.locale)
output_class.hide_barcode(False)
# if event.settings.get('ticketoutput_googlepaypasses_hero'):
# output_class.hero_image(
# urljoin(django_settings.SITE_URL, event.settings.get('ticketoutput_googlepaypasses_hero').url),
# str(event.name),
# event.name,
# )
# output_class.hex_background_color(event.settings.get('primary_color'))
# output_class.event_id('pretix-%s-%s-%s' % (gs.settings.get('update_check_id'), event.organizer.id, event.id))
# if event.settings.get('ticketoutput_googlepaypasses_logo'):
# output_class.logo(
# urljoin(django_settings.SITE_URL, event.settings.get('ticketoutput_googlepaypasses_logo').url),
# str(event.name),
# event.name,
# )
# if event.location:
# name = {}
# address = {}
# for key, value in event.location.data.items():
# lines = value.splitlines()
# name[key] = lines[0]
# # We must provide at least one address line each for the name and address - no way around it.
# if len(lines) > 1:
# address[key] = '\n'.join(value.splitlines()[1:])
# else:
# address[key] = lines[0]
# output_class.venue(name, address)
# if event.date_from and event.date_to and event.date_admission:
# output_class.date_time(
# DoorsOpen.doorsOpen,
# event.date_admission.isoformat(),
# event.date_from.isoformat(),
# event.date_to.isoformat(),
# )
# output_class.confirmation_code_label(ConfirmationCode.orderNumber)
# if event.seating_plan_id is not None:
# output_class.seat_label(Seat.seat)
# return self._comms().put_item(ClassType.eventTicketClass, class_name, output_class)
return output_class._eventTicketClass
class GoogleWalletStyle(PassStyle):
platform = GooglePlatform