diff --git a/doc/api/resources/webhooks.rst b/doc/api/resources/webhooks.rst index 051a2bd26..29242e753 100644 --- a/doc/api/resources/webhooks.rst +++ b/doc/api/resources/webhooks.rst @@ -56,6 +56,7 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.subevent.added`` * ``pretix.subevent.changed`` * ``pretix.subevent.deleted`` + * ``pretix.event.item.*`` * ``pretix.event.live.activated`` * ``pretix.event.live.deactivated`` * ``pretix.event.testmode.activated`` diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index db33d3601..e0c7d0052 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -96,7 +96,7 @@ def get_all_webhook_events(): return types -class ParametrizedOrderWebhookEvent(WebhookEvent): +class ParametrizedWebhookEvent(WebhookEvent): def __init__(self, action_type, verbose_name): self._action_type = action_type self._verbose_name = verbose_name @@ -110,6 +110,8 @@ class ParametrizedOrderWebhookEvent(WebhookEvent): def verbose_name(self): return self._verbose_name + +class ParametrizedOrderWebhookEvent(ParametrizedWebhookEvent): def build_payload(self, logentry: LogEntry): order = logentry.content_object if not order: @@ -124,19 +126,7 @@ class ParametrizedOrderWebhookEvent(WebhookEvent): } -class ParametrizedEventWebhookEvent(WebhookEvent): - def __init__(self, action_type, verbose_name): - self._action_type = action_type - self._verbose_name = verbose_name - super().__init__() - - @property - def action_type(self): - return self._action_type - - @property - def verbose_name(self): - return self._verbose_name +class ParametrizedEventWebhookEvent(ParametrizedWebhookEvent): def build_payload(self, logentry: LogEntry): if logentry.action_type == 'pretix.event.deleted': @@ -160,19 +150,7 @@ class ParametrizedEventWebhookEvent(WebhookEvent): } -class ParametrizedSubEventWebhookEvent(WebhookEvent): - def __init__(self, action_type, verbose_name): - self._action_type = action_type - self._verbose_name = verbose_name - super().__init__() - - @property - def action_type(self): - return self._action_type - - @property - def verbose_name(self): - return self._verbose_name +class ParametrizedSubEventWebhookEvent(ParametrizedWebhookEvent): def build_payload(self, logentry: LogEntry): # do not use content_object, this is also called in deletion @@ -185,6 +163,19 @@ class ParametrizedSubEventWebhookEvent(WebhookEvent): } +class ParametrizedItemWebhookEvent(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, + 'item': logentry.object_id, + 'action': logentry.action_type, + } + + class ParametrizedOrderPositionWebhookEvent(ParametrizedOrderWebhookEvent): def build_payload(self, logentry: LogEntry): @@ -305,6 +296,11 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.subevent.deleted', pgettext_lazy('subevent', 'Event series date deleted'), ), + ParametrizedItemWebhookEvent( + 'pretix.event.item.*', + _('Product changed (including product added or deleted and including changes to nested objects like ' + 'variations or bundles)'), + ), ParametrizedEventWebhookEvent( 'pretix.event.live.activated', _('Shop taken live'), diff --git a/src/pretix/control/templates/pretixcontrol/organizers/webhook_logs.html b/src/pretix/control/templates/pretixcontrol/organizers/webhook_logs.html index 05fdec5f9..b2c4d87cf 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/webhook_logs.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/webhook_logs.html @@ -90,7 +90,7 @@ {% empty %} -