diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 86497c935..5c59e81af 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1065,6 +1065,21 @@ class OrderChangeManager: self._operations.append(self.ItemOperation(position, item, variation)) def change_seat(self, position: OrderPosition, seat: Seat): + if isinstance(seat, str): + subev = None + if self.event.has_subevents: + subev = position.subevent + for p in self._operations: + if isinstance(p, self.SubeventOperation) and p.position == position: + subev = p.subevent + try: + seat = Seat.objects.get( + event=self.event, + subevent=subev, + seat_guid=seat + ) + except Seat.DoesNotExist: + raise OrderError(error_messages['seat_invalid']) if position.seat: self._seatdiff.subtract([position.seat]) if seat: @@ -1148,6 +1163,19 @@ class OrderChangeManager: def add_position(self, item: Item, variation: ItemVariation, price: Decimal, addon_to: Order = None, subevent: SubEvent = None, seat: Seat = None): + if isinstance(seat, str): + if not seat: + seat = None + else: + try: + seat = Seat.objects.get( + event=self.event, + subevent=subevent, + seat_guid=seat + ) + except Seat.DoesNotExist: + raise OrderError(error_messages['seat_invalid']) + if price is None: price = get_price(item, variation, subevent=subevent, invoice_address=self._invoice_address) else: @@ -1171,7 +1199,7 @@ class OrderChangeManager: raise OrderError(self.error_messages['seat_required']) elif not seated and seat: raise OrderError(self.error_messages['seat_forbidden']) - if seat and subevent and seat.subevent_id != subevent: + if seat and subevent and seat.subevent_id != subevent.pk: raise OrderError(self.error_messages['seat_subevent_mismatch'].format(seat=seat.name)) new_quotas = (variation.quotas.filter(subevent=subevent) diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 50a4ad17e..efb9557a4 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -11,9 +11,7 @@ from django.utils.translation import pgettext_lazy, ugettext_lazy as _ from pretix.base.email import get_available_placeholders from pretix.base.forms import I18nModelForm, PlaceholderValidator from pretix.base.forms.widgets import DatePickerWidget -from pretix.base.models import ( - InvoiceAddress, ItemAddOn, Order, OrderPosition, Seat, -) +from pretix.base.models import InvoiceAddress, ItemAddOn, Order, OrderPosition from pretix.base.models.event import SubEvent from pretix.base.services.pricing import get_price from pretix.control.forms.widgets import Select2 @@ -204,11 +202,10 @@ class OrderPositionAddForm(forms.Form): required=False, label=_('Add-on to'), ) - seat = forms.ModelChoiceField( - Seat.objects.none(), + seat = forms.CharField( required=False, - label=_('Seat'), - empty_label=_('General admission') + widget=forms.TextInput(attrs={'placeholder': _('General admission'), 'data-seat-guid-field': 'true'}), + label=_('Seat') ) price = forms.DecimalField( required=False, @@ -255,19 +252,6 @@ class OrderPositionAddForm(forms.Form): else: del self.fields['addon_to'] - self.fields['seat'].queryset = order.event.seats.all() - self.fields['seat'].widget = Select2( - attrs={ - 'data-model-select2': 'seat', - 'data-select2-url': reverse('control:event.seats.select2', kwargs={ - 'event': order.event.slug, - 'organizer': order.event.organizer.slug, - }), - 'data-placeholder': _('General admission') - } - ) - self.fields['seat'].widget.choices = self.fields['seat'].choices - if order.event.has_subevents: self.fields['subevent'].queryset = order.event.subevents.all() self.fields['subevent'].widget = Select2( @@ -318,10 +302,9 @@ class OrderPositionChangeForm(forms.Form): required=False, empty_label=_('(Unchanged)') ) - seat = forms.ModelChoiceField( - Seat.objects.none(), + seat = forms.CharField( required=False, - empty_label=_('(Unchanged)') + widget=forms.TextInput(attrs={'placeholder': _('(Unchanged)'), 'data-seat-guid-field': 'true'}) ) price = forms.DecimalField( required=False, @@ -366,20 +349,7 @@ class OrderPositionChangeForm(forms.Form): else: del self.fields['subevent'] - if instance.seat: - self.fields['seat'].queryset = instance.order.event.seats.all() - self.fields['seat'].widget = Select2( - attrs={ - 'data-model-select2': 'seat', - 'data-select2-url': reverse('control:event.seats.select2', kwargs={ - 'event': instance.order.event.slug, - 'organizer': instance.order.event.organizer.slug, - }), - 'data-placeholder': _('(Unchanged)') - } - ) - self.fields['seat'].widget.choices = self.fields['seat'].choices - else: + if not instance.seat: del self.fields['seat'] choices = [ diff --git a/src/pretix/control/templates/pretixcontrol/order/change.html b/src/pretix/control/templates/pretixcontrol/order/change.html index bcbb68cf2..e85d19498 100644 --- a/src/pretix/control/templates/pretixcontrol/order/change.html +++ b/src/pretix/control/templates/pretixcontrol/order/change.html @@ -73,7 +73,7 @@