New implementation of sales channels (#4111)

Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
Raphael Michel
2024-06-30 19:24:30 +02:00
committed by GitHub
parent 95511b0330
commit 4fb5c6bef0
174 changed files with 2902 additions and 616 deletions

View File

@@ -28,8 +28,7 @@ from django.urls import reverse
from django.utils.html import escape
from django.utils.translation import gettext_lazy as _
from pretix.base.channels import get_all_sales_channels
from pretix.base.models import Event
from pretix.base.models import Event, SalesChannel
from pretix.base.signals import ( # NOQA: legacy import
EventPluginSignal, event_copy_data, item_copy_data, layout_text_variables,
logentry_display, logentry_object_link, register_data_exporters,
@@ -67,25 +66,25 @@ def register_multievent_data(sender, **kwargs):
def control_item_forms(sender, request, item, **kwargs):
forms = []
queryset = sender.ticket_layouts.all()
for k, v in sorted(list(get_all_sales_channels().items()), key=lambda a: (int(a[0] != 'web'), a[0])):
for sc in sorted(list(sender.organizer.sales_channels.all()), key=lambda a: (int(a.identifier != 'web'), a.identifier)):
try:
inst = TicketLayoutItem.objects.get(item=item, sales_channel=k)
inst = TicketLayoutItem.objects.get(item=item, sales_channel=sc)
except TicketLayoutItem.DoesNotExist:
inst = TicketLayoutItem(item=item)
forms.append(TicketLayoutItemForm(
instance=inst,
event=sender,
sales_channel=v,
sales_channel=sc,
queryset=queryset,
data=(request.POST if request.method == "POST" else None),
prefix="ticketlayoutitem_{}".format(k)
prefix="ticketlayoutitem_{}".format(sc.identifier)
))
return forms
@receiver(item_copy_data, dispatch_uid="pretix_ticketoutputpdf_item_copy")
def copy_item(sender, source, target, **kwargs):
for tli in TicketLayoutItem.objects.filter(item=source):
for tli in TicketLayoutItem.objects.filter(item=source).select_related("sales_channel"):
TicketLayoutItem.objects.create(item=target, layout=tli.layout, sales_channel=tli.sales_channel)
@@ -122,9 +121,16 @@ def pdf_event_copy_data_receiver(sender, other, item_map, question_map, **kwargs
layout_map[oldid] = bl
for bi in TicketLayoutItem.objects.filter(item__event=other):
for bi in TicketLayoutItem.objects.filter(item__event=other).select_related("sales_channel"):
if sender.organizer != other.organizer:
try:
sc = sender.organizer.sales_channels.get(identifier=bi.sales_channel.identifier)
except SalesChannel.DoesNotExist:
continue
else:
sc = bi.sales_channel
TicketLayoutItem.objects.create(item=item_map.get(bi.item_id), layout=layout_map.get(bi.layout_id),
sales_channel=bi.sales_channel)
sales_channel=sc)
return layout_map
@@ -167,7 +173,7 @@ def _ticket_layouts_for_item(request, item):
request._ticket_layouts_for_item = {}
if item.pk not in request._ticket_layouts_for_item:
request._ticket_layouts_for_item[item.pk] = {
tli.sales_channel: tli.layout
tli.sales_channel.identifier: tli.layout
for tli in item.ticketlayout_assignments.select_related('layout')
}
if request._ticket_layouts_for_item[item.pk] and 'web' not in request._ticket_layouts_for_item[item.pk]:
@@ -184,10 +190,10 @@ def control_order_position_info(sender: Event, position, request, order, **kwarg
layouts = []
seen = set()
lm = _ticket_layouts_for_item(request, position.item)
if order.sales_channel in lm:
seen.add(lm[order.sales_channel])
if order.sales_channel.identifier in lm:
seen.add(lm[order.sales_channel.identifier])
for k, l in lm.items():
if k == order.sales_channel or l in seen:
if k == order.sales_channel.identifier or l in seen:
continue
layouts.append({
'label': str(l.name),