* refactor: separate signal receiver from work * test: split test to match code structure * test: fix test * refactor: reorg signals in community app
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
# Copyright The IETF Trust 2024, All Rights Reserved
|
|
|
|
from django.conf import settings
|
|
from django.db import transaction
|
|
from django.db.models.signals import post_save
|
|
from django.dispatch import receiver
|
|
|
|
from ietf.doc.models import DocEvent
|
|
from .tasks import notify_event_to_subscribers_task
|
|
|
|
|
|
def notify_of_event(event: DocEvent):
|
|
"""Send subscriber notification emails for a 'draft'-related DocEvent
|
|
|
|
If the event is attached to a draft of type 'doc', queues a task to send notification emails to
|
|
community list subscribers. No emails will be sent when SERVER_MODE is 'test'.
|
|
"""
|
|
if event.doc.type_id != "draft":
|
|
return
|
|
|
|
if getattr(event, "skip_community_list_notification", False):
|
|
return
|
|
|
|
# kludge alert: queuing a celery task in response to a signal can cause unexpected attempts to
|
|
# start a Celery task during tests. To prevent this, don't queue a celery task if we're running
|
|
# tests.
|
|
if settings.SERVER_MODE != "test":
|
|
# Wrap in on_commit in case a transaction is open
|
|
transaction.on_commit(
|
|
lambda: notify_event_to_subscribers_task.delay(event_id=event.pk)
|
|
)
|
|
|
|
|
|
# dispatch_uid ensures only a single signal receiver binding is made
|
|
@receiver(post_save, dispatch_uid="notify_of_events_receiver_uid")
|
|
def notify_of_events_receiver(sender, instance, **kwargs):
|
|
"""Call notify_of_event after saving a new DocEvent"""
|
|
if not isinstance(instance, DocEvent):
|
|
return
|
|
|
|
if not kwargs.get("created", False):
|
|
return # only notify on creation
|
|
|
|
notify_of_event(instance)
|