Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/official/AlekSIS-App-Alsijil
  • sunweaver/AlekSIS-App-Alsijil
  • 8tincsoVluke/AlekSIS-App-Alsijil
  • perfreicpo/AlekSIS-App-Alsijil
  • noifobarep/AlekSIS-App-Alsijil
  • 7ingannisdo/AlekSIS-App-Alsijil
  • unmruntartpa/AlekSIS-App-Alsijil
  • balrorebta/AlekSIS-App-Alsijil
  • comliFdifwa/AlekSIS-App-Alsijil
  • 3ranaadza/AlekSIS-App-Alsijil
10 results
Show changes
Commits on Source (34)
Showing
with 300 additions and 94 deletions
<!-- AlekSIS is developed on EduGit. GitHub only serves as
backup mirror and to help people find the project. If
possible, please submit your merge request on EduGit!
EduGit accepts logins with GitHub accounts.
-->
[ ] I have read the above and have no way to contribute on EduGit
[ ] I understand that GitHub's terms of service exclude young and
learning contributors, but still cannot contribute on EduGit
instead.
......@@ -9,11 +9,30 @@ and this project adheres to `Semantic Versioning`_.
Unreleased
----------
Changed
~~~~~~~
* Use new icon set inside of models and templates
* Run full register printout generation in background
Fixed
~~~~~
* Extra marks and excused absences were counted multiple times in some class register views.
* Substitution teachers couldn't see any persons in the person list of a substituted lesson.
`2.1.1`_ - 2022-09-01
---------------------
Fixed
~~~~~
* Register absence form wasn't accessible without direct access to class register.
* Printing the full group register failed when a person had no personal notes.
* Data checks reported all Lesson Documentations as being during Holidays if there was no Holiday object.
* Students were displayed multiple times in class register views.
* Absences were counted multiple times in some class register views.
* Group owners couldn't create new seating plans.
`2.1`_ - 2022-06-25
-------------------
......@@ -267,3 +286,4 @@ Fixed
.. _2.0: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.0
.. _2.0.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.0.1
.. _2.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1
.. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS-App-Alsijil/-/tags/2.1.1
......@@ -113,7 +113,7 @@ class LessonDocumentationOnHolidaysDataCheck(DataCheck):
documentations = LessonDocumentation.objects.not_empty().annotate_date_range()
q = Q()
q = Q(pk__in=[])
for holiday in holidays:
q = q | Q(day_end__gte=holiday.date_start, day_start__lte=holiday.date_end)
documentations = documentations.filter(q)
......@@ -147,7 +147,7 @@ class PersonalNoteOnHolidaysDataCheck(DataCheck):
personal_notes = PersonalNote.objects.not_empty().annotate_date_range()
q = Q()
q = Q(pk__in=[])
for holiday in holidays:
q = q | Q(day_end__gte=holiday.date_start, day_start__lte=holiday.date_end)
personal_notes = personal_notes.filter(q)
......
......@@ -5,7 +5,7 @@ MENUS = {
{
"name": _("Class register"),
"url": "#",
"icon": "chrome_reader_mode",
"svg_icon": "mdi:book-open-outline",
"root": True,
"validators": [
"menu_generator.validators.is_authenticated",
......@@ -15,7 +15,7 @@ MENUS = {
{
"name": _("Current lesson"),
"url": "lesson_period",
"icon": "alarm",
"svg_icon": "mdi:alarm",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -26,7 +26,7 @@ MENUS = {
{
"name": _("Current week"),
"url": "week_view",
"icon": "view_week",
"svg_icon": "mdi:view-week-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -37,7 +37,7 @@ MENUS = {
{
"name": _("My groups"),
"url": "my_groups",
"icon": "people",
"svg_icon": "mdi:account-multiple-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -48,7 +48,7 @@ MENUS = {
{
"name": _("My overview"),
"url": "overview_me",
"icon": "insert_chart",
"svg_icon": "mdi:chart-box-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -59,7 +59,7 @@ MENUS = {
{
"name": _("My students"),
"url": "my_students",
"icon": "people",
"svg_icon": "mdi:account-school-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -70,7 +70,7 @@ MENUS = {
{
"name": _("Assign group role"),
"url": "assign_group_role_multiple",
"icon": "assignment_ind",
"svg_icon": "mdi:clipboard-account-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -81,7 +81,7 @@ MENUS = {
{
"name": _("All lessons"),
"url": "all_register_objects",
"icon": "list",
"svg_icon": "mdi:format-list-text",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -96,14 +96,14 @@ MENUS = {
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
"alsijil.register_absence_rule",
"alsijil.view_register_absence_rule",
),
],
},
{
"name": _("Excuse types"),
"url": "excuse_types",
"icon": "label",
"svg_icon": "mdi:label-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -114,7 +114,7 @@ MENUS = {
{
"name": _("Extra marks"),
"url": "extra_marks",
"icon": "label",
"svg_icon": "mdi:label-variant-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......@@ -125,7 +125,7 @@ MENUS = {
{
"name": _("Manage group roles"),
"url": "group_roles",
"icon": "assignment_ind",
"svg_icon": "mdi:clipboard-plus-outline",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
......
......@@ -434,6 +434,7 @@ def generate_person_list_with_class_register_statistics(
"filtered_personal_notes",
filter=Q(filtered_personal_notes__absent=True)
& ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
distinct=True,
),
excused=Count(
"filtered_personal_notes",
......@@ -442,6 +443,7 @@ def generate_person_list_with_class_register_statistics(
filtered_personal_notes__excused=True,
)
& ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
distinct=True,
),
excused_without_excuse_type=Count(
"filtered_personal_notes",
......@@ -450,15 +452,16 @@ def generate_person_list_with_class_register_statistics(
filtered_personal_notes__excused=True,
filtered_personal_notes__excuse_type__isnull=True,
),
distinct=True,
),
unexcused=Count(
"filtered_personal_notes",
filter=Q(filtered_personal_notes__absent=True, filtered_personal_notes__excused=False),
distinct=True,
),
tardiness=Sum("filtered_personal_notes__late"),
tardiness_count=Count(
"filtered_personal_notes",
filter=Q(filtered_personal_notes__late__gt=0),
"filtered_personal_notes", filter=Q(filtered_personal_notes__late__gt=0), distinct=True
),
)
......@@ -468,6 +471,7 @@ def generate_person_list_with_class_register_statistics(
extra_mark.count_label: Count(
"filtered_personal_notes",
filter=Q(filtered_personal_notes__extra_marks=extra_mark),
distinct=True,
)
}
)
......@@ -481,6 +485,7 @@ def generate_person_list_with_class_register_statistics(
filtered_personal_notes__absent=True,
filtered_personal_notes__excuse_type=excuse_type,
),
distinct=True,
)
}
)
......
......@@ -5,6 +5,7 @@ from urllib.parse import urlparse
from django.db import models
from django.db.models.constraints import CheckConstraint
from django.db.models.query_utils import Q
from django.urls import reverse
from django.utils.formats import date_format
from django.utils.translation import gettext_lazy as _
......@@ -31,6 +32,7 @@ from aleksis.apps.alsijil.managers import (
from aleksis.apps.chronos.managers import GroupPropertiesMixin
from aleksis.apps.chronos.mixins import WeekRelatedMixin
from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod, TimePeriod
from aleksis.core.data_checks import field_validation_data_check_factory
from aleksis.core.mixins import ExtensibleModel, GlobalPermissionModel
from aleksis.core.models import SchoolTerm
from aleksis.core.util.core_helpers import get_site_preferences
......@@ -450,6 +452,8 @@ class ExtraMark(ExtensibleModel):
class GroupRole(ExtensibleModel):
data_checks = [field_validation_data_check_factory("alsijil", "GroupRole", "icon")]
objects = GroupRoleManager.from_queryset(GroupRoleQuerySet)()
name = models.CharField(max_length=255, verbose_name=_("Name"))
......@@ -467,6 +471,9 @@ class GroupRole(ExtensibleModel):
]
permissions = (("assign_group_role", _("Can assign group role")),)
def get_absolute_url(self) -> str:
return reverse("edit_group_role", args=[self.id])
class GroupRoleAssignment(GroupPropertiesMixin, ExtensibleModel):
objects = GroupRoleAssignmentManager.from_queryset(GroupRoleAssignmentQuerySet)()
......
......@@ -156,15 +156,20 @@ view_week_personal_notes_predicate = has_person & (
add_perm("alsijil.view_week_personalnote_rule", view_week_personal_notes_predicate)
# Register absence
register_absence_predicate = has_person & (
view_register_absence_predicate = has_person & (
(
is_person_group_owner
& is_site_preference_set("alsijil", "register_absence_as_primary_group_owner")
)
| has_global_perm("alsijil.register_absence")
)
register_absence_predicate = has_person & (
view_register_absence_predicate
| has_object_perm("core.register_absence_person")
| has_person_group_object_perm("core.register_absence_group")
)
add_perm("alsijil.view_register_absence_rule", view_register_absence_predicate)
add_perm("alsijil.register_absence_rule", register_absence_predicate)
# View full register for group
......
from copy import deepcopy
from datetime import date, timedelta
from django.db.models import Q
from django.utils.translation import gettext as _
from calendarweek import CalendarWeek
from celery.result import allow_join_result
from celery.states import SUCCESS
from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod
from aleksis.core.models import Group, PDFFile
from aleksis.core.util.celery_progress import ProgressRecorder, recorded_task
from aleksis.core.util.pdf import generate_pdf_from_template
from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote
@recorded_task
def generate_full_register_printout(group: int, file_object: int, recorder: ProgressRecorder):
"""Generate a full register printout as PDF for a group."""
context = {}
_number_of_steps = 8
recorder.set_progress(1, _number_of_steps, _("Load data ..."))
group = Group.objects.get(pk=group)
file_object = PDFFile.objects.get(pk=file_object)
groups_q = (
Q(lesson_period__lesson__groups=group)
| Q(lesson_period__lesson__groups__parent_groups=group)
| Q(extra_lesson__groups=group)
| Q(extra_lesson__groups__parent_groups=group)
| Q(event__groups=group)
| Q(event__groups__parent_groups=group)
)
personal_notes = (
PersonalNote.objects.prefetch_related(
"lesson_period__substitutions", "lesson_period__lesson__teachers"
)
.not_empty()
.filter(groups_q)
.filter(groups_of_person=group)
)
documentations = LessonDocumentation.objects.not_empty().filter(groups_q)
recorder.set_progress(2, _number_of_steps, _("Sort data ..."))
sorted_documentations = {"extra_lesson": {}, "event": {}, "lesson_period": {}}
sorted_personal_notes = {"extra_lesson": {}, "event": {}, "lesson_period": {}, "person": {}}
for documentation in documentations:
key = documentation.register_object.label_
sorted_documentations[key][documentation.register_object_key] = documentation
for note in personal_notes:
key = note.register_object.label_
sorted_personal_notes[key].setdefault(note.register_object_key, [])
sorted_personal_notes[key][note.register_object_key].append(note)
sorted_personal_notes["person"].setdefault(note.person.pk, [])
sorted_personal_notes["person"][note.person.pk].append(note)
recorder.set_progress(3, _number_of_steps, _("Load lesson data ..."))
# Get all lesson periods for the selected group
lesson_periods = LessonPeriod.objects.filter_group(group).distinct()
events = Event.objects.filter_group(group).distinct()
extra_lessons = ExtraLesson.objects.filter_group(group).distinct()
weeks = CalendarWeek.weeks_within(group.school_term.date_start, group.school_term.date_end)
register_objects_by_day = {}
for extra_lesson in extra_lessons:
day = extra_lesson.date
register_objects_by_day.setdefault(day, []).append(
(
extra_lesson,
sorted_documentations["extra_lesson"].get(extra_lesson.pk),
sorted_personal_notes["extra_lesson"].get(extra_lesson.pk, []),
None,
)
)
for event in events:
day_number = (event.date_end - event.date_start).days + 1
for i in range(day_number):
day = event.date_start + timedelta(days=i)
event_copy = deepcopy(event)
event_copy.annotate_day(day)
register_objects_by_day.setdefault(day, []).append(
(
event_copy,
sorted_documentations["event"].get(event.pk),
sorted_personal_notes["event"].get(event.pk, []),
None,
)
)
recorder.set_progress(4, _number_of_steps, _("Sort lesson data ..."))
weeks = CalendarWeek.weeks_within(
group.school_term.date_start,
group.school_term.date_end,
)
for lesson_period in lesson_periods:
for week in weeks:
day = week[lesson_period.period.weekday]
if (
lesson_period.lesson.validity.date_start
<= day
<= lesson_period.lesson.validity.date_end
):
filtered_documentation = sorted_documentations["lesson_period"].get(
f"{lesson_period.pk}_{week.week}_{week.year}"
)
filtered_personal_notes = sorted_personal_notes["lesson_period"].get(
f"{lesson_period.pk}_{week.week}_{week.year}", []
)
substitution = lesson_period.get_substitution(week)
register_objects_by_day.setdefault(day, []).append(
(lesson_period, filtered_documentation, filtered_personal_notes, substitution)
)
recorder.set_progress(5, _number_of_steps, _("Load statistics ..."))
persons = group.members.prefetch_related(None).select_related(None)
persons = group.generate_person_list_with_class_register_statistics(persons)
prefetched_persons = []
for person in persons:
person.filtered_notes = sorted_personal_notes["person"].get(person.pk, [])
prefetched_persons.append(person)
context["school_term"] = group.school_term
context["persons"] = prefetched_persons
context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False)
context["extra_marks"] = ExtraMark.objects.all()
context["group"] = group
context["weeks"] = weeks
context["register_objects_by_day"] = register_objects_by_day
context["register_objects"] = list(lesson_periods) + list(events) + list(extra_lessons)
context["today"] = date.today()
context["lessons"] = (
group.lessons.all()
.select_related(None)
.prefetch_related(None)
.select_related("validity", "subject")
.prefetch_related("teachers", "lesson_periods")
)
context["child_groups"] = (
group.child_groups.all()
.select_related(None)
.prefetch_related(None)
.prefetch_related(
"lessons",
"lessons__validity",
"lessons__subject",
"lessons__teachers",
"lessons__lesson_periods",
)
)
recorder.set_progress(6, _number_of_steps, _("Generate template ..."))
file_object, result = generate_pdf_from_template(
"alsijil/print/full_register.html", context, file_object=file_object
)
recorder.set_progress(7, _number_of_steps, _("Generate PDF ..."))
with allow_join_result():
result.wait()
file_object.refresh_from_db()
if not result.status == SUCCESS and file_object.file:
raise Exception(_("PDF generation failed"))
recorder.set_progress(8, _number_of_steps)
......@@ -18,11 +18,11 @@
</div>
<div class="collection">
<div class="collection-item">
<i class="material-icons left">date_range</i>
<i class="material-icons iconify left" data-icon="mdi:calendar-range"></i>
{{ form_data.date_start }}, {{ form_data.from_period }}. – {{ form_data.date_end }}, {{ form_data.to_period }}.
{% if form_data.date_start != form_data.date_end %}
<figure class="alert warning">
<i class="material-icons left">warning</i>
<i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
{% blocktrans %}
As the length of this absence is longer than one day,
please double check the correctness of your entry.
......@@ -31,12 +31,12 @@
{% endif %}
</div>
<div class="collection-item">
<i class="material-icons left">list</i>
<i class="material-icons iconify left" data-icon="mdi:format-list-bulleted"></i>
{% blocktrans with count=affected_lessons %} {{ count }} affected lessons {% endblocktrans %}
{% if affected_lessons == 0 %}
<div class="alert error">
<div>
<i class="material-icons left">error</i>
<i class="material-icons iconify left" data-icon="mdi:alert-octagon-outline"></i>
{% blocktrans %}
There are no affected lessons. Registering this absence won't have any effect.
{% endblocktrans %}
......@@ -45,7 +45,7 @@
{% endif %}
</div>
<div class="collection-item">
<i class="material-icons left">label</i>
<i class="material-icons iconify left" data-icon="mdi:label-outline"></i>
{% if form_data.absent %}
<span class="chip red white-text">{% trans "Absent" %}</span>
{% if form_data.excused and form_data.excuse_type %}
......@@ -59,7 +59,7 @@
</div>
{% if form_data.remarks %}
<div class="collection-item">
<i class="material-icons left">edit</i>
<i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i>
{{ form_data.remarks }}
</div>
{% endif %}
......@@ -75,7 +75,7 @@
<input type="hidden" name="confirmed" value="1">
{% include "core/partials/save_button.html" %}
<a class="btn red waves-effect waves-light" href="{% url "register_absence" person.pk %}">
<i class="material-icons left">cancel</i>
<i class="material-icons iconify left" data-icon="mdi:close"></i>
{% trans "Cancel" %}
</a>
</form>
......
......@@ -31,23 +31,23 @@
<td>
<div class="right">
<a class="btn primary-color waves-effect waves-light" href="{% url "students_list" group.pk %}">
<i class="material-icons left">people</i>
<i class="material-icons iconify left" data-icon="mdi:account-multiple-outline"></i>
{% trans "Students list" %}
</a>
<a class="btn secondary-color waves-effect waves-light" href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">view_week</i>
<i class="material-icons iconify left" data-icon="mdi:view-week-outline"></i>
{% trans "Week view" %}
</a>
{% has_perm "alsijil.view_assigned_grouproles_rule" user group as 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 %}">
<i class="material-icons left">assignment_ind</i>
<i class="material-icons iconify left" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Roles" %}
</a>
{% endif %}
<a class="btn primary waves-effect waves-light" href="{% url "full_register_group" group.pk %}"
target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</div>
......@@ -72,13 +72,13 @@
</p>
<p>
<a class="btn primary-color waves-effect waves-light" href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">people</i>
<i class="material-icons iconify left" data-icon="mdi:account-multiple-outline"></i>
{% trans "Students list" %}
</a>
</p>
<p>
<a class="btn secondary-color waves-effect waves-light" href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">view_week</i>
<i class="material-icons iconify left" data-icon="mdi:view-week-outline"></i>
{% trans "Week view" %}
</a>
</p>
......@@ -86,7 +86,7 @@
{% if can_view_assigned_group_roles %}
<p>
<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 iconify left" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Roles" %}
</a>
</p>
......@@ -94,7 +94,7 @@
<p>
<a class="btn primary waves-effect waves-light" href="{% url "full_register_group" group.pk %}"
target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</p>
......
......@@ -17,14 +17,14 @@
<ul class="tabs tabs-transparent tabs-icons tabs-fixed-width">
<li class="tab">
<a href="#lesson-documentation">
<i class="material-icons">speaker_notes</i>
<i class="material-icons iconify" data-icon="mdi:message-bulleted"></i>
{% trans "Period" %}
</a>
</li>
{% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %}
<li class="tab">
<a href="#personal-notes">
<i class="material-icons">people</i>
<i class="material-icons iconify" data-icon="mdi:account-multiple-outline"></i>
{% trans "Persons" %}
</a>
</li>
......@@ -32,7 +32,7 @@
{% if with_seating_plan %}
<li class="tab">
<a href="#seating-plan">
<i class="material-icons">event_seat</i>
<i class="material-icons iconify" data-icon="mdi:seat-outline"></i>
{% trans "Seating plan" %}
</a>
</li>
......@@ -42,7 +42,7 @@
{% if prev_lesson.get_lesson_documentation and can_view_prev_lesson_documentation %}
<li class="tab">
<a href="#previous-lesson">
<i class="material-icons">history</i>
<i class="material-icons iconify" data-icon="mdi:history"></i>
{% trans "Previous" %}
</a>
</li>
......@@ -50,7 +50,7 @@
{% endif %}
<li class="tab">
<a href="#more">
<i class="material-icons">more_horiz</i>
<i class="material-icons iconify" data-icon="mdi:dots-horizontal"></i>
{% trans "More" %}
</a>
</li>
......@@ -69,7 +69,7 @@
{% if back_to_week_url %}
<a href="{{ back_to_week_url }}"
class="btn secondary-color waves-light waves-effect margin-bottom {% if prev_lesson_person or next_lesson_person %}hide-on-extra-large-only{% endif %}">
<i class="material-icons left">chevron_left</i> {% trans "Week view" %}
<i class="material-icons iconify left" data-icon="mdi:chevron-left"></i> {% trans "Week view" %}
</a>
{% endif %}
......@@ -78,7 +78,7 @@
{% if back_to_week_url %}
<a href="{{ back_to_week_url }}"
class="btn-flat secondary-color-text waves-light waves-effect left hide-on-med-and-down hide-on-large-only show-on-extra-large">
<i class="material-icons left">chevron_left</i> {% trans "Week view" %}
<i class="material-icons iconify left" data-icon="mdi:chevron-left"></i> {% trans "Week view" %}
</a>
{% endif %}
......@@ -89,7 +89,7 @@
href="{% url "lesson_period" prev_lesson_person.week.year prev_lesson_person.week.week prev_lesson_person.id %}"
{% endif %}
>
<i class="material-icons left">navigate_before</i>
<i class="material-icons iconify left" data-icon="mdi:chevron-left"></i>
<span class="hide-on-small-only">{% trans "My previous lesson" %}</span>
<span class="hide-on-med-and-up">{% trans "Previous" %}</span>
</a>
......@@ -100,7 +100,7 @@
href="{% url "lesson_period" next_lesson_person.week.year next_lesson_person.week.week next_lesson_person.id %}"
{% endif %}
>
<i class="material-icons right">navigate_next</i>
<i class="material-icons iconify right" data-icon="mdi:chevron-right"></i>
<span class="hide-on-small-only">{% trans "My next lesson" %}</span>
<span class="hide-on-med-and-up">{% trans "Next" %}</span>
</a>
......@@ -155,7 +155,7 @@
<div class="card">
<div class="card-content center-align">
<p>
<i class="material-icons medium orange-text">warning</i>
<i class="material-icons iconify medium orange-text" data-icon="mdi:alert-outline"></i>
</p>
<p class="card-title">
{% blocktrans %}
......
......@@ -15,7 +15,7 @@
{% if has_students %}
<a href="{% url "my_students" %}"
class="btn-flat primary-color-text waves-light waves-effect">
<i class="material-icons left">chevron_left</i> {% trans "Back" %}
<i class="material-icons iconify left" data-icon="mdi:chevron-left"></i> {% trans "Back" %}
</a>
{% endif %}
<span id="heading">
......@@ -26,7 +26,7 @@
{% has_perm "alsijil.register_absence_rule" user person as can_register_absence %}
{% if can_register_absence %}
<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 iconify left" data-icon="mdi:message-draw"></i>
{% trans "Register absence" %}
</a>
{% endif %}
......@@ -70,13 +70,13 @@
</figure>
<div class="modal-footer">
<button type="button" class="btn-flat secondary-color-text waves-effect waves-ripple" id="remove-filters">
<i class="material-icons left">clear</i>{% trans "Clear all filters" %}
<i class="material-icons iconify left" data-icon="mdi:close"></i>{% trans "Clear all filters" %}
</button>
<button type="button" class="modal-close btn-flat red-text waves-effect waves-ripple waves-red">
<i class="material-icons left">cancel</i>{% trans "Close" %}
<i class="material-icons iconify left" data-icon="mdi:close-circle-outline"></i>{% trans "Close" %}
</button>
<button type="submit" class="modal-close btn-flat primary-color-text waves-effect waves-ripple waves-light">
<i class="material-icons left">filter_alt</i>{% trans "Filter" %}
<i class="material-icons iconify left" data-icon="mdi:filter-outline"></i>{% trans "Filter" %}
</button>
</div>
</form>
......@@ -88,7 +88,8 @@
{% if can_mark_all_as_excused %} medium-high-right {% endif %}"
data-target="filter-modal"
type="button">
{% trans "Filter results" %} ({{ num_filters }})<i class="material-icons right">filter_alt</i>
{% trans "Filter results" %} ({{ num_filters }})
<i class="material-icons iconify right" data-icon="mdi:filter-outline"></i>
</button>
</div>
<form action="" method="post" class="">
......@@ -100,7 +101,7 @@
</div>
<div class="col s12 m3">
<button type="submit" class="btn waves-effect waves-light medium-high full-width-s">
Run <i class="material-icons right">send</i>
Run <i class="material-icons iconify right" data-icon="mdi:send-outline"></i>
</button>
</div>
{% endif %}
......@@ -121,7 +122,7 @@
{% for school_term, stat in stats %}
<li {% if forloop.first %}class="active"{% endif %}>
<div class="collapsible-header">
<i class="material-icons">date_range</i>{{ school_term }}</div>
<i class="material-icons iconify" data-icon="mdi:calendar-range"></i>{{ school_term }}</div>
<div class="collapsible-body">
<table>
<tr>
......
......@@ -23,11 +23,11 @@
<div class="hundred-percent">
<span class="right show-on-active hide-on-small-and-down">
<a class="btn primary-color waves-effect waves-light" href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">view_week</i>
<i class="material-icons iconify left" data-icon="mdi:view-week-outline"></i>
{% trans "Week view" %}
</a>
<a class="btn waves-effect waves-light" href="{% url "full_register_group" group.pk %}" target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</span>
......@@ -39,14 +39,14 @@
<p class="show-on-active hide-on-med-and-up">
<a class="btn primary-color waves-effect waves-light hundred-percent"
href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">view_week</i>
<i class="material-icons iconify left" data-icon="mdi:view-week-outline"></i>
{% trans "Week view" %}
</a>
</p>
<p class="show-on-active hide-on-med-and-up">
<a class="btn waves-effect waves-light hundred-percent" href="{% url "full_register_group" group.pk %}"
target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</p>
......
......@@ -7,16 +7,16 @@
{% block page_title %}
<a href="{% url "my_groups" %}"
class="btn-flat primary-color-text waves-light waves-effect">
<i class="material-icons left">chevron_left</i> {% trans "Back" %}
<i class="material-icons iconify left" data-icon="mdi:chevron-left"></i> {% trans "Back" %}
</a>
{% blocktrans with group=group %}Students list: {{ group }}{% endblocktrans %}
<span class="right show-on-active hide-on-small-and-down">
<a class="btn primary-color waves-effect waves-light" href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">view_week</i>
<i class="material-icons iconify left" data-icon="mdi:view-week-outline"></i>
{% trans "Week view" %}
</a>
<a class="btn waves-effect waves-light" href="{% url "full_register_group" group.pk %}" target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</span>
......@@ -31,14 +31,14 @@
<p class="show-on-active hide-on-med-and-up">
<a class="btn primary-color waves-effect waves-light hundred-percent"
href="{% url "week_view" "group" group.pk %}">
<i class="material-icons left">view_week</i>
<i class="material-icons iconify left" data-icon="mdi:view-week-outline"></i>
{% trans "Week view" %}
</a>
</p>
<p class="show-on-active hide-on-med-and-up">
<a class="btn waves-effect waves-light hundred-percent" href="{% url "full_register_group" group.pk %}"
target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</p>
......
......@@ -17,20 +17,20 @@
<ul class="tabs tabs-transparent tabs-icons tabs-fixed-width">
<li class="tab col">
<a class="active" href="#week-overview">
<i class="material-icons">speaker_notes</i>
<i class="material-icons iconify" data-icon="mdi:message-bulleted"></i>
{% trans "Lesson documentations" %}
</a>
</li>
<li class="tab col">
<a href="#personal-notes">
<i class="material-icons">people</i>
<i class="material-icons iconify" data-icon="mdi:account-multiple-outline"></i>
{% trans "Persons" %}
</a>
</li>
{% if group_roles %}
<li class="tab col">
<a href="#group-roles">
<i class="material-icons">assignment_ind</i>
<i class="material-icons iconify" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Group roles" %}
</a>
</li>
......@@ -50,16 +50,14 @@
{% csrf_token %}
{% form form=select_form %}{% endform %}
<button type="submit" class="btn waves-effect waves-light primary-color">
<i class="material-icons left">check</i>
<i class="material-icons iconify left" data-icon="mdi:check"></i>
{% blocktrans %}Select{% endblocktrans %}
</button>
</form>
</div>
<div class="col s12 m4 l2 right">
<button type="button" class="btn waves-effect waves-light hundred-percent" id="toggle-button">
<i class="material-icons left">
filter_alt
</i> {% trans "Toggle filters" %}
<i class="material-icons iconify left" data-icon="mdi:filter-outline"></i> {% trans "Toggle filters" %}
</button>
</div>
</div>
......@@ -74,11 +72,11 @@
{% if group %}
<p class="hide-on-med-and-down">
<a class="btn primary-color waves-effect waves-light" href="{% url "students_list" group.pk %}">
<i class="material-icons left">people</i>
<i class="material-icons iconify left" data-icon="mdi:account-multiple-outline"></i>
{% trans "Students list" %}
</a>
<a class="btn waves-effect waves-light" href="{% url "full_register_group" group.pk %}" target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</p>
......@@ -86,14 +84,14 @@
<p class="hide-on-med-and-up">
<a class="btn primary-color waves-effect waves-light hundred-percent"
href="{% url "students_list" group.pk %}">
<i class="material-icons left">people</i>
<i class="material-icons iconify left" data-icon="mdi:account-multiple-outline"></i>
{% trans "Students list" %}
</a>
</p>
<p class="hide-on-med-and-up">
<a class="btn waves-effect waves-light hundred-percent" href="{% url "full_register_group" group.pk %}"
target="_blank">
<i class="material-icons left">print</i>
<i class="material-icons iconify left" data-icon="mdi:printer-outline"></i>
{% trans "Generate printout" %}
</a>
</p>
......@@ -212,7 +210,7 @@
<li class="">
<div class="collapsible-header flow-text">
{{ advanced_weekday.name }}, {{ advanced_weekday.date }} <i
class="material-icons collapsible-icon-right">expand_more</i>
class="material-icons iconify collapsible-icon-right" data-icon="mdi:unfold-more-horizontal"></i>
</div>
<div class="collapsible-body">
<div class="collection">
......@@ -290,9 +288,8 @@
<p class="subtitle">
<span>{{ advanced_weekday.date }}</span>
<button class="btn-superflat right waves-effect unfold-trigger">
{% trans "Unfold" %} <i class="material-icons">
expand_less
</i>
{% trans "Unfold" %}
<i class="material-icons iconify" data-icon="mdi:unfold-less-horizontal"></i>
</button>
</p>
<div class="horizontal-scroll-container">
......@@ -381,7 +378,7 @@
{% if can_register_absence %}
<a class="btn primary-color waves-effect waves-light right"
href="{% url "register_absence" person.person.pk %}">
<i class="material-icons left">rate_review</i>
<i class="material-icons iconify left" data-icon="mdi:message-draw"></i>
{% trans "Register absence" %}
</a>
{% endif %}
......@@ -432,7 +429,7 @@
<div class="card">
<div class="card-content">
<span class="card-title">
<i class="material-icons red-text left">warning</i>
<i class="material-icons iconify red-text left" data-icon="mdi:alert-outline"></i>
{% blocktrans %}No lessons available{% endblocktrans %}
</span>
<p>
......
......@@ -14,7 +14,7 @@
{% has_perm "alsijil.add_excusetype_rule" user as add_excusetype %}
{% if add_excusetype %}
<a class="btn green waves-effect waves-light" href="{% url 'create_excuse_type' %}">
<i class="material-icons left">add</i>
<i class="material-icons iconify left"data-icon="mdi:plus"></i>
{% trans "Create excuse type" %}
</a>
{% endif %}
......
{% load i18n %}
<figure class="alert warning">
<i class="material-icons left">warning</i>
<i class="material-icons iconify left" data-icon="mdi:alert-outline"></i>
{% blocktrans %}
This function should only be used to define alternatives to the default excuse which also will be counted extra.
Don't use this to create a default excuse or if you don't divide between different types of excuse.
......
......@@ -10,7 +10,7 @@
{% block content %}
<a class="btn green waves-effect waves-light" href="{% url 'create_extra_mark' %}">
<i class="material-icons left">add</i>
<i class="material-icons iconify left" data-icon="mdi:plus"></i>
{% trans "Create extra mark" %}
</a>
......
......@@ -30,7 +30,7 @@
{% form form=form %}{% endform %}
<button type="submit" class="btn green waves-effect waves-light">
<i class="material-icons left">assignment_ind</i>
<i class="material-icons iconify left" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Assign" %}
</button>
</form>
......
......@@ -24,7 +24,7 @@
{% has_perm "alsijil.view_my_groups_rule" user as can_view_group_overview %}
{% if can_view_group_overview %}
<a class="btn waves-effect waves-light" href="{% url "my_groups" %}">
<i class="material-icons left">arrow_back</i>
<i class="material-icons iconify left" data-icon="mdi:arrow-left"></i>
{% trans "Back to my groups" %}
</a>
{% endif %}
......@@ -32,7 +32,7 @@
{% has_perm "alsijil.assign_grouprole_for_group_rule" user object as can_assign_group_role %}
{% if can_assign_group_role %}
<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 iconify left" data-icon="mdi:clipboard-account-outline"></i>
{% trans "Assign a role to a person" %}
</a>
{% endif %}
......@@ -79,7 +79,7 @@
<td>
<a class="btn waves-effect waves-light dropdown-trigger" href="#"
data-target="dropdown-{{ assignment.pk }}-d2">
<i class="material-icons left">list</i>
<i class="material-icons iconify left" data-icon="mdi:format-list-bulleted"></i>
{% trans "Actions" %}
</a>
{% include "alsijil/group_role/partials/assignment_options.html" with assignment=assignment back_url=back_url suffix="-d2" %}
......