Optimize subscriber notifications

This commit is contained in:
Jeremy Stretch 2024-07-04 16:51:21 -04:00
parent 9f6ccec1ea
commit 2bc7b208f1

View File

@ -294,24 +294,21 @@ def notify_object_changed(sender, instance, created, raw, **kwargs):
if created or raw: if created or raw:
return return
# Skip unsupported object types
ct = ContentType.objects.get_for_model(instance) ct = ContentType.objects.get_for_model(instance)
if ct.model not in registry['model_features']['notifications'].get(ct.app_label, []): if ct.model not in registry['model_features']['notifications'].get(ct.app_label, []):
return return
# Find any Subscriptions for supported objects # Find all subscribed Users
subscriptions = Subscription.objects.filter(object_type=ct, object_id=instance.pk).values('user') subscribed_users = Subscription.objects.filter(object_type=ct, object_id=instance.pk).values_list('user', flat=True)
if not subscribed_users:
return
# Delete any existing Notifications for the object # Delete any existing Notifications for the object
subscribed_users = [sub['user'] for sub in subscriptions]
Notification.objects.filter(object_type=ct, object_id=instance.pk, user__in=subscribed_users).delete() Notification.objects.filter(object_type=ct, object_id=instance.pk, user__in=subscribed_users).delete()
# Create Notifications for Subscribers # Create Notifications for Subscribers
notifications = [ Notification.objects.bulk_create([
Notification( Notification(user_id=user, object=instance, event_name=OBJECT_UPDATED)
user_id=sub['user'], for user in subscribed_users
object=instance, ])
event_name=OBJECT_UPDATED
)
for sub in subscriptions
]
Notification.objects.bulk_create(notifications)