Order change page: Fix pathological performance in event series

This commit is contained in:
Raphael Michel
2021-06-22 10:49:49 +02:00
parent d8f3a3f5be
commit 3544c3f5b8
2 changed files with 17 additions and 5 deletions

View File

@@ -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

View File

@@ -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