diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py
index 6c5e8b40a1..fe7398333b 100644
--- a/src/pretix/control/forms/orders.py
+++ b/src/pretix/control/forms/orders.py
@@ -562,9 +562,7 @@ class OrderPositionChangeForm(forms.Form):
if instance.addon_to_id:
del self.fields['operation_split']
- if not instance.seat and not (
- instance.item.seat_category_mappings.filter(subevent=instance.subevent).exists()
- ):
+ if not instance.seat and not instance._seat_allowed:
del self.fields['seat']
choices = [
diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html
index 3528777611..8e530f8765 100644
--- a/src/pretix/control/templates/pretixcontrol/order/index.html
+++ b/src/pretix/control/templates/pretixcontrol/order/index.html
@@ -833,7 +833,7 @@
{% trans "Pending total" %}
- {{ order.pending_sum|money:event.currency }}
+ {{ pending_sum|money:event.currency }}
diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py
index 53b628ed58..eb9b7adcfd 100644
--- a/src/pretix/control/views/orders.py
+++ b/src/pretix/control/views/orders.py
@@ -81,7 +81,7 @@ from pretix.base.i18n import language
from pretix.base.models import (
CachedFile, CachedTicket, Checkin, Invoice, InvoiceAddress, Item,
ItemVariation, LogEntry, Order, QuestionAnswer, Quota,
- ScheduledEventExport, generate_secret,
+ ScheduledEventExport, generate_secret, SeatCategoryMapping,
)
from pretix.base.models.orders import (
CancellationRequest, OrderFee, OrderPayment, OrderPosition, OrderRefund,
@@ -564,10 +564,11 @@ class OrderDetail(OrderView):
})
ctx['display_locale'] = dict(settings.LANGUAGES)[self.object.locale or self.request.event.settings.locale]
- ctx['overpaid'] = self.order.pending_sum * -1
+ pending_sum = self.order.pending_sum
+ ctx['overpaid'] = pending_sum * -1
ctx['download_buttons'] = self.download_buttons
ctx['payment_refund_sum'] = self.order.payment_refund_sum
- ctx['pending_sum'] = self.order.pending_sum
+ ctx['pending_sum'] = pending_sum
ctx['uncancelled_invoice'] = self.order.invoices.exclude(
Exists(self.order.invoices.filter(refers=OuterRef('pk'), is_cancellation=True))
).exclude(is_cancellation=True).first()
@@ -603,6 +604,7 @@ class OrderDetail(OrderView):
Prefetch('answers', queryset=QuestionAnswer.objects.prefetch_related('options').select_related('question')),
Prefetch('all_checkins', queryset=Checkin.all.select_related('list').order_by('datetime')),
Prefetch('print_logs', queryset=PrintLog.objects.select_related('device').order_by('datetime')),
+ Prefetch('subevent', queryset=self.request.event.subevents.all()),
).order_by('positionid')
positions = []
@@ -1981,24 +1983,46 @@ class OrderChange(OrderView):
def items(self):
return self.request.event.items.prefetch_related('variations', 'tax_rule').all()
+ @cached_property
+ def tax_rules(self):
+ return self.request.event.tax_rules.all()
+
@cached_property
def fees(self):
fees = list(self.order.fees.all())
for f in fees:
- f.form = OrderFeeChangeForm(prefix='of-{}'.format(f.pk), instance=f,
- data=self.request.POST if self.request.method == "POST" else None)
+ f.form = OrderFeeChangeForm(
+ prefix='of-{}'.format(f.pk),
+ instance=f,
+ tax_rules=self.tax_rules,
+ data=self.request.POST if self.request.method == "POST" else None
+ )
return fees
@cached_property
def positions(self):
positions = list(self.order.positions.select_related(
'item', 'item__tax_rule', 'used_membership', 'used_membership__membership_type', 'tax_rule',
- 'seat', 'subevent',
- ).prefetch_related('granted_memberships'))
+ 'seat',
+ ).prefetch_related(
+ Prefetch(
+ 'subevent',
+ queryset=self.request.event.subevents.all(),
+ ),
+ 'granted_memberships',
+ 'issued_gift_cards',
+ 'addons',
+ ).annotate(
+ _seat_allowed=Exists(SeatCategoryMapping.objects.filter(subevent=OuterRef("subevent"), product=OuterRef("item")))
+ ))
for p in positions:
- p.form = OrderPositionChangeForm(prefix='op-{}'.format(p.pk), instance=p, items=self.items,
- initial={'seat': p.seat.seat_guid if p.seat else None},
- data=self.request.POST if self.request.method == "POST" else None)
+ p.form = OrderPositionChangeForm(
+ prefix='op-{}'.format(p.pk),
+ instance=p,
+ items=self.items,
+ initial={'seat': p.seat.seat_guid if p.seat else None},
+ data=self.request.POST if self.request.method == "POST" else None
+ )
return positions
def get_context_data(self, **kwargs):