33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
from django.db import transaction
|
|
|
|
from .models import Notification
|
|
|
|
PERSONAL_NOTIFICATION_LIMIT = 200
|
|
|
|
|
|
def notify_project_change(project, actor, kind, text):
|
|
"""Notify the project's owner + contributors about a change, excluding the actor.
|
|
|
|
Retention: keeps only the newest ~200 notifications per recipient."""
|
|
if actor is None or not actor.is_authenticated:
|
|
return
|
|
recipient_ids = {project.owner_id}
|
|
recipient_ids.update(project.contributors.values_list('user_id', flat=True))
|
|
recipient_ids.discard(actor.pk)
|
|
if not recipient_ids:
|
|
return
|
|
with transaction.atomic():
|
|
for uid in recipient_ids:
|
|
Notification.objects.create(
|
|
user_id=uid, actor=actor, project=project, kind=kind, text=text,
|
|
)
|
|
# Prune each recipient down to the newest limit.
|
|
for uid in recipient_ids:
|
|
stale = list(
|
|
Notification.objects.filter(user_id=uid)
|
|
.order_by('-created_at', '-pk')
|
|
.values_list('pk', flat=True)[PERSONAL_NOTIFICATION_LIMIT:]
|
|
)
|
|
if stale:
|
|
Notification.objects.filter(pk__in=stale).delete()
|