diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 529cd41e06321ee80fd76e8bc388f369be2bab92..da3074ee02f31ac95dc7b400339d45331b39cadb 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,16 @@ Added * Owners of one of the parent groups of a object can now have the same rights on it as a group owner (can be toggled with a preference). +* Integrate seating plans in lesson overview +* Add option to set LessonDocumentation data for all lessons in one week at once. +* Excuse types can now be marked as `Count as absent`, which they are per default. If not, they aren't counted in the overviews. +* Add Ukrainian locale (contributed by Sergiy Gorichenko from Fre(i)e Software GmbH). + +Fixed +~~~~~ + +* The week overview page was not refreshed when a new week was selected in the dropdown. +* Make generation of full register printout faster. `2.0.1`_ - 2022-02-12 --------------------- diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 7186b6fac2db54c959703f9cc2ba4ab26990b60f..e23d8c47b344e2e7aa2b7a67ce344c42e4fa205d 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -13,7 +13,7 @@ from guardian.shortcuts import get_objects_for_user from material import Fieldset, Layout, Row from aleksis.apps.chronos.managers import TimetableType -from aleksis.apps.chronos.models import Subject, TimePeriod +from aleksis.apps.chronos.models import LessonPeriod, Subject, TimePeriod from aleksis.core.forms import ActionForm, ListActionForm from aleksis.core.models import Group, Person, SchoolTerm from aleksis.core.util.core_helpers import get_site_preferences @@ -45,6 +45,30 @@ class LessonDocumentationForm(forms.ModelForm): super().__init__(*args, **kwargs) self.fields["homework"].label = _("Homework for the next lesson") + if ( + self.instance.lesson_period + and get_site_preferences()["alsijil__allow_carry_over_same_week"] + ): + self.fields["carry_over_week"] = forms.BooleanField( + label=_("Carry over data to all other lessons with the same subject in this week"), + initial=True, + required=False, + ) + + def save(self, **kwargs): + lesson_documentation = super(LessonDocumentationForm, self).save(commit=True) + if ( + self.cleaned_data["carry_over_week"] + and ( + lesson_documentation.topic + or lesson_documentation.homework + or lesson_documentation.group_note + ) + and lesson_documentation.lesson_period + ): + lesson_documentation.carry_over_data( + LessonPeriod.objects.filter(lesson=lesson_documentation.lesson_period.lesson) + ) class PersonalNoteForm(forms.ModelForm): @@ -197,11 +221,11 @@ class ExtraMarkForm(forms.ModelForm): class ExcuseTypeForm(forms.ModelForm): - layout = Layout("short_name", "name") + layout = Layout("short_name", "name", "count_as_absent") class Meta: model = ExcuseType - fields = ["short_name", "name"] + fields = ["short_name", "name", "count_as_absent"] class PersonOverviewForm(ActionForm): diff --git a/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000000000000000000000000000000000000..cfdaa5cfb780278cb399496235d9af4140f18d64 --- /dev/null +++ b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,1437 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-04-23 12:35+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" +#: aleksis/apps/alsijil/actions.py:18 +msgid "Mark as excused" +msgstr "" + +#: aleksis/apps/alsijil/actions.py:25 +msgid "Mark as unexcused" +msgstr "" + +#: aleksis/apps/alsijil/actions.py:32 +#, python-brace-format +msgid "Mark as {excuse_type.name}" +msgstr "" + +#: aleksis/apps/alsijil/actions.py:48 aleksis/apps/alsijil/tables.py:29 +#: aleksis/apps/alsijil/tables.py:53 aleksis/apps/alsijil/tables.py:78 +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:29 +msgid "Delete" +msgstr "" + +#: aleksis/apps/alsijil/actions.py:68 +msgid "{} asks you to check some class register entries." +msgstr "" + +#: aleksis/apps/alsijil/actions.py:86 +#, python-brace-format +msgid "We have successfully sent notifications to {count_teachers} persons for {count_items} lessons." +msgstr "" + +#: aleksis/apps/alsijil/actions.py:92 +msgid "Ask teacher to check data" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:12 +msgid "Delete object" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:22 +msgid "Set current groups" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:33 +msgid "Reset personal note to defaults" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:45 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:46 +msgid "The personal note is related to a cancelled lesson." +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:73 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:74 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:99 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:100 +msgid "The lesson documentation is on holidays." +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:133 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:134 +msgid "The personal note is on holidays." +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:162 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" + +#: aleksis/apps/alsijil/data_checks.py:163 +msgid "The personal note is marked as excused, but not as absent." +msgstr "" + +#: aleksis/apps/alsijil/filters.py:12 +msgid "After" +msgstr "" + +#: aleksis/apps/alsijil/filters.py:13 +msgid "Before" +msgstr "" + +#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:302 +#: aleksis/apps/alsijil/tables.py:116 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220 +msgid "Subject" +msgstr "" + +#: aleksis/apps/alsijil/filters.py:30 +msgid "Tardiness is lower than" +msgstr "" + +#: aleksis/apps/alsijil/filters.py:31 +msgid "Tardiness is bigger than" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:47 +msgid "Homework for the next lesson" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:73 aleksis/apps/alsijil/forms.py:214 +#: aleksis/apps/alsijil/forms.py:301 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219 +msgid "Group" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:79 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:190 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:221 +msgid "Teacher" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:96 +msgid "You can't select a group and a teacher both." +msgstr "" + +#: aleksis/apps/alsijil/forms.py:150 aleksis/apps/alsijil/forms.py:303 +#: aleksis/apps/alsijil/models.py:480 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64 +msgid "Start date" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:151 aleksis/apps/alsijil/forms.py:304 +#: aleksis/apps/alsijil/models.py:484 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65 +msgid "End date" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:152 +msgid "Start period" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:153 +msgid "End period" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:154 aleksis/apps/alsijil/tables.py:117 +#: aleksis/apps/alsijil/tables.py:138 +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352 +msgid "Absent" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:155 aleksis/apps/alsijil/tables.py:146 +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297 +msgid "Excused" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:157 aleksis/apps/alsijil/models.py:71 +#: aleksis/apps/alsijil/models.py:245 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73 +msgid "Excuse type" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:162 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354 +msgid "Remarks" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:227 +#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28 +msgid "Person" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:299 +msgid "School term" +msgstr "" + +#: aleksis/apps/alsijil/forms.py:300 +msgid "Has lesson documentation" +msgstr "" + +#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455 +#: aleksis/apps/alsijil/util/alsijil_helpers.py:315 +msgid "Event" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16 +msgid "Class register" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:16 +msgid "Current lesson" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:27 +msgid "Current week" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:38 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8 +msgid "My groups" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:49 +msgid "My overview" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:60 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9 +msgid "My students" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:71 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18 +msgid "Assign group role" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:82 +#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8 +msgid "All lessons" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30 +msgid "Excuse types" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:250 +#: aleksis/apps/alsijil/models.py:432 aleksis/apps/alsijil/tables.py:120 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331 +msgid "Extra marks" +msgstr "" + +#: aleksis/apps/alsijil/menus.py:115 +msgid "Manage group roles" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:190 +msgid "Can view week overview of group class register" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:194 +msgid "Can view lesson overview of group class register" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:196 +msgid "Can view all personal notes of a group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:197 +msgid "Can edit all personal notes of a group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:199 +msgid "Can view all lesson documentation of a group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:202 +msgid "Can edit all lesson documentation of a group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:204 +msgid "Can view full register of a group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:206 +msgid "Can register an absence for all members of a group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:208 +msgid "Can assign a group role for this group" +msgstr "" + +#: aleksis/apps/alsijil/model_extensions.py:209 +msgid "Can register an absence for a person" +msgstr "" + +#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:419 +msgid "Short name" +msgstr "" + +#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:420 +#: aleksis/apps/alsijil/models.py:444 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23 +msgid "Name" +msgstr "" + +#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41 +msgid "Count as absent" +msgstr "" + +#: aleksis/apps/alsijil/models.py:57 +msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report." +msgstr "" + +#: aleksis/apps/alsijil/models.py:225 aleksis/apps/alsijil/models.py:324 +msgid "Year" +msgstr "" + +#: aleksis/apps/alsijil/models.py:284 +msgid "Personal note" +msgstr "" + +#: aleksis/apps/alsijil/models.py:285 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22 +msgid "Personal notes" +msgstr "" + +#: aleksis/apps/alsijil/models.py:336 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421 +msgid "Lesson topic" +msgstr "" + +#: aleksis/apps/alsijil/models.py:337 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422 +msgid "Homework" +msgstr "" + +#: aleksis/apps/alsijil/models.py:338 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42 +msgid "Group note" +msgstr "" + +#: aleksis/apps/alsijil/models.py:385 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17 +msgid "Lesson documentation" +msgstr "" + +#: aleksis/apps/alsijil/models.py:386 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21 +msgid "Lesson documentations" +msgstr "" + +#: aleksis/apps/alsijil/models.py:431 +msgid "Extra mark" +msgstr "" + +#: aleksis/apps/alsijil/models.py:445 +msgid "Icon" +msgstr "" + +#: aleksis/apps/alsijil/models.py:446 +msgid "Colour" +msgstr "" + +#: aleksis/apps/alsijil/models.py:452 aleksis/apps/alsijil/models.py:467 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62 +msgid "Group role" +msgstr "" + +#: aleksis/apps/alsijil/models.py:453 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34 +#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8 +#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9 +msgid "Group roles" +msgstr "" + +#: aleksis/apps/alsijil/models.py:457 +msgid "Can assign group role" +msgstr "" + +#: aleksis/apps/alsijil/models.py:473 +msgid "Assigned person" +msgstr "" + +#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:105 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326 +msgid "Groups" +msgstr "" + +#: aleksis/apps/alsijil/models.py:485 +msgid "Can be left empty if end date is not clear yet" +msgstr "" + +#: aleksis/apps/alsijil/models.py:500 +msgid "Group role assignment" +msgstr "" + +#: aleksis/apps/alsijil/models.py:501 +msgid "Group role assignments" +msgstr "" + +#: aleksis/apps/alsijil/models.py:508 +msgid "Can view lesson overview" +msgstr "" + +#: aleksis/apps/alsijil/models.py:509 +msgid "Can view week overview" +msgstr "" + +#: aleksis/apps/alsijil/models.py:510 +msgid "Can view full register" +msgstr "" + +#: aleksis/apps/alsijil/models.py:511 +msgid "Can register absence" +msgstr "" + +#: aleksis/apps/alsijil/models.py:512 +msgid "Can list all personal note filters" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:17 +msgid "Block adding personal notes for cancelled lessons" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:25 +msgid "Allow users to view their own personal notes" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:34 +msgid "Allow primary group owners to register future absences for students in their groups" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:43 +msgid "Allow original teachers to edit their lessons although they are substituted" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:52 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:55 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:63 +msgid "Carry over personal notes to all following lesson periods on the same day." +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:72 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:76 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:85 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:94 +msgid "Allow group owners to assign group roles to the parents of the group's members" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:103 +msgid "Show assigned group roles in week view" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:104 +msgid "Only week view of groups" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:112 +msgid "Show assigned group roles in lesson view" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:122 +msgid "Items per page in lessons table" +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:126 +msgid "Each page must show at least one item." +msgstr "" + +#: aleksis/apps/alsijil/preferences.py:134 +msgid "Filter lessons by existence of their lesson documentation on default" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47 +#: aleksis/apps/alsijil/tables.py:72 +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13 +msgid "Edit" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:96 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:348 +msgid "Date" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:99 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126 +msgid "Period" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:111 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336 +msgid "Teachers" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:118 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323 +msgid "Tardiness" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:119 +msgid "Excuse" +msgstr "" + +#: aleksis/apps/alsijil/tables.py:156 +#, python-brace-format +msgid "{value}' late" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5 +#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138 +msgid "Register absence" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:5 +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:6 +msgid "Confirm: Register absence" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:10 +msgid "" +"\n" +" Do you really want to register the following absence?\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:26 +msgid "" +"\n" +" As the length of this absence is longer than one day,\n" +" please double check the correctness of your entry.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:35 +#, python-format +msgid " %(count)s affected lessons " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:40 +msgid "" +"\n" +" There are no affected lessons. Registering this absence won't have any effect.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:57 +msgid "Reset status to 'not absent'" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:79 +msgid "Cancel" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21 +msgid "Students" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90 +msgid "Students list" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6 +msgid "Week view" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:45 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:90 +msgid "Roles" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:51 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:98 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:31 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97 +msgid "Generate printout" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:59 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:104 +msgid "No groups available." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:71 +msgid "students" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:5 +msgid "Lesson" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27 +msgid "Persons" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36 +msgid "Seating plan" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94 +msgid "Previous" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54 +msgid "More" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93 +msgid "My previous lesson" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104 +msgid "My next lesson" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105 +msgid "Next" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:10 +msgid "Class register: person" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:18 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:10 +msgid "Back" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:22 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:50 +msgid "Statistics" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:65 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:344 +msgid "Relevant personal notes" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:68 +msgid "Filter personal notes" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:73 +msgid "Clear all filters" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:76 +msgid "Close" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:79 +msgid "Filter" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:91 +msgid "Filter results" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119 +msgid "Statistics on absences, tardiness and remarks" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291 +msgid "Absences" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302 +msgid "thereof" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140 +msgid "Without Excuse Type" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313 +msgid "Unexcused" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12 +#, python-format +msgid "Students list: %(group)s" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54 +msgid "Select" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62 +msgid "Toggle filters" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69 +#, python-format +msgid "" +"CW %(week)s:\n" +" %(instance)s" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293 +msgid "Unfold" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360 +msgid "Visit lesson overview" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398 +msgid "unexcused" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401 +msgid "Summed up tardiness" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117 +msgid "Count of tardiness" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436 +msgid "No lessons available" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439 +msgid "" +"\n" +" There are no lessons for the selected group or teacher in this week.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:6 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:7 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:18 +msgid "Create excuse type" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:6 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:7 +msgid "Edit excuse type" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/warning.html:4 +#: aleksis/apps/alsijil/templates/alsijil/group_role/warning.html:4 +msgid "" +"\n" +" This function should only be used to define alternatives to the default excuse which also will be counted extra.\n" +" Don't use this to create a default excuse or if you don't divide between different types of excuse.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:6 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:7 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:14 +msgid "Create extra mark" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:6 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:7 +msgid "Edit extra mark" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:9 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:16 +#, python-format +msgid "Assign group role for %(group)s" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34 +msgid "Assign" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:9 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:12 +#, python-format +msgid "Group roles for %(group)s" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:28 +msgid "Back to my groups" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:36 +msgid "Assign a role to a person" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:45 +msgid "Current roles" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:48 +msgid "All assignments" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:66 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:83 +msgid "Actions" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:6 +#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:7 +#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:16 +msgid "Create group role" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:6 +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:7 +msgid "Edit group role" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:7 +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:8 +msgid "Edit group role assignment" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:31 +msgid "No one assigned." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:41 +msgid "" +"\n" +" You can get some additional actions for each group role assignment if you click on the name of the\n" +" corresponding person.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:21 +msgid "Stop" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/notifications/check.html:1 +msgid "Please check if the following class register entries are complete and correct:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139 +msgid "(e)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143 +msgid "(u)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:4 +msgid "Legend" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:7 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:71 +msgid "General" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:137 +msgid "(a)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14 +msgid "Unexcused absences" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138 +msgid "Sum (e)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18 +msgid "Sum of excused absences" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22 +msgid "Regular excused absences" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:41 +msgid "Excuse types (not counted as absent)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7 +#, python-format +msgid "%(period)s. period" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31 +#, python-format +msgid "" +"\n" +" %(period_from)s.–%(period_to)s. period\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136 +msgid "Save" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13 +msgid "Change history" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59 +msgid "Tardiness (in m)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:6 +msgid "Overview: Previous lesson" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:13 +msgid "Lesson topic of previous lesson:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:20 +msgid "Homework for this lesson:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:27 +msgid "Group notes for previous lesson:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:34 +msgid "Absent persons:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:41 +msgid "Late persons:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:8 +#, python-format +msgid "" +"Seating plan for %(group)s in\n" +" %(room)s" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:14 +#, python-format +msgid "" +"\n" +" This seating plan is taken from the parent group of %(child_group)s.\n" +" If you want, you can take it over for your group and then customize it.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:30 +msgid "Edit seating plan" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:37 +msgid "Copy plan and edit" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:56 +msgid "There is no seating plan for this lesson." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:64 +#, python-format +msgid "" +"\n" +" Create a new seating plan for %(group)s (%(subject)s) in %(room)s\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78 +#, python-format +msgid "" +"\n" +" Create a new seating plan for %(group)s in %(room)s\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:6 +msgid "Data complete" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:17 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:30 +msgid "Missing data" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:19 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:32 +msgid "Pending" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:28 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:466 +msgid "Lesson cancelled" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:34 +msgid "Substitution" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:4 +msgid "Lesson filter" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:9 +msgid "Update filters" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:22 +msgid "Lesson table" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:31 +msgid "Execute" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:6 +msgid "No students available." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24 +msgid "Primary group" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15 +msgid "Uncounted Absences" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48 +msgid "Sum" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90 +msgid "Regular excused" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130 +msgid "Show more details" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131 +msgid "Details" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:6 +msgid "Class register:" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:26 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:59 +msgid "Owners" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:30 +msgid "Printed on" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:38 +msgid "" +"\n" +" This printout is intended for archival purposes. The main copy of\n" +" the class register is stored in the AlekSIS School Information\n" +" System.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:45 +msgid "" +"\n" +" Copies of the class register, both digital and as printout, must\n" +" only be kept inside the school and/or on devices authorised by the\n" +" school.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:52 +msgid "" +"\n" +" The owner of the group and the headteacher confirm the above, as\n" +" well as the correctness of this printout.\n" +" " +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:62 +msgid "Headteacher" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:69 +msgid "Abbreviations" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:78 +msgid "Late" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:89 +msgid "Custom excuse types" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:101 +msgid "Custom excuse types (not counted as absent)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:113 +msgid "Available extra marks" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:127 +msgid "Persons in group" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:132 +msgid "No." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:133 +msgid "Last name" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:134 +msgid "First name" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:135 +msgid "Sex" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:136 +msgid "Date of birth" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:147 +msgid "(b)" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:184 +msgid "Teachers and lessons in group" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:191 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:222 +msgid "Lesson start" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:192 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:223 +msgid "Lesson end" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:193 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:224 +msgid "Per week" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:214 +msgid "Teachers and lessons in child groups" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:247 +msgid "Personal overview" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:249 +msgid "Contact details" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:288 +msgid "Absences and tardiness" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:303 +msgid "Without excuse type" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:349 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:419 +msgid "Pe." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:350 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:420 +msgid "Subj." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:351 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:424 +msgid "Te." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:353 +msgid "Tard." +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:381 +msgid "Yes" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:386 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:484 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:499 +msgid "e" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:413 +msgid "Week" +msgstr "" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:423 +msgid "Notes" +msgstr "" + +#: aleksis/apps/alsijil/views.py:118 +msgid "You either selected an invalid lesson or there is currently no lesson in progress." +msgstr "" + +#: aleksis/apps/alsijil/views.py:151 +msgid "You are not allowed to create a lesson documentation for a lesson in the future." +msgstr "" + +#: aleksis/apps/alsijil/views.py:266 +msgid "The lesson documentation has been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:300 +msgid "The personal notes have been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1079 +msgid "The absence has been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1100 +msgid "The personal note has been deleted." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1122 +msgid "The extra mark has been created." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1134 +msgid "The extra mark has been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1145 +msgid "The extra mark has been deleted." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1166 +msgid "The excuse type has been created." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1178 +msgid "The excuse type has been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1189 +msgid "The excuse type has been deleted." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1210 +msgid "The group role has been created." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1222 +msgid "The group role has been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1233 +msgid "The group role has been deleted." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1266 aleksis/apps/alsijil/views.py:1298 +msgid "The group role has been assigned." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1317 +msgid "The group role assignment has been saved." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1338 +msgid "The group role assignment has been stopped." +msgstr "" + +#: aleksis/apps/alsijil/views.py:1351 +msgid "The group role assignment has been deleted." +msgstr "" diff --git a/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000000000000000000000000000000000000..9375b86c3d4dd90ab2cd0f6e76eebad2b5e65b9f --- /dev/null +++ b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,1526 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-04-23 12:35+0000\n" +"PO-Revision-Date: 2022-05-18 23:27+0000\n" +"Last-Translator: Serhii Horichenko <m@sgg.im>\n" +"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/" +"aleksis-app-alsijil/uk/>\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 " +"? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > " +"14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % " +"100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"X-Generator: Weblate 4.12.1\n" + +#: aleksis/apps/alsijil/actions.py:18 +msgid "Mark as excused" +msgstr "Позначити Ñк поÑÑнений" + +#: aleksis/apps/alsijil/actions.py:25 +msgid "Mark as unexcused" +msgstr "Позначити Ñк непоÑÑнений" + +#: aleksis/apps/alsijil/actions.py:32 +#, python-brace-format +msgid "Mark as {excuse_type.name}" +msgstr "Позначити Ñк {excuse_type.name}" + +#: aleksis/apps/alsijil/actions.py:48 aleksis/apps/alsijil/tables.py:29 +#: aleksis/apps/alsijil/tables.py:53 aleksis/apps/alsijil/tables.py:78 +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:29 +msgid "Delete" +msgstr "Видалити" + +#: aleksis/apps/alsijil/actions.py:68 +msgid "{} asks you to check some class register entries." +msgstr "{} проÑить тебе перевірити деÑкі запиÑи клаÑного журналу." + +#: aleksis/apps/alsijil/actions.py:86 +#, python-brace-format +msgid "We have successfully sent notifications to {count_teachers} persons for {count_items} lessons." +msgstr "" +"Ми надіÑлали ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ {count_teachers} оÑіб щодо {count_items} уроків." + +#: aleksis/apps/alsijil/actions.py:92 +msgid "Ask teacher to check data" +msgstr "ПопроÑити Ð²Ñ‡Ð¸Ñ‚ÐµÐ»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ дані" + +#: aleksis/apps/alsijil/data_checks.py:12 +msgid "Delete object" +msgstr "Видалити об'єкт" + +#: aleksis/apps/alsijil/data_checks.py:22 +msgid "Set current groups" +msgstr "Ð’Ñтановити поточні групи" + +#: aleksis/apps/alsijil/data_checks.py:33 +msgid "Reset personal note to defaults" +msgstr "Скинути перÑональні нотатки на типові" + +#: aleksis/apps/alsijil/data_checks.py:45 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "ПереконайтеÑÑ, щоб у ÑкаÑованих уроках не було оÑобиÑтих нотаток" + +#: aleksis/apps/alsijil/data_checks.py:46 +msgid "The personal note is related to a cancelled lesson." +msgstr "У ÑкаÑованого уроку Ñ” пов'Ñзані оÑобиÑÑ‚Ñ– нотатки." + +#: aleksis/apps/alsijil/data_checks.py:73 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" +"ПереконайтеÑÑ, що Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— оÑобиÑтої нотатки уÑтановлені \"групи_оÑіб\"" + +#: aleksis/apps/alsijil/data_checks.py:74 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "Ð¦Ñ Ð¾ÑобиÑта нотатка не має групи у \"групі_оÑіб\"." + +#: aleksis/apps/alsijil/data_checks.py:99 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "ПереконайтеÑÑ, що на вихідні немає заповненого учбового матеріалу" + +#: aleksis/apps/alsijil/data_checks.py:100 +msgid "The lesson documentation is on holidays." +msgstr "Цей учбовий матеріал Ñ” на вихідних." + +#: aleksis/apps/alsijil/data_checks.py:133 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "ПереконайтеÑÑ, що на вихідні немає заповнених оÑобиÑтих нотаток" + +#: aleksis/apps/alsijil/data_checks.py:134 +msgid "The personal note is on holidays." +msgstr "Ці оÑобиÑÑ‚Ñ– нотатки Ñ” на вихідних." + +#: aleksis/apps/alsijil/data_checks.py:162 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "ПереконайтеÑÑ, що немає оÑобиÑтих нотаток щодо поÑÑÐ½ÐµÐ½Ð½Ñ Ð±ÐµÐ· пропуÑків" + +#: aleksis/apps/alsijil/data_checks.py:163 +msgid "The personal note is marked as excused, but not as absent." +msgstr "Ð¦Ñ Ð¿ÐµÑ€Ñональна нотатка відмічена Ñк поÑÑненнÑ, але не Ñк пропуÑк." + +#: aleksis/apps/alsijil/filters.py:12 +msgid "After" +msgstr "ПіÑлÑ" + +#: aleksis/apps/alsijil/filters.py:13 +msgid "Before" +msgstr "Перед" + +#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:302 +#: aleksis/apps/alsijil/tables.py:116 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220 +msgid "Subject" +msgstr "Предмет" + +#: aleksis/apps/alsijil/filters.py:30 +msgid "Tardiness is lower than" +msgstr "Ð—Ð°Ð¿Ñ–Ð·Ð½ÐµÐ½Ð½Ñ Ð¼ÐµÐ½ÑˆÐµ ніж на" + +#: aleksis/apps/alsijil/filters.py:31 +msgid "Tardiness is bigger than" +msgstr "Ð—Ð°Ð¿Ñ–Ð·Ð½ÐµÐ½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆÐµ ніж на" + +#: aleksis/apps/alsijil/forms.py:47 +msgid "Homework for the next lesson" +msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð° на наÑтупний урок" + +#: aleksis/apps/alsijil/forms.py:73 aleksis/apps/alsijil/forms.py:214 +#: aleksis/apps/alsijil/forms.py:301 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219 +msgid "Group" +msgstr "Група" + +#: aleksis/apps/alsijil/forms.py:79 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:190 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:221 +msgid "Teacher" +msgstr "Викладач" + +#: aleksis/apps/alsijil/forms.py:96 +msgid "You can't select a group and a teacher both." +msgstr "Ви не можете обрати одночаÑно групу та викладача." + +#: aleksis/apps/alsijil/forms.py:150 aleksis/apps/alsijil/forms.py:303 +#: aleksis/apps/alsijil/models.py:480 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64 +msgid "Start date" +msgstr "Дата початку" + +#: aleksis/apps/alsijil/forms.py:151 aleksis/apps/alsijil/forms.py:304 +#: aleksis/apps/alsijil/models.py:484 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65 +msgid "End date" +msgstr "Дата закінченнÑ" + +#: aleksis/apps/alsijil/forms.py:152 +msgid "Start period" +msgstr "Початок уроків" + +#: aleksis/apps/alsijil/forms.py:153 +msgid "End period" +msgstr "Ð—Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ ÑƒÑ€Ð¾ÐºÑ–Ð²" + +#: aleksis/apps/alsijil/forms.py:154 aleksis/apps/alsijil/tables.py:117 +#: aleksis/apps/alsijil/tables.py:138 +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352 +msgid "Absent" +msgstr "ВідÑутній(-Ñ)" + +#: aleksis/apps/alsijil/forms.py:155 aleksis/apps/alsijil/tables.py:146 +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297 +msgid "Excused" +msgstr "ПоÑÑнено" + +#: aleksis/apps/alsijil/forms.py:157 aleksis/apps/alsijil/models.py:71 +#: aleksis/apps/alsijil/models.py:245 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73 +msgid "Excuse type" +msgstr "Тип поÑÑненнÑ" + +#: aleksis/apps/alsijil/forms.py:162 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354 +msgid "Remarks" +msgstr "ЗауваженнÑ" + +#: aleksis/apps/alsijil/forms.py:227 +#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28 +msgid "Person" +msgstr "ОÑоба" + +#: aleksis/apps/alsijil/forms.py:299 +msgid "School term" +msgstr "Ðавчальний рік" + +#: aleksis/apps/alsijil/forms.py:300 +msgid "Has lesson documentation" +msgstr "Має учбовий матеріал" + +#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455 +#: aleksis/apps/alsijil/util/alsijil_helpers.py:315 +msgid "Event" +msgstr "ПодіÑ" + +#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16 +msgid "Class register" +msgstr "КлаÑний журнал" + +#: aleksis/apps/alsijil/menus.py:16 +msgid "Current lesson" +msgstr "Поточний урок" + +#: aleksis/apps/alsijil/menus.py:27 +msgid "Current week" +msgstr "Поточний тиждень" + +#: aleksis/apps/alsijil/menus.py:38 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8 +msgid "My groups" +msgstr "Мої групи" + +#: aleksis/apps/alsijil/menus.py:49 +msgid "My overview" +msgstr "Мій оглÑд" + +#: aleksis/apps/alsijil/menus.py:60 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9 +msgid "My students" +msgstr "Мої Ñтуденти" + +#: aleksis/apps/alsijil/menus.py:71 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18 +msgid "Assign group role" +msgstr "Призначити роль групи" + +#: aleksis/apps/alsijil/menus.py:82 +#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8 +msgid "All lessons" +msgstr "УÑÑ– уроки" + +#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30 +msgid "Excuse types" +msgstr "Типи поÑÑнень" + +#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:250 +#: aleksis/apps/alsijil/models.py:432 aleksis/apps/alsijil/tables.py:120 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331 +msgid "Extra marks" +msgstr "Додаткові відмітки" + +#: aleksis/apps/alsijil/menus.py:115 +msgid "Manage group roles" +msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð»Ñми групи" + +#: aleksis/apps/alsijil/model_extensions.py:190 +msgid "Can view week overview of group class register" +msgstr "Може бачити клаÑний журнал групи за тиждень" + +#: aleksis/apps/alsijil/model_extensions.py:194 +msgid "Can view lesson overview of group class register" +msgstr "Може бачити клаÑний журнал групи за урок" + +#: aleksis/apps/alsijil/model_extensions.py:196 +msgid "Can view all personal notes of a group" +msgstr "Може бачити уÑÑ– оÑобиÑÑ‚Ñ– нотатки групи" + +#: aleksis/apps/alsijil/model_extensions.py:197 +msgid "Can edit all personal notes of a group" +msgstr "Може редагувати уÑÑ– оÑобиÑÑ‚Ñ– нотатки групи" + +#: aleksis/apps/alsijil/model_extensions.py:199 +msgid "Can view all lesson documentation of a group" +msgstr "Може бачити увеÑÑŒ учбовий матеріал групи" + +#: aleksis/apps/alsijil/model_extensions.py:202 +msgid "Can edit all lesson documentation of a group" +msgstr "Може редагувати увеÑÑŒ учбовий матеріал групи" + +#: aleksis/apps/alsijil/model_extensions.py:204 +msgid "Can view full register of a group" +msgstr "Може бачити клаÑний журнал групи без обмежень" + +#: aleksis/apps/alsijil/model_extensions.py:206 +msgid "Can register an absence for all members of a group" +msgstr "Може реєÑтрувати пропуÑки Ð´Ð»Ñ ÑƒÑÑ–Ñ… учаÑників групи" + +#: aleksis/apps/alsijil/model_extensions.py:208 +msgid "Can assign a group role for this group" +msgstr "Може призначати роль групи Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи" + +#: aleksis/apps/alsijil/model_extensions.py:209 +msgid "Can register an absence for a person" +msgstr "Може реєÑтрувати відÑутніÑÑ‚ÑŒ оÑоби" + +#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:419 +msgid "Short name" +msgstr "Коротке ім'Ñ" + +#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:420 +#: aleksis/apps/alsijil/models.py:444 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23 +msgid "Name" +msgstr "Повне ім'Ñ" + +#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41 +msgid "Count as absent" +msgstr "КількіÑÑ‚ÑŒ відÑутніх" + +#: aleksis/apps/alsijil/models.py:57 +msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report." +msgstr "" +"Якщо відмічено, цей тип поÑÑÐ½ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ зарахований Ñк пропущений урок. Якщо " +"не відмічено, то без запиÑу у звіт відÑутноÑÑ‚Ñ–." + +#: aleksis/apps/alsijil/models.py:225 aleksis/apps/alsijil/models.py:324 +msgid "Year" +msgstr "Рік" + +#: aleksis/apps/alsijil/models.py:284 +msgid "Personal note" +msgstr "ОÑобиÑта нотатка" + +#: aleksis/apps/alsijil/models.py:285 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22 +msgid "Personal notes" +msgstr "ОÑобиÑÑ‚Ñ– нотатки" + +#: aleksis/apps/alsijil/models.py:336 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421 +msgid "Lesson topic" +msgstr "Тема уроку" + +#: aleksis/apps/alsijil/models.py:337 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422 +msgid "Homework" +msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð°" + +#: aleksis/apps/alsijil/models.py:338 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42 +msgid "Group note" +msgstr "Групова нотатка" + +#: aleksis/apps/alsijil/models.py:385 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17 +msgid "Lesson documentation" +msgstr "Учбовий матеріал" + +#: aleksis/apps/alsijil/models.py:386 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21 +msgid "Lesson documentations" +msgstr "Учбові матеріали" + +#: aleksis/apps/alsijil/models.py:431 +msgid "Extra mark" +msgstr "Додаткова відмітка" + +#: aleksis/apps/alsijil/models.py:445 +msgid "Icon" +msgstr "Іконка" + +#: aleksis/apps/alsijil/models.py:446 +msgid "Colour" +msgstr "Колір" + +#: aleksis/apps/alsijil/models.py:452 aleksis/apps/alsijil/models.py:467 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62 +msgid "Group role" +msgstr "Роль групи" + +#: aleksis/apps/alsijil/models.py:453 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34 +#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8 +#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9 +msgid "Group roles" +msgstr "Ролі груп" + +#: aleksis/apps/alsijil/models.py:457 +msgid "Can assign group role" +msgstr "Може призначати роль групи" + +#: aleksis/apps/alsijil/models.py:473 +msgid "Assigned person" +msgstr "Призначена оÑоба" + +#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:105 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326 +msgid "Groups" +msgstr "Групи" + +#: aleksis/apps/alsijil/models.py:485 +msgid "Can be left empty if end date is not clear yet" +msgstr "Якщо немає точної кінцевої дати, можна залишити порожнім" + +#: aleksis/apps/alsijil/models.py:500 +msgid "Group role assignment" +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– групи" + +#: aleksis/apps/alsijil/models.py:501 +msgid "Group role assignments" +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– групи" + +#: aleksis/apps/alsijil/models.py:508 +msgid "Can view lesson overview" +msgstr "Може бачити оглÑд уроку" + +#: aleksis/apps/alsijil/models.py:509 +msgid "Can view week overview" +msgstr "Може бачити оглÑд тижнÑ" + +#: aleksis/apps/alsijil/models.py:510 +msgid "Can view full register" +msgstr "Може бачити повний журнал" + +#: aleksis/apps/alsijil/models.py:511 +msgid "Can register absence" +msgstr "Може реєÑтрувати пропуÑк" + +#: aleksis/apps/alsijil/models.py:512 +msgid "Can list all personal note filters" +msgstr "Може бачити уÑÑ– фільтри оÑобиÑтих нотаток" + +#: aleksis/apps/alsijil/preferences.py:17 +msgid "Block adding personal notes for cancelled lessons" +msgstr "Блокувати Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¾ÑобиÑтих нотаток до ÑкаÑованих уроків" + +#: aleksis/apps/alsijil/preferences.py:25 +msgid "Allow users to view their own personal notes" +msgstr "Дозволити кориÑтувачам переглÑдати влаÑні оÑобиÑÑ‚Ñ– нотатки" + +#: aleksis/apps/alsijil/preferences.py:34 +msgid "Allow primary group owners to register future absences for students in their groups" +msgstr "" +"Дозволити влаÑникам оÑновних груп реєÑтрувати майбутні пропуÑки Ñтудентів у " +"Ñ—Ñ… групах" + +#: aleksis/apps/alsijil/preferences.py:43 +msgid "Allow original teachers to edit their lessons although they are substituted" +msgstr "" +"Дозволити початковим викладачам навіть піÑÐ»Ñ Ñ—Ñ… заміни редагувати Ñвої уроки" + +#: aleksis/apps/alsijil/preferences.py:52 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" +"ПереноÑити дані з першого уроку в розкладі на поточні уроки через декілька " +"уроків" + +#: aleksis/apps/alsijil/preferences.py:55 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "Це перенеÑе дані лише в тому разі, коли в поточних уроках даних немає." + +#: aleksis/apps/alsijil/preferences.py:63 +msgid "Carry over personal notes to all following lesson periods on the same day." +msgstr "ПереноÑити оÑобиÑÑ‚Ñ– нотатки до вÑÑ–Ñ… наÑтупних уроків того ж днÑ." + +#: aleksis/apps/alsijil/preferences.py:72 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" +"Дозволити викладачам відкривати уроки того Ñамого Ð´Ð½Ñ Ñ– не лише на початку " +"уроків" + +#: aleksis/apps/alsijil/preferences.py:76 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" +"Ці Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ впливають на минулі уроки. Ви можете відкривати Ñ—Ñ… " +"будь-коли." + +#: aleksis/apps/alsijil/preferences.py:85 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "" +"Дозволити викладачам додавати навчальний матеріал (дані Ð´Ð»Ñ ÑƒÑ€Ð¾ÐºÑ–Ð²) на " +"вихідних" + +#: aleksis/apps/alsijil/preferences.py:94 +msgid "Allow group owners to assign group roles to the parents of the group's members" +msgstr "Дозволити влаÑникам груп призначати ролі груп батькам учаÑників груп" + +#: aleksis/apps/alsijil/preferences.py:103 +msgid "Show assigned group roles in week view" +msgstr "Показати призначені ролі груп у тижневому оглÑді" + +#: aleksis/apps/alsijil/preferences.py:104 +msgid "Only week view of groups" +msgstr "Лише тижневі оглÑди груп" + +#: aleksis/apps/alsijil/preferences.py:112 +msgid "Show assigned group roles in lesson view" +msgstr "Показати призначені ролі груп в оглÑді уроку" + +#: aleksis/apps/alsijil/preferences.py:122 +msgid "Items per page in lessons table" +msgstr "КількіÑÑ‚ÑŒ запиÑів у розкладі на Ñторінку" + +#: aleksis/apps/alsijil/preferences.py:126 +msgid "Each page must show at least one item." +msgstr "Кожна Ñторінка повинна мати принаймні один запиÑ." + +#: aleksis/apps/alsijil/preferences.py:134 +msgid "Filter lessons by existence of their lesson documentation on default" +msgstr "Типово фільтувати уроки за наÑвніÑÑ‚ÑŽ у них учбового матеріалу" + +#: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47 +#: aleksis/apps/alsijil/tables.py:72 +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13 +msgid "Edit" +msgstr "Редагувати" + +#: aleksis/apps/alsijil/tables.py:96 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:348 +msgid "Date" +msgstr "Дата" + +#: aleksis/apps/alsijil/tables.py:99 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126 +msgid "Period" +msgstr "Урок" + +#: aleksis/apps/alsijil/tables.py:111 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336 +msgid "Teachers" +msgstr "Викладачі" + +#: aleksis/apps/alsijil/tables.py:118 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323 +msgid "Tardiness" +msgstr "ЗапізненнÑ" + +#: aleksis/apps/alsijil/tables.py:119 +msgid "Excuse" +msgstr "ПоÑÑненнÑ" + +#: aleksis/apps/alsijil/tables.py:156 +#, python-brace-format +msgid "{value}' late" +msgstr "{value}' затримка" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5 +#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138 +msgid "Register absence" +msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутноÑÑ‚Ñ–" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:5 +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:6 +msgid "Confirm: Register absence" +msgstr "ПідтвердженнÑ: РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутноÑÑ‚Ñ–" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:10 +msgid "" +"\n" +" Do you really want to register the following absence?\n" +" " +msgstr "" +"\n" +" Ви дійÑно хочете зареєÑтрувати цей пропуÑк?\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:26 +msgid "" +"\n" +" As the length of this absence is longer than one day,\n" +" please double check the correctness of your entry.\n" +" " +msgstr "" +"\n" +" ОÑкільки пропуÑк більше одного днÑ,\n" +" переконайтеÑÑ, будь лаÑка, двічі у точноÑÑ‚Ñ– вашого запиÑу.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:35 +#, python-format +msgid " %(count)s affected lessons " +msgstr " %(count)s залежних уроків " + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:40 +msgid "" +"\n" +" There are no affected lessons. Registering this absence won't have any effect.\n" +" " +msgstr "" +"\n" +" Залежних уроків немає. РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку ні на що не " +"впливає.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:57 +msgid "Reset status to 'not absent'" +msgstr "Скинути ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° 'не відÑутній'" + +#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:79 +msgid "Cancel" +msgstr "СкаÑувати" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21 +msgid "Students" +msgstr "Студенти" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90 +msgid "Students list" +msgstr "СпиÑок Ñтудентів" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6 +msgid "Week view" +msgstr "Тижневий оглÑд" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:45 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:90 +msgid "Roles" +msgstr "Ролі" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:51 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:98 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:31 +#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97 +msgid "Generate printout" +msgstr "Підготувати Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:59 +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:104 +msgid "No groups available." +msgstr "Групи не доÑтупні." + +#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:71 +msgid "students" +msgstr "Ñтуденти" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:5 +msgid "Lesson" +msgstr "Урок" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28 +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27 +msgid "Persons" +msgstr "ОÑоби" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36 +msgid "Seating plan" +msgstr "План розміщеннÑ" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94 +msgid "Previous" +msgstr "Попередній" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54 +msgid "More" +msgstr "Ще" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93 +msgid "My previous lesson" +msgstr "Мій попередній урок" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98 +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104 +msgid "My next lesson" +msgstr "Мій наÑтупний урок" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105 +msgid "Next" +msgstr "ÐаÑтупний" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" +"\n" +" Цей урок перекриває вихідні Ñ– його не можна редагувати.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:10 +msgid "Class register: person" +msgstr "КлаÑний журнал: оÑоба" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:18 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:10 +msgid "Back" +msgstr "Ðазад" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:22 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" +"\n" +" ОглÑд клаÑного журналу Ð´Ð»Ñ %(person)s\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:50 +msgid "Statistics" +msgstr "СтатиÑтика" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:65 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:344 +msgid "Relevant personal notes" +msgstr "Відповідні оÑобиÑÑ‚Ñ– нотатки" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:68 +msgid "Filter personal notes" +msgstr "Фільтрувати оÑобиÑÑ‚Ñ– нотатки" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:73 +msgid "Clear all filters" +msgstr "ОчиÑтити фільтри" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:76 +msgid "Close" +msgstr "Закрити" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:79 +msgid "Filter" +msgstr "Фільтри" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:91 +msgid "Filter results" +msgstr "Результат фільтрів" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119 +msgid "Statistics on absences, tardiness and remarks" +msgstr "СтатиÑтика пропуÑків, запізнень та зауважень" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291 +msgid "Absences" +msgstr "ВідÑутноÑÑ‚Ñ–" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132 +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302 +msgid "thereof" +msgstr "отже" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140 +msgid "Without Excuse Type" +msgstr "Без Типу ПоÑÑненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313 +msgid "Unexcused" +msgstr "Ðеобґрунтоване" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5 +#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12 +#, python-format +msgid "Students list: %(group)s" +msgstr "СпиÑок Ñтудентів: %(group)s" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54 +msgid "Select" +msgstr "Обрати" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62 +msgid "Toggle filters" +msgstr "Перемикнути фільтри" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69 +#, python-format +msgid "" +"CW %(week)s:\n" +" %(instance)s" +msgstr "" +"ТЖ %(week)s:\n" +" %(instance)s" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293 +msgid "Unfold" +msgstr "Розгорнути" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360 +msgid "Visit lesson overview" +msgstr "ПереглÑд Ð²Ñ–Ð´Ð²Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑ€Ð¾ÐºÑƒ" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398 +msgid "unexcused" +msgstr "непоÑÑнене" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401 +msgid "Summed up tardiness" +msgstr "Сумарні запізненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117 +msgid "Count of tardiness" +msgstr "КількіÑÑ‚ÑŒ запізень" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436 +msgid "No lessons available" +msgstr "Ðемає доÑтупних уроків" + +#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439 +msgid "" +"\n" +" There are no lessons for the selected group or teacher in this week.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ð¾Ð±Ñ€Ð°Ð½Ð¾Ñ— групи або викладача на цьому тижні уроків немає.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:6 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:7 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:18 +msgid "Create excuse type" +msgstr "Створити тип поÑÑненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:6 +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:7 +msgid "Edit excuse type" +msgstr "Редагувати тип поÑÑненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/excuse_type/warning.html:4 +#: aleksis/apps/alsijil/templates/alsijil/group_role/warning.html:4 +msgid "" +"\n" +" This function should only be used to define alternatives to the default excuse which also will be counted extra.\n" +" Don't use this to create a default excuse or if you don't divide between different types of excuse.\n" +" " +msgstr "" +"\n" +" Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтовуєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð² до типового " +"поÑÑненнÑ, Ñке додатково буде враховане.\n" +" Ðе кориÑтуйтеÑÑ Ñ†Ð¸Ð¼ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ поÑÑÐ½ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ Ñкщо не " +"розділÑєте на типи поÑÑнень.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:6 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:7 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:14 +msgid "Create extra mark" +msgstr "Створити додаткову позначку" + +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:6 +#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:7 +msgid "Edit extra mark" +msgstr "Редагувати додаткову позначку" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:9 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:16 +#, python-format +msgid "Assign group role for %(group)s" +msgstr "Призначити роль групи Ð´Ð»Ñ %(group)s" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34 +msgid "Assign" +msgstr "Призначити" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:9 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:12 +#, python-format +msgid "Group roles for %(group)s" +msgstr "Ролі груп Ð´Ð»Ñ %(group)s" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:28 +msgid "Back to my groups" +msgstr "Ðазад до моїх груп" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:36 +msgid "Assign a role to a person" +msgstr "Призначити роль оÑобі" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:45 +msgid "Current roles" +msgstr "Поточні ролі" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:48 +msgid "All assignments" +msgstr "УÑÑ– призначеннÑ" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:66 +#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:83 +msgid "Actions" +msgstr "Дії" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:6 +#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:7 +#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:16 +msgid "Create group role" +msgstr "Створити роль групи" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:6 +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:7 +msgid "Edit group role" +msgstr "Редагувати роль групи" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:7 +#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:8 +msgid "Edit group role assignment" +msgstr "Редагувати Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– групи" + +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:31 +msgid "No one assigned." +msgstr "Ðіхто не призначений." + +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:41 +msgid "" +"\n" +" You can get some additional actions for each group role assignment if you click on the name of the\n" +" corresponding person.\n" +" " +msgstr "" +"\n" +" Ви можете отримати деÑкі додаткові дії Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– " +"групи піÑÐ»Ñ ÐºÐ»Ñ–ÐºÑƒ\n" +" на ім'Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñ— оÑоби.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:21 +msgid "Stop" +msgstr "Стоп" + +#: aleksis/apps/alsijil/templates/alsijil/notifications/check.html:1 +msgid "Please check if the following class register entries are complete and correct:" +msgstr "" +"Перевірте, будь лаÑка, чи ці запиÑи клаÑного журналу повні та правильні:" + +#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139 +msgid "(e)" +msgstr "(п)" + +#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6 +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143 +msgid "(u)" +msgstr "(н)" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:4 +msgid "Legend" +msgstr "Легенда" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:7 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:71 +msgid "General" +msgstr "Загальне" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:137 +msgid "(a)" +msgstr "(в)" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14 +msgid "Unexcused absences" +msgstr "Ðеобґрунтовані пропуÑки" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138 +msgid "Sum (e)" +msgstr "Сума (п)" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18 +msgid "Sum of excused absences" +msgstr "КількіÑÑ‚ÑŒ пропуÑків з поÑÑненнÑм" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22 +msgid "Regular excused absences" +msgstr "РегулÑрні поÑÑÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑків" + +#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:41 +msgid "Excuse types (not counted as absent)" +msgstr "Типи поÑÑнень (не враховані Ñк пропуÑки)" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7 +#, python-format +msgid "%(period)s. period" +msgstr "%(period)s. урок" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31 +#, python-format +msgid "" +"\n" +" %(period_from)s.–%(period_to)s. period\n" +" " +msgstr "" +"\n" +" %(period_from)s.–%(period_to)s. уроки\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136 +msgid "Save" +msgstr "Зберегти" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" +"\n" +" Попередній урок %(subject)s\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" +"\n" +" ÐаÑтупний урок %(subject)s\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13 +msgid "Change history" +msgstr "Змінити Ñ–Ñторію" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59 +msgid "Tardiness (in m)" +msgstr "Ð—Ð°Ð¿Ñ–Ð·Ð½ÐµÐ½Ð½Ñ (хв)" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:6 +msgid "Overview: Previous lesson" +msgstr "ОглÑд: Попередній урок" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:13 +msgid "Lesson topic of previous lesson:" +msgstr "Тема попереднього уроку:" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:20 +msgid "Homework for this lesson:" +msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð° на цей урок:" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:27 +msgid "Group notes for previous lesson:" +msgstr "Ðотатки групи на попередньому уроці:" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:34 +msgid "Absent persons:" +msgstr "ВідÑутні:" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:41 +msgid "Late persons:" +msgstr "ЗапізнилиÑÑ:" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:8 +#, python-format +msgid "" +"Seating plan for %(group)s in\n" +" %(room)s" +msgstr "" +"План Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %(group)s у\n" +" %(room)s" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:14 +#, python-format +msgid "" +"\n" +" This seating plan is taken from the parent group of %(child_group)s.\n" +" If you want, you can take it over for your group and then customize it.\n" +" " +msgstr "" +"\n" +" Цей план Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð·Ñтий із батьківÑької групи %(child_group)s." +"\n" +" При необхідноÑÑ‚Ñ–, Ви можете його налаштувати під Ñвою групу.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:30 +msgid "Edit seating plan" +msgstr "Редагувати план розміщеннÑ" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:37 +msgid "Copy plan and edit" +msgstr "Скопіювати план та відредагувати" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:56 +msgid "There is no seating plan for this lesson." +msgstr "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ уроку немає плану розміщеннÑ." + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:64 +#, python-format +msgid "" +"\n" +" Create a new seating plan for %(group)s (%(subject)s) in %(room)s\n" +" " +msgstr "" +"\n" +" Створити новий план Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %(group)s (%(subject)s) у " +"%(room)s\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78 +#, python-format +msgid "" +"\n" +" Create a new seating plan for %(group)s in %(room)s\n" +" " +msgstr "" +"\n" +" Створити новий план Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %(group)s у %(room)s\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:6 +msgid "Data complete" +msgstr "Дані заповнені" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:17 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:30 +msgid "Missing data" +msgstr "Дані відÑутні" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:19 +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:32 +msgid "Pending" +msgstr "Ð’ очікуванні" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:28 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:466 +msgid "Lesson cancelled" +msgstr "Урок ÑкаÑований" + +#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:34 +msgid "Substitution" +msgstr "Заміна" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:4 +msgid "Lesson filter" +msgstr "Фільтр уроків" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:9 +msgid "Update filters" +msgstr "Оновити фільтри" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:22 +msgid "Lesson table" +msgstr "Розклад уроків" + +#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:31 +msgid "Execute" +msgstr "Виконати" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:6 +msgid "No students available." +msgstr "Ðемає доÑтупних Ñтудентів." + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13 +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24 +msgid "Primary group" +msgstr "ОÑновна група" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15 +msgid "Uncounted Absences" +msgstr "Ðевраховані пропуÑки" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48 +msgid "Sum" +msgstr "Сума" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90 +msgid "Regular excused" +msgstr "РегулÑрні поÑÑненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130 +msgid "Show more details" +msgstr "Показати більш детально" + +#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131 +msgid "Details" +msgstr "Деталі" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:6 +msgid "Class register:" +msgstr "КлаÑний журнал:" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:26 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:59 +msgid "Owners" +msgstr "ВлаÑники" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:30 +msgid "Printed on" +msgstr "Ðадруковано" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:38 +msgid "" +"\n" +" This printout is intended for archival purposes. The main copy of\n" +" the class register is stored in the AlekSIS School Information\n" +" System.\n" +" " +msgstr "" +"\n" +" Ð¦Ñ Ñ€Ð¾Ð·Ð´Ñ€ÑƒÐºÑ–Ð²ÐºÐ° зроблена Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð½Ð¸Ñ… потреб. ОÑновна копіÑ\n" +" цього клаÑного журналу зберігаєтьÑÑ Ð² навчальній інформаційній\n" +" ÑиÑтемі AlekSIS.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:45 +msgid "" +"\n" +" Copies of the class register, both digital and as printout, must\n" +" only be kept inside the school and/or on devices authorised by the\n" +" school.\n" +" " +msgstr "" +"\n" +" Копії цього клаÑного журналу, в Ñ‚.ч. цифрові та друковані, повинні\n" +" зберігатиÑÑ Ð»Ð¸ÑˆÐµ вÑередині навчального закладу та/або на приÑтроÑÑ…,\n" +" дозволених адмініÑтрацією цього навчального закладу.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:52 +msgid "" +"\n" +" The owner of the group and the headteacher confirm the above, as\n" +" well as the correctness of this printout.\n" +" " +msgstr "" +"\n" +" ВлаÑник групи та директор погоджують зазначене вище, \n" +" а також правильніÑÑ‚ÑŒ цієї роздруківки.\n" +" " + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:62 +msgid "Headteacher" +msgstr "Директор" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:69 +msgid "Abbreviations" +msgstr "СкороченнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:78 +msgid "Late" +msgstr "ЗапізненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:89 +msgid "Custom excuse types" +msgstr "КориÑтувацькі типи поÑÑнень" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:101 +msgid "Custom excuse types (not counted as absent)" +msgstr "КориÑтувацькі типи поÑÑнень (не враховані Ñк пропуÑки)" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:113 +msgid "Available extra marks" +msgstr "ДоÑтупні додаткові відмітки" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:127 +msgid "Persons in group" +msgstr "ОÑоби в групі" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:132 +msgid "No." +msgstr "â„–" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:133 +msgid "Last name" +msgstr "Прізвище" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:134 +msgid "First name" +msgstr "Ім'Ñ" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:135 +msgid "Sex" +msgstr "Стать" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:136 +msgid "Date of birth" +msgstr "Дата народженнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:147 +msgid "(b)" +msgstr "(з)" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:184 +msgid "Teachers and lessons in group" +msgstr "Викладачі та уроки в групі" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:191 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:222 +msgid "Lesson start" +msgstr "Початок уроку" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:192 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:223 +msgid "Lesson end" +msgstr "Кінець уроку" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:193 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:224 +msgid "Per week" +msgstr "Ðа тиждень" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:214 +msgid "Teachers and lessons in child groups" +msgstr "Викладачі та уроки у підлеглих групах" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:247 +msgid "Personal overview" +msgstr "ОÑобиÑтий оглÑд" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:249 +msgid "Contact details" +msgstr "Контактні дані" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:288 +msgid "Absences and tardiness" +msgstr "ПропуÑки та запізненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:303 +msgid "Without excuse type" +msgstr "Без типу поÑÑненнÑ" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:349 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:419 +msgid "Pe." +msgstr "Ур." + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:350 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:420 +msgid "Subj." +msgstr "Предм." + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:351 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:424 +msgid "Te." +msgstr "Вч." + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:353 +msgid "Tard." +msgstr "Зап." + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:381 +msgid "Yes" +msgstr "Так" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:386 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:484 +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:499 +msgid "e" +msgstr "п" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:413 +msgid "Week" +msgstr "Тиждень" + +#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:423 +msgid "Notes" +msgstr "Ðотатки" + +#: aleksis/apps/alsijil/views.py:118 +msgid "You either selected an invalid lesson or there is currently no lesson in progress." +msgstr "Ðбо Ви обрали неправильний урок, або зараз уроку немає." + +#: aleksis/apps/alsijil/views.py:151 +msgid "You are not allowed to create a lesson documentation for a lesson in the future." +msgstr "Вам не дозволено Ñтворювати учбові матеріали Ð´Ð»Ñ ÑƒÑ€Ð¾ÐºÑƒ у майбутньому." + +#: aleksis/apps/alsijil/views.py:266 +msgid "The lesson documentation has been saved." +msgstr "Учбовий матеріал збережений." + +#: aleksis/apps/alsijil/views.py:300 +msgid "The personal notes have been saved." +msgstr "ОÑобиÑÑ‚Ñ– нотатки збережені." + +#: aleksis/apps/alsijil/views.py:1079 +msgid "The absence has been saved." +msgstr "ПропуÑк збережений." + +#: aleksis/apps/alsijil/views.py:1100 +msgid "The personal note has been deleted." +msgstr "ОÑобиÑта нотатка видалена." + +#: aleksis/apps/alsijil/views.py:1122 +msgid "The extra mark has been created." +msgstr "Додаткова позначка Ñторена." + +#: aleksis/apps/alsijil/views.py:1134 +msgid "The extra mark has been saved." +msgstr "Додаткова позначка збережена." + +#: aleksis/apps/alsijil/views.py:1145 +msgid "The extra mark has been deleted." +msgstr "Додаткова позначка видалена." + +#: aleksis/apps/alsijil/views.py:1166 +msgid "The excuse type has been created." +msgstr "Тип поÑÑÐ½ÐµÐ½Ð½Ñ Ñтворений." + +#: aleksis/apps/alsijil/views.py:1178 +msgid "The excuse type has been saved." +msgstr "Тип поÑÑÐ½ÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¸Ð¹." + +#: aleksis/apps/alsijil/views.py:1189 +msgid "The excuse type has been deleted." +msgstr "Тип поÑÑÐ½ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¸Ð¹." + +#: aleksis/apps/alsijil/views.py:1210 +msgid "The group role has been created." +msgstr "Роль групи Ñтворена." + +#: aleksis/apps/alsijil/views.py:1222 +msgid "The group role has been saved." +msgstr "Роль групи збережена." + +#: aleksis/apps/alsijil/views.py:1233 +msgid "The group role has been deleted." +msgstr "Роль групи видалена." + +#: aleksis/apps/alsijil/views.py:1266 aleksis/apps/alsijil/views.py:1298 +msgid "The group role has been assigned." +msgstr "Роль групи призначена." + +#: aleksis/apps/alsijil/views.py:1317 +msgid "The group role assignment has been saved." +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– групи збережене." + +#: aleksis/apps/alsijil/views.py:1338 +msgid "The group role assignment has been stopped." +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– групи зупинене." + +#: aleksis/apps/alsijil/views.py:1351 +msgid "The group role assignment has been deleted." +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– групи видалене." diff --git a/aleksis/apps/alsijil/migrations/0016_add_not_counted_excuse_types.py b/aleksis/apps/alsijil/migrations/0016_add_not_counted_excuse_types.py new file mode 100644 index 0000000000000000000000000000000000000000..c45edee40fca69d73ca7edf67c816d389470f1ef --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0016_add_not_counted_excuse_types.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-03-20 10:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('alsijil', '0015_fix_unique_personal_note'), + ] + + operations = [ + migrations.AddField( + model_name='excusetype', + name='count_as_absent', + field=models.BooleanField(default=True, help_text="If checked, this excuse type will be counted as a missed lesson. If not checked, it won't show up in the absence report.", verbose_name='Count as missed lesson'), + ), + ] diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index a2c9b8dc7984f7896c60f0c6439542eebb98ccc7..5b0e5ac4b1337dfdc44c97470c36cd954fc7b915 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -432,9 +432,18 @@ def generate_person_list_with_class_register_statistics( ).annotate( absences_count=Count( "filtered_personal_notes", - filter=Q(filtered_personal_notes__absent=True), + filter=Q(filtered_personal_notes__absent=True) + & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False), ), excused=Count( + "filtered_personal_notes", + filter=Q( + filtered_personal_notes__absent=True, + filtered_personal_notes__excused=True, + ) + & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False), + ), + excused_without_excuse_type=Count( "filtered_personal_notes", filter=Q( filtered_personal_notes__absent=True, diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index 1805831a1b25cbe01744f9a3a7e7a2baf7f27966..16d6c7d3e4c46ae17db133a981a17d965abe3da2 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -50,6 +50,15 @@ class ExcuseType(ExtensibleModel): short_name = models.CharField(max_length=255, unique=True, verbose_name=_("Short name")) name = models.CharField(max_length=255, unique=True, verbose_name=_("Name")) + count_as_absent = models.BooleanField( + default=True, + verbose_name=_("Count as absent"), + help_text=_( + "If checked, this excuse type will be counted as a missed lesson. If not checked," + "it won't show up in the absence report." + ), + ) + def __str__(self): return f"{self.name} ({self.short_name})" @@ -109,6 +118,14 @@ class RegisterObjectRelatedMixin(WeekRelatedMixin): else: return self.extra_lesson + @property + def register_object_key(self: Union["LessonDocumentation", "PersonalNote"]) -> str: + """Get a unique reference to the related object related.""" + if self.week and self.year: + return f"{self.register_object.pk}_{self.week}_{self.year}" + else: + return self.register_object.pk + @property def calendar_week(self: Union["LessonDocumentation", "PersonalNote"]) -> CalendarWeek: """Get the calendar week of this lesson documentation or personal note. @@ -328,15 +345,13 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel): homework = models.CharField(verbose_name=_("Homework"), max_length=200, blank=True) group_note = models.CharField(verbose_name=_("Group note"), max_length=200, blank=True) - def _carry_over_data(self): - """Carry over data to directly adjacent periods in this lesson if data is not already set. + def carry_over_data(self, all_periods_of_lesson: LessonPeriod): + """Carry over data to given periods in this lesson if data is not already set. - Can be deactivated using site preference ``alsijil__carry_over``. + Both forms of carrying over data can be deactivated using site preferences + ``alsijil__carry_over_next_periods`` and ``alsijil__allow_carry_over_same_week`` + respectively. """ - all_periods_of_lesson = LessonPeriod.objects.filter( - lesson=self.lesson_period.lesson, - period__weekday=self.lesson_period.period.weekday, - ) for period in all_periods_of_lesson: lesson_documentation = period.get_or_create_lesson_documentation( CalendarWeek(week=self.week, year=self.year) @@ -357,19 +372,24 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel): changed = True if changed: - lesson_documentation.save(carry_over=False) + lesson_documentation.save(carry_over_next_periods=False) def __str__(self) -> str: return f"{self.lesson_period}, {self.date_formatted}" - def save(self, carry_over=True, *args, **kwargs): + def save(self, carry_over_next_periods=True, *args, **kwargs): if ( - get_site_preferences()["alsijil__carry_over"] + get_site_preferences()["alsijil__carry_over_next_periods"] and (self.topic or self.homework or self.group_note) and self.lesson_period - and carry_over + and carry_over_next_periods ): - self._carry_over_data() + self.carry_over_data( + LessonPeriod.objects.filter( + lesson=self.lesson_period.lesson, + period__weekday=self.lesson_period.period.weekday, + ) + ) super().save(*args, **kwargs) class Meta: diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py index 5e1a2913121adb271df2d2c9dc84846eeb9c60bb..2fd34fa7fc4f802a52ead1d2d0291789be4fb9ce 100644 --- a/aleksis/apps/alsijil/preferences.py +++ b/aleksis/apps/alsijil/preferences.py @@ -57,7 +57,7 @@ class EditLessonDocumentationAsOriginalTeacher(BooleanPreference): @site_preferences_registry.register class CarryOverDataToNextPeriods(BooleanPreference): section = alsijil - name = "carry_over" + name = "carry_over_next_periods" default = True verbose_name = _( "Carry over data from first lesson period to the " @@ -66,6 +66,20 @@ class CarryOverDataToNextPeriods(BooleanPreference): help_text = _("This will carry over data only if the data in the following periods are empty.") +@site_preferences_registry.register +class AllowCarryOverLessonDocumentationToCurrentWeek(BooleanPreference): + section = alsijil + name = "allow_carry_over_same_week" + default = False + verbose_name = _( + "Allow carrying over data from any lesson period to all other lesson \ + periods with the same lesson and in the same week" + ) + help_text = _( + "This will carry over data only if the data in the aforementioned periods are empty." + ) + + @site_preferences_registry.register class CarryOverPersonalNotesToNextPeriods(BooleanPreference): section = alsijil diff --git a/aleksis/apps/alsijil/tables.py b/aleksis/apps/alsijil/tables.py index 19abbc3a5d7d80ab5729086fff72dc7e8c60e59e..c82385265b37d6b37f365048b2ad8c4b6ae52cf1 100644 --- a/aleksis/apps/alsijil/tables.py +++ b/aleksis/apps/alsijil/tables.py @@ -37,6 +37,10 @@ class ExcuseTypeTable(tables.Table): name = tables.LinkColumn("edit_excuse_type", args=[A("id")]) short_name = tables.Column() + count_as_absent = tables.BooleanColumn( + verbose_name=_("Count as absent"), + accessor="count_as_absent", + ) edit = tables.LinkColumn( "edit_excuse_type", args=[A("id")], diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html index 08af12a757d7377747075f5952cc380e5f300595..6de367aee293d9a4c74708ebc2bdaabff775ed88 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html @@ -7,6 +7,10 @@ {% block extra_head %} {{ block.super }} <link rel="stylesheet" href="{% static 'css/alsijil/lesson.css' %}"/> + + {% if with_seating_plan %} + <link rel="stylesheet" href="{% static "css/stoelindeling/seating_plan.css" %}"> + {% endif %} {% endblock %} {% block nav_content %} @@ -25,6 +29,14 @@ </a> </li> {% endif %} + {% if with_seating_plan %} + <li class="tab"> + <a href="#seating-plan"> + <i class="material-icons">event_seat</i> + {% trans "Seating plan" %} + </a> + </li> + {% endif %} {% if prev_lesson %} {% 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 %} @@ -125,6 +137,12 @@ </div> {% endif %} + {% if with_seating_plan %} + <div class="col s12 no-padding" id="seating-plan"> + {% include "alsijil/partials/lesson/tabs/seating_plan.html" %} + </div> + {% endif %} + <div class="col s12 no-padding" id="more"> {% include "alsijil/partials/lesson/tabs/more.html" %} </div> diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html index 304aae60e48a0a4292848e3a10ca93f0fb42c370..d11b192fbecb27004b1cb850e0e3070239975187 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html @@ -125,30 +125,44 @@ <div class="collapsible-body"> <table> <tr> - <th colspan="2">{% trans 'Absences' %}</th> + <th colspan="3">{% trans 'Absences' %}</th> <td>{{ stat.absences_count }}</td> </tr> <tr> - <td rowspan="{{ excuse_types.count|add:2 }}" class="hide-on-small-only">{% trans "thereof" %}</td> - <td rowspan="{{ excuse_types.count|add:2 }}" class="hide-on-med-and-up"></td> - <th class="truncate">{% trans 'Excused' %}</th> + <td rowspan="{{ excuse_types.count|add:3 }}" class="hide-on-small-only">{% trans "thereof" %}</td> + <td rowspan="{{ excuse_types.count|add:3 }}" class="hide-on-med-and-up"></td> + <th colspan="2">{% trans 'Excused' %}</th> <td>{{ stat.excused }}</td> </tr> + <tr> + <td rowspan="{{ excuse_types.count|add:1 }}" class="hide-on-small-only">{% trans "thereof" %}</td> + <td rowspan="{{ excuse_types.count|add:1 }}" class="hide-on-med-and-up"></td> + <th colspan="2" class="truncate">{% trans 'Without Excuse Type' %}</th> + <td>{{ stat.excused_no_excuse_type }}</td> + </tr> {% for excuse_type in excuse_types %} - <th>{{ excuse_type.name }}</th> - <td>{{ stat|get_dict:excuse_type.count_label }}</td> + <tr> + <th>{{ excuse_type.name }}</th> + <td>{{ stat|get_dict:excuse_type.count_label }}</td> + </tr> {% endfor %} <tr> - <th>{% trans 'Unexcused' %}</th> + <th colspan="2">{% trans 'Unexcused' %}</th> <td>{{ stat.unexcused }}</td> </tr> + {% for excuse_type in excuse_types_not_absent %} + <tr> + <th colspan="3">{{ excuse_type.name }}</th> + <td>{{ stat|get_dict:excuse_type.count_label }}</td> + </tr> + {% endfor %} <tr> - <th colspan="2">{% trans 'Tardiness' %}</th> + <th colspan="3">{% trans 'Tardiness' %}</th> <td>{{ stat.tardiness }}'/{{ stat.tardiness_count }} ×</td> </tr> {% for extra_mark in extra_marks %} <tr> - <th colspan="2">{{ extra_mark.name }}</th> + <th colspan="3">{{ extra_mark.name }}</th> <td>{{ stat|get_dict:extra_mark.count_label }}</td> </tr> {% endfor %} diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html index a79e1273620035abb6532176231501231a0af0ea..4742b43208a86a35e4fcd51ea7e3ef07ddc4dee2 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html @@ -41,9 +41,9 @@ {% endblock %} {% block content %} - <script type="text/javascript" src="{% static " js/helper.js" %}"></script> + <script type="text/javascript" src="{% static "js/helper.js" %}"></script> {{ week_select|json_script:"week_select" }} - <script type="text/javascript" src="{% static " js/chronos/week_select.js" %}"></script> + <script type="text/javascript" src="{% static "js/chronos/week_select.js" %}"></script> <div class="row"> <div id="toggle-row" class="col s12 m8 l10 {% if lesson_periods %}pre-hidden{% endif %}"> <form method="post" action=""> diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/legend.html b/aleksis/apps/alsijil/templates/alsijil/partials/legend.html index a2c6ba1aaee02c492155c08b902f1562b405b3a7..bf0c82d792b57943b36502f0b94dff3db193a70d 100644 --- a/aleksis/apps/alsijil/templates/alsijil/partials/legend.html +++ b/aleksis/apps/alsijil/templates/alsijil/partials/legend.html @@ -7,17 +7,21 @@ <h6>{% trans "General" %}</h6> <ul class="collection"> <li class="collection-item chip-height"> - <strong>(a)</strong> {% trans "Absences" %} + <strong>{% trans "(a)" %}</strong> {% trans "Absences" %} <span class="chip secondary-color white-text right">0</span> </li> <li class="collection-item chip-height"> - <strong>(u)</strong> {% trans "Unexcused absences" %} + <strong>{% trans "(u)" %}</strong> {% trans "Unexcused absences" %} <span class="chip red white-text right">0</span> </li> <li class="collection-item chip-height"> - <strong>(e)</strong> {% trans "Excused absences" %} + <strong>{% trans "Sum (e)" %}</strong> {% trans "Sum of excused absences" %} <span class="chip green white-text right">0</span> </li> + <li class="collection-item chip-height"> + <strong>{% trans "(e)" %}</strong> {% trans "Regular excused absences" %} + <span class="chip grey white-text right">0</span> + </li> </ul> </div> @@ -33,6 +37,18 @@ </li> {% endfor %} </ul> + {% if excuse_types_not_absent %} + <h6>{% trans "Excuse types (not counted as absent)" %}</h6> + + <ul class="collection"> + {% for excuse_type in excuse_types_not_absent %} + <li class="collection-item chip-height"> + <strong>({{ excuse_type.short_name }})</strong> {{ excuse_type.name }} + <span class="chip grey white-text right">0</span> + </li> + {% endfor %} + </ul> + {% endif %} </div> {% endif %} diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html new file mode 100644 index 0000000000000000000000000000000000000000..1dcfbed7d043b1f068e8e8f7f2f74e9028aa8de7 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html @@ -0,0 +1,89 @@ +{% load i18n material_form_internal material_form time_helpers rules %} + + +{% if seating_plan %} + <div class="card no-mobile-card"> + <div class="card-content"> + <div class="card-title margin-bottom"> + {% blocktrans with group=seating_plan.group room=seating_plan.room %}Seating plan for {{ group }} in + {{ room }}{% endblocktrans %} + </div> + {% if seating_plan_parent %} + <figure class="alert primary"> + <i class="material-icons left">info</i> + {% blocktrans with child_group=first_group %} + This seating plan is taken from the parent group of {{ child_group }}. + If you want, you can take it over for your group and then customize it. + {% endblocktrans %} + </figure> + {% endif %} + + <div class="row margin-bottom no-padding"> + <div class="col s12 no-padding"> + {% has_perm "stoelindeling.edit_seatingplan_rule" user seating_plan as can_edit %} + {% has_perm "stoelindeling.copy_seatingplan_for_group_rule" user first_group as can_copy %} + + {% if can_edit %} + <a class="btn orange waves-effect waves-light" + href="{% url "edit_seating_plan" seating_plan.pk %}?next={{ back_url }}#seating-plan"> + <i class="material-icons left">edit</i> + {% trans "Edit seating plan" %} + </a> + {% endif %} + {% if can_copy and seating_plan_parent %} + <a class="btn orange waves-effect waves-light" + href="{% url "copy_seating_plan" seating_plan.pk %}?next={{ back_url }}#seating-plan"> + <i class="material-icons left">content_copy</i> + {% trans "Copy plan and edit" %} + </a> + {% endif %} + </div> + </div> + + <div class="row"> + <div class="col s12"> + {% include "stoelindeling/seating_plan/render.html" %} + </div> + </div> + </div> + </div> +{% else %} + <div class="container"> + <div class="card"> + <div class="card-content"> + <div class="card-title"> + <i class="material-icons left small orange-text">warning</i> + {% trans "There is no seating plan for this lesson." %} + </div> + {% has_perm "stoelindeling.add_seatingplan_rule" user first_group as can_add %} + {% if can_add %} + <div class="row margin-bottom"> + <div class="col s12"> + <a class="btn waves-effect waves-light" href="{% url "create_seating_plan" %}?group={{ first_group.pk }}&subject={{ register_object.get_subject.pk }}&room={{ register_object.get_room.pk }}&next={{ back_url }}#seating-plan"> + <i class="material-icons left">add</i> + {% blocktrans with group=first_group.name subject=register_object.get_subject.name room=register_object.get_room.name %} + Create a new seating plan for {{ group }} ({{ subject }}) in {{ room }} + {% endblocktrans %} + </a> + </div> + </div> + {% endif %} + {% for parent_group in first_group.parent_groups.all %} + {% has_perm "stoelindeling.add_seatingplan_rule" user parent_group as can_add %} + {% if can_add %} + <div class="row"> + <div class="col s12"> + <a class="btn waves-effect waves-light" href="{% url "create_seating_plan" %}?group={{ parent_group.pk }}&subject={{ register_object.get_subject.pk }}&room={{ register_object.get_room.pk }}&next={{ back_url }}#seating-plan"> + <i class="material-icons left">add</i> + {% blocktrans with group=parent_group.name room=register_object.get_room.name %} + Create a new seating plan for {{ group }} in {{ room }} + {% endblocktrans %} + </a> + </div> + </div> + {% endif %} + {% endfor %} + </div> + </div> + </div> +{% endif %} diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html b/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html index 404705dfbc3fe7cb4d6cfde5561ed2f3fb82de13..efa5bc3a89d72c75fbf5f3d1c9de5426c668270f 100644 --- a/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html +++ b/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html @@ -11,7 +11,8 @@ <tr class="hide-on-med-and-down"> <th rowspan="2">{% trans "Name" %}</th> <th rowspan="2">{% trans "Primary group" %}</th> - <th colspan="{{ excuse_types.count|add:3 }}">{% trans "Absences" %}</th> + <th colspan="{{ excuse_types.count|add:4 }}">{% trans "Absences" %}</th> + <th colspan="{{ excuse_types_not_absent.count }}">{% trans "Uncounted Absences" %}</th> <th rowspan="2">{% trans "Tardiness" %}</th> {% if extra_marks %} <th colspan="{{ extra_marks.count }}">{% trans "Extra marks" %}</th> @@ -22,6 +23,7 @@ <th class="truncate">{% trans "Name" %}</th> <th class="truncate">{% trans "Primary group" %}</th> <th class="truncate chip-height">{% trans "Absences" %}</th> + <th class="chip-height">{% trans "Sum (e)" %}</th> <th class="chip-height">{% trans "(e)" %}</th> {% for excuse_type in excuse_types %} <th class="chip-height"> @@ -29,6 +31,11 @@ </th> {% endfor %} <th class="chip-height">{% trans "(u)" %}</th> + {% for excuse_type in excuse_types_not_absent %} + <th class="chip-height"> + ({{ excuse_type.short_name }}) + </th> + {% endfor %} <th class="truncate chip-height">{% trans "Tardiness" %}</th> {% for extra_mark in extra_marks %} <th class="chip-height"> @@ -39,6 +46,7 @@ </tr> <tr class="hide-on-med-and-down"> <th>{% trans "Sum" %}</th> + <th>{% trans "Sum (e)" %}</th> <th>{% trans "(e)" %}</th> {% for excuse_type in excuse_types %} <th> @@ -46,6 +54,11 @@ </th> {% endfor %} <th>{% trans "(u)" %}</th> + {% for excuse_type in excuse_types_not_absent %} + <th> + ({{ excuse_type.short_name }}) + </th> + {% endfor %} {% for extra_mark in extra_marks %} <th> {{ extra_mark.short_name }} @@ -73,6 +86,11 @@ {{ person.excused }} </span> </td> + <td> + <span class="chip grey white-text" title="{% trans "Regular excused" %}"> + {{ person.excused_without_excuse_type }} + </span> + </td> {% for excuse_type in excuse_types %} <td> <span class="chip grey white-text" title="{{ excuse_type.name }}"> @@ -85,6 +103,13 @@ {{ person.unexcused }} </span> </td> + {% for excuse_type in excuse_types_not_absent %} + <td> + <span class="chip grey white-text" title="{{ excuse_type.name }}"> + {{ person|get_dict:excuse_type.count_label }} + </span> + </td> + {% endfor %} <td> <span class="chip orange white-text" title="{% trans "Tardiness" %}"> {% firstof person.tardiness|to_time|time:"H\h i\m" "–" %} diff --git a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html index 1f8b6132fa0dee3033c7ea466e872e2ffd61fa64..a8f7dd5c3d428c3e3d3e45324865cbd9fccab7f1 100644 --- a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html +++ b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html @@ -97,6 +97,18 @@ </ul> {% endif %} + {% if excuse_types_not_absent %} + <h5>{% trans "Custom excuse types (not counted as absent)" %}</h5> + + <ul class="collection"> + {% for excuse_type in excuse_types_not_absent %} + <li class="collection-item"> + <strong>({{ excuse_type.short_name }})</strong> {{ excuse_type.name }} + </li> + {% endfor %} + </ul> + {% endif %} + {% if extra_marks %} <h5>{% trans "Available extra marks" %}</h5> @@ -123,11 +135,15 @@ <th>{% trans 'Sex' %}</th> <th>{% trans 'Date of birth' %}</th> <th>{% trans '(a)' %}</th> + <th>{% trans "Sum (e)" %}</th> <th>{% trans "(e)" %}</th> {% for excuse_type in excuse_types %} <th>({{ excuse_type.short_name }})</th> {% endfor %} <th>{% trans '(u)' %}</th> + {% for excuse_type in excuse_types_not_absent %} + <th>({{ excuse_type.short_name }})</th> + {% endfor %} <th>{% trans '(b)' %}</th> {% for extra_mark in extra_marks %} <th>{{ extra_mark.short_name }}</th> @@ -145,11 +161,15 @@ <td>{{ person.date_of_birth }}</td> <td>{{ person.absences_count }}</td> <td>{{ person.excused }}</td> + <td>{{ person.excused_without_excuse_type }}</td> {% for excuse_type in excuse_types %} <td>{{ person|get_dict:excuse_type.count_label }}</td> {% endfor %} <td>{{ person.unexcused }}</td> - <td>{{ person.tardiness }}'/{{ person.tardiness_count }} ×</td> + {% for excuse_type in excuse_types_not_absent %} + <td>{{ person|get_dict:excuse_type.count_label }}</td> + {% endfor %} + <td>{{ person.tardiness }}'/{{ person.tardiness_count }}×</td> {% for extra_mark in extra_marks %} <td>{{ person|get_dict:extra_mark.count_label }}</td> {% endfor %} @@ -160,7 +180,7 @@ <div class="page-break"> </div> - {% if group.lessons.all %} + {% if lessons %} <h4>{% trans 'Teachers and lessons in group' %} {{ group.name }}</h4> <table id="lessons"> @@ -190,7 +210,7 @@ {% endif %} - {% if group.child_groups.all %} + {% if child_groups %} <h4>{% trans 'Teachers and lessons in child groups' %}</h4> <table id="lessons"> @@ -263,43 +283,63 @@ </tr> </table> - <h5>{% trans 'Absences and tardiness' %}</h5> - <table> - <tr> - <th colspan="2">{% trans 'Absences' %}</th> - <td>{{ person.absences_count }}</td> - </tr> - <tr> - <td rowspan="{{ excuse_types.count|add:2 }}" style="width: 16mm;" - class="rotate small-print">{% trans "thereof" %}</td> - <th>{% trans 'Excused' %}</th> - <td>{{ person.excused }}</td> - </tr> - {% for excuse_type in excuse_types %} - <th>{{ excuse_type.name }}</th> - <td>{{ person|get_dict:excuse_type.count_label }}</td> - {% endfor %} - <tr> - <th>{% trans 'Unexcused' %}</th> - <td>{{ person.unexcused }}</td> - </tr> - <tr> - <th colspan="2">{% trans 'Tardiness' %}</th> - <td>{{ person.tardiness }}'/{{ person.tardiness_count }} ×</td> - </tr> - </table> - - {% if extra_marks %} - <h5>{% trans 'Extra marks' %}</h5> - <table> - {% for extra_mark in extra_marks %} + <div class="row"> + <div class="col s6"> + <h5>{% trans 'Absences and tardiness' %}</h5> + <table> <tr> - <th>{{ extra_mark.name }}</th> - <td>{{ person|get_dict:extra_mark.count_label }}</td> + <th colspan="3">{% trans 'Absences' %}</th> + <td>{{ person.absences_count }}</td> </tr> - {% endfor %} - </table> - {% endif %} + <tr> + <td rowspan="{{ excuse_types.count|add:3 }}" style="width: 16mm;" + class="rotate small-print">{% trans "thereof" %}</td> + <th colspan="2">{% trans 'Excused' %}</th> + <td>{{ person.excused }}</td> + </tr> + <tr> + <td rowspan="{{ excuse_types.count|add:1 }}" style="width: 16mm;" + class="rotate small-print">{% trans "thereof" %}</td> + <th>{% trans "Without excuse type" %}</th> + <td>{{ person.excused_without_excuse_type }}</td> + </tr> + {% for excuse_type in excuse_types %} + <tr> + <th>{{ excuse_type.name }}</th> + <td>{{ person|get_dict:excuse_type.count_label }}</td> + </tr> + {% endfor %} + <tr> + <th colspan="2">{% trans 'Unexcused' %}</th> + <td>{{ person.unexcused }}</td> + </tr> + {% for excuse_type in excuse_types_not_absent %} + <tr> + <th colspan="3">{{ excuse_type.name }}</th> + <td>{{ person|get_dict:excuse_type.count_label }}</td> + </tr> + {% endfor %} + <tr> + <th colspan="3">{% trans 'Tardiness' %}</th> + <td>{{ person.tardiness }}'/{{ person.tardiness_count }}×</td> + </tr> + </table> + </div> + + <div class="col s6"> + {% if extra_marks %} + <h5>{% trans 'Extra marks' %}</h5> + <table> + {% for extra_mark in extra_marks %} + <tr> + <th>{{ extra_mark.name }}</th> + <td>{{ person|get_dict:extra_mark.count_label }}</td> + </tr> + {% endfor %} + </table> + {% endif %} + </div> + </div> <h5>{% trans 'Relevant personal notes' %}</h5> <table class="small-print"> @@ -387,7 +427,7 @@ <tbody> {% for day in week %} {% with register_objects_by_day|get_dict:day as register_objects %} - {% for register_object, documentations, notes, substitution in register_objects %} + {% for register_object, documentation, notes, substitution in register_objects %} <tr class=" {% if substitution %} {% if substitution.cancelled %} @@ -421,47 +461,45 @@ </td> <td class="lesson-topic"> {% if register_object.label_ == "event" %} - {{ register_object.title }}: {{ documentations.0.topic }} + {{ register_object.title }}: {{ documentation.topic }} {% elif substitution.cancelled %} {% trans 'Lesson cancelled' %} {% else %} - {{ documentations.0.topic }} + {{ documentation.topic }} {% endif %} </td> - <td class="lesson-homework">{{ documentations.0.homework }}</td> + <td class="lesson-homework">{{ documentation.homework }}</td> <td class="lesson-notes"> - {{ documentations.0.group_note }} + {{ documentation.group_note }} {% for note in notes %} - {% if group in note.groups_of_person.all %} - {% if note.absent %} - <span class="lesson-note-absent"> - {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}. - {% if note.excused %} - <span class="lesson-note-excused"> - {% if note.excuse_type %} - ({{ note.excuse_type.short_name }}) - {% else %} - ({% trans 'e' %}) - {% endif %} - </span> - {% endif %} - </span> - {% endif %} - {% if note.late %} - <span class="lesson-note-late"> - {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}. - ({{ note.late }}′) - {% if note.excused %} - <span class="lesson-note-excused"> - {% if note.excuse_type %} - ({{ note.excuse_type.short_name }}) - {% else %} - ({% trans 'e' %}) - {% endif %} - </span> - {% endif %} - </span> - {% endif %} + {% if note.absent %} + <span class="lesson-note-absent"> + {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}. + {% if note.excused %} + <span class="lesson-note-excused"> + {% if note.excuse_type %} + ({{ note.excuse_type.short_name }}) + {% else %} + ({% trans 'e' %}) + {% endif %} + </span> + {% endif %} + </span> + {% endif %} + {% if note.late %} + <span class="lesson-note-late"> + {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}. + ({{ note.late }}′) + {% if note.excused %} + <span class="lesson-note-excused"> + {% if note.excuse_type %} + ({{ note.excuse_type.short_name }}) + {% else %} + ({% trans 'e' %}) + {% endif %} + </span> + {% endif %} + </span> {% endif %} {% for extra_mark in note.extra_marks.all %} <span> @@ -472,7 +510,7 @@ {% endfor %} </td> <td class="lesson-te"> - {% if documentations.0.topic %} + {% if documentation.topic %} {{ register_object.get_teachers.first.short_name }} {% endif %} </td> diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index de3866e0b4ecb62cffd2fc0223c1383f70772c30..c1ef90f6998d6426239141aa0dc7e40495303836 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -3,6 +3,7 @@ from copy import deepcopy from datetime import date, datetime, timedelta from typing import Any, Dict, Optional +from django.apps import apps from django.core.exceptions import PermissionDenied from django.db.models import Count, Exists, FilteredRelation, OuterRef, Prefetch, Q, Sum from django.db.models.expressions import Case, When @@ -185,6 +186,11 @@ def register_object( ) if not blocked_because_holidays: + groups = register_object.get_groups().all() + if groups: + first_group = groups.first() + context["first_group"] = first_group + # Group roles show_group_roles = request.user.person.preferences[ "alsijil__group_roles_in_lesson_view" @@ -192,10 +198,22 @@ def register_object( "alsijil.view_assigned_grouproles_for_register_object_rule", register_object ) if show_group_roles: - groups = register_object.get_groups().all() group_roles = GroupRole.objects.with_assignments(date_of_lesson, groups) context["group_roles"] = group_roles + with_seating_plan = ( + apps.is_installed("aleksis.apps.stoelindeling") + and groups + and request.user.has_perm("stoelindeling.view_seatingplan_for_group_rule", first_group) + ) + context["with_seating_plan"] = with_seating_plan + + if with_seating_plan: + seating_plan = register_object.seating_plan + context["seating_plan"] = register_object.seating_plan + if seating_plan and seating_plan.group != first_group: + context["seating_plan_parent"] = True + # Create or get lesson documentation object; can be empty when first opening lesson lesson_documentation = register_object.get_or_create_lesson_documentation(wanted_week) context["has_documentation"] = bool(lesson_documentation.topic) @@ -631,16 +649,27 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: | Q(event__groups__parent_groups=group) ) personal_notes = ( - PersonalNote.objects.select_related("lesson_period") - .prefetch_related( - "lesson_period__substitutions", "lesson_period__lesson__teachers", "groups_of_person" + PersonalNote.objects.prefetch_related( + "lesson_period__substitutions", "lesson_period__lesson__teachers" ) .not_empty() .filter(groups_q) + .filter(groups_of_person=group) ) - documentations = ( - LessonDocumentation.objects.select_related("lesson_period").not_empty().filter(groups_q) - ) + documentations = LessonDocumentation.objects.not_empty().filter(groups_q) + + 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) # Get all lesson periods for the selected group lesson_periods = LessonPeriod.objects.filter_group(group).distinct() @@ -654,8 +683,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: register_objects_by_day.setdefault(day, []).append( ( extra_lesson, - list(filter(lambda d: d.extra_lesson == extra_lesson, documentations)), - list(filter(lambda d: d.extra_lesson == extra_lesson, personal_notes)), + sorted_documentations["extra_lesson"].get(extra_lesson.pk), + sorted_personal_notes["extra_lesson"].get(extra_lesson.pk, []), None, ) ) @@ -669,8 +698,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: register_objects_by_day.setdefault(day, []).append( ( event_copy, - list(filter(lambda d: d.event == event, documentations)), - list(filter(lambda d: d.event == event, personal_notes)), + sorted_documentations["event"].get(event.pk), + sorted_personal_notes["event"].get(event.pk, []), None, ) ) @@ -689,26 +718,17 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: <= day <= lesson_period.lesson.validity.date_end ): - filtered_documentations = list( - filter( - lambda d: d.week == week.week - and d.year == week.year - and d.lesson_period == lesson_period, - documentations, - ) + filtered_documentation = sorted_documentations["lesson_period"].get( + f"{lesson_period.pk}_{week.week}_{week.year}" ) - filtered_personal_notes = list( - filter( - lambda d: d.week == week.week - and d.year == week.year - and d.lesson_period == lesson_period, - personal_notes, - ) + 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_documentations, filtered_personal_notes, substitution) + (lesson_period, filtered_documentation, filtered_personal_notes, substitution) ) persons = group.members.prefetch_related(None).select_related(None) @@ -716,12 +736,13 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: prefetched_persons = [] for person in persons: - person.filtered_notes = list(filter(lambda d: d.person == person, personal_notes)) + person.filtered_notes = sorted_personal_notes["person"][person.pk] prefetched_persons.append(person) context["school_term"] = group.school_term context["persons"] = prefetched_persons - context["excuse_types"] = ExcuseType.objects.all() + 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 @@ -730,15 +751,22 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: 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().prefetch_related( - "lessons", - "lessons__validity", - "lessons__subject", - "lessons__teachers", - "lessons__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", + ) ) return render_pdf(request, "alsijil/print/full_register.html", context) @@ -777,7 +805,8 @@ def my_students(request: HttpRequest) -> HttpResponse: new_groups.append((group, persons_for_group)) context["groups"] = new_groups - context["excuse_types"] = ExcuseType.objects.all() + 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() return render(request, "alsijil/class_register/persons.html", context) @@ -807,7 +836,8 @@ class StudentsList(PermissionRequiredMixin, DetailView): member_of__in=self.request.user.person.owner_of.all() ) context["extra_marks"] = ExtraMark.objects.all() - context["excuse_types"] = ExcuseType.objects.all() + context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True) + context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False) return context @@ -924,7 +954,8 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp note.set_object_permission_checker(checker) personal_notes_list.append(note) context["personal_notes"] = personal_notes_list - context["excuse_types"] = ExcuseType.objects.all() + context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True) + context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False) form = PersonOverviewForm(request, request.POST or None, queryset=allowed_personal_notes) if request.method == "POST" and request.user.has_perm( @@ -958,12 +989,19 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp continue stat.update( - personal_notes.filter(absent=True).aggregate(absences_count=Count("absent")) + personal_notes.filter(absent=True) + .exclude(excuse_type__count_as_absent=False) + .aggregate(absences_count=Count("absent")) + ) + stat.update( + personal_notes.filter(absent=True, excused=True) + .exclude(excuse_type__count_as_absent=False) + .aggregate(excused=Count("absent")) ) stat.update( - personal_notes.filter( - absent=True, excused=True, excuse_type__isnull=True - ).aggregate(excused=Count("absent")) + personal_notes.filter(absent=True, excused=True, excuse_type__isnull=True) + .exclude(excuse_type__count_as_absent=False) + .aggregate(excused_no_excuse_type=Count("absent")) ) stat.update( personal_notes.filter(absent=True, excused=False).aggregate( @@ -990,7 +1028,6 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp stats.append((school_term, stat)) context["stats"] = stats - context["excuse_types"] = excuse_types context["extra_marks"] = extra_marks # Build filter with own form and logic as django-filter can't work with different models diff --git a/docs/_static/my_students.png b/docs/_static/my_students.png index 895b8198e3e7144e683fd70ba4656bbd950b4e47..7473831c7f8d577f0576a022e7ce14de442b9c4a 100644 Binary files a/docs/_static/my_students.png and b/docs/_static/my_students.png differ diff --git a/docs/admin/30_configure.rst b/docs/admin/30_configure.rst index 22b8401d6c27c569d7381b17bf9772cb78ced504..e208afe91c18526b59f2505ef611090c430eff6f 100644 --- a/docs/admin/30_configure.rst +++ b/docs/admin/30_configure.rst @@ -46,4 +46,7 @@ like class representatives or ventilation services can be defined here. .. image:: ../_static/edit_group_role.png :width: 100% - :alt: Form for managing a group role \ No newline at end of file + :alt: Form for managing a group role + +Group roles can be managed via menu entry "Manage group roles" located in +the submenu "Class register". diff --git a/docs/user/20_overview.rst b/docs/user/20_overview.rst index fc550253a042c6f3fd43e64e73439b97e7e9c61e..6a44ca2372c6a19b4acd19ab1bccddcc82b7af62 100644 --- a/docs/user/20_overview.rst +++ b/docs/user/20_overview.rst @@ -24,7 +24,7 @@ Personal overview for students ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This menu item provides the student with an overview of the personal notes -such as tardiness, absences and remarks that teachers hav entered in the class register. +such as tardiness, absences and remarks that teachers have entered in the class register. This enables them to quickly check whether excuses still need to be submitted, and to verify what notes have been made about them. @@ -70,6 +70,12 @@ From each entry, you can switch to a detailed view to add specific data. :width: 100% :alt: List with all students of a teacher +You are also able to create custom excuse types via the menu entry "Excuse +types". These custom types are also shown in the statistical overview. The +custom excuse types are also shown in the legend under the students overview +table. + + All lessons ----------- diff --git a/tox.ini b/tox.ini index 6ba5d926ea520a574125f4a9717b93ba0020a2c3..749e0606f4f02fcbd1649627219b15850cbc0a90 100644 --- a/tox.ini +++ b/tox.ini @@ -49,8 +49,8 @@ commands = [testenv:makemessages] commands = - poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la - poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la + poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru + poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru [flake8] max_line_length = 100