diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index e97ad3c335..4d54f85173 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -689,6 +689,7 @@ class OrderChangeManager: CancelOperation = namedtuple('CancelOperation', ('position',)) AddOperation = namedtuple('AddOperation', ('item', 'variation', 'price', 'addon_to', 'subevent')) SplitOperation = namedtuple('SplitOperation', ('position',)) + RegenerateSecretOperation = namedtuple('RegenerateSecretOperation', ('position',)) def __init__(self, order: Order, user, notify=True): self.order = order @@ -744,6 +745,9 @@ class OrderChangeManager: self._quotadiff.subtract(position.quotas) self._operations.append(self.SubeventOperation(position, subevent, price)) + def regenerate_secret(self, position: OrderPosition): + self._operations.append(self.RegenerateSecretOperation(position)) + def change_price(self, position: OrderPosition, price: Decimal): price = position.item.tax(price) @@ -950,6 +954,15 @@ class OrderChangeManager: }) elif isinstance(op, self.SplitOperation): split_positions.append(op.position) + elif isinstance(op, self.RegenerateSecretOperation): + op.position.secret = generate_position_secret() + op.position.save() + CachedTicket.objects.filter(order_position__order=self.order).delete() + CachedCombinedTicket.objects.filter(order=self.order).delete() + self.order.log_action('pretix.event.order.changed.secret', user=self.user, data={ + 'position': op.position.pk, + 'positionid': op.position.positionid, + }) if split_positions: self.split_order = self._create_split_order(split_positions) diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index e1d5f30729..9cb1c61e26 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -206,6 +206,7 @@ class OrderPositionChangeForm(forms.Form): ('subevent', 'Change event date'), ('cancel', 'Remove product'), ('split', 'Split into new order'), + ('secret', 'Regenerate secret'), ) ) diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index d6ede1f5a6..fd80f2480b 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -82,6 +82,10 @@ def _display_order_changed(event: Event, logentry: LogEntry): item=item, price=money_filter(Decimal(data['price']), event.currency), ) + elif logentry.action_type == 'pretix.event.order.changed.secret': + return text + ' ' + _('A new secret has been generated for position #{posid}.').format( + posid=data.get('positionid', '?'), + ) elif logentry.action_type == 'pretix.event.order.changed.split': old_item = str(event.items.get(pk=data['old_item'])) if data['old_variation']: diff --git a/src/pretix/control/templates/pretixcontrol/order/change.html b/src/pretix/control/templates/pretixcontrol/order/change.html index 9d5e11a57f..f8bec38330 100644 --- a/src/pretix/control/templates/pretixcontrol/order/change.html +++ b/src/pretix/control/templates/pretixcontrol/order/change.html @@ -131,6 +131,13 @@ {% trans "Split into new order" %} +
+ +