diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html index e98f71587ed93f987ed710c0dd7721f86f21a407..82a3c03731fb1f1229ddd6e7b974cfb85c9c3916 100644 --- a/aleksis/core/templates/core/base.html +++ b/aleksis/core/templates/core/base.html @@ -10,9 +10,9 @@ <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1"> - <meta name="description" content="Selbst programmierte Anwendungen für den Schullaltag am Katharineum zu Lübeck"> + <meta name="description" content="{% blocktrans %}AlekSIS is a web-based school information system (SIS) which can be used to manage and/or publish organisational data of educational in titutions.{% endblocktrans %}"> - <title>School Information System</title> + <title>{% blocktrans %}AlekSIS - School Information System{% endblocktrans %}</title> {# Favicons #} <link href="{% static "icons/favicon_16.png" %}" rel="icon" type="image/png" sizes="16x16"> @@ -41,7 +41,7 @@ <!-- Nav bar (logged in as, logout) --> <nav> - <a class="brand-logo" href="/">SIS</a> + <a class="brand-logo" href="/">AlekSIS</a> <div class="nav-wrapper"> <ul id="nav-mobile" class="right hide-on-med-and-down"> diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html index 5055129bffdcbe45d1e5d22f2a27881ad9006052..a8fbbcbb57b724337062af6d3906486fa0211268 100644 --- a/aleksis/core/templates/core/index.html +++ b/aleksis/core/templates/core/index.html @@ -1,22 +1,78 @@ -{# -*- engine:django -*- #} +{% extends 'core/base.html' %} +{% load i18n %} -{% extends "core/base.html" %} +{% block content %} + <p class="flow-text">{% blocktrans %}AlekSIS (School Information System){% endblocktrans %}</p> -{% load i18n %} + {% if user.is_authenticated %} + {% for notification in unread_notifications %} + <div class="alert primary scale-transition"> + <div> + <i class="material-icons left">info</i> -{% block page_title %} - {% blocktrans %} - AlekSIS (School Information System) - {% endblocktrans %} -{% endblock %} + <div class="right"> + <a class="btn-flat waves-effect" href="{% url "notification_mark_read" notification.id %}"> + <i class="material-icons center">close</i> + </a> + </div> -{% block content %} - <div class="flow-text"> - <p> - {% blocktrans %} - AlekSIS is a web-based school information system (SIS) which can be used to - manage and/or publish organisational data of educational institutions. - {% endblocktrans %} - </p> - </div> + <strong>{{ notification.title }}</strong> + <p>{{ notification.description }}</p> + </div> + </div> + {% endfor %} + + <div class="row"> + <div class="col s12 m6"> + <h5>{% blocktrans %}Last activities{% endblocktrans %}</h5> + + {% if activities %} + <ul class="collection"> + {% for activity in activities %} + <li class="collection-item"> + <span class="badge new primary-color">{{ activity.app }}</span> + <span class="title">{{ activity.title }}</span> + <p> + <i class="material-icons left">access_time</i> {{ activity.created_at }} + </p> + <p> + {{ activity.description }} + </p> + </li> + {% endfor %} + </ul> + {% else %} + <p>{% blocktrans %}No activities available yet.{% endblocktrans %}</p> + {% endif %} + </div> + + <div class="col s12 m6"> + <h5>{% blocktrans %}Recent notifications{% endblocktrans %}</h5> + + {% if notifications %} + <ul class="collection"> + {% for notification in notifications %} + <li class="collection-item"> + <span class="badge new primary-color">{{ notification.app }}</span> + <span class="title">{{ notification.title }}</span> + <p> + <i class="material-icons left">access_time</i> {{ notification.created_at }} + </p> + <p> + {{ notification.description }} + </p> + {% if notification.link %} + <p> + <a href="{{ notification.link }}">{% blocktrans %}More information →{% endblocktrans %}</a> + </p> + {% endif %} + </li> + {% endfor %} + </ul> + {% else %} + <p>{% blocktrans %}No notifications available yet.{% endblocktrans %}</p> + {% endif %} + </div> + </div> + {% endif %} {% endblock %} diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index 0ac57aabe965aa6017d455a3468eddf43f0abe80..2229a5dbfd731a1124ed10944d496c8a9527e785 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -31,6 +31,7 @@ urlpatterns = [ path("group/<int:id_>", views.group, name="group_by_id"), path("group/<int:id_>/edit", views.edit_group, name="edit_group_by_id"), path("", views.index, name="index"), + path("notifications/mark-read/<int:id_>", views.notification_mark_read, name="notification_mark_read"), path("maintenance-mode/", include("maintenance_mode.urls")), path("impersonate/", include("impersonate.urls")), path("__i18n__/", include("django.conf.urls.i18n")), diff --git a/aleksis/core/views.py b/aleksis/core/views.py index 709ebe26d917c4d5fad9ffe2afc0ccdbab4bb2db..607cb4ed1a9b43863207325b457b88c8157205a6 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -1,6 +1,7 @@ from typing import Optional from django.contrib.auth.decorators import login_required +from django.core.exceptions import PermissionDenied from django.http import Http404, HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils.translation import ugettext_lazy as _ @@ -15,13 +16,29 @@ from .forms import ( EditTermForm, PersonsAccountsFormSet, ) -from .models import Group, Person, School +from .models import Activity, Group, Notification, Person, School from .tables import GroupsTable, PersonsTable from .util import messages +@login_required def index(request: HttpRequest) -> HttpResponse: context = {} + + if request.user.is_authenticated: + activities = request.user.person.activities.all()[:5] + + notifications = ( + request.user.person.notifications.all()[:5] + ) + unread_notifications = ( + request.user.person.notifications.all().filter(read=False) + ) + + context["activities"] = activities + context["notifications"] = notifications + context["unread_notifications"] = unread_notifications + return render(request, "core/index.html", context) @@ -237,3 +254,17 @@ def edit_schoolterm(request: HttpRequest) -> HttpResponse: context["edit_term_form"] = edit_term_form return render(request, "core/edit_schoolterm.html", context) + + +def notification_mark_read(request: HttpRequest, id_: int) -> HttpResponse: + context = {} + + notification = get_object_or_404(Notification, pk=id_) + + if notification.user == request.user: + notification.read = True + notification.save() + else: + raise PermissionDenied(_("You are not allowed to mark notifications from other users as read!")) + + return redirect("index")