takahe/users/services/announcement.py

46 lines
1.3 KiB
Python

from django.db import models
from django.utils import timezone
from users.models import Announcement, User
class AnnouncementService:
"""
Handles viewing and dismissing announcements
"""
def __init__(self, user: User):
self.user = user
@classmethod
def visible_queryset(cls) -> models.QuerySet[Announcement]:
"""
Common visibility query
"""
now = timezone.now()
return Announcement.objects.filter(
models.Q(start__lte=now) | models.Q(start__isnull=True),
models.Q(end__gte=now) | models.Q(end__isnull=True),
published=True,
).order_by("-start", "-created")
@classmethod
def visible_anonymous(cls) -> models.QuerySet[Announcement]:
"""
Returns all announcements marked as being showable to all visitors
"""
return cls.visible_queryset().filter(include_unauthenticated=True)
def visible(self) -> models.QuerySet[Announcement]:
"""
Returns all announcements that are currently valid and should be shown
to a given user.
"""
return self.visible_queryset().exclude(seen=self.user)
def mark_seen(self, announcement: Announcement):
"""
Marks an announcement as seen by the user
"""
announcement.seen.add(self.user)