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')
|
invoice_address = kwargs.pop('invoice_address')
|
||||||
initial = kwargs.get('initial', {})
|
initial = kwargs.get('initial', {})
|
||||||
event = kwargs.pop('event')
|
event = kwargs.pop('event')
|
||||||
|
quota_cache = kwargs.pop('quota_cache')
|
||||||
kwargs['initial'] = initial
|
kwargs['initial'] = initial
|
||||||
if instance.variation_id:
|
if instance.variation_id:
|
||||||
initial['itemvar'] = f'{instance.item_id}-{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())
|
variations = list(i.variations.all())
|
||||||
|
|
||||||
if variations:
|
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()
|
qa = QuotaAvailability()
|
||||||
for v in variations:
|
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()
|
qa.compute()
|
||||||
|
quota_cache.update(qa.results)
|
||||||
|
|
||||||
for v in variations:
|
for v in variations:
|
||||||
|
|
||||||
@@ -73,7 +80,11 @@ class OrderPositionChangeForm(forms.Form):
|
|||||||
if not v.active:
|
if not v.active:
|
||||||
continue
|
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)):
|
if not v.quotas.all() or (q_res and any(q_res)):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|||||||
@@ -1175,16 +1175,17 @@ class OrderChange(EventViewMixin, OrderDetailMixin, TemplateView):
|
|||||||
def positions(self):
|
def positions(self):
|
||||||
positions = list(
|
positions = list(
|
||||||
self.order.positions.select_related('item', 'item__tax_rule').prefetch_related(
|
self.order.positions.select_related('item', 'item__tax_rule').prefetch_related(
|
||||||
'item__quotas', 'item__variations', 'item__variations__quotas'
|
'item__variations',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
quota_cache = {}
|
||||||
try:
|
try:
|
||||||
ia = self.order.invoice_address
|
ia = self.order.invoice_address
|
||||||
except InvoiceAddress.DoesNotExist:
|
except InvoiceAddress.DoesNotExist:
|
||||||
ia = None
|
ia = None
|
||||||
for p in positions:
|
for p in positions:
|
||||||
p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p,
|
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)
|
data=self.request.POST if self.request.method == "POST" else None)
|
||||||
return positions
|
return positions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user