Log entries: Check config before bulk-scheduling

This commit is contained in:
Raphael Michel
2025-10-02 14:03:31 +02:00
parent 2611ff74a5
commit 82e4c331fc
3 changed files with 73 additions and 19 deletions
+21
View File
@@ -22,6 +22,7 @@
from datetime import timedelta
from django.db import models
from django.db.models import Exists, OuterRef, Q
from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
@@ -111,6 +112,24 @@ class OAuthRefreshToken(AbstractRefreshToken):
)
class WebHookQuerySet(models.QuerySet):
def for_notification(self, action_type, organizer, event):
event_listener = WebHookEventListener.objects.filter(
webhook=OuterRef('pk'),
action_type=action_type
)
webhooks = WebHook.objects.annotate(has_el=Exists(event_listener)).filter(
organizer=organizer,
has_el=True,
enabled=True
)
if event:
webhooks = webhooks.filter(
Q(all_events=True) | Q(limit_events__pk=event.pk if not isinstance(event, int) else event)
)
return webhooks
class WebHook(models.Model):
organizer = models.ForeignKey('pretixbase.Organizer', on_delete=models.CASCADE, related_name='webhooks')
enabled = models.BooleanField(default=True, verbose_name=_("Enable webhook"))
@@ -119,6 +138,8 @@ class WebHook(models.Model):
limit_events = models.ManyToManyField('pretixbase.Event', verbose_name=_("Limit to events"), blank=True)
comment = models.CharField(verbose_name=_("Comment"), max_length=255, null=True, blank=True)
objects = models.Manager.from_queryset(WebHookQuerySet)()
class Meta:
ordering = ('id',)
+3 -17
View File
@@ -27,16 +27,13 @@ from datetime import timedelta
import requests
from django.db import DatabaseError, connection, transaction
from django.db.models import Exists, OuterRef, Q
from django.dispatch import receiver
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _, pgettext_lazy
from django_scopes import scope, scopes_disabled
from requests import RequestException
from pretix.api.models import (
WebHook, WebHookCall, WebHookCallRetry, WebHookEventListener,
)
from pretix.api.models import WebHook, WebHookCall, WebHookCallRetry
from pretix.api.signals import register_webhook_events
from pretix.base.models import LogEntry
from pretix.base.services.tasks import ProfiledTask, TransactionAwareTask
@@ -454,20 +451,9 @@ def notify_webhooks(logentry_ids: list):
_org = logentry.organizer
_at = logentry.action_type
# All webhooks that registered for this notification
event_listener = WebHookEventListener.objects.filter(
webhook=OuterRef('pk'),
action_type=notification_type.action_type
webhooks = WebHook.objects.for_notification(
notification_type.action_type, logentry.organizer, logentry.event_id
)
webhooks = WebHook.objects.annotate(has_el=Exists(event_listener)).filter(
organizer=logentry.organizer,
has_el=True,
enabled=True
)
if logentry.event_id:
webhooks = webhooks.filter(
Q(all_events=True) | Q(limit_events__pk=logentry.event_id)
)
for wh in webhooks:
send_webhook.apply_async(args=(logentry.id, notification_type.action_type, wh.pk))