diff --git a/doc/api/resources/webhooks.rst b/doc/api/resources/webhooks.rst index d7111c6318..c30b39a5ba 100644 --- a/doc/api/resources/webhooks.rst +++ b/doc/api/resources/webhooks.rst @@ -50,6 +50,10 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.event.order.payment.confirmed`` * ``pretix.event.order.approved`` * ``pretix.event.order.denied`` + * ``pretix.event.orders.waitinglist.added`` + * ``pretix.event.orders.waitinglist.changed`` + * ``pretix.event.orders.waitinglist.deleted`` + * ``pretix.event.orders.waitinglist.voucher_assigned`` * ``pretix.event.checkin`` * ``pretix.event.checkin.reverted`` * ``pretix.event.added`` diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index f16df9671e..e05d2fe5b0 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -189,6 +189,19 @@ class ParametrizedOrderPositionWebhookEvent(ParametrizedOrderWebhookEvent): return d +class ParametrizedWaitingListEntryWebhookEvent(ParametrizedWebhookEvent): + + def build_payload(self, logentry: LogEntry): + # do not use content_object, this is also called in deletion + return { + 'notification_id': logentry.pk, + 'organizer': logentry.event.organizer.slug, + 'event': logentry.event.slug, + 'waitinglistentry': logentry.object_id, + 'action': logentry.action_type, + } + + @receiver(register_webhook_events, dispatch_uid="base_register_default_webhook_events") def register_default_webhook_events(sender, **kwargs): return ( @@ -321,6 +334,22 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.event.testmode.deactivated', _('Test-Mode of shop has been deactivated'), ), + ParametrizedWaitingListEntryWebhookEvent( + 'pretix.event.orders.waitinglist.added', + _('Waiting list entry added'), + ), + ParametrizedWaitingListEntryWebhookEvent( + 'pretix.event.orders.waitinglist.changed', + _('Waiting list entry changed'), + ), + ParametrizedWaitingListEntryWebhookEvent( + 'pretix.event.orders.waitinglist.deleted', + _('Waiting list entry deleted'), + ), + ParametrizedWaitingListEntryWebhookEvent( + 'pretix.event.orders.waitinglist.voucher_assigned', + _('Waiting list entry received voucher'), + ), ) diff --git a/src/pretix/base/models/waitinglist.py b/src/pretix/base/models/waitinglist.py index 667ad7be52..331017d8b6 100644 --- a/src/pretix/base/models/waitinglist.py +++ b/src/pretix/base/models/waitinglist.py @@ -218,7 +218,7 @@ class WaitingListEntry(LoggedModel): 'waitinglistentry': self.pk, 'subevent': self.subevent.pk if self.subevent else None, }, user=user, auth=auth) - self.log_action('pretix.waitinglist.voucher', user=user, auth=auth) + self.log_action('pretix.event.orders.waitinglist.voucher_assigned', user=user, auth=auth) self.voucher = v self.save() diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index eeff28d72f..d9086e4a25 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -531,9 +531,10 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs): 'pretix.event.permissions.invited': _('A user has been invited to the event team.'), 'pretix.event.permissions.changed': _('A user\'s permissions have been changed.'), 'pretix.event.permissions.deleted': _('A user has been removed from the event team.'), - 'pretix.waitinglist.voucher': _('A voucher has been sent to a person on the waiting list.'), + 'pretix.waitinglist.voucher': _('A voucher has been sent to a person on the waiting list.'), # legacy + 'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'), 'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'), - 'pretix.event.orders.waitinglist.transferred': _('An entry has been transferred to another waiting list.'), + 'pretix.event.order.waitinglist.transferred': _('An entry has been transferred to another waiting list.'), # legacy 'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'), 'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'), 'pretix.team.created': _('The team has been created.'), diff --git a/src/pretix/control/views/waitinglist.py b/src/pretix/control/views/waitinglist.py index 00a96d6544..d504fc9c87 100644 --- a/src/pretix/control/views/waitinglist.py +++ b/src/pretix/control/views/waitinglist.py @@ -189,6 +189,11 @@ class WaitingListActionView(EventPermissionRequiredMixin, WaitingListQuerySetMix ) wle.priority = self.request.event.waitinglistentries.aggregate(m=Max('priority'))['m'] + 1 wle.save(update_fields=['priority']) + wle.log_action( + 'pretix.event.orders.waitinglist.changed', + data={'priority': wle.priority}, + user=self.request.user, + ) messages.success(request, _('The waiting list entry has been moved to the top.')) return self._redirect_back() except WaitingListEntry.DoesNotExist: @@ -202,6 +207,11 @@ class WaitingListActionView(EventPermissionRequiredMixin, WaitingListQuerySetMix ) wle.priority = self.request.event.waitinglistentries.aggregate(m=Min('priority'))['m'] - 1 wle.save(update_fields=['priority']) + wle.log_action( + 'pretix.event.orders.waitinglist.changed', + data={'priority': wle.priority}, + user=self.request.user, + ) messages.success(request, _('The waiting list entry has been moved to the end of the list.')) return self._redirect_back() except WaitingListEntry.DoesNotExist: @@ -391,7 +401,7 @@ class EntryTransfer(EventPermissionRequiredMixin, UpdateView): messages.success(self.request, _('The waitinglist entry has been transferred.')) if form.has_changed(): self.object.log_action( - 'pretix.event.order.waitinglist.transferred', user=self.request.user, data={ + 'pretix.event.orders.waitinglist.changed', user=self.request.user, data={ k: form.cleaned_data.get(k) for k in form.changed_data } ) diff --git a/src/pretix/presale/views/waiting.py b/src/pretix/presale/views/waiting.py index b577d1f348..7b5891712b 100644 --- a/src/pretix/presale/views/waiting.py +++ b/src/pretix/presale/views/waiting.py @@ -127,6 +127,7 @@ class WaitingView(EventViewMixin, FormView): return redirect(self.get_index_url()) form.save() + form.instance.log_action("pretix.event.orders.waitinglist.added") messages.success(self.request, _("We've added you to the waiting list. You will receive " "an email as soon as this product gets available again.")) return super().form_valid(form)