forked from CGM_Public/pretix_original
Order change page: Fix pathological performance in event series
This commit is contained in:
@@ -42,6 +42,7 @@ class OrderPositionChangeForm(forms.Form):
|
||||
invoice_address = kwargs.pop('invoice_address')
|
||||
initial = kwargs.get('initial', {})
|
||||
event = kwargs.pop('event')
|
||||
quota_cache = kwargs.pop('quota_cache')
|
||||
kwargs['initial'] = initial
|
||||
if instance.variation_id:
|
||||
initial['itemvar'] = f'{instance.item_id}-{instance.variation_id}'
|
||||
@@ -57,11 +58,17 @@ class OrderPositionChangeForm(forms.Form):
|
||||
variations = list(i.variations.all())
|
||||
|
||||
if variations:
|
||||
current_quotas = instance.variation.quotas.all() if instance.variation else instance.item.quotas.all()
|
||||
current_quotas = (
|
||||
instance.variation.quotas.filter(subevent=instance.subevent)
|
||||
if instance.variation
|
||||
else instance.item.quotas.all(subevent=instance.subevent)
|
||||
)
|
||||
qa = QuotaAvailability()
|
||||
for v in variations:
|
||||
qa.queue(*v.quotas.all())
|
||||
quotas_to_compute = [q for q in v.quotas.filter(subevent=instance.subevent) if q not in quota_cache]
|
||||
qa.queue(*quotas_to_compute)
|
||||
qa.compute()
|
||||
quota_cache.update(qa.results)
|
||||
|
||||
for v in variations:
|
||||
|
||||
@@ -73,7 +80,11 @@ class OrderPositionChangeForm(forms.Form):
|
||||
if not v.active:
|
||||
continue
|
||||
|
||||
q_res = [qa.results[q][0] != Quota.AVAILABILITY_OK for q in v.quotas.all() if q not in current_quotas]
|
||||
q_res = [
|
||||
(qa.results[q] if q in qa.results else quota_cache[q])[0] != Quota.AVAILABILITY_OK
|
||||
for q in v.quotas.all()
|
||||
if q not in current_quotas
|
||||
]
|
||||
if not v.quotas.all() or (q_res and any(q_res)):
|
||||
continue
|
||||
|
||||
|
||||
@@ -1175,16 +1175,17 @@ class OrderChange(EventViewMixin, OrderDetailMixin, TemplateView):
|
||||
def positions(self):
|
||||
positions = list(
|
||||
self.order.positions.select_related('item', 'item__tax_rule').prefetch_related(
|
||||
'item__quotas', 'item__variations', 'item__variations__quotas'
|
||||
'item__variations',
|
||||
)
|
||||
)
|
||||
quota_cache = {}
|
||||
try:
|
||||
ia = self.order.invoice_address
|
||||
except InvoiceAddress.DoesNotExist:
|
||||
ia = None
|
||||
for p in positions:
|
||||
p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p,
|
||||
invoice_address=ia, event=self.request.event,
|
||||
invoice_address=ia, event=self.request.event, quota_cache=quota_cache,
|
||||
data=self.request.POST if self.request.method == "POST" else None)
|
||||
return positions
|
||||
|
||||
|
||||
Reference in New Issue
Block a user