Skip to content
Snippets Groups Projects
tables.py 6.96 KiB
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _

import django_tables2 as tables
from django_tables2.utils import A

from aleksis.apps.chronos.models import Event, LessonPeriod
from aleksis.core.util.tables import SelectColumn

from .models import PersonalNote


class ExtraMarkTable(tables.Table):
    class Meta:
        attrs = {"class": "highlight"}

    name = tables.LinkColumn("edit_extra_mark", args=[A("id")])
    short_name = tables.Column()
    edit = tables.LinkColumn(
        "edit_extra_mark",
        args=[A("id")],
        text=_("Edit"),
        attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}},
    )
    delete = tables.LinkColumn(
        "delete_extra_mark",
        args=[A("id")],
        text=_("Delete"),
        attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}},
    )


class ExcuseTypeTable(tables.Table):
    class Meta:
        attrs = {"class": "highlight"}

    name = tables.LinkColumn("edit_excuse_type", args=[A("id")])
    short_name = tables.Column()
    edit = tables.LinkColumn(
        "edit_excuse_type",
        args=[A("id")],
        text=_("Edit"),
        attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}},
    )
    delete = tables.LinkColumn(
        "delete_excuse_type",
        args=[A("id")],
        text=_("Delete"),
        attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}},
    )

    def before_render(self, request):
        if not request.user.has_perm("alsijil.edit_excusetype"):
            self.columns.hide("edit")
        if not request.user.has_perm("alsijil.delete_excusetype"):
            self.columns.hide("delete")


class GroupRoleTable(tables.Table):
    class Meta:
        attrs = {"class": "highlight"}

    name = tables.LinkColumn("edit_excuse_type", args=[A("id")])
    edit = tables.LinkColumn(
        "edit_group_role",
        args=[A("id")],
        text=_("Edit"),
        attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}},
    )
    delete = tables.LinkColumn(
        "delete_group_role",
        args=[A("id")],
        text=_("Delete"),
        attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}},
    )

    def render_name(self, value, record):
        context = dict(role=record)
        return render_to_string("alsijil/group_role/chip.html", context)

    def before_render(self, request):
        if not request.user.has_perm("alsijil.edit_grouprole"):
            self.columns.hide("edit")
        if not request.user.has_perm("alsijil.delete_grouprole"):
            self.columns.hide("delete")


class PersonalNoteTable(tables.Table):
    selected = SelectColumn(attrs={"input": {"name": "selected_objects"}}, accessor=A("pk"))
    date = tables.Column(
        verbose_name=_("Date"), accessor=A("date_formatted"), order_by=A("day_start")
    )
    period = tables.Column(
        verbose_name=_("Period"), accessor=A("period_formatted"), order_by=A("order_period")
    )
    groups = tables.Column(
        verbose_name=_("Groups"),
        accessor=A("register_object__group_names"),
        order_by=A("order_groups"),
    )
    teachers = tables.Column(
        verbose_name=_("Teachers"),
        accessor=A("register_object__teacher_names"),
        order_by=A("order_teachers"),
    )
    subject = tables.Column(verbose_name=_("Subject"), accessor=A("subject"))
    absent = tables.Column()
    late = tables.Column()
    excused = tables.Column(verbose_name=_("Excuse"))
    extra_marks = tables.Column(verbose_name="Extra marks", accessor=A("extra_marks__all"))

    def render_groups(self, value, record):
        if isinstance(record.register_object, LessonPeriod):
            return record.register_object.lesson.group_names
        else:
            return value

    def render_subject(self, value, record):
        if isinstance(record.register_object, Event):
            return _("Event")
        else:
            return value

    def render_absent(self, value):
        return (
            render_to_string(
                "components/materialize-chips.html",
                dict(content="Absent", classes="red white-text"),
            )
            if value
            else ""
        )

    def render_excused(self, value, record):
        if record.absent and value:
            context = dict(content=_("Excused"), classes="green white-text")
            badge = render_to_string("components/materialize-chips.html", context)
            if record.excuse_type:
                context = dict(content=record.excuse_type.name, classes="green white-text")
                badge = render_to_string("components/materialize-chips.html", context)
            return badge
        return ""

    def render_late(self, value):
        if value:
            content = _(f"{value}' late")
            context = dict(content=content, classes="orange white-text")
            return render_to_string("components/materialize-chips.html", context)
        else:
            return ""

    def render_extra_marks(self, value):
        if value:
            badges = ""
            for extra_mark in value:
                content = extra_mark.name
                badges += render_to_string(
                    "components/materialize-chips.html", context=dict(content=content)
                )
            return mark_safe(badges)  # noqa
        else:
            return ""

    class Meta:
        model = PersonalNote
        fields = ()


def _get_link(value, record):
    return record["register_object"].get_alsijil_url(record.get("week"))


class RegisterObjectTable(tables.Table):
    """Table to show all register objects in an overview.

    .. warning::
        Works only with ``generate_list_of_all_register_objects``.
    """

    class Meta:
        attrs = {"class": "highlight responsive-table"}

    status = tables.Column(accessor="register_object")
    date = tables.Column(order_by="date_sort", linkify=_get_link)
    period = tables.Column(order_by="period_sort", linkify=_get_link)
    groups = tables.Column(linkify=_get_link)
    teachers = tables.Column(linkify=_get_link)
    subject = tables.Column(linkify=_get_link)
    topic = tables.Column(linkify=_get_link)
    homework = tables.Column(linkify=_get_link)
    group_note = tables.Column(linkify=_get_link)

    def render_status(self, value, record):
        return render_to_string(
            "alsijil/partials/lesson_status_icon.html",
            dict(
                week=record.get("week"),
                has_documentation=record.get("has_documentation", False),
                substitution=record.get("substitution"),
                register_object=value,
            ),
        )


class RegisterObjectSelectTable(RegisterObjectTable):
    """Table to show all register objects with multi-select support.

    More information at ``RegisterObjectTable``
    """

    selected = SelectColumn()

    class Meta(RegisterObjectTable.Meta):
        sequence = ("selected", "...")