diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 3d49754fb05baa4aa803e5295490ae6ac7192d18..de891da1bab9bbc37da9c95493fea9efc81db99d 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -277,21 +277,8 @@ class Notification(ExtensibleModel): verbose_name_plural = _("Notifications") -class Announcement(ExtensibleModel): - title = models.CharField(max_length=150, verbose_name=_("Title")) - description = models.TextField(max_length=500, verbose_name=_("Description"), blank=True) - link = models.URLField(blank=True, verbose_name=_("Link")) - - valid_from = models.DateTimeField( - verbose_name=_("Date and time from when to show"), default=timezone.now - ) - valid_until = models.DateTimeField( - verbose_name=_("Date and time until when to show"), - default=now_tomorrow, - ) - - @classmethod - def relevant_for(cls, obj: Union[models.Model, models.QuerySet]) -> models.QuerySet: +class AnnouncementQuerySet(models.QuerySet): + def relevant_for(self, obj: Union[models.Model, models.QuerySet]) -> models.QuerySet: """ Get a QuerySet with all announcements relevant for a certain Model (e.g. a Group) or a set of models in a QuerySet. """ @@ -303,15 +290,33 @@ class Announcement(ExtensibleModel): ct = ContentType.objects.get_for_model(obj) pks = [obj.pk] - return cls.objects.filter(recipients__content_type=ct, recipients__recipient_id__in=pks) + return self.filter(recipients__content_type=ct, recipients__recipient_id__in=pks) - @classmethod - def for_person_at_time(cls, person: Person, when: Optional[datetime] = None) -> List: + def at_time(self,when: Optional[datetime] = None ) -> models.QuerySet: + """ Get all announcements at a certain time """ + + when = when or timezone.datetime.now() + + # Get announcements by time + announcements = self.filter(valid_from__lte=when, valid_until__gte=when) + + return announcements + + def at_date(self,when: Optional[date] = None) -> models.QuerySet: + """ Get all announcements at a certain date """ + + when = when or timezone.datetime.now().date() + + # Get announcements by time + announcements = self.filter(valid_from__date__lte=when, valid_until__date__gte=when) + + return announcements + + def for_person_at_time(self, person: Person, when: Optional[datetime] = None) -> List: """ Get all announcements for one person at a certain time """ - when = when or timezone.now() # Get announcements by time - announcements = cls.objects.filter(valid_from__lte=when, valid_until__gte=when) + announcements = self.at_time(when) # Filter by person announcements_for_person = [] @@ -321,6 +326,22 @@ class Announcement(ExtensibleModel): return announcements_for_person + +class Announcement(ExtensibleModel): + objects = models.Manager.from_queryset(AnnouncementQuerySet)() + + title = models.CharField(max_length=150, verbose_name=_("Title")) + description = models.TextField(max_length=500, verbose_name=_("Description"), blank=True) + link = models.URLField(blank=True, verbose_name=_("Link")) + + valid_from = models.DateTimeField( + verbose_name=_("Date and time from when to show"), default=timezone.datetime.now + ) + valid_until = models.DateTimeField( + verbose_name=_("Date and time until when to show"), + default=now_tomorrow, + ) + @property def recipient_persons(self) -> Sequence[Person]: """ Return a list of Persons this announcement is relevant for """ diff --git a/aleksis/core/views.py b/aleksis/core/views.py index 68773c76398542863bef6df3316ca3799a643e6a..662a1a040ec64b302be36de2fa0a5d36592330fb 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -34,7 +34,7 @@ def index(request: HttpRequest) -> HttpResponse: context["notifications"] = notifications context["unread_notifications"] = unread_notifications - announcements = Announcement.for_person_at_time(request.user.person) + announcements = Announcement.objects.for_person_at_time(request.user.person) context["announcements"] = announcements widgets = DashboardWidget.objects.filter(active=True)