Skip to content
Snippets Groups Projects
notifications.py 7.04 KiB
from typing import Union
from urllib.parse import urljoin

from django.conf import settings
from django.urls import reverse
from django.utils.formats import date_format
from django.utils.translation import gettext_lazy as _
from django.utils.translation import ngettext

from aleksis.core.models import Notification, Person

from ..models import Event, ExtraLesson, LessonSubstitution, SupervisionSubstitution


def send_notifications_for_object(
    instance: Union[ExtraLesson, LessonSubstitution, Event, SupervisionSubstitution]
):
    """Send notifications for a change object."""
    recipients = []
    if isinstance(instance, LessonSubstitution):
        recipients += instance.lesson_period.lesson.teachers.all()
        recipients += instance.teachers.all()
        recipients += Person.objects.filter(
            member_of__in=instance.lesson_period.lesson.groups.all()
        )
    elif isinstance(instance, Event):
        recipients += instance.teachers.all()
        recipients += Person.objects.filter(member_of__in=instance.groups.all())
    elif isinstance(instance, ExtraLesson):
        recipients += instance.teachers.all()
        recipients += Person.objects.filter(member_of__in=instance.groups.all())
    elif isinstance(instance, SupervisionSubstitution):
        recipients.append(instance.teacher)
        recipients.append(instance.supervision.teacher)

    description = ""
    if isinstance(instance, LessonSubstitution):
        # Date, lesson, subject
        subject = instance.lesson_period.lesson.subject
        day = instance.date
        period = instance.lesson_period.period

        if instance.cancelled:
            description += (
                _(
                    "The {subject} lesson in the {period}. period on {day} has been cancelled."
                ).format(subject=subject.name, period=period.period, day=date_format(day))
                + " "
            )
        else:
            description += (
                _(
                    "The {subject} lesson in the {period}. period "
                    "on {day} has some current changes."
                ).format(subject=subject.name, period=period.period, day=date_format(day))
                + " "
            )

            if instance.teachers.all():
                description += (
                    ngettext(
                        "The teacher {old} is substituted by {new}.",
                        "The teachers {old} are substituted by {new}.",
                        instance.teachers.count(),
                    ).format(
                        old=instance.lesson_period.lesson.teacher_names,
                        new=instance.teacher_names,
                    )
                    + " "
                )

            if instance.subject:
                description += (
                    _("The subject is changed to {subject}.").format(subject=instance.subject.name)
                    + " "
                )

            if instance.room:
                description += (
                    _("The lesson is moved from {old} to {new}.").format(
                        old=instance.lesson_period.room.name,
                        new=instance.room.name,
                    )
                    + " "
                )

        if instance.comment:
            description += (
                _("There is an additional comment: {comment}.").format(comment=instance.comment)
                + " "
            )

    elif isinstance(instance, Event):
        if instance.date_start != instance.date_end:
            description += (
                _(
                    "There is an event that starts on {date_start}, {period_from}. period "
                    "and ends on {date_end}, {period_to}. period:"
                ).format(
                    date_start=date_format(instance.date_start),
                    date_end=date_format(instance.date_end),
                    period_from=instance.period_from.period,
                    period_to=instance.period_to.period,
                )
                + "\n"
            )
        else:
            description += (
                _(
                    "There is an event on {date} from the "
                    "{period_from}. period to the {period_to}. period:"
                ).format(
                    date=date_format(instance.date_start),
                    period_from=instance.period_from.period,
                    period_to=instance.period_to.period,
                )
                + "\n"
            )

        if instance.groups.all():
            description += _("Groups: {groups}").format(groups=instance.group_names) + "\n"
        if instance.teachers.all():
            description += _("Teachers: {teachers}").format(teachers=instance.teacher_names) + "\n"
        if instance.rooms.all():
            description += (
                _("Rooms: {rooms}").format(
                    rooms=", ".join([room.name for room in instance.rooms.all()])
                )
                + "\n"
            )
    elif isinstance(instance, ExtraLesson):
        description += (
            _("There is an extra lesson on {date} in the {period}. period:").format(
                date=date_format(instance.date),
                period=instance.period.period,
            )
            + "\n"
        )

        if instance.groups.all():
            description += _("Groups: {groups}").format(groups=instance.group_names) + "\n"
        if instance.room:
            description += _("Subject: {subject}").format(subject=instance.subject.name) + "\n"
        if instance.teachers.all():
            description += _("Teachers: {teachers}").format(teachers=instance.teacher_names) + "\n"
        if instance.room:
            description += _("Room: {room}").format(room=instance.room.name) + "\n"
        if instance.comment:
            description += _("Comment: {comment}.").format(comment=instance.comment) + "\n"
    elif isinstance(instance, SupervisionSubstitution):
        description += _(
            "The supervision of {old} on {date} between the {period_from}. period "
            "and the {period_to}. period in the area {area} is substituted by {new}."
        ).format(
            old=instance.supervision.teacher.full_name,
            date=date_format(instance.date),
            period_from=instance.supervision.break_item.after_period_number,
            period_to=instance.supervision.break_item.before_period_number,
            area=instance.supervision.area.name,
            new=instance.teacher.full_name,
        )

    day = instance.date if hasattr(instance, "date") else instance.date_start

    url = urljoin(
        settings.BASE_URL,
        reverse(
            "my_timetable_by_date",
            args=[day.year, day.month, day.day],
        ),
    )

    for recipient in recipients:
        if recipient.preferences["chronos__send_notifications"]:
            n = Notification(
                recipient=recipient,
                sender=_("Timetable"),
                title=_("There are current changes to your timetable."),
                description=description,
                link=url,
            )
            n.save()