Skip to content
Snippets Groups Projects
Commit 6e9fd121 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch 'master' into prepare-release-2.0

parents 45ce5c0e 1d074007
No related branches found
No related tags found
1 merge request!196Set version and core dependency to 2.0b0
Showing
with 122 additions and 40 deletions
...@@ -9,7 +9,19 @@ This is an application for use with the `AlekSIS`_ platform. ...@@ -9,7 +9,19 @@ This is an application for use with the `AlekSIS`_ platform.
Features Features
-------- --------
The Alsijil app provides functionality for digital class registers. This AlekSIS app currently provides the following features for managing digital class registers:
* For users:
* Manage and assign group roles
* Manage custom excuse types
* Manage extra marks (e. g. forgotten homework)
* Manage group notes for every lesson
* Manage lesson documentations for every lesson
* Manage personal notes for every lesson
* Show all owned groups of the current person
* Show all students of the current person
* Show filterable (week) overview for lesson documentations and personal/group notes
Licence Licence
------- -------
......
# Generated by Django 3.2.3 on 2021-05-23 12:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('alsijil', '0012_unique_relation'),
]
operations = [
migrations.AlterUniqueTogether(
name='lessondocumentation',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='personalnote',
unique_together=set(),
),
migrations.AddConstraint(
model_name='excusetype',
constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_excuse_short_name'),
),
migrations.AddConstraint(
model_name='excusetype',
constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_excuse_name'),
),
migrations.AddConstraint(
model_name='extramark',
constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_mark_short_name'),
),
migrations.AddConstraint(
model_name='extramark',
constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_mark_name'),
),
migrations.AddConstraint(
model_name='grouprole',
constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_role_per_site'),
),
migrations.AddConstraint(
model_name='lessondocumentation',
constraint=models.UniqueConstraint(fields=('lesson_period', 'week', 'year', 'event', 'extra_lesson'), name='unique_documentation_per_object'),
),
migrations.AddConstraint(
model_name='personalnote',
constraint=models.UniqueConstraint(fields=('lesson_period', 'week', 'year', 'event', 'extra_lesson'), name='unique_personal_note_per_object'),
),
]
...@@ -61,6 +61,12 @@ class ExcuseType(ExtensibleModel): ...@@ -61,6 +61,12 @@ class ExcuseType(ExtensibleModel):
ordering = ["name"] ordering = ["name"]
verbose_name = _("Excuse type") verbose_name = _("Excuse type")
verbose_name_plural = _("Excuse types") verbose_name_plural = _("Excuse types")
constraints = [
models.UniqueConstraint(
fields=("site_id", "short_name"), name="unique_excuse_short_name"
),
models.UniqueConstraint(fields=("site_id", "name"), name="unique_excuse_name"),
]
lesson_related_constraint_q = ( lesson_related_constraint_q = (
...@@ -275,9 +281,12 @@ class PersonalNote(RegisterObjectRelatedMixin, ExtensibleModel): ...@@ -275,9 +281,12 @@ class PersonalNote(RegisterObjectRelatedMixin, ExtensibleModel):
constraints = [ constraints = [
CheckConstraint( CheckConstraint(
check=lesson_related_constraint_q, name="one_relation_only_personal_note" check=lesson_related_constraint_q, name="one_relation_only_personal_note"
) ),
models.UniqueConstraint(
fields=("lesson_period", "week", "year", "event", "extra_lesson"),
name="unique_personal_note_per_object",
),
] ]
unique_together = ["lesson_period", "week", "year", "event", "extra_lesson"]
class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel): class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
...@@ -362,9 +371,12 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel): ...@@ -362,9 +371,12 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
constraints = [ constraints = [
CheckConstraint( CheckConstraint(
check=lesson_related_constraint_q, name="one_relation_only_lesson_documentation", check=lesson_related_constraint_q, name="one_relation_only_lesson_documentation",
) ),
models.UniqueConstraint(
fields=("lesson_period", "week", "year", "event", "extra_lesson"),
name="unique_documentation_per_object",
),
] ]
unique_together = ["lesson_period", "week", "year", "event", "extra_lesson"]
class ExtraMark(ExtensibleModel): class ExtraMark(ExtensibleModel):
...@@ -387,6 +399,12 @@ class ExtraMark(ExtensibleModel): ...@@ -387,6 +399,12 @@ class ExtraMark(ExtensibleModel):
ordering = ["short_name"] ordering = ["short_name"]
verbose_name = _("Extra mark") verbose_name = _("Extra mark")
verbose_name_plural = _("Extra marks") verbose_name_plural = _("Extra marks")
constraints = [
models.UniqueConstraint(
fields=("site_id", "short_name"), name="unique_mark_short_name"
),
models.UniqueConstraint(fields=("site_id", "name"), name="unique_mark_name"),
]
class GroupRole(ExtensibleModel): class GroupRole(ExtensibleModel):
...@@ -402,6 +420,9 @@ class GroupRole(ExtensibleModel): ...@@ -402,6 +420,9 @@ class GroupRole(ExtensibleModel):
class Meta: class Meta:
verbose_name = _("Group role") verbose_name = _("Group role")
verbose_name_plural = _("Group roles") verbose_name_plural = _("Group roles")
constraints = [
models.UniqueConstraint(fields=("site_id", "name"), name="unique_role_per_site"),
]
class GroupRoleAssignment(GroupPropertiesMixin, ExtensibleModel): class GroupRoleAssignment(GroupPropertiesMixin, ExtensibleModel):
......
...@@ -261,7 +261,7 @@ add_perm("alsijil.delete_grouprole_rule", delete_group_role_predicate) ...@@ -261,7 +261,7 @@ add_perm("alsijil.delete_grouprole_rule", delete_group_role_predicate)
view_assigned_group_roles_predicate = has_person & ( view_assigned_group_roles_predicate = has_person & (
is_group_owner is_group_owner
| has_global_perm("alsjil.assign_grouprole") | has_global_perm("alsijil.assign_grouprole")
| has_object_perm("core.assign_grouprole") | has_object_perm("core.assign_grouprole")
) )
add_perm("alsijil.view_assigned_grouproles_rule", view_assigned_group_roles_predicate) add_perm("alsijil.view_assigned_grouproles_rule", view_assigned_group_roles_predicate)
...@@ -270,7 +270,7 @@ view_assigned_group_roles_register_object_predicate = has_person & ( ...@@ -270,7 +270,7 @@ view_assigned_group_roles_register_object_predicate = has_person & (
is_lesson_teacher is_lesson_teacher
| is_lesson_original_teacher | is_lesson_original_teacher
| is_lesson_parent_group_owner | is_lesson_parent_group_owner
| has_global_perm("alsjil.assign_grouprole") | has_global_perm("alsijil.assign_grouprole")
) )
add_perm( add_perm(
"alsijil.view_assigned_grouproles_for_register_object", "alsijil.view_assigned_grouproles_for_register_object",
...@@ -278,12 +278,12 @@ add_perm( ...@@ -278,12 +278,12 @@ add_perm(
) )
assign_group_role_person_predicate = has_person & ( assign_group_role_person_predicate = has_person & (
is_person_group_owner | has_global_perm("alsjil.assign_grouprole") is_person_group_owner | has_global_perm("alsijil.assign_grouprole")
) )
add_perm("alsijil.assign_grouprole_to_person_rule", assign_group_role_person_predicate) add_perm("alsijil.assign_grouprole_to_person_rule", assign_group_role_person_predicate)
assign_group_role_for_multiple_predicate = has_person & ( assign_group_role_for_multiple_predicate = has_person & (
is_owner_of_any_group | has_global_perm("alsjil.assign_grouprole") is_owner_of_any_group | has_global_perm("alsijil.assign_grouprole")
) )
add_perm("alsijil.assign_grouprole_for_multiple_rule", assign_group_role_for_multiple_predicate) add_perm("alsijil.assign_grouprole_for_multiple_rule", assign_group_role_for_multiple_predicate)
...@@ -291,7 +291,7 @@ assign_group_role_group_predicate = view_assigned_group_roles_predicate ...@@ -291,7 +291,7 @@ assign_group_role_group_predicate = view_assigned_group_roles_predicate
add_perm("alsijil.assign_grouprole_for_group_rule", assign_group_role_group_predicate) add_perm("alsijil.assign_grouprole_for_group_rule", assign_group_role_group_predicate)
edit_group_role_assignment_predicate = has_person & ( edit_group_role_assignment_predicate = has_person & (
has_global_perm("alsjil.assign_grouprole") | is_group_role_assignment_group_owner has_global_perm("alsijil.assign_grouprole") | is_group_role_assignment_group_owner
) )
add_perm("alsijil.edit_grouproleassignment_rule", edit_group_role_assignment_predicate) add_perm("alsijil.edit_grouproleassignment_rule", edit_group_role_assignment_predicate)
...@@ -299,7 +299,7 @@ stop_group_role_assignment_predicate = edit_group_role_assignment_predicate ...@@ -299,7 +299,7 @@ stop_group_role_assignment_predicate = edit_group_role_assignment_predicate
add_perm("alsijil.stop_grouproleassignment_rule", stop_group_role_assignment_predicate) add_perm("alsijil.stop_grouproleassignment_rule", stop_group_role_assignment_predicate)
delete_group_role_assignment_predicate = has_person & ( delete_group_role_assignment_predicate = has_person & (
has_global_perm("alsjil.assign_grouprole") | is_group_role_assignment_group_owner has_global_perm("alsijil.assign_grouprole") | is_group_role_assignment_group_owner
) )
add_perm("alsijil.delete_grouproleassignment_rule", delete_group_role_assignment_predicate) add_perm("alsijil.delete_grouproleassignment_rule", delete_group_role_assignment_predicate)
......
...@@ -51,9 +51,9 @@ class ExcuseTypeTable(tables.Table): ...@@ -51,9 +51,9 @@ class ExcuseTypeTable(tables.Table):
) )
def before_render(self, request): def before_render(self, request):
if not request.user.has_perm("alsijil.edit_excusetype"): if not request.user.has_perm("alsijil.edit_excusetype_rule"):
self.columns.hide("edit") self.columns.hide("edit")
if not request.user.has_perm("alsijil.delete_excusetype"): if not request.user.has_perm("alsijil.delete_excusetype_rule"):
self.columns.hide("delete") self.columns.hide("delete")
...@@ -80,9 +80,9 @@ class GroupRoleTable(tables.Table): ...@@ -80,9 +80,9 @@ class GroupRoleTable(tables.Table):
return render_to_string("alsijil/group_role/chip.html", context) return render_to_string("alsijil/group_role/chip.html", context)
def before_render(self, request): def before_render(self, request):
if not request.user.has_perm("alsijil.edit_grouprole"): if not request.user.has_perm("alsijil.edit_grouprole_rule"):
self.columns.hide("edit") self.columns.hide("edit")
if not request.user.has_perm("alsijil.delete_grouprole"): if not request.user.has_perm("alsijil.delete_grouprole_rule"):
self.columns.hide("delete") self.columns.hide("delete")
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<i class="material-icons left">view_week</i> <i class="material-icons left">view_week</i>
{% trans "Week view" %} {% trans "Week view" %}
</a> </a>
{% has_perm "alsijil.view_assigned_grouproles" user group as can_view_assigned_group_roles %} {% has_perm "alsijil.view_assigned_grouproles_rule" user group as can_view_assigned_group_roles %}
{% if can_view_assigned_group_roles %} {% if can_view_assigned_group_roles %}
<a class="btn primary waves-effect waves-light" href="{% url 'assigned_group_roles' group.pk %}"> <a class="btn primary waves-effect waves-light" href="{% url 'assigned_group_roles' group.pk %}">
<i class="material-icons left">assignment_ind</i> <i class="material-icons left">assignment_ind</i>
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
{% trans "Week view" %} {% trans "Week view" %}
</a> </a>
</p> </p>
{% has_perm "alsijil.view_assigned_grouproles" user group as can_view_assigned_group_roles %} {% has_perm "alsijil.view_assigned_grouproles_rule" user group as can_view_assigned_group_roles %}
{% if can_view_assigned_group_roles %} {% if can_view_assigned_group_roles %}
<p> <p>
<a class="btn primary waves-effect waves-light" href="{% url 'assigned_group_roles' group.pk %}"> <a class="btn primary waves-effect waves-light" href="{% url 'assigned_group_roles' group.pk %}">
......
...@@ -66,9 +66,9 @@ ...@@ -66,9 +66,9 @@
</h4> </h4>
<br/> <br/>
{% has_perm "alsijil.view_lessondocumentation" user register_object as can_view_lesson_documentation %} {% has_perm "alsijil.view_lessondocumentation_rule" user register_object as can_view_lesson_documentation %}
{% has_perm "alsijil.edit_lessondocumentation" user register_object as can_edit_lesson_documentation %} {% has_perm "alsijil.edit_lessondocumentation_rule" user register_object as can_edit_lesson_documentation %}
{% has_perm "alsijil.edit_register_object_personalnote" user register_object as can_edit_register_object_personalnote %} {% has_perm "alsijil.edit_register_object_personalnote_rule" user register_object as can_edit_register_object_personalnote %}
<form method="post" class="row"> <form method="post" class="row">
<p> <p>
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
</li> </li>
{% endif %} {% endif %}
{% if prev_lesson %} {% if prev_lesson %}
{% has_perm "alsijil.view_lessondocumentation" user prev_lesson as can_view_prev_lesson_documentation %} {% has_perm "alsijil.view_lessondocumentation_rule" user prev_lesson as can_view_prev_lesson_documentation %}
{% if prev_lesson.get_lesson_documentation and can_view_prev_lesson_documentation %} {% if prev_lesson.get_lesson_documentation and can_view_prev_lesson_documentation %}
<li class="tab"> <li class="tab">
<a href="#previous-lesson">{% trans "Previous lesson" %}</a> <a href="#previous-lesson">{% trans "Previous lesson" %}</a>
...@@ -176,7 +176,7 @@ ...@@ -176,7 +176,7 @@
{% with prev_doc=prev_lesson.get_lesson_documentation %} {% with prev_doc=prev_lesson.get_lesson_documentation %}
{% with absences=prev_lesson.get_absences tardinesses=prev_lesson.get_tardinesses extra_marks=prev_lesson.get_extra_marks %} {% with absences=prev_lesson.get_absences tardinesses=prev_lesson.get_tardinesses extra_marks=prev_lesson.get_extra_marks %}
{% has_perm "alsijil.view_lessondocumentation" user prev_lesson as can_view_prev_lesson_documentation %} {% has_perm "alsijil.view_lessondocumentation_rule" user prev_lesson as can_view_prev_lesson_documentation %}
{% if prev_doc and can_view_prev_lesson_documentation %} {% if prev_doc and can_view_prev_lesson_documentation %}
{% weekday_to_date prev_lesson.week prev_lesson.period.weekday as prev_date %} {% weekday_to_date prev_lesson.week prev_lesson.period.weekday as prev_date %}
<div class="col s12" id="previous-lesson"> <div class="col s12" id="previous-lesson">
...@@ -228,7 +228,7 @@ ...@@ -228,7 +228,7 @@
<th>{{ extra_mark.name }}</th> <th>{{ extra_mark.name }}</th>
<td> <td>
{% for note in notes %} {% for note in notes %}
{% has_perm "alsijil.view_personalnote" user note as can_view_personalnote %} {% has_perm "alsijil.view_personalnote_rule" user note as can_view_personalnote %}
{% if can_view_personalnote %} {% if can_view_personalnote %}
<span>{{ note.person }}{% if not forloop.last %},{% endif %}</span> <span>{{ note.person }}{% if not forloop.last %},{% endif %}</span>
{% endif %} {% endif %}
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
{% block page_title %} {% block page_title %}
{% has_perm "alsijil.view_my_students" user as has_students %} {% has_perm "alsijil.view_my_students_rule" user as has_students %}
{% if has_students %} {% if has_students %}
<a href="{% url "my_students" %}" <a href="{% url "my_students" %}"
class="btn-flat primary-color-text waves-light waves-effect"> class="btn-flat primary-color-text waves-light waves-effect">
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
Class register overview for {{ person }} Class register overview for {{ person }}
{% endblocktrans %} {% endblocktrans %}
</span> </span>
{% has_perm "alsijil.register_absence" user person as can_register_absence %} {% has_perm "alsijil.register_absence_rule" user person as can_register_absence %}
{% if can_register_absence %} {% if can_register_absence %}
<a class="btn primary-color waves-effect waves-light right" href="{% url "register_absence" person.pk %}"> <a class="btn primary-color waves-effect waves-light right" href="{% url "register_absence" person.pk %}">
<i class="material-icons left">rate_review</i> <i class="material-icons left">rate_review</i>
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
</button> </button>
</div> </div>
</form> </form>
{% has_perm "alsijil.edit_person_overview_personalnote" user person as can_mark_all_as_excused %} {% has_perm "alsijil.edit_person_overview_personalnote_rule" user person as can_mark_all_as_excused %}
<div class="row"> <div class="row">
<div class="col s12 m3 l5 push-m9 push-l7"> <div class="col s12 m3 l5 push-m9 push-l7">
<button <button
......
...@@ -112,7 +112,7 @@ ...@@ -112,7 +112,7 @@
</thead> </thead>
<tbody> <tbody>
{% for register_object in objects %} {% for register_object in objects %}
{% has_perm "alsijil.view_lessondocumentation" user register_object as can_view_lesson_documentation %} {% has_perm "alsijil.view_lessondocumentation_rule" user register_object as can_view_lesson_documentation %}
{% if can_view_lesson_documentation %} {% if can_view_lesson_documentation %}
<tr> <tr>
<td class="center-align"> <td class="center-align">
...@@ -192,7 +192,7 @@ ...@@ -192,7 +192,7 @@
<div class="collapsible-body"> <div class="collapsible-body">
<div class="collection"> <div class="collection">
{% for register_object in objects %} {% for register_object in objects %}
{% has_perm "alsijil.view_lessondocumentation" user register_object as can_view_lesson_documentation %} {% has_perm "alsijil.view_lessondocumentation_rule" user register_object as can_view_lesson_documentation %}
{% if can_view_lesson_documentation %} {% if can_view_lesson_documentation %}
<a class="collection-item avatar" <a class="collection-item avatar"
href="{{ register_object.alsijil_url }}?back={{ back_url }}"> href="{{ register_object.alsijil_url }}?back={{ back_url }}">
...@@ -319,7 +319,7 @@ ...@@ -319,7 +319,7 @@
{% for person in persons %} {% for person in persons %}
<h5 class="card-title"> <h5 class="card-title">
<a href="{% url "overview_person" person.person.pk %}">{{ person.person.full_name }}</a> <a href="{% url "overview_person" person.person.pk %}">{{ person.person.full_name }}</a>
{% has_perm "alsijil.register_absence" user person.person as can_register_absence %} {% has_perm "alsijil.register_absence_rule" user person.person as can_register_absence %}
{% if can_register_absence %} {% if can_register_absence %}
<a class="btn primary-color waves-effect waves-light right" <a class="btn primary-color waves-effect waves-light right"
href="{% url "register_absence" person.person.pk %}"> href="{% url "register_absence" person.person.pk %}">
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
{% block content %} {% block content %}
{% include "alsijil/excuse_type/warning.html" %} {% include "alsijil/excuse_type/warning.html" %}
{% has_perm "alsijil.add_excusetype" user as add_excusetype %} {% has_perm "alsijil.add_excusetype_rule" user as add_excusetype %}
{% if add_excusetype %} {% if add_excusetype %}
<a class="btn green waves-effect waves-light" href="{% url 'create_excuse_type' %}"> <a class="btn green waves-effect waves-light" href="{% url 'create_excuse_type' %}">
<i class="material-icons left">add</i> <i class="material-icons left">add</i>
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
{% url "assigned_group_roles" object.pk as back_url %} {% url "assigned_group_roles" object.pk as back_url %}
<p> <p>
{% has_perm "alsijil.view_my_groups" user as can_view_group_overview %} {% has_perm "alsijil.view_my_groups_rule" user as can_view_group_overview %}
{% if can_view_group_overview %} {% if can_view_group_overview %}
<a class="btn waves-effect waves-light" href="{% url "my_groups" %}"> <a class="btn waves-effect waves-light" href="{% url "my_groups" %}">
<i class="material-icons left">arrow_back</i> <i class="material-icons left">arrow_back</i>
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
</a> </a>
{% endif %} {% endif %}
{% has_perm "alsijil.assign_grouprole_for_group" user object as can_assign_group_role %} {% has_perm "alsijil.assign_grouprole_for_group_rule" user object as can_assign_group_role %}
{% if can_assign_group_role %} {% if can_assign_group_role %}
<a class="btn green waves-effect waves-light" href="{% url "assign_group_role" object.pk %}"> <a class="btn green waves-effect waves-light" href="{% url "assign_group_role" object.pk %}">
<i class="material-icons left">assignment_ind</i> <i class="material-icons left">assignment_ind</i>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
{% block page_title %}{% blocktrans %}Group roles{% endblocktrans %}{% endblock %} {% block page_title %}{% blocktrans %}Group roles{% endblocktrans %}{% endblock %}
{% block content %} {% block content %}
{% has_perm "alsijil.add_grouprole" user as add_group_role %} {% has_perm "alsijil.add_grouprole_rule" user as add_group_role %}
{% if add_group_role %} {% if add_group_role %}
<a class="btn green waves-effect waves-light" href="{% url 'create_group_role' %}"> <a class="btn green waves-effect waves-light" href="{% url 'create_group_role' %}">
<i class="material-icons left">add</i> <i class="material-icons left">add</i>
......
{% load i18n rules %} {% load i18n rules %}
{% has_perm "alsijil.assign_grouprole_for_group" user group as can_assign_group_role %} {% has_perm "alsijil.assign_grouprole_for_group_rule" user group as can_assign_group_role %}
<div class="collection"> <div class="collection">
{% for role in roles %} {% for role in roles %}
<div class="collection-item"> <div class="collection-item">
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
{% load i18n rules %} {% load i18n rules %}
{% has_perm "alsijil.edit_grouproleassignment" user assignment as can_edit %} {% has_perm "alsijil.edit_grouproleassignment_rule" user assignment as can_edit %}
{% has_perm "alsijil.stop_grouproleassignment" user assignment as can_stop %} {% has_perm "alsijil.stop_grouproleassignment_rule" user assignment as can_stop %}
{% has_perm "alsijil.delete_grouproleassignment" user assignment as can_delete %} {% has_perm "alsijil.delete_grouproleassignment_rule" user assignment as can_delete %}
<ul id="dropdown-{{ assignment.pk }}{{ suffix }}" class="dropdown-content"> <ul id="dropdown-{{ assignment.pk }}{{ suffix }}" class="dropdown-content">
{% if can_edit %} {% if can_edit %}
......
{% load i18n rules %} {% load i18n rules %}
{% for note in notes %} {% for note in notes %}
{% has_perm "alsijil.view_personalnote" user note as can_view_personalnote %} {% has_perm "alsijil.view_personalnote_rule" user note as can_view_personalnote %}
{% if can_view_personalnote %} {% if can_view_personalnote %}
<span class="{% if note.excused %}green-text{% else %}red-text{% endif %}">{{ note.person }} <span class="{% if note.excused %}green-text{% else %}red-text{% endif %}">{{ note.person }}
{% if note.excused %}{% if note.excuse_type %}({{ note.excuse_type.short_name }}){% else %}{% trans "(e)" %}{% endif %}{% else %}{% trans "(u)" %}{% endif %}{% if not forloop.last %},{% endif %} {% if note.excused %}{% if note.excuse_type %}({{ note.excuse_type.short_name }}){% else %}{% trans "(e)" %}{% endif %}{% else %}{% trans "(u)" %}{% endif %}{% if not forloop.last %},{% endif %}
......
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
<span class="hide-on-large-only">{% trans "Details" %}</span> <span class="hide-on-large-only">{% trans "Details" %}</span>
</a> </a>
{% has_perm "alsijil.register_absence" user person as can_register_absence %} {% has_perm "alsijil.register_absence_rule" user person as can_register_absence %}
{% if can_register_absence %} {% if can_register_absence %}
<a class="btn primary-color waves-effect waves-light" href="{% url "register_absence" person.pk %}"> <a class="btn primary-color waves-effect waves-light" href="{% url "register_absence" person.pk %}">
<i class="material-icons left">rate_review</i> <i class="material-icons left">rate_review</i>
......
{% load rules %} {% load rules %}
{% for note in notes %} {% for note in notes %}
{% has_perm "alsijil.view_personalnote" user note as can_view_personalnote %} {% has_perm "alsijil.view_personalnote_rule" user note as can_view_personalnote %}
{% if can_view_personalnote %} {% if can_view_personalnote %}
<span>{{ note.person }} ({{ note.late }}'){% if not forloop.last %},{% endif %}</span> <span>{{ note.person }} ({{ note.late }}'){% if not forloop.last %},{% endif %}</span>
{% endif %} {% endif %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment