mirror of
https://github.com/pretix/pretix.git
synced 2026-05-08 15:44:02 +00:00
Reduce number of queries on the order change form
This commit is contained in:
@@ -241,6 +241,7 @@ class OrderPositionAddForm(forms.Form):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.items = kwargs.pop('items')
|
||||||
order = kwargs.pop('order')
|
order = kwargs.pop('order')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
@@ -250,11 +251,13 @@ class OrderPositionAddForm(forms.Form):
|
|||||||
ia = None
|
ia = None
|
||||||
|
|
||||||
choices = []
|
choices = []
|
||||||
for i in order.event.items.prefetch_related('variations').all():
|
for i in self.items:
|
||||||
pname = str(i)
|
pname = str(i)
|
||||||
if not i.is_available():
|
if not i.is_available():
|
||||||
pname += ' ({})'.format(_('inactive'))
|
pname += ' ({})'.format(_('inactive'))
|
||||||
variations = list(i.variations.all())
|
variations = list(i.variations.all())
|
||||||
|
if i.tax_rule: # performance optimization
|
||||||
|
i.tax_rule.event = order.event
|
||||||
if variations:
|
if variations:
|
||||||
for v in variations:
|
for v in variations:
|
||||||
p = get_price(i, v, invoice_address=ia)
|
p = get_price(i, v, invoice_address=ia)
|
||||||
@@ -264,7 +267,11 @@ class OrderPositionAddForm(forms.Form):
|
|||||||
p = get_price(i, invoice_address=ia)
|
p = get_price(i, invoice_address=ia)
|
||||||
choices.append((str(i.pk), '%s (%s)' % (pname, p.print(order.event.currency))))
|
choices.append((str(i.pk), '%s (%s)' % (pname, p.print(order.event.currency))))
|
||||||
self.fields['itemvar'].choices = choices
|
self.fields['itemvar'].choices = choices
|
||||||
if ItemAddOn.objects.filter(base_item__event=order.event).exists():
|
if order.event.cache.get_or_set(
|
||||||
|
'has_addon_products',
|
||||||
|
default=lambda: ItemAddOn.objects.filter(base_item__event=order.event).exists(),
|
||||||
|
timeout=300
|
||||||
|
):
|
||||||
self.fields['addon_to'].queryset = order.positions.filter(addon_to__isnull=True).select_related(
|
self.fields['addon_to'].queryset = order.positions.filter(addon_to__isnull=True).select_related(
|
||||||
'item', 'variation'
|
'item', 'variation'
|
||||||
)
|
)
|
||||||
@@ -293,10 +300,12 @@ class OrderPositionAddForm(forms.Form):
|
|||||||
class OrderPositionAddFormset(forms.BaseFormSet):
|
class OrderPositionAddFormset(forms.BaseFormSet):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.order = kwargs.pop('order', None)
|
self.order = kwargs.pop('order', None)
|
||||||
|
self.items = kwargs.pop('items')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def _construct_form(self, i, **kwargs):
|
def _construct_form(self, i, **kwargs):
|
||||||
kwargs['order'] = self.order
|
kwargs['order'] = self.order
|
||||||
|
kwargs['items'] = self.items
|
||||||
return super()._construct_form(i, **kwargs)
|
return super()._construct_form(i, **kwargs)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -307,6 +316,7 @@ class OrderPositionAddFormset(forms.BaseFormSet):
|
|||||||
empty_permitted=True,
|
empty_permitted=True,
|
||||||
use_required_attribute=False,
|
use_required_attribute=False,
|
||||||
order=self.order,
|
order=self.order,
|
||||||
|
items=self.items,
|
||||||
)
|
)
|
||||||
self.add_fields(form, None)
|
self.add_fields(form, None)
|
||||||
return form
|
return form
|
||||||
@@ -346,6 +356,7 @@ class OrderPositionChangeForm(forms.Form):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
instance = kwargs.pop('instance')
|
instance = kwargs.pop('instance')
|
||||||
|
items = kwargs.pop('items')
|
||||||
initial = kwargs.get('initial', {})
|
initial = kwargs.get('initial', {})
|
||||||
|
|
||||||
initial['price'] = instance.price
|
initial['price'] = instance.price
|
||||||
@@ -374,7 +385,7 @@ class OrderPositionChangeForm(forms.Form):
|
|||||||
choices = [
|
choices = [
|
||||||
('', _('(Unchanged)'))
|
('', _('(Unchanged)'))
|
||||||
]
|
]
|
||||||
for i in instance.order.event.items.prefetch_related('variations').all():
|
for i in items:
|
||||||
pname = str(i)
|
pname = str(i)
|
||||||
if not i.is_available():
|
if not i.is_available():
|
||||||
pname += ' ({})'.format(_('inactive'))
|
pname += ' ({})'.format(_('inactive'))
|
||||||
|
|||||||
@@ -1379,9 +1379,14 @@ class OrderChange(OrderView):
|
|||||||
return ff(
|
return ff(
|
||||||
prefix='add',
|
prefix='add',
|
||||||
order=self.order,
|
order=self.order,
|
||||||
|
items=self.items,
|
||||||
data=self.request.POST if self.request.method == "POST" else None
|
data=self.request.POST if self.request.method == "POST" else None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def items(self):
|
||||||
|
return self.request.event.items.prefetch_related('variations', 'tax_rule').all()
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def fees(self):
|
def fees(self):
|
||||||
fees = list(self.order.fees.all())
|
fees = list(self.order.fees.all())
|
||||||
@@ -1397,9 +1402,9 @@ class OrderChange(OrderView):
|
|||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def positions(self):
|
def positions(self):
|
||||||
positions = list(self.order.positions.all())
|
positions = list(self.order.positions.select_related('item', 'item__tax_rule'))
|
||||||
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, items=self.items,
|
||||||
initial={'seat': p.seat.seat_guid if p.seat else None},
|
initial={'seat': p.seat.seat_guid if p.seat else None},
|
||||||
data=self.request.POST if self.request.method == "POST" else None)
|
data=self.request.POST if self.request.method == "POST" else None)
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user