62 lines
2 KiB
Python
62 lines
2 KiB
Python
|
from django.db import models
|
||
|
from django.utils.translation import gettext_lazy as _
|
||
|
from django.db.models import CASCADE, F
|
||
|
from django.core.exceptions import ObjectDoesNotExist
|
||
|
|
||
|
from judge.models import Profile, Comment
|
||
|
from judge.caching import cache_wrapper
|
||
|
|
||
|
|
||
|
class Notification(models.Model):
|
||
|
owner = models.ForeignKey(
|
||
|
Profile,
|
||
|
verbose_name=_("owner"),
|
||
|
related_name="notifications",
|
||
|
on_delete=CASCADE,
|
||
|
)
|
||
|
time = models.DateTimeField(verbose_name=_("posted time"), auto_now_add=True)
|
||
|
category = models.CharField(verbose_name=_("category"), max_length=1000)
|
||
|
html_link = models.TextField(
|
||
|
default="",
|
||
|
verbose_name=_("html link to comments, used for non-comments"),
|
||
|
max_length=1000,
|
||
|
)
|
||
|
author = models.ForeignKey(
|
||
|
Profile,
|
||
|
null=True,
|
||
|
verbose_name=_("who trigger, used for non-comment"),
|
||
|
on_delete=CASCADE,
|
||
|
)
|
||
|
comment = models.ForeignKey(
|
||
|
Comment, null=True, verbose_name=_("comment"), on_delete=CASCADE
|
||
|
) # deprecated
|
||
|
read = models.BooleanField(verbose_name=_("read"), default=False) # deprecated
|
||
|
|
||
|
|
||
|
class NotificationProfile(models.Model):
|
||
|
unread_count = models.IntegerField(default=0)
|
||
|
user = models.OneToOneField(Profile, on_delete=CASCADE)
|
||
|
|
||
|
|
||
|
def make_notification(to_users, category, html_link, author):
|
||
|
for user in to_users:
|
||
|
if user == author:
|
||
|
continue
|
||
|
notif = Notification(
|
||
|
owner=user, category=category, html_link=html_link, author=author
|
||
|
)
|
||
|
notif.save()
|
||
|
NotificationProfile.objects.get_or_create(user=user)
|
||
|
NotificationProfile.objects.filter(user=user).update(
|
||
|
unread_count=F("unread_count") + 1
|
||
|
)
|
||
|
unseen_notifications_count.dirty(user)
|
||
|
|
||
|
|
||
|
@cache_wrapper(prefix="unc")
|
||
|
def unseen_notifications_count(profile):
|
||
|
try:
|
||
|
return NotificationProfile.objects.get(user=profile).unread_count
|
||
|
except ObjectDoesNotExist:
|
||
|
return 0
|