From 9017128513039582deee61975297c89b85162422 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 25 Jun 2025 08:56:46 +0200 Subject: [PATCH] Webhooks: Fix retry logic (Z#23197527) (#5250) * Webhooks: Fix retry logic (Z#23197527) * Add no-op migration --- ..._alter_webhookcallretry_retry_not_before.py | 18 ++++++++++++++++++ src/pretix/api/models.py | 2 +- src/pretix/api/webhooks.py | 11 ++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/pretix/api/migrations/0013_alter_webhookcallretry_retry_not_before.py diff --git a/src/pretix/api/migrations/0013_alter_webhookcallretry_retry_not_before.py b/src/pretix/api/migrations/0013_alter_webhookcallretry_retry_not_before.py new file mode 100644 index 000000000..120e363ea --- /dev/null +++ b/src/pretix/api/migrations/0013_alter_webhookcallretry_retry_not_before.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.17 on 2025-06-24 14:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixapi", "0012_oauthapplication_post_logout_redirect_uris"), + ] + + operations = [ + migrations.AlterField( + model_name="webhookcallretry", + name="retry_not_before", + field=models.DateTimeField(), + ), + ] diff --git a/src/pretix/api/models.py b/src/pretix/api/models.py index ed5858d4b..39787fc30 100644 --- a/src/pretix/api/models.py +++ b/src/pretix/api/models.py @@ -157,7 +157,7 @@ class WebHookCallRetry(models.Model): id = models.BigAutoField(primary_key=True) webhook = models.ForeignKey('WebHook', on_delete=models.CASCADE, related_name='retries') logentry = models.ForeignKey('pretixbase.LogEntry', on_delete=models.CASCADE, related_name='webhook_retries') - retry_not_before = models.DateTimeField(auto_now_add=True) + retry_not_before = models.DateTimeField() retry_count = models.PositiveIntegerField(default=0) action_type = models.CharField(max_length=255) diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 7a625c28b..dc7566889 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -527,8 +527,10 @@ def send_webhook(self, logentry_id: int, action_type: str, webhook_id: int, retr if retry_count >= len(retry_intervals): return 'retry-given-up' elif retry_intervals[retry_count] < retry_celery_cutoff: - send_webhook.apply_async(args=(logentry_id, action_type, webhook_id, retry_count + 1), - countdown=retry_intervals[retry_count]) + send_webhook.apply_async( + args=(logentry_id, action_type, webhook_id, retry_count + 1), + countdown=retry_intervals[retry_count] + ) return 'retry-via-celery' else: webhook.retries.update_or_create( @@ -555,7 +557,10 @@ def send_webhook(self, logentry_id: int, action_type: str, webhook_id: int, retr if retry_count >= len(retry_intervals): return 'retry-given-up' elif retry_intervals[retry_count] < retry_celery_cutoff: - send_webhook.apply_async(args=(logentry_id, action_type, webhook_id, retry_count + 1)) + send_webhook.apply_async( + args=(logentry_id, action_type, webhook_id, retry_count + 1), + countdown=retry_intervals[retry_count] + ) return 'retry-via-celery' else: webhook.retries.update_or_create(