diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 79933d4007b6afff751b3dde0b950f7ffd6ce33a..e1dae558196ec24093496f7ccdd588bdcdcbca43 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -1,5 +1,5 @@ from datetime import date, datetime, timedelta -from typing import Optional, Iterable, Union, Sequence +from typing import Optional, Iterable, Union, Sequence, List from django.contrib.auth import get_user_model from django.contrib.auth.models import User @@ -312,6 +312,22 @@ class Announcement(models.Model): return cls.objects.filter(content_type=ct, recipient_id__in=pks) + @classmethod + def for_person_at_time(cls, person: Person, when: Optional[datetime] = None) -> List: + """ Get all announcements for one person at a certain time """ + when = when or timezone.datetime.now() + + # Get announcements by time + announcements = cls.objects.filter(valid_from__lte=when, valid_until__gte=when) + + # Filter by person + announcements_for_person = [] + for announcement in announcements: + if person in announcement.recipient_persons: + announcements_for_person.append(announcement) + + return announcements_for_person + @property def recipient_persons(self) -> Union[models.QuerySet, Sequence[models.Model]]: """ Return a list of Persons this announcement is relevant for diff --git a/aleksis/core/templates/core/announcements.html b/aleksis/core/templates/core/announcements.html new file mode 100644 index 0000000000000000000000000000000000000000..3e1925536a12bb3824a5b5bb11adb636fcfc9bf2 --- /dev/null +++ b/aleksis/core/templates/core/announcements.html @@ -0,0 +1,41 @@ +{% load i18n humanize %} + +{% for announcement in announcements %} + <div class="alert primary"> + <div> + {% if show_interval %} + <em class="right hide-on-small-and-down"> + {% if announcement.valid_from.date == announcement.valid_until.date %} + {% blocktrans with from=announcement.valid_from|naturalday %} + Valid for {{ from }} + {% endblocktrans %} + {% else %} + {% blocktrans with from=announcement.valid_from|naturalday until=announcement.valid_until|naturalday %} + Valid for {{ from }} – {{ until }} + {% endblocktrans %} + {% endif %} + </em> + {% endif %} + + <i class="material-icons left">announcement</i> + <p> + <strong>{{ announcement.title }}</strong> <br/> + {{ announcement.description }} + </p> + + {% if show_interval %} + <em class="hide-on-med-and-up"> + {% if announcement.valid_from.date == announcement.valid_until.date %} + {% blocktrans with from=announcement.valid_from|naturalday %} + Valid for {{ from }} + {% endblocktrans %} + {% else %} + {% blocktrans with from=announcement.valid_from|naturalday until=announcement.valid_until|naturalday %} + Valid for {{ from }} – {{ until }} + {% endblocktrans %} + {% endif %} + </em> + {% endif %} + </div> + </div> +{% endfor %} diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html index 9e8e19ac71dd20e17ca690c560a81767975e85aa..2ace14e98652ded4e56c840c180b10690b1fb7d6 100644 --- a/aleksis/core/templates/core/index.html +++ b/aleksis/core/templates/core/index.html @@ -28,6 +28,8 @@ </div> {% endfor %} + {% include "core/announcements.html" with announcements=announcements %} + <div class="row" id="live_load"> {% for widget in widgets %} <div class="col s12 m12 l6 xl4"> diff --git a/aleksis/core/views.py b/aleksis/core/views.py index 2e1946de401b866e0adbc4aa3ee8463b5f1b94af..98db80da4a5d30df58f6bc2a8d3d037f226a0044 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -16,7 +16,7 @@ from .forms import ( EditTermForm, PersonsAccountsFormSet, ) -from .models import Activity, Group, Notification, Person, School, DashboardWidget +from .models import Activity, Group, Notification, Person, School, DashboardWidget, Announcement from .tables import GroupsTable, PersonsTable from .util import messages @@ -33,6 +33,9 @@ def index(request: HttpRequest) -> HttpResponse: context["notifications"] = notifications context["unread_notifications"] = unread_notifications + announcements = Announcement.for_person_at_time(request.user.person) + context["announcements"] = announcements + widgets = DashboardWidget.objects.filter(active=True) media = DashboardWidget.get_media(widgets)