diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 167a73dbc378e01b1189db08508a4d1828fc6ca2..7b74944b11716f608edf15958f90f7c5aec4c7ca 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -6,9 +6,10 @@ from django.db.models import Count from django.utils.translation import gettext_lazy as _ from django_select2.forms import Select2Widget -from material import Layout, Row +from material import Fieldset, Layout, Row from aleksis.apps.chronos.managers import TimetableType +from aleksis.apps.chronos.models import TimePeriod from aleksis.core.models import Group, Person from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote @@ -92,22 +93,36 @@ PersonalNoteFormSet = forms.modelformset_factory( class RegisterAbsenceForm(forms.Form): layout = Layout( - Row("date_start", "date_end"), - Row("from_period"), - Row("absent", "excused"), - Row("person"), - Row("remarks"), + Fieldset("", "person"), + Fieldset("", Row("date_start", "date_end"), Row("from_period", "to_period")), + Fieldset("", Row("absent", "excused"), Row("excuse_type"), Row("remarks")), ) date_start = forms.DateField(label=_("Start date"), initial=datetime.today) date_end = forms.DateField(label=_("End date"), initial=datetime.today) - from_period = forms.IntegerField(label=_("From period"), initial=0, min_value=0) + from_period = forms.ChoiceField(label=_("Start period")) + to_period = forms.ChoiceField(label=_("End period")) person = forms.ModelChoiceField( label=_("Person"), queryset=Person.objects.all(), widget=Select2Widget ) absent = forms.BooleanField(label=_("Absent"), initial=True, required=False) excused = forms.BooleanField(label=_("Excused"), initial=True, required=False) + excuse_type = forms.ModelChoiceField( + label=_("Excuse type"), + queryset=ExcuseType.objects.all(), + widget=Select2Widget, + required=False, + ) remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + period_choices = TimePeriod.period_choices + + self.fields["from_period"].choices = period_choices + self.fields["to_period"].choices = period_choices + self.fields["from_period"].initial = TimePeriod.period_min + self.fields["to_period"].initial = TimePeriod.period_max + class ExtraMarkForm(forms.ModelForm): layout = Layout("short_name", "name") diff --git a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po index 47031832edd1744334295f9182a01b121c9153c3..d13da9c3e540c135d89bd5bf63dc8b93148e0b28 100644 --- a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-03 20:03+0200\n" +"POT-Creation-Date: 2020-08-21 12:39+0200\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" @@ -18,33 +18,37 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: forms.py:25 +#: forms.py:26 msgid "Homework for the next lesson" msgstr "" -#: forms.py:50 templates/alsijil/print/full_register.html:199 +#: forms.py:51 templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "" -#: forms.py:56 templates/alsijil/print/full_register.html:170 +#: forms.py:57 templates/alsijil/print/full_register.html:170 #: templates/alsijil/print/full_register.html:201 msgid "Teacher" msgstr "" -#: forms.py:73 +#: forms.py:74 msgid "You can't select a group and a teacher both." msgstr "" -#: forms.py:101 +#: forms.py:100 msgid "Start date" msgstr "" -#: forms.py:102 +#: forms.py:101 msgid "End date" msgstr "" +#: forms.py:102 +msgid "Start period" +msgstr "" + #: forms.py:103 -msgid "From period" +msgid "End period" msgstr "" #: forms.py:105 templates/alsijil/class_register/lesson.html:163 @@ -52,19 +56,30 @@ msgid "Person" msgstr "" #: forms.py:107 templates/alsijil/class_register/lesson.html:164 -#: templates/alsijil/class_register/week_view.html:109 +#: templates/alsijil/class_register/person.html:160 +#: templates/alsijil/class_register/week_view.html:119 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:108 templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/person.html:66 +#: templates/alsijil/class_register/person.html:168 +#: templates/alsijil/partials/mark_as_buttons.html:2 +#: templates/alsijil/partials/mark_as_buttons.html:3 #: templates/alsijil/print/full_register.html:84 #: templates/alsijil/print/full_register.html:275 msgid "Excused" msgstr "" -#: forms.py:109 templates/alsijil/class_register/lesson.html:170 +#: forms.py:110 models.py:37 models.py:68 +#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:202 +msgid "Excuse type" +msgstr "" + +#: forms.py:115 templates/alsijil/class_register/lesson.html:170 #: templates/alsijil/class_register/lesson.html:223 #: templates/alsijil/class_register/lesson.html:231 #: templates/alsijil/print/full_register.html:314 @@ -84,15 +99,25 @@ msgid "Current week" msgstr "" #: menus.py:28 +msgid "My overview" +msgstr "" + +#: menus.py:34 templates/alsijil/class_register/persons.html:7 +#: templates/alsijil/class_register/persons.html:11 +msgid "My students" +msgstr "" + +#: menus.py:40 templates/alsijil/absences/register.html:5 +#: templates/alsijil/absences/register.html:6 msgid "Register absence" msgstr "" -#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8 +#: menus.py:46 models.py:38 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 msgid "Excuse types" msgstr "" -#: menus.py:40 models.py:66 models.py:138 +#: menus.py:52 models.py:74 models.py:190 #: templates/alsijil/class_register/lesson.html:168 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 @@ -100,52 +125,51 @@ msgstr "" msgid "Extra marks" msgstr "" -#: models.py:18 models.py:124 +#: models.py:24 models.py:176 msgid "Short name" msgstr "" -#: models.py:20 models.py:126 +#: models.py:26 models.py:178 msgid "Name" msgstr "" -#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167 -#: templates/alsijil/class_register/lesson.html:202 -msgid "Excuse type" +#: models.py:54 models.py:106 +msgid "Year" msgstr "" -#: models.py:75 +#: models.py:86 msgid "Personal note" msgstr "" -#: models.py:76 templates/alsijil/class_register/lesson.html:64 +#: models.py:87 templates/alsijil/class_register/lesson.html:64 #: templates/alsijil/class_register/lesson.html:156 -#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:112 msgid "Personal notes" msgstr "" -#: models.py:99 templates/alsijil/class_register/week_view.html:56 +#: models.py:112 templates/alsijil/class_register/week_view.html:64 #: templates/alsijil/print/full_register.html:371 msgid "Lesson topic" msgstr "" -#: models.py:100 templates/alsijil/print/full_register.html:372 +#: models.py:113 templates/alsijil/print/full_register.html:372 msgid "Homework" msgstr "" -#: models.py:102 +#: models.py:115 msgid "Group note" msgstr "" -#: models.py:106 templates/alsijil/class_register/lesson.html:60 +#: models.py:158 templates/alsijil/class_register/lesson.html:60 #: templates/alsijil/class_register/lesson.html:143 msgid "Lesson documentation" msgstr "" -#: models.py:107 +#: models.py:159 msgid "Lesson documentations" msgstr "" -#: models.py:137 +#: models.py:189 msgid "Extra mark" msgstr "" @@ -153,6 +177,22 @@ msgstr "" msgid "Block adding personal notes for cancelled lessons" msgstr "" +#: preferences.py:25 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" + +#: preferences.py:28 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "" + +#: preferences.py:38 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" + +#: preferences.py:41 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -161,11 +201,6 @@ msgstr "" msgid "Delete" msgstr "" -#: templates/alsijil/absences/register.html:5 -#: templates/alsijil/absences/register.html:6 -msgid "Manage absence" -msgstr "" - #: templates/alsijil/class_register/lesson.html:6 msgid "Lesson" msgstr "" @@ -214,6 +249,7 @@ msgid "Late persons:" msgstr "" #: templates/alsijil/class_register/lesson.html:165 +#: templates/alsijil/class_register/person.html:78 #: templates/alsijil/print/full_register.html:287 msgid "Tardiness" msgstr "" @@ -222,50 +258,123 @@ msgstr "" msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/person.html:7 +msgid "Class register: person" +msgstr "" + +#: templates/alsijil/class_register/person.html:11 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" + +#: templates/alsijil/class_register/person.html:19 +msgid "Unexcused absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:27 +#: templates/alsijil/class_register/person.html:40 +#: templates/alsijil/class_register/person.html:152 +#: templates/alsijil/class_register/person.html:190 +msgid "Mark as" +msgstr "" + +#: templates/alsijil/class_register/person.html:47 +msgid "There are unexcused lessons." +msgstr "" + +#: templates/alsijil/class_register/person.html:51 +msgid "Statistics on absences, tardiness and remarks" +msgstr "" + +#: templates/alsijil/class_register/person.html:60 +#: templates/alsijil/print/full_register.html:269 +msgid "Absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:64 +#: templates/alsijil/print/full_register.html:274 +msgid "thereof" +msgstr "" + +#: templates/alsijil/class_register/person.html:74 +#: templates/alsijil/print/full_register.html:81 +#: templates/alsijil/print/full_register.html:283 +msgid "Unexcused" +msgstr "" + +#: templates/alsijil/class_register/person.html:94 +#: templates/alsijil/print/full_register.html:304 +msgid "Relevant personal notes" +msgstr "" + +#: templates/alsijil/class_register/person.html:110 +#, python-format +msgid "Week %(week)s" +msgstr "" + +#: templates/alsijil/class_register/person.html:118 +#: templates/alsijil/class_register/person.html:127 +msgid "Mark all as" +msgstr "" + +#: templates/alsijil/class_register/person.html:175 +#, python-format +msgid "%(late)s' late" +msgstr "" + +#: templates/alsijil/class_register/persons.html:22 +msgid "No students available." +msgstr "" + #: templates/alsijil/class_register/week_view.html:6 msgid "Week view" msgstr "" -#: templates/alsijil/class_register/week_view.html:27 +#: templates/alsijil/class_register/week_view.html:30 msgid "Select" msgstr "" -#: templates/alsijil/class_register/week_view.html:33 +#: templates/alsijil/class_register/week_view.html:38 #, python-format -msgid "CW %(week)s: %(instance)s" +msgid "" +"CW %(week)s:\n" +" %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:50 +#: templates/alsijil/class_register/week_view.html:58 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:52 +#: templates/alsijil/class_register/week_view.html:60 msgid "Groups" msgstr "" -#: templates/alsijil/class_register/week_view.html:54 +#: templates/alsijil/class_register/week_view.html:62 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:55 +#: templates/alsijil/class_register/week_view.html:63 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:110 +#: templates/alsijil/class_register/week_view.html:120 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:113 +#: templates/alsijil/class_register/week_view.html:123 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:142 +#: templates/alsijil/class_register/week_view.html:152 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:145 +#: templates/alsijil/class_register/week_view.html:155 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -333,6 +442,13 @@ msgstr "" msgid "Substitution" msgstr "" +#: templates/alsijil/partials/mark_as_buttons.html:4 +#: templates/alsijil/print/full_register.html:335 +#: templates/alsijil/print/full_register.html:424 +#: templates/alsijil/print/full_register.html:439 +msgid "e" +msgstr "" + #: templates/alsijil/print/full_register.html:6 msgid "Class register:" msgstr "" @@ -388,11 +504,6 @@ msgstr "" msgid "Late" msgstr "" -#: templates/alsijil/print/full_register.html:81 -#: templates/alsijil/print/full_register.html:283 -msgid "Unexcused" -msgstr "" - #: templates/alsijil/print/full_register.html:89 msgid "Custom excuse types" msgstr "" @@ -468,18 +579,6 @@ msgstr "" msgid "Absences and tardiness" msgstr "" -#: templates/alsijil/print/full_register.html:269 -msgid "Absences" -msgstr "" - -#: templates/alsijil/print/full_register.html:274 -msgid "thereof" -msgstr "" - -#: templates/alsijil/print/full_register.html:304 -msgid "Relevant personal notes" -msgstr "" - #: templates/alsijil/print/full_register.html:308 msgid "Date" msgstr "" @@ -507,12 +606,6 @@ msgstr "" msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:335 -#: templates/alsijil/print/full_register.html:424 -#: templates/alsijil/print/full_register.html:439 -msgid "e" -msgstr "" - #: templates/alsijil/print/full_register.html:363 msgid "Lesson documentation for week" msgstr "" @@ -525,46 +618,54 @@ msgstr "" msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:94 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:116 +#: views.py:120 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:136 +#: views.py:140 msgid "The personal notes have been saved." msgstr "" -#: views.py:327 +#: views.py:348 msgid "There is no current school term." msgstr "" -#: views.py:463 +#: views.py:513 +msgid "The absences have been marked as excused." +msgstr "" + +#: views.py:528 +msgid "The absence has been marked as excused." +msgstr "" + +#: views.py:633 msgid "The absence has been saved." msgstr "" -#: views.py:488 +#: views.py:658 msgid "The extra mark has been created." msgstr "" -#: views.py:499 +#: views.py:669 msgid "The extra mark has been saved." msgstr "" -#: views.py:509 +#: views.py:679 msgid "The extra mark has been deleted." msgstr "" -#: views.py:529 +#: views.py:699 msgid "The excuse type has been created." msgstr "" -#: views.py:540 +#: views.py:710 msgid "The excuse type has been saved." msgstr "" -#: views.py:550 +#: views.py:720 msgid "The excuse type has been deleted." msgstr "" diff --git a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po index a300bb6d6672106860d862c639afcaf6e254b753..e7d4526046014d7d7055ab8d94f20dc42e81a242 100644 --- a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-03 20:03+0200\n" -"PO-Revision-Date: 2020-08-03 18:41+0000\n" +"POT-Creation-Date: 2020-08-21 12:39+0200\n" +"PO-Revision-Date: 2020-08-21 14:02+0000\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: German <https://translate.edugit.org/projects/aleksis/" "aleksis-app-alsijil/de/>\n" @@ -17,55 +17,70 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.1\n" +"X-Generator: Weblate 4.1.1\n" -#: forms.py:25 +#: forms.py:26 msgid "Homework for the next lesson" msgstr "Hausaufgabe zur nächsten Stunde" -#: forms.py:50 templates/alsijil/print/full_register.html:199 +#: forms.py:51 templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "Gruppe" -#: forms.py:56 templates/alsijil/print/full_register.html:170 +#: forms.py:57 templates/alsijil/print/full_register.html:170 #: templates/alsijil/print/full_register.html:201 msgid "Teacher" msgstr "Lehrkraft" -#: forms.py:73 +#: forms.py:74 msgid "You can't select a group and a teacher both." msgstr "Es kann nur entweder eine Gruppe oder eine Lehrkraft ausgewählt werden." -#: forms.py:101 +#: forms.py:100 msgid "Start date" msgstr "Startdatum" -#: forms.py:102 +#: forms.py:101 msgid "End date" msgstr "Enddatum" +#: forms.py:102 +msgid "Start period" +msgstr "Startstunde" + #: forms.py:103 -msgid "From period" -msgstr "Ab Stunde" +msgid "End period" +msgstr "Endstunde" #: forms.py:105 templates/alsijil/class_register/lesson.html:163 msgid "Person" msgstr "Person" #: forms.py:107 templates/alsijil/class_register/lesson.html:164 -#: templates/alsijil/class_register/week_view.html:109 +#: templates/alsijil/class_register/person.html:160 +#: templates/alsijil/class_register/week_view.html:119 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "Abwesend" #: forms.py:108 templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/person.html:66 +#: templates/alsijil/class_register/person.html:168 +#: templates/alsijil/partials/mark_as_buttons.html:2 +#: templates/alsijil/partials/mark_as_buttons.html:3 #: templates/alsijil/print/full_register.html:84 #: templates/alsijil/print/full_register.html:275 msgid "Excused" msgstr "Entschuldigt" -#: forms.py:109 templates/alsijil/class_register/lesson.html:170 +#: forms.py:110 models.py:37 models.py:68 +#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:202 +msgid "Excuse type" +msgstr "Entschuldigungsart" + +#: forms.py:115 templates/alsijil/class_register/lesson.html:170 #: templates/alsijil/class_register/lesson.html:223 #: templates/alsijil/class_register/lesson.html:231 #: templates/alsijil/print/full_register.html:314 @@ -85,15 +100,25 @@ msgid "Current week" msgstr "Aktuelle Woche" #: menus.py:28 +msgid "My overview" +msgstr "Meine Übersicht" + +#: menus.py:34 templates/alsijil/class_register/persons.html:7 +#: templates/alsijil/class_register/persons.html:11 +msgid "My students" +msgstr "Meine Schüler*innen" + +#: menus.py:40 templates/alsijil/absences/register.html:5 +#: templates/alsijil/absences/register.html:6 msgid "Register absence" msgstr "Abwesenheit eintragen" -#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8 +#: menus.py:46 models.py:38 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 msgid "Excuse types" msgstr "Entschuldigungsarten" -#: menus.py:40 models.py:66 models.py:138 +#: menus.py:52 models.py:74 models.py:190 #: templates/alsijil/class_register/lesson.html:168 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 @@ -101,59 +126,79 @@ msgstr "Entschuldigungsarten" msgid "Extra marks" msgstr "Zusätzliche Markierungen" -#: models.py:18 models.py:124 +#: models.py:24 models.py:176 msgid "Short name" msgstr "Kurzname" -#: models.py:20 models.py:126 +#: models.py:26 models.py:178 msgid "Name" msgstr "Name" -#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167 -#: templates/alsijil/class_register/lesson.html:202 -msgid "Excuse type" -msgstr "Entschuldigungsart" +#: models.py:54 models.py:106 +msgid "Year" +msgstr "Jahr" -#: models.py:75 +#: models.py:86 msgid "Personal note" msgstr "Persönliche Notiz" -#: models.py:76 templates/alsijil/class_register/lesson.html:64 +#: models.py:87 templates/alsijil/class_register/lesson.html:64 #: templates/alsijil/class_register/lesson.html:156 -#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:112 msgid "Personal notes" msgstr "Persönliche Notizen" -#: models.py:99 templates/alsijil/class_register/week_view.html:56 +#: models.py:112 templates/alsijil/class_register/week_view.html:64 #: templates/alsijil/print/full_register.html:371 msgid "Lesson topic" msgstr "Stundenthema" -#: models.py:100 templates/alsijil/print/full_register.html:372 +#: models.py:113 templates/alsijil/print/full_register.html:372 msgid "Homework" msgstr "Hausaufgaben" -#: models.py:102 +#: models.py:115 msgid "Group note" msgstr "Gruppennotiz" -#: models.py:106 templates/alsijil/class_register/lesson.html:60 +#: models.py:158 templates/alsijil/class_register/lesson.html:60 #: templates/alsijil/class_register/lesson.html:143 msgid "Lesson documentation" msgstr "Stunden-Dokumentation" -#: models.py:107 +#: models.py:159 msgid "Lesson documentations" msgstr "Stunden-Dokumentationen" -#: models.py:137 +#: models.py:189 msgid "Extra mark" msgstr "Zusätzliche Markierung" #: preferences.py:16 msgid "Block adding personal notes for cancelled lessons" +msgstr "Blockiere das Hinzufügen von persönlichen Notizen für ausgefallene Stunden" + +#: preferences.py:25 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "Daten von der ersten Stunde zu weiteren folgenden Stunden übernehmen" + +#: preferences.py:28 +msgid "This will carry over data only if the data in the following periods are empty." msgstr "" -"Blockiere das Hinzufügen von persönlichen Notizen für ausgefallene Stunden" +"Dies wird die Daten nur übernehmen, wenn die Daten in den Folgestunden leer " +"sind." + +#: preferences.py:38 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" +"Erlaube Lehrkräften, Unterrichtsstunden bereits am gleichen Tag und nicht " +"erst zu Beginn der Stunde zu öffnen" + +#: preferences.py:41 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" +"Unterrichtsstunden in der Vergangenheit werden nicht durch diese Einstellung " +"beeinflusst, sie können immer geöffnet werden." #: tables.py:16 tables.py:36 msgid "Edit" @@ -163,11 +208,6 @@ msgstr "Bearbeiten" msgid "Delete" msgstr "Löschen" -#: templates/alsijil/absences/register.html:5 -#: templates/alsijil/absences/register.html:6 -msgid "Manage absence" -msgstr "Abwesenheiten verwalten" - #: templates/alsijil/class_register/lesson.html:6 msgid "Lesson" msgstr "Unterrichtsstunde" @@ -216,6 +256,7 @@ msgid "Late persons:" msgstr "Verspätete Personen:" #: templates/alsijil/class_register/lesson.html:165 +#: templates/alsijil/class_register/person.html:78 #: templates/alsijil/print/full_register.html:287 msgid "Tardiness" msgstr "Verspätung" @@ -224,50 +265,126 @@ msgstr "Verspätung" msgid "Tardiness (in m)" msgstr "Verspätung (in m)" +#: templates/alsijil/class_register/person.html:7 +msgid "Class register: person" +msgstr "Klassenbuch: Person" + +#: templates/alsijil/class_register/person.html:11 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" +"\n" +" Klassenbuchübersicht für %(person)s\n" +" " + +#: templates/alsijil/class_register/person.html:19 +msgid "Unexcused absences" +msgstr "Unentschuldigte Fehlzeiten" + +#: templates/alsijil/class_register/person.html:27 +#: templates/alsijil/class_register/person.html:40 +#: templates/alsijil/class_register/person.html:152 +#: templates/alsijil/class_register/person.html:190 +msgid "Mark as" +msgstr "Markiere als" + +#: templates/alsijil/class_register/person.html:47 +msgid "There are unexcused lessons." +msgstr "Es gibt keine unentschuldigten Unterrichtsstunden." + +#: templates/alsijil/class_register/person.html:51 +msgid "Statistics on absences, tardiness and remarks" +msgstr "Statistiken zu Fehlzeiten, Verspätungen und Bemerkungen" + +#: templates/alsijil/class_register/person.html:60 +#: templates/alsijil/print/full_register.html:269 +msgid "Absences" +msgstr "Absenzen" + +#: templates/alsijil/class_register/person.html:64 +#: templates/alsijil/print/full_register.html:274 +msgid "thereof" +msgstr "davon" + +#: templates/alsijil/class_register/person.html:74 +#: templates/alsijil/print/full_register.html:81 +#: templates/alsijil/print/full_register.html:283 +msgid "Unexcused" +msgstr "Unentschuldigt" + +#: templates/alsijil/class_register/person.html:94 +#: templates/alsijil/print/full_register.html:304 +msgid "Relevant personal notes" +msgstr "Relevante persönliche Notizen" + +#: templates/alsijil/class_register/person.html:110 +#, python-format +msgid "Week %(week)s" +msgstr "Woche %(week)s" + +#: templates/alsijil/class_register/person.html:118 +#: templates/alsijil/class_register/person.html:127 +msgid "Mark all as" +msgstr "Alle als markieren" + +#: templates/alsijil/class_register/person.html:175 +#, python-format +msgid "%(late)s' late" +msgstr "%(late)s' verspätet" + +#: templates/alsijil/class_register/persons.html:22 +msgid "No students available." +msgstr "Keine Schüler*innen verfügbar." + #: templates/alsijil/class_register/week_view.html:6 msgid "Week view" msgstr "Wochenansicht" -#: templates/alsijil/class_register/week_view.html:27 +#: templates/alsijil/class_register/week_view.html:30 msgid "Select" msgstr "Auswählen" -#: templates/alsijil/class_register/week_view.html:33 +#: templates/alsijil/class_register/week_view.html:38 #, python-format -msgid "CW %(week)s: %(instance)s" +msgid "" +"CW %(week)s:\n" +" %(instance)s" msgstr "KW %(week)s: %(instance)s" -#: templates/alsijil/class_register/week_view.html:50 +#: templates/alsijil/class_register/week_view.html:58 msgid "Period" msgstr "Stunde" -#: templates/alsijil/class_register/week_view.html:52 +#: templates/alsijil/class_register/week_view.html:60 msgid "Groups" msgstr "Gruppen" -#: templates/alsijil/class_register/week_view.html:54 +#: templates/alsijil/class_register/week_view.html:62 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "Fach" -#: templates/alsijil/class_register/week_view.html:55 +#: templates/alsijil/class_register/week_view.html:63 msgid "Teachers" msgstr "Lehrkräfte" -#: templates/alsijil/class_register/week_view.html:110 +#: templates/alsijil/class_register/week_view.html:120 msgid "unexcused" msgstr "unentschuldigt" -#: templates/alsijil/class_register/week_view.html:113 +#: templates/alsijil/class_register/week_view.html:123 msgid "Summed up tardiness" msgstr "Summierte Verspätung" -#: templates/alsijil/class_register/week_view.html:142 +#: templates/alsijil/class_register/week_view.html:152 msgid "No lessons available" msgstr "Keine Stunden verfügbar" -#: templates/alsijil/class_register/week_view.html:145 +#: templates/alsijil/class_register/week_view.html:155 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -342,6 +459,13 @@ msgstr "Findet gerade statt" msgid "Substitution" msgstr "Vertretung" +#: templates/alsijil/partials/mark_as_buttons.html:4 +#: templates/alsijil/print/full_register.html:335 +#: templates/alsijil/print/full_register.html:424 +#: templates/alsijil/print/full_register.html:439 +msgid "e" +msgstr "e" + #: templates/alsijil/print/full_register.html:6 msgid "Class register:" msgstr "Klassenbuch:" @@ -410,11 +534,6 @@ msgstr "Allgemein" msgid "Late" msgstr "Verspätet" -#: templates/alsijil/print/full_register.html:81 -#: templates/alsijil/print/full_register.html:283 -msgid "Unexcused" -msgstr "Unentschuldigt" - #: templates/alsijil/print/full_register.html:89 msgid "Custom excuse types" msgstr "Benutzerdefinierte Entschuldigunsarten" @@ -490,18 +609,6 @@ msgstr "Kontaktdetails" msgid "Absences and tardiness" msgstr "Abwesenheiten und Verspätungen" -#: templates/alsijil/print/full_register.html:269 -msgid "Absences" -msgstr "Absenzen" - -#: templates/alsijil/print/full_register.html:274 -msgid "thereof" -msgstr "davon" - -#: templates/alsijil/print/full_register.html:304 -msgid "Relevant personal notes" -msgstr "Relevante persönliche Notizen" - #: templates/alsijil/print/full_register.html:308 msgid "Date" msgstr "Datum" @@ -529,12 +636,6 @@ msgstr "Verspät." msgid "Yes" msgstr "Ja" -#: templates/alsijil/print/full_register.html:335 -#: templates/alsijil/print/full_register.html:424 -#: templates/alsijil/print/full_register.html:439 -msgid "e" -msgstr "e" - #: templates/alsijil/print/full_register.html:363 msgid "Lesson documentation for week" msgstr "Unterrichtsdokumentation für Woche" @@ -549,50 +650,61 @@ msgstr "" "Sie haben eine ungültige Stunde ausgewählt oder es\n" " läuft momentan keine Stunde." -#: views.py:90 +#: views.py:94 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "Ihnen ist es nicht erlaubt, eine Eintragung für eine Unterrichtsstunde in der Zukunft vorzunehmen." -#: views.py:116 +#: views.py:120 msgid "The lesson documentation has been saved." msgstr "Die Stunden-Dokumentation wurde gespeichert." -#: views.py:136 +#: views.py:140 msgid "The personal notes have been saved." msgstr "Die persönlichen Notizen wurden gespeichert." -#: views.py:327 +#: views.py:348 msgid "There is no current school term." msgstr "Es gibt aktuell kein Schuljahr." -#: views.py:463 +#: views.py:513 +msgid "The absences have been marked as excused." +msgstr "Die Fehlzeiten wurden als entschuldigt markiert." + +#: views.py:528 +msgid "The absence has been marked as excused." +msgstr "Die Fehlzeit wurde als entschuldigt markiert." + +#: views.py:633 msgid "The absence has been saved." msgstr "Die Abwesenheit wurde gespeichert." -#: views.py:488 +#: views.py:658 msgid "The extra mark has been created." msgstr "Die zusätzliche Markierung wurde erstellt." -#: views.py:499 +#: views.py:669 msgid "The extra mark has been saved." msgstr "Die zusätzliche Markierung wurde gespeichert." -#: views.py:509 +#: views.py:679 msgid "The extra mark has been deleted." msgstr "Die zusätzliche Markierung wurde gelöscht." -#: views.py:529 +#: views.py:699 msgid "The excuse type has been created." msgstr "Die Entschuldigungsart wurde erstellt." -#: views.py:540 +#: views.py:710 msgid "The excuse type has been saved." msgstr "Die Entschuldigunsart wurde gespeichert." -#: views.py:550 +#: views.py:720 msgid "The excuse type has been deleted." msgstr "Die Entschuldigungsart wurde gelöscht." +#~ msgid "Manage absence" +#~ msgstr "Abwesenheiten verwalten" + #~ msgid "Personal note filters" #~ msgstr "Filter für persönliche Notizen" @@ -623,9 +735,6 @@ msgstr "Die Entschuldigungsart wurde gelöscht." #~ msgid "Delete filter" #~ msgstr "Filter löschen" -#~ msgid "Statistics on remarks" -#~ msgstr "Statistiken zu Bemerkungen" - #~ msgid "Count" #~ msgstr "Anzahl" diff --git a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po index fa8b44b705f77e077073e91f7c27d6deb92aee7f..e57fbb5be435d7f2314b7b59a19db38ee8a84f58 100644 --- a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-03 20:03+0200\n" +"POT-Creation-Date: 2020-08-21 12:39+0200\n" "PO-Revision-Date: 2020-07-26 14:08+0000\n" "Last-Translator: Marlene Grundey <grundema@katharineum.de>\n" "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/fr/>\n" @@ -18,33 +18,41 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.0.1\n" -#: forms.py:25 +#: forms.py:26 msgid "Homework for the next lesson" msgstr "" -#: forms.py:50 templates/alsijil/print/full_register.html:199 +#: forms.py:51 templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "Groupe" -#: forms.py:56 templates/alsijil/print/full_register.html:170 +#: forms.py:57 templates/alsijil/print/full_register.html:170 #: templates/alsijil/print/full_register.html:201 msgid "Teacher" msgstr "Profs" -#: forms.py:73 +#: forms.py:74 msgid "You can't select a group and a teacher both." msgstr "" -#: forms.py:101 +#: forms.py:100 msgid "Start date" msgstr "Date de début" -#: forms.py:102 +#: forms.py:101 msgid "End date" msgstr "Date de fin" +#: forms.py:102 +#, fuzzy +#| msgid "From period" +msgid "Start period" +msgstr "De la période" + #: forms.py:103 -msgid "From period" +#, fuzzy +#| msgid "From period" +msgid "End period" msgstr "De la période" #: forms.py:105 templates/alsijil/class_register/lesson.html:163 @@ -52,19 +60,32 @@ msgid "Person" msgstr "Personne" #: forms.py:107 templates/alsijil/class_register/lesson.html:164 -#: templates/alsijil/class_register/week_view.html:109 +#: templates/alsijil/class_register/person.html:160 +#: templates/alsijil/class_register/week_view.html:119 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "Absent(e)" #: forms.py:108 templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/person.html:66 +#: templates/alsijil/class_register/person.html:168 +#: templates/alsijil/partials/mark_as_buttons.html:2 +#: templates/alsijil/partials/mark_as_buttons.html:3 #: templates/alsijil/print/full_register.html:84 #: templates/alsijil/print/full_register.html:275 msgid "Excused" msgstr "Excusé" -#: forms.py:109 templates/alsijil/class_register/lesson.html:170 +#: forms.py:110 models.py:37 models.py:68 +#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:202 +#, fuzzy +#| msgid "Excused" +msgid "Excuse type" +msgstr "Excusé" + +#: forms.py:115 templates/alsijil/class_register/lesson.html:170 #: templates/alsijil/class_register/lesson.html:223 #: templates/alsijil/class_register/lesson.html:231 #: templates/alsijil/print/full_register.html:314 @@ -84,17 +105,29 @@ msgid "Current week" msgstr "Semaine actuelle" #: menus.py:28 +#, fuzzy +#| msgid "Personal overview" +msgid "My overview" +msgstr "Vue d'ensemble personnelle" + +#: menus.py:34 templates/alsijil/class_register/persons.html:7 +#: templates/alsijil/class_register/persons.html:11 +msgid "My students" +msgstr "" + +#: menus.py:40 templates/alsijil/absences/register.html:5 +#: templates/alsijil/absences/register.html:6 msgid "Register absence" msgstr "Registre de Absence" -#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8 +#: menus.py:46 models.py:38 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #, fuzzy #| msgid "Excused" msgid "Excuse types" msgstr "Excusé" -#: menus.py:40 models.py:66 models.py:138 +#: menus.py:52 models.py:74 models.py:190 #: templates/alsijil/class_register/lesson.html:168 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 @@ -102,62 +135,59 @@ msgstr "Excusé" msgid "Extra marks" msgstr "" -#: models.py:18 models.py:124 +#: models.py:24 models.py:176 #, fuzzy #| msgid "First name" msgid "Short name" msgstr "Prénom" -#: models.py:20 models.py:126 +#: models.py:26 models.py:178 msgid "Name" msgstr "" -#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167 -#: templates/alsijil/class_register/lesson.html:202 -#, fuzzy -#| msgid "Excused" -msgid "Excuse type" -msgstr "Excusé" +#: models.py:54 models.py:106 +msgid "Year" +msgstr "" -#: models.py:75 +#: models.py:86 #, fuzzy #| msgid "Personal notes" msgid "Personal note" msgstr "Notes personnelles" -#: models.py:76 templates/alsijil/class_register/lesson.html:64 +#: models.py:87 templates/alsijil/class_register/lesson.html:64 #: templates/alsijil/class_register/lesson.html:156 -#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:112 msgid "Personal notes" msgstr "Notes personnelles" -#: models.py:99 templates/alsijil/class_register/week_view.html:56 +#: models.py:112 templates/alsijil/class_register/week_view.html:64 #: templates/alsijil/print/full_register.html:371 msgid "Lesson topic" msgstr "Sujet de cours" -#: models.py:100 templates/alsijil/print/full_register.html:372 +#: models.py:113 templates/alsijil/print/full_register.html:372 msgid "Homework" msgstr "Devoirs" -#: models.py:102 +#: models.py:115 #, fuzzy #| msgid "Group" msgid "Group note" msgstr "Groupe" -#: models.py:106 templates/alsijil/class_register/lesson.html:60 +#: models.py:158 templates/alsijil/class_register/lesson.html:60 #: templates/alsijil/class_register/lesson.html:143 msgid "Lesson documentation" msgstr "Documentation de cours" -#: models.py:107 +#: models.py:159 #, fuzzy #| msgid "Lesson documentation" msgid "Lesson documentations" msgstr "Documentation de cours" -#: models.py:137 +#: models.py:189 msgid "Extra mark" msgstr "" @@ -165,6 +195,22 @@ msgstr "" msgid "Block adding personal notes for cancelled lessons" msgstr "" +#: preferences.py:25 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" + +#: preferences.py:28 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "" + +#: preferences.py:38 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" + +#: preferences.py:41 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -173,11 +219,6 @@ msgstr "" msgid "Delete" msgstr "" -#: templates/alsijil/absences/register.html:5 -#: templates/alsijil/absences/register.html:6 -msgid "Manage absence" -msgstr "" - #: templates/alsijil/class_register/lesson.html:6 msgid "Lesson" msgstr "Cours" @@ -233,6 +274,7 @@ msgid "Late persons:" msgstr "" #: templates/alsijil/class_register/lesson.html:165 +#: templates/alsijil/class_register/person.html:78 #: templates/alsijil/print/full_register.html:287 msgid "Tardiness" msgstr "Retard" @@ -243,52 +285,129 @@ msgstr "Retard" msgid "Tardiness (in m)" msgstr "Retard" +#: templates/alsijil/class_register/person.html:7 +#, fuzzy +#| msgid "Class register" +msgid "Class register: person" +msgstr "Registre de la classe" + +#: templates/alsijil/class_register/person.html:11 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" + +#: templates/alsijil/class_register/person.html:19 +#, fuzzy +#| msgid "Unexcused" +msgid "Unexcused absences" +msgstr "injustifié(e)" + +#: templates/alsijil/class_register/person.html:27 +#: templates/alsijil/class_register/person.html:40 +#: templates/alsijil/class_register/person.html:152 +#: templates/alsijil/class_register/person.html:190 +msgid "Mark as" +msgstr "" + +#: templates/alsijil/class_register/person.html:47 +msgid "There are unexcused lessons." +msgstr "" + +#: templates/alsijil/class_register/person.html:51 +msgid "Statistics on absences, tardiness and remarks" +msgstr "" + +#: templates/alsijil/class_register/person.html:60 +#: templates/alsijil/print/full_register.html:269 +msgid "Absences" +msgstr "Absences" + +#: templates/alsijil/class_register/person.html:64 +#: templates/alsijil/print/full_register.html:274 +msgid "thereof" +msgstr "" + +#: templates/alsijil/class_register/person.html:74 +#: templates/alsijil/print/full_register.html:81 +#: templates/alsijil/print/full_register.html:283 +msgid "Unexcused" +msgstr "injustifié(e)" + +#: templates/alsijil/class_register/person.html:94 +#: templates/alsijil/print/full_register.html:304 +msgid "Relevant personal notes" +msgstr "Notes personnelles importantes" + +#: templates/alsijil/class_register/person.html:110 +#, python-format +msgid "Week %(week)s" +msgstr "" + +#: templates/alsijil/class_register/person.html:118 +#: templates/alsijil/class_register/person.html:127 +msgid "Mark all as" +msgstr "" + +#: templates/alsijil/class_register/person.html:175 +#, python-format +msgid "%(late)s' late" +msgstr "" + +#: templates/alsijil/class_register/persons.html:22 +msgid "No students available." +msgstr "" + #: templates/alsijil/class_register/week_view.html:6 msgid "Week view" msgstr "Vue de semaine" -#: templates/alsijil/class_register/week_view.html:27 +#: templates/alsijil/class_register/week_view.html:30 msgid "Select" msgstr "Sélectionner" -#: templates/alsijil/class_register/week_view.html:33 +#: templates/alsijil/class_register/week_view.html:38 #, python-format -msgid "CW %(week)s: %(instance)s" +msgid "" +"CW %(week)s:\n" +" %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:50 +#: templates/alsijil/class_register/week_view.html:58 msgid "Period" msgstr "Période" -#: templates/alsijil/class_register/week_view.html:52 +#: templates/alsijil/class_register/week_view.html:60 #, fuzzy #| msgid "Group" msgid "Groups" msgstr "Groupe" -#: templates/alsijil/class_register/week_view.html:54 +#: templates/alsijil/class_register/week_view.html:62 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "Sujet" -#: templates/alsijil/class_register/week_view.html:55 +#: templates/alsijil/class_register/week_view.html:63 msgid "Teachers" msgstr "Profs" -#: templates/alsijil/class_register/week_view.html:110 +#: templates/alsijil/class_register/week_view.html:120 msgid "unexcused" msgstr "Injustifié(e)" -#: templates/alsijil/class_register/week_view.html:113 +#: templates/alsijil/class_register/week_view.html:123 msgid "Summed up tardiness" msgstr "Résumé des retards" -#: templates/alsijil/class_register/week_view.html:142 +#: templates/alsijil/class_register/week_view.html:152 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:145 +#: templates/alsijil/class_register/week_view.html:155 #, fuzzy #| msgid "" #| "\n" @@ -364,6 +483,13 @@ msgstr "" msgid "Substitution" msgstr "" +#: templates/alsijil/partials/mark_as_buttons.html:4 +#: templates/alsijil/print/full_register.html:335 +#: templates/alsijil/print/full_register.html:424 +#: templates/alsijil/print/full_register.html:439 +msgid "e" +msgstr "e" + #: templates/alsijil/print/full_register.html:6 #, fuzzy #| msgid "Class register" @@ -421,11 +547,6 @@ msgstr "" msgid "Late" msgstr "" -#: templates/alsijil/print/full_register.html:81 -#: templates/alsijil/print/full_register.html:283 -msgid "Unexcused" -msgstr "injustifié(e)" - #: templates/alsijil/print/full_register.html:89 msgid "Custom excuse types" msgstr "" @@ -503,18 +624,6 @@ msgstr "Détails de contact" msgid "Absences and tardiness" msgstr "Absences et retards" -#: templates/alsijil/print/full_register.html:269 -msgid "Absences" -msgstr "Absences" - -#: templates/alsijil/print/full_register.html:274 -msgid "thereof" -msgstr "" - -#: templates/alsijil/print/full_register.html:304 -msgid "Relevant personal notes" -msgstr "Notes personnelles importantes" - #: templates/alsijil/print/full_register.html:308 msgid "Date" msgstr "Date" @@ -542,12 +651,6 @@ msgstr "" msgid "Yes" msgstr "Oui" -#: templates/alsijil/print/full_register.html:335 -#: templates/alsijil/print/full_register.html:424 -#: templates/alsijil/print/full_register.html:439 -msgid "e" -msgstr "e" - #: templates/alsijil/print/full_register.html:363 #, fuzzy #| msgid "Lesson documentation for calendar week" @@ -562,53 +665,61 @@ msgstr "Notes" msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:94 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:116 +#: views.py:120 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The lesson documentation has been saved." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:136 +#: views.py:140 msgid "The personal notes have been saved." msgstr "" -#: views.py:327 +#: views.py:348 msgid "There is no current school term." msgstr "" -#: views.py:463 +#: views.py:513 +msgid "The absences have been marked as excused." +msgstr "" + +#: views.py:528 +msgid "The absence has been marked as excused." +msgstr "" + +#: views.py:633 msgid "The absence has been saved." msgstr "" -#: views.py:488 +#: views.py:658 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The extra mark has been created." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:499 +#: views.py:669 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The extra mark has been saved." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:509 +#: views.py:679 msgid "The extra mark has been deleted." msgstr "" -#: views.py:529 +#: views.py:699 msgid "The excuse type has been created." msgstr "" -#: views.py:540 +#: views.py:710 msgid "The excuse type has been saved." msgstr "" -#: views.py:550 +#: views.py:720 msgid "The excuse type has been deleted." msgstr "" diff --git a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po index 8d23b91ba87783c3e16698f4626b6949de23f1f1..262dab826763950f3858b4a77d6155c9e522c2b1 100644 --- a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-03 20:03+0200\n" +"POT-Creation-Date: 2020-08-21 12:39+0200\n" "PO-Revision-Date: 2020-07-26 14:08+0000\n" "Last-Translator: Julian <leuckerj@gmail.com>\n" "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/la/>\n" @@ -18,33 +18,37 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.0.1\n" -#: forms.py:25 +#: forms.py:26 msgid "Homework for the next lesson" msgstr "" -#: forms.py:50 templates/alsijil/print/full_register.html:199 +#: forms.py:51 templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "Grex" -#: forms.py:56 templates/alsijil/print/full_register.html:170 +#: forms.py:57 templates/alsijil/print/full_register.html:170 #: templates/alsijil/print/full_register.html:201 msgid "Teacher" msgstr "" -#: forms.py:73 +#: forms.py:74 msgid "You can't select a group and a teacher both." msgstr "" -#: forms.py:101 +#: forms.py:100 msgid "Start date" msgstr "" -#: forms.py:102 +#: forms.py:101 msgid "End date" msgstr "" +#: forms.py:102 +msgid "Start period" +msgstr "" + #: forms.py:103 -msgid "From period" +msgid "End period" msgstr "" #: forms.py:105 templates/alsijil/class_register/lesson.html:163 @@ -52,19 +56,30 @@ msgid "Person" msgstr "Persona" #: forms.py:107 templates/alsijil/class_register/lesson.html:164 -#: templates/alsijil/class_register/week_view.html:109 +#: templates/alsijil/class_register/person.html:160 +#: templates/alsijil/class_register/week_view.html:119 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:108 templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/person.html:66 +#: templates/alsijil/class_register/person.html:168 +#: templates/alsijil/partials/mark_as_buttons.html:2 +#: templates/alsijil/partials/mark_as_buttons.html:3 #: templates/alsijil/print/full_register.html:84 #: templates/alsijil/print/full_register.html:275 msgid "Excused" msgstr "" -#: forms.py:109 templates/alsijil/class_register/lesson.html:170 +#: forms.py:110 models.py:37 models.py:68 +#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:202 +msgid "Excuse type" +msgstr "" + +#: forms.py:115 templates/alsijil/class_register/lesson.html:170 #: templates/alsijil/class_register/lesson.html:223 #: templates/alsijil/class_register/lesson.html:231 #: templates/alsijil/print/full_register.html:314 @@ -84,15 +99,25 @@ msgid "Current week" msgstr "" #: menus.py:28 +msgid "My overview" +msgstr "" + +#: menus.py:34 templates/alsijil/class_register/persons.html:7 +#: templates/alsijil/class_register/persons.html:11 +msgid "My students" +msgstr "" + +#: menus.py:40 templates/alsijil/absences/register.html:5 +#: templates/alsijil/absences/register.html:6 msgid "Register absence" msgstr "" -#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8 +#: menus.py:46 models.py:38 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 msgid "Excuse types" msgstr "" -#: menus.py:40 models.py:66 models.py:138 +#: menus.py:52 models.py:74 models.py:190 #: templates/alsijil/class_register/lesson.html:168 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 @@ -100,58 +125,57 @@ msgstr "" msgid "Extra marks" msgstr "" -#: models.py:18 models.py:124 +#: models.py:24 models.py:176 #, fuzzy #| msgid "First name" msgid "Short name" msgstr "Primus nomen" -#: models.py:20 models.py:126 +#: models.py:26 models.py:178 msgid "Name" msgstr "" -#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167 -#: templates/alsijil/class_register/lesson.html:202 -msgid "Excuse type" +#: models.py:54 models.py:106 +msgid "Year" msgstr "" -#: models.py:75 +#: models.py:86 #, fuzzy #| msgid "Person" msgid "Personal note" msgstr "Persona" -#: models.py:76 templates/alsijil/class_register/lesson.html:64 +#: models.py:87 templates/alsijil/class_register/lesson.html:64 #: templates/alsijil/class_register/lesson.html:156 -#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:112 msgid "Personal notes" msgstr "" -#: models.py:99 templates/alsijil/class_register/week_view.html:56 +#: models.py:112 templates/alsijil/class_register/week_view.html:64 #: templates/alsijil/print/full_register.html:371 msgid "Lesson topic" msgstr "" -#: models.py:100 templates/alsijil/print/full_register.html:372 +#: models.py:113 templates/alsijil/print/full_register.html:372 msgid "Homework" msgstr "" -#: models.py:102 +#: models.py:115 #, fuzzy #| msgid "Group" msgid "Group note" msgstr "Grex" -#: models.py:106 templates/alsijil/class_register/lesson.html:60 +#: models.py:158 templates/alsijil/class_register/lesson.html:60 #: templates/alsijil/class_register/lesson.html:143 msgid "Lesson documentation" msgstr "" -#: models.py:107 +#: models.py:159 msgid "Lesson documentations" msgstr "" -#: models.py:137 +#: models.py:189 msgid "Extra mark" msgstr "" @@ -159,6 +183,22 @@ msgstr "" msgid "Block adding personal notes for cancelled lessons" msgstr "" +#: preferences.py:25 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" + +#: preferences.py:28 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "" + +#: preferences.py:38 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" + +#: preferences.py:41 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -167,11 +207,6 @@ msgstr "" msgid "Delete" msgstr "" -#: templates/alsijil/absences/register.html:5 -#: templates/alsijil/absences/register.html:6 -msgid "Manage absence" -msgstr "" - #: templates/alsijil/class_register/lesson.html:6 msgid "Lesson" msgstr "" @@ -220,6 +255,7 @@ msgid "Late persons:" msgstr "" #: templates/alsijil/class_register/lesson.html:165 +#: templates/alsijil/class_register/person.html:78 #: templates/alsijil/print/full_register.html:287 msgid "Tardiness" msgstr "" @@ -228,52 +264,125 @@ msgstr "" msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/person.html:7 +msgid "Class register: person" +msgstr "" + +#: templates/alsijil/class_register/person.html:11 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" + +#: templates/alsijil/class_register/person.html:19 +msgid "Unexcused absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:27 +#: templates/alsijil/class_register/person.html:40 +#: templates/alsijil/class_register/person.html:152 +#: templates/alsijil/class_register/person.html:190 +msgid "Mark as" +msgstr "" + +#: templates/alsijil/class_register/person.html:47 +msgid "There are unexcused lessons." +msgstr "" + +#: templates/alsijil/class_register/person.html:51 +msgid "Statistics on absences, tardiness and remarks" +msgstr "" + +#: templates/alsijil/class_register/person.html:60 +#: templates/alsijil/print/full_register.html:269 +msgid "Absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:64 +#: templates/alsijil/print/full_register.html:274 +msgid "thereof" +msgstr "" + +#: templates/alsijil/class_register/person.html:74 +#: templates/alsijil/print/full_register.html:81 +#: templates/alsijil/print/full_register.html:283 +msgid "Unexcused" +msgstr "" + +#: templates/alsijil/class_register/person.html:94 +#: templates/alsijil/print/full_register.html:304 +msgid "Relevant personal notes" +msgstr "" + +#: templates/alsijil/class_register/person.html:110 +#, python-format +msgid "Week %(week)s" +msgstr "" + +#: templates/alsijil/class_register/person.html:118 +#: templates/alsijil/class_register/person.html:127 +msgid "Mark all as" +msgstr "" + +#: templates/alsijil/class_register/person.html:175 +#, python-format +msgid "%(late)s' late" +msgstr "" + +#: templates/alsijil/class_register/persons.html:22 +msgid "No students available." +msgstr "" + #: templates/alsijil/class_register/week_view.html:6 msgid "Week view" msgstr "" -#: templates/alsijil/class_register/week_view.html:27 +#: templates/alsijil/class_register/week_view.html:30 msgid "Select" msgstr "" -#: templates/alsijil/class_register/week_view.html:33 +#: templates/alsijil/class_register/week_view.html:38 #, python-format -msgid "CW %(week)s: %(instance)s" +msgid "" +"CW %(week)s:\n" +" %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:50 +#: templates/alsijil/class_register/week_view.html:58 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:52 +#: templates/alsijil/class_register/week_view.html:60 #, fuzzy #| msgid "Group" msgid "Groups" msgstr "Grex" -#: templates/alsijil/class_register/week_view.html:54 +#: templates/alsijil/class_register/week_view.html:62 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:55 +#: templates/alsijil/class_register/week_view.html:63 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:110 +#: templates/alsijil/class_register/week_view.html:120 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:113 +#: templates/alsijil/class_register/week_view.html:123 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:142 +#: templates/alsijil/class_register/week_view.html:152 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:145 +#: templates/alsijil/class_register/week_view.html:155 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -341,6 +450,13 @@ msgstr "" msgid "Substitution" msgstr "" +#: templates/alsijil/partials/mark_as_buttons.html:4 +#: templates/alsijil/print/full_register.html:335 +#: templates/alsijil/print/full_register.html:424 +#: templates/alsijil/print/full_register.html:439 +msgid "e" +msgstr "" + #: templates/alsijil/print/full_register.html:6 msgid "Class register:" msgstr "" @@ -396,11 +512,6 @@ msgstr "" msgid "Late" msgstr "" -#: templates/alsijil/print/full_register.html:81 -#: templates/alsijil/print/full_register.html:283 -msgid "Unexcused" -msgstr "" - #: templates/alsijil/print/full_register.html:89 msgid "Custom excuse types" msgstr "" @@ -476,18 +587,6 @@ msgstr "" msgid "Absences and tardiness" msgstr "" -#: templates/alsijil/print/full_register.html:269 -msgid "Absences" -msgstr "" - -#: templates/alsijil/print/full_register.html:274 -msgid "thereof" -msgstr "" - -#: templates/alsijil/print/full_register.html:304 -msgid "Relevant personal notes" -msgstr "" - #: templates/alsijil/print/full_register.html:308 msgid "Date" msgstr "dies" @@ -515,12 +614,6 @@ msgstr "" msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:335 -#: templates/alsijil/print/full_register.html:424 -#: templates/alsijil/print/full_register.html:439 -msgid "e" -msgstr "" - #: templates/alsijil/print/full_register.html:363 msgid "Lesson documentation for week" msgstr "" @@ -533,47 +626,55 @@ msgstr "" msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:94 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:116 +#: views.py:120 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:136 +#: views.py:140 msgid "The personal notes have been saved." msgstr "" -#: views.py:327 +#: views.py:348 msgid "There is no current school term." msgstr "" -#: views.py:463 +#: views.py:513 +msgid "The absences have been marked as excused." +msgstr "" + +#: views.py:528 +msgid "The absence has been marked as excused." +msgstr "" + +#: views.py:633 msgid "The absence has been saved." msgstr "" -#: views.py:488 +#: views.py:658 msgid "The extra mark has been created." msgstr "" -#: views.py:499 +#: views.py:669 msgid "The extra mark has been saved." msgstr "" -#: views.py:509 +#: views.py:679 msgid "The extra mark has been deleted." msgstr "" -#: views.py:529 +#: views.py:699 msgid "The excuse type has been created." msgstr "" -#: views.py:540 +#: views.py:710 msgid "The excuse type has been saved." msgstr "" -#: views.py:550 +#: views.py:720 msgid "The excuse type has been deleted." msgstr "" diff --git a/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po index 6c135ee070af949f1a52f1eef843fdf53d28047c..105dd88031136bf3fed0ce9bb722183c10264c44 100644 --- a/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-03 20:03+0200\n" +"POT-Creation-Date: 2020-08-21 12:39+0200\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" @@ -17,33 +17,37 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: forms.py:25 +#: forms.py:26 msgid "Homework for the next lesson" msgstr "" -#: forms.py:50 templates/alsijil/print/full_register.html:199 +#: forms.py:51 templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "" -#: forms.py:56 templates/alsijil/print/full_register.html:170 +#: forms.py:57 templates/alsijil/print/full_register.html:170 #: templates/alsijil/print/full_register.html:201 msgid "Teacher" msgstr "" -#: forms.py:73 +#: forms.py:74 msgid "You can't select a group and a teacher both." msgstr "" -#: forms.py:101 +#: forms.py:100 msgid "Start date" msgstr "" -#: forms.py:102 +#: forms.py:101 msgid "End date" msgstr "" +#: forms.py:102 +msgid "Start period" +msgstr "" + #: forms.py:103 -msgid "From period" +msgid "End period" msgstr "" #: forms.py:105 templates/alsijil/class_register/lesson.html:163 @@ -51,19 +55,30 @@ msgid "Person" msgstr "" #: forms.py:107 templates/alsijil/class_register/lesson.html:164 -#: templates/alsijil/class_register/week_view.html:109 +#: templates/alsijil/class_register/person.html:160 +#: templates/alsijil/class_register/week_view.html:119 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:108 templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/person.html:66 +#: templates/alsijil/class_register/person.html:168 +#: templates/alsijil/partials/mark_as_buttons.html:2 +#: templates/alsijil/partials/mark_as_buttons.html:3 #: templates/alsijil/print/full_register.html:84 #: templates/alsijil/print/full_register.html:275 msgid "Excused" msgstr "" -#: forms.py:109 templates/alsijil/class_register/lesson.html:170 +#: forms.py:110 models.py:37 models.py:68 +#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:202 +msgid "Excuse type" +msgstr "" + +#: forms.py:115 templates/alsijil/class_register/lesson.html:170 #: templates/alsijil/class_register/lesson.html:223 #: templates/alsijil/class_register/lesson.html:231 #: templates/alsijil/print/full_register.html:314 @@ -83,15 +98,25 @@ msgid "Current week" msgstr "" #: menus.py:28 +msgid "My overview" +msgstr "" + +#: menus.py:34 templates/alsijil/class_register/persons.html:7 +#: templates/alsijil/class_register/persons.html:11 +msgid "My students" +msgstr "" + +#: menus.py:40 templates/alsijil/absences/register.html:5 +#: templates/alsijil/absences/register.html:6 msgid "Register absence" msgstr "" -#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8 +#: menus.py:46 models.py:38 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 msgid "Excuse types" msgstr "" -#: menus.py:40 models.py:66 models.py:138 +#: menus.py:52 models.py:74 models.py:190 #: templates/alsijil/class_register/lesson.html:168 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 @@ -99,52 +124,51 @@ msgstr "" msgid "Extra marks" msgstr "" -#: models.py:18 models.py:124 +#: models.py:24 models.py:176 msgid "Short name" msgstr "" -#: models.py:20 models.py:126 +#: models.py:26 models.py:178 msgid "Name" msgstr "" -#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167 -#: templates/alsijil/class_register/lesson.html:202 -msgid "Excuse type" +#: models.py:54 models.py:106 +msgid "Year" msgstr "" -#: models.py:75 +#: models.py:86 msgid "Personal note" msgstr "" -#: models.py:76 templates/alsijil/class_register/lesson.html:64 +#: models.py:87 templates/alsijil/class_register/lesson.html:64 #: templates/alsijil/class_register/lesson.html:156 -#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:112 msgid "Personal notes" msgstr "" -#: models.py:99 templates/alsijil/class_register/week_view.html:56 +#: models.py:112 templates/alsijil/class_register/week_view.html:64 #: templates/alsijil/print/full_register.html:371 msgid "Lesson topic" msgstr "" -#: models.py:100 templates/alsijil/print/full_register.html:372 +#: models.py:113 templates/alsijil/print/full_register.html:372 msgid "Homework" msgstr "" -#: models.py:102 +#: models.py:115 msgid "Group note" msgstr "" -#: models.py:106 templates/alsijil/class_register/lesson.html:60 +#: models.py:158 templates/alsijil/class_register/lesson.html:60 #: templates/alsijil/class_register/lesson.html:143 msgid "Lesson documentation" msgstr "" -#: models.py:107 +#: models.py:159 msgid "Lesson documentations" msgstr "" -#: models.py:137 +#: models.py:189 msgid "Extra mark" msgstr "" @@ -152,6 +176,22 @@ msgstr "" msgid "Block adding personal notes for cancelled lessons" msgstr "" +#: preferences.py:25 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" + +#: preferences.py:28 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "" + +#: preferences.py:38 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" + +#: preferences.py:41 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -160,11 +200,6 @@ msgstr "" msgid "Delete" msgstr "" -#: templates/alsijil/absences/register.html:5 -#: templates/alsijil/absences/register.html:6 -msgid "Manage absence" -msgstr "" - #: templates/alsijil/class_register/lesson.html:6 msgid "Lesson" msgstr "" @@ -213,6 +248,7 @@ msgid "Late persons:" msgstr "" #: templates/alsijil/class_register/lesson.html:165 +#: templates/alsijil/class_register/person.html:78 #: templates/alsijil/print/full_register.html:287 msgid "Tardiness" msgstr "" @@ -221,50 +257,123 @@ msgstr "" msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/person.html:7 +msgid "Class register: person" +msgstr "" + +#: templates/alsijil/class_register/person.html:11 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" + +#: templates/alsijil/class_register/person.html:19 +msgid "Unexcused absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:27 +#: templates/alsijil/class_register/person.html:40 +#: templates/alsijil/class_register/person.html:152 +#: templates/alsijil/class_register/person.html:190 +msgid "Mark as" +msgstr "" + +#: templates/alsijil/class_register/person.html:47 +msgid "There are unexcused lessons." +msgstr "" + +#: templates/alsijil/class_register/person.html:51 +msgid "Statistics on absences, tardiness and remarks" +msgstr "" + +#: templates/alsijil/class_register/person.html:60 +#: templates/alsijil/print/full_register.html:269 +msgid "Absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:64 +#: templates/alsijil/print/full_register.html:274 +msgid "thereof" +msgstr "" + +#: templates/alsijil/class_register/person.html:74 +#: templates/alsijil/print/full_register.html:81 +#: templates/alsijil/print/full_register.html:283 +msgid "Unexcused" +msgstr "" + +#: templates/alsijil/class_register/person.html:94 +#: templates/alsijil/print/full_register.html:304 +msgid "Relevant personal notes" +msgstr "" + +#: templates/alsijil/class_register/person.html:110 +#, python-format +msgid "Week %(week)s" +msgstr "" + +#: templates/alsijil/class_register/person.html:118 +#: templates/alsijil/class_register/person.html:127 +msgid "Mark all as" +msgstr "" + +#: templates/alsijil/class_register/person.html:175 +#, python-format +msgid "%(late)s' late" +msgstr "" + +#: templates/alsijil/class_register/persons.html:22 +msgid "No students available." +msgstr "" + #: templates/alsijil/class_register/week_view.html:6 msgid "Week view" msgstr "" -#: templates/alsijil/class_register/week_view.html:27 +#: templates/alsijil/class_register/week_view.html:30 msgid "Select" msgstr "" -#: templates/alsijil/class_register/week_view.html:33 +#: templates/alsijil/class_register/week_view.html:38 #, python-format -msgid "CW %(week)s: %(instance)s" +msgid "" +"CW %(week)s:\n" +" %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:50 +#: templates/alsijil/class_register/week_view.html:58 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:52 +#: templates/alsijil/class_register/week_view.html:60 msgid "Groups" msgstr "" -#: templates/alsijil/class_register/week_view.html:54 +#: templates/alsijil/class_register/week_view.html:62 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:55 +#: templates/alsijil/class_register/week_view.html:63 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:110 +#: templates/alsijil/class_register/week_view.html:120 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:113 +#: templates/alsijil/class_register/week_view.html:123 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:142 +#: templates/alsijil/class_register/week_view.html:152 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:145 +#: templates/alsijil/class_register/week_view.html:155 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -332,6 +441,13 @@ msgstr "" msgid "Substitution" msgstr "" +#: templates/alsijil/partials/mark_as_buttons.html:4 +#: templates/alsijil/print/full_register.html:335 +#: templates/alsijil/print/full_register.html:424 +#: templates/alsijil/print/full_register.html:439 +msgid "e" +msgstr "" + #: templates/alsijil/print/full_register.html:6 msgid "Class register:" msgstr "" @@ -387,11 +503,6 @@ msgstr "" msgid "Late" msgstr "" -#: templates/alsijil/print/full_register.html:81 -#: templates/alsijil/print/full_register.html:283 -msgid "Unexcused" -msgstr "" - #: templates/alsijil/print/full_register.html:89 msgid "Custom excuse types" msgstr "" @@ -467,18 +578,6 @@ msgstr "" msgid "Absences and tardiness" msgstr "" -#: templates/alsijil/print/full_register.html:269 -msgid "Absences" -msgstr "" - -#: templates/alsijil/print/full_register.html:274 -msgid "thereof" -msgstr "" - -#: templates/alsijil/print/full_register.html:304 -msgid "Relevant personal notes" -msgstr "" - #: templates/alsijil/print/full_register.html:308 msgid "Date" msgstr "" @@ -506,12 +605,6 @@ msgstr "" msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:335 -#: templates/alsijil/print/full_register.html:424 -#: templates/alsijil/print/full_register.html:439 -msgid "e" -msgstr "" - #: templates/alsijil/print/full_register.html:363 msgid "Lesson documentation for week" msgstr "" @@ -524,46 +617,54 @@ msgstr "" msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:94 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:116 +#: views.py:120 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:136 +#: views.py:140 msgid "The personal notes have been saved." msgstr "" -#: views.py:327 +#: views.py:348 msgid "There is no current school term." msgstr "" -#: views.py:463 +#: views.py:513 +msgid "The absences have been marked as excused." +msgstr "" + +#: views.py:528 +msgid "The absence has been marked as excused." +msgstr "" + +#: views.py:633 msgid "The absence has been saved." msgstr "" -#: views.py:488 +#: views.py:658 msgid "The extra mark has been created." msgstr "" -#: views.py:499 +#: views.py:669 msgid "The extra mark has been saved." msgstr "" -#: views.py:509 +#: views.py:679 msgid "The extra mark has been deleted." msgstr "" -#: views.py:529 +#: views.py:699 msgid "The excuse type has been created." msgstr "" -#: views.py:540 +#: views.py:710 msgid "The excuse type has been saved." msgstr "" -#: views.py:550 +#: views.py:720 msgid "The excuse type has been deleted." msgstr "" diff --git a/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po index 6c135ee070af949f1a52f1eef843fdf53d28047c..105dd88031136bf3fed0ce9bb722183c10264c44 100644 --- a/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-03 20:03+0200\n" +"POT-Creation-Date: 2020-08-21 12:39+0200\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" @@ -17,33 +17,37 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: forms.py:25 +#: forms.py:26 msgid "Homework for the next lesson" msgstr "" -#: forms.py:50 templates/alsijil/print/full_register.html:199 +#: forms.py:51 templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "" -#: forms.py:56 templates/alsijil/print/full_register.html:170 +#: forms.py:57 templates/alsijil/print/full_register.html:170 #: templates/alsijil/print/full_register.html:201 msgid "Teacher" msgstr "" -#: forms.py:73 +#: forms.py:74 msgid "You can't select a group and a teacher both." msgstr "" -#: forms.py:101 +#: forms.py:100 msgid "Start date" msgstr "" -#: forms.py:102 +#: forms.py:101 msgid "End date" msgstr "" +#: forms.py:102 +msgid "Start period" +msgstr "" + #: forms.py:103 -msgid "From period" +msgid "End period" msgstr "" #: forms.py:105 templates/alsijil/class_register/lesson.html:163 @@ -51,19 +55,30 @@ msgid "Person" msgstr "" #: forms.py:107 templates/alsijil/class_register/lesson.html:164 -#: templates/alsijil/class_register/week_view.html:109 +#: templates/alsijil/class_register/person.html:160 +#: templates/alsijil/class_register/week_view.html:119 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:108 templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/person.html:66 +#: templates/alsijil/class_register/person.html:168 +#: templates/alsijil/partials/mark_as_buttons.html:2 +#: templates/alsijil/partials/mark_as_buttons.html:3 #: templates/alsijil/print/full_register.html:84 #: templates/alsijil/print/full_register.html:275 msgid "Excused" msgstr "" -#: forms.py:109 templates/alsijil/class_register/lesson.html:170 +#: forms.py:110 models.py:37 models.py:68 +#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:202 +msgid "Excuse type" +msgstr "" + +#: forms.py:115 templates/alsijil/class_register/lesson.html:170 #: templates/alsijil/class_register/lesson.html:223 #: templates/alsijil/class_register/lesson.html:231 #: templates/alsijil/print/full_register.html:314 @@ -83,15 +98,25 @@ msgid "Current week" msgstr "" #: menus.py:28 +msgid "My overview" +msgstr "" + +#: menus.py:34 templates/alsijil/class_register/persons.html:7 +#: templates/alsijil/class_register/persons.html:11 +msgid "My students" +msgstr "" + +#: menus.py:40 templates/alsijil/absences/register.html:5 +#: templates/alsijil/absences/register.html:6 msgid "Register absence" msgstr "" -#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8 +#: menus.py:46 models.py:38 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 msgid "Excuse types" msgstr "" -#: menus.py:40 models.py:66 models.py:138 +#: menus.py:52 models.py:74 models.py:190 #: templates/alsijil/class_register/lesson.html:168 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 @@ -99,52 +124,51 @@ msgstr "" msgid "Extra marks" msgstr "" -#: models.py:18 models.py:124 +#: models.py:24 models.py:176 msgid "Short name" msgstr "" -#: models.py:20 models.py:126 +#: models.py:26 models.py:178 msgid "Name" msgstr "" -#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167 -#: templates/alsijil/class_register/lesson.html:202 -msgid "Excuse type" +#: models.py:54 models.py:106 +msgid "Year" msgstr "" -#: models.py:75 +#: models.py:86 msgid "Personal note" msgstr "" -#: models.py:76 templates/alsijil/class_register/lesson.html:64 +#: models.py:87 templates/alsijil/class_register/lesson.html:64 #: templates/alsijil/class_register/lesson.html:156 -#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:112 msgid "Personal notes" msgstr "" -#: models.py:99 templates/alsijil/class_register/week_view.html:56 +#: models.py:112 templates/alsijil/class_register/week_view.html:64 #: templates/alsijil/print/full_register.html:371 msgid "Lesson topic" msgstr "" -#: models.py:100 templates/alsijil/print/full_register.html:372 +#: models.py:113 templates/alsijil/print/full_register.html:372 msgid "Homework" msgstr "" -#: models.py:102 +#: models.py:115 msgid "Group note" msgstr "" -#: models.py:106 templates/alsijil/class_register/lesson.html:60 +#: models.py:158 templates/alsijil/class_register/lesson.html:60 #: templates/alsijil/class_register/lesson.html:143 msgid "Lesson documentation" msgstr "" -#: models.py:107 +#: models.py:159 msgid "Lesson documentations" msgstr "" -#: models.py:137 +#: models.py:189 msgid "Extra mark" msgstr "" @@ -152,6 +176,22 @@ msgstr "" msgid "Block adding personal notes for cancelled lessons" msgstr "" +#: preferences.py:25 +msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" +msgstr "" + +#: preferences.py:28 +msgid "This will carry over data only if the data in the following periods are empty." +msgstr "" + +#: preferences.py:38 +msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" +msgstr "" + +#: preferences.py:41 +msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -160,11 +200,6 @@ msgstr "" msgid "Delete" msgstr "" -#: templates/alsijil/absences/register.html:5 -#: templates/alsijil/absences/register.html:6 -msgid "Manage absence" -msgstr "" - #: templates/alsijil/class_register/lesson.html:6 msgid "Lesson" msgstr "" @@ -213,6 +248,7 @@ msgid "Late persons:" msgstr "" #: templates/alsijil/class_register/lesson.html:165 +#: templates/alsijil/class_register/person.html:78 #: templates/alsijil/print/full_register.html:287 msgid "Tardiness" msgstr "" @@ -221,50 +257,123 @@ msgstr "" msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/person.html:7 +msgid "Class register: person" +msgstr "" + +#: templates/alsijil/class_register/person.html:11 +#, python-format +msgid "" +"\n" +" Class register overview for %(person)s\n" +" " +msgstr "" + +#: templates/alsijil/class_register/person.html:19 +msgid "Unexcused absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:27 +#: templates/alsijil/class_register/person.html:40 +#: templates/alsijil/class_register/person.html:152 +#: templates/alsijil/class_register/person.html:190 +msgid "Mark as" +msgstr "" + +#: templates/alsijil/class_register/person.html:47 +msgid "There are unexcused lessons." +msgstr "" + +#: templates/alsijil/class_register/person.html:51 +msgid "Statistics on absences, tardiness and remarks" +msgstr "" + +#: templates/alsijil/class_register/person.html:60 +#: templates/alsijil/print/full_register.html:269 +msgid "Absences" +msgstr "" + +#: templates/alsijil/class_register/person.html:64 +#: templates/alsijil/print/full_register.html:274 +msgid "thereof" +msgstr "" + +#: templates/alsijil/class_register/person.html:74 +#: templates/alsijil/print/full_register.html:81 +#: templates/alsijil/print/full_register.html:283 +msgid "Unexcused" +msgstr "" + +#: templates/alsijil/class_register/person.html:94 +#: templates/alsijil/print/full_register.html:304 +msgid "Relevant personal notes" +msgstr "" + +#: templates/alsijil/class_register/person.html:110 +#, python-format +msgid "Week %(week)s" +msgstr "" + +#: templates/alsijil/class_register/person.html:118 +#: templates/alsijil/class_register/person.html:127 +msgid "Mark all as" +msgstr "" + +#: templates/alsijil/class_register/person.html:175 +#, python-format +msgid "%(late)s' late" +msgstr "" + +#: templates/alsijil/class_register/persons.html:22 +msgid "No students available." +msgstr "" + #: templates/alsijil/class_register/week_view.html:6 msgid "Week view" msgstr "" -#: templates/alsijil/class_register/week_view.html:27 +#: templates/alsijil/class_register/week_view.html:30 msgid "Select" msgstr "" -#: templates/alsijil/class_register/week_view.html:33 +#: templates/alsijil/class_register/week_view.html:38 #, python-format -msgid "CW %(week)s: %(instance)s" +msgid "" +"CW %(week)s:\n" +" %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:50 +#: templates/alsijil/class_register/week_view.html:58 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:52 +#: templates/alsijil/class_register/week_view.html:60 msgid "Groups" msgstr "" -#: templates/alsijil/class_register/week_view.html:54 +#: templates/alsijil/class_register/week_view.html:62 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:55 +#: templates/alsijil/class_register/week_view.html:63 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:110 +#: templates/alsijil/class_register/week_view.html:120 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:113 +#: templates/alsijil/class_register/week_view.html:123 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:142 +#: templates/alsijil/class_register/week_view.html:152 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:145 +#: templates/alsijil/class_register/week_view.html:155 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -332,6 +441,13 @@ msgstr "" msgid "Substitution" msgstr "" +#: templates/alsijil/partials/mark_as_buttons.html:4 +#: templates/alsijil/print/full_register.html:335 +#: templates/alsijil/print/full_register.html:424 +#: templates/alsijil/print/full_register.html:439 +msgid "e" +msgstr "" + #: templates/alsijil/print/full_register.html:6 msgid "Class register:" msgstr "" @@ -387,11 +503,6 @@ msgstr "" msgid "Late" msgstr "" -#: templates/alsijil/print/full_register.html:81 -#: templates/alsijil/print/full_register.html:283 -msgid "Unexcused" -msgstr "" - #: templates/alsijil/print/full_register.html:89 msgid "Custom excuse types" msgstr "" @@ -467,18 +578,6 @@ msgstr "" msgid "Absences and tardiness" msgstr "" -#: templates/alsijil/print/full_register.html:269 -msgid "Absences" -msgstr "" - -#: templates/alsijil/print/full_register.html:274 -msgid "thereof" -msgstr "" - -#: templates/alsijil/print/full_register.html:304 -msgid "Relevant personal notes" -msgstr "" - #: templates/alsijil/print/full_register.html:308 msgid "Date" msgstr "" @@ -506,12 +605,6 @@ msgstr "" msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:335 -#: templates/alsijil/print/full_register.html:424 -#: templates/alsijil/print/full_register.html:439 -msgid "e" -msgstr "" - #: templates/alsijil/print/full_register.html:363 msgid "Lesson documentation for week" msgstr "" @@ -524,46 +617,54 @@ msgstr "" msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:94 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:116 +#: views.py:120 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:136 +#: views.py:140 msgid "The personal notes have been saved." msgstr "" -#: views.py:327 +#: views.py:348 msgid "There is no current school term." msgstr "" -#: views.py:463 +#: views.py:513 +msgid "The absences have been marked as excused." +msgstr "" + +#: views.py:528 +msgid "The absence has been marked as excused." +msgstr "" + +#: views.py:633 msgid "The absence has been saved." msgstr "" -#: views.py:488 +#: views.py:658 msgid "The extra mark has been created." msgstr "" -#: views.py:499 +#: views.py:669 msgid "The extra mark has been saved." msgstr "" -#: views.py:509 +#: views.py:679 msgid "The extra mark has been deleted." msgstr "" -#: views.py:529 +#: views.py:699 msgid "The excuse type has been created." msgstr "" -#: views.py:540 +#: views.py:710 msgid "The excuse type has been saved." msgstr "" -#: views.py:550 +#: views.py:720 msgid "The excuse type has been deleted." msgstr "" diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py index a3ec5e9cc443a951ca5ddf4803361bd29e0637f9..d20c88b567ad7d4feb86231eafa4e35d880f9e1c 100644 --- a/aleksis/apps/alsijil/menus.py +++ b/aleksis/apps/alsijil/menus.py @@ -24,6 +24,18 @@ MENUS = { "icon": "view_week", "validators": ["menu_generator.validators.is_authenticated"], }, + { + "name": _("My overview"), + "url": "overview_me", + "icon": "insert_chart", + "validators": ["menu_generator.validators.is_authenticated"], + }, + { + "name": _("My students"), + "url": "my_students", + "icon": "people", + "validators": ["menu_generator.validators.is_authenticated"], + }, { "name": _("Register absence"), "url": "register_absence", diff --git a/aleksis/apps/alsijil/migrations/0007_personal_note_lesson_documentation_year.py b/aleksis/apps/alsijil/migrations/0007_personal_note_lesson_documentation_year.py new file mode 100644 index 0000000000000000000000000000000000000000..4cf8743b0ba5a2e16e0e1dcb491fe49b72dbb9c4 --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0007_personal_note_lesson_documentation_year.py @@ -0,0 +1,55 @@ +# Generated by Django 3.0.9 on 2020-08-15 09:39 + +from django.db import migrations, models + +import aleksis.apps.chronos.util.date + + +def migrate_data(apps, schema_editor): + PersonalNote = apps.get_model("alsijil", "PersonalNote") + LessonDocumentation = apps.get_model("alsijil", "LessonDocumentation") + + db_alias = schema_editor.connection.alias + + for note in PersonalNote.objects.using(db_alias).all(): + year = note.lesson_period.lesson.validity.date_start.year + if note.week < int( + note.lesson_period.lesson.validity.date_start.strftime("%V") + ): + year += 1 + note.year = year + note.save() + + for doc in LessonDocumentation.objects.using(db_alias).all(): + year = doc.lesson_period.lesson.validity.date_start.year + if doc.week < int(doc.lesson_period.lesson.validity.date_start.strftime("%V")): + year += 1 + doc.year = year + doc.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ("alsijil", "0006_delete_personal_notes_filter"), + ] + + operations = [ + migrations.AddField( + model_name="lessondocumentation", + name="year", + field=models.IntegerField( + default=aleksis.apps.chronos.util.date.get_current_year, + verbose_name="Year", + ), + ), + migrations.AddField( + model_name="personalnote", + name="year", + field=models.IntegerField( + default=aleksis.apps.chronos.util.date.get_current_year, + verbose_name="Year", + ), + ), + migrations.RunPython(migrate_data), + ] diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index c53db9756eb99566b88b0ee86c680d7daf74a11e..d31a4ddc3f1da4147947b252ec14f570dc6940db 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -3,6 +3,7 @@ from typing import Dict, Optional, Union from django.db.models import Exists, OuterRef, QuerySet +import reversion from calendarweek import CalendarWeek from aleksis.apps.chronos.models import LessonPeriod @@ -20,6 +21,7 @@ def mark_absent( excused: bool = False, excuse_type: Optional[ExcuseType] = None, remarks: str = "", + to_period: Optional[int] = None, ): """Mark a person absent for all lessons in a day, optionally starting with a selected period number. @@ -41,26 +43,35 @@ def mark_absent( .annotate_week(wanted_week) ) + if to_period: + lesson_periods = lesson_periods.filter(period__period__lte=to_period) + # Create and update all personal notes for the discovered lesson periods for lesson_period in lesson_periods: sub = lesson_period.get_substitution() if sub and sub.is_cancelled: continue - personal_note, created = PersonalNote.objects.update_or_create( - person=self, - lesson_period=lesson_period, - week=wanted_week.week, - defaults={"absent": absent, "excused": excused, "excuse_type": excuse_type}, - ) - personal_note.groups_of_person.set(self.member_of.all()) + with reversion.create_revision(): + personal_note, created = PersonalNote.objects.update_or_create( + person=self, + lesson_period=lesson_period, + week=wanted_week.week, + year=wanted_week.year, + defaults={ + "absent": absent, + "excused": excused, + "excuse_type": excuse_type, + }, + ) + personal_note.groups_of_person.set(self.member_of.all()) - if remarks: - if personal_note.remarks: - personal_note.remarks += "; %s" % remarks - else: - personal_note.remarks = remarks - personal_note.save() + if remarks: + if personal_note.remarks: + personal_note.remarks += "; %s" % remarks + else: + personal_note.remarks = remarks + personal_note.save() @LessonPeriod.method @@ -80,7 +91,10 @@ def get_personal_notes(self, wanted_week: CalendarWeek): missing_persons = Person.objects.annotate( no_personal_notes=~Exists( PersonalNote.objects.filter( - week=wanted_week.week, lesson_period=self, person__pk=OuterRef("pk") + week=wanted_week.week, + year=wanted_week.year, + lesson_period=self, + person__pk=OuterRef("pk"), ) ) ).filter( @@ -91,7 +105,12 @@ def get_personal_notes(self, wanted_week: CalendarWeek): # Create all missing personal notes new_personal_notes = [ - PersonalNote(person=person, lesson_period=self, week=wanted_week.week) + PersonalNote( + person=person, + lesson_period=self, + week=wanted_week.week, + year=wanted_week.year, + ) for person in missing_persons ] PersonalNote.objects.bulk_create(new_personal_notes) @@ -100,7 +119,7 @@ def get_personal_notes(self, wanted_week: CalendarWeek): personal_note.groups_of_person.set(personal_note.person.member_of.all()) return PersonalNote.objects.select_related("person").filter( - lesson_period=self, week=wanted_week.week + lesson_period=self, week=wanted_week.week, year=wanted_week.year ) @@ -112,7 +131,9 @@ def get_lesson_documentation( if not week: week = self.week try: - return LessonDocumentation.objects.get(lesson_period=self, week=week.week) + return LessonDocumentation.objects.get( + lesson_period=self, week=week.week, year=week.year + ) except LessonDocumentation.DoesNotExist: return None @@ -125,7 +146,7 @@ def get_or_create_lesson_documentation( if not week: week = self.week lesson_documentation, created = LessonDocumentation.objects.get_or_create( - lesson_period=self, week=week.week + lesson_period=self, week=week.week, year=week.year ) return lesson_documentation @@ -135,7 +156,7 @@ def get_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: """Get all personal notes of absent persons for this lesson.""" if not week: week = self.week - return self.personal_notes.filter(week=week.week, absent=True) + return self.personal_notes.filter(week=week.week, year=week.year, absent=True) @LessonPeriod.method @@ -143,7 +164,9 @@ def get_excused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: """Get all personal notes of excused absent persons for this lesson.""" if not week: week = self.week - return self.personal_notes.filter(week=week.week, absent=True, excused=True) + return self.personal_notes.filter( + week=week.week, year=week.year, absent=True, excused=True + ) @LessonPeriod.method @@ -151,7 +174,9 @@ def get_unexcused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySe """Get all personal notes of unexcused absent persons for this lesson.""" if not week: week = self.week - return self.personal_notes.filter(week=week.week, absent=True, excused=False) + return self.personal_notes.filter( + week=week.week, year=week.year, absent=True, excused=False + ) @LessonPeriod.method @@ -159,7 +184,7 @@ def get_tardinesses(self, week: Optional[CalendarWeek] = None) -> QuerySet: """Get all personal notes of late persons for this lesson.""" if not week: week = self.week - return self.personal_notes.filter(week=week.week, late__gt=0) + return self.personal_notes.filter(week=week.week, year=week.year, late__gt=0) @LessonPeriod.method @@ -172,7 +197,9 @@ def get_extra_marks( stats = {} for extra_mark in ExtraMark.objects.all(): - qs = self.personal_notes.filter(week=week.week, extra_marks=extra_mark) + qs = self.personal_notes.filter( + week=week.week, year=week.year, extra_marks=extra_mark + ) if qs: stats[extra_mark] = qs diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index 0f0e72bb864590684c8eab5e90eed5eb5f444546..ea951fd97a4a7676d775070440a77e8b1b68783e 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -1,7 +1,14 @@ from django.db import models +from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _ +from calendarweek import CalendarWeek + +from aleksis.apps.chronos.mixins import WeekRelatedMixin +from aleksis.apps.chronos.models import LessonPeriod +from aleksis.apps.chronos.util.date import get_current_year from aleksis.core.mixins import ExtensibleModel +from aleksis.core.util.core_helpers import get_site_preferences def isidentifier(value: str) -> bool: @@ -32,7 +39,7 @@ class ExcuseType(ExtensibleModel): verbose_name_plural = _("Excuse types") -class PersonalNote(ExtensibleModel): +class PersonalNote(ExtensibleModel, WeekRelatedMixin): """A personal note about a single person. Used in the class register to note absences, excuses @@ -45,6 +52,8 @@ class PersonalNote(ExtensibleModel): groups_of_person = models.ManyToManyField("core.Group", related_name="+") week = models.IntegerField() + year = models.IntegerField(verbose_name=_("Year"), default=get_current_year) + lesson_period = models.ForeignKey( "chronos.LessonPeriod", models.CASCADE, related_name="personal_notes" ) @@ -69,14 +78,36 @@ class PersonalNote(ExtensibleModel): def save(self, *args, **kwargs): if self.excuse_type: self.excused = True + if not self.absent: + self.excused = False + self.excuse_type = None super().save(*args, **kwargs) + def reset_values(self): + """Reset all saved data to default values. + + .. warning :: + + This won't save the data, please execute ``save`` extra. + """ + defaults = PersonalNote() + + self.absent = defaults.absent + self.late = defaults.late + self.excused = defaults.excused + self.excuse_type = defaults.excuse_type + self.remarks = defaults.remarks + self.extra_marks.clear() + + def __str__(self): + return f"{date_format(self.date)}, {self.lesson_period}, {self.person}" + class Meta: verbose_name = _("Personal note") verbose_name_plural = _("Personal notes") unique_together = [["lesson_period", "week", "person"]] ordering = [ - "lesson_period__lesson__validity__date_start", + "year", "week", "lesson_period__period__weekday", "lesson_period__period__period", @@ -85,13 +116,15 @@ class PersonalNote(ExtensibleModel): ] -class LessonDocumentation(ExtensibleModel): +class LessonDocumentation(ExtensibleModel, WeekRelatedMixin): """A documentation on a single lesson period. Non-personal, includes the topic and homework of the lesson. """ week = models.IntegerField() + year = models.IntegerField(verbose_name=_("Year"), default=get_current_year) + lesson_period = models.ForeignKey( "chronos.LessonPeriod", models.CASCADE, related_name="documentations" ) @@ -102,12 +135,51 @@ class LessonDocumentation(ExtensibleModel): 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. + + Can be deactivated using site preference ``alsijil__carry_over``. + """ + following_periods = LessonPeriod.objects.filter( + lesson=self.lesson_period.lesson, + period__weekday=self.lesson_period.period.weekday, + period__period__gt=self.lesson_period.period.period, + ) + for period in following_periods: + lesson_documentation = period.get_or_create_lesson_documentation( + CalendarWeek(week=self.week, year=self.year) + ) + + changed = False + + if not lesson_documentation.topic: + lesson_documentation.topic = self.topic + changed = True + + if not lesson_documentation.homework: + lesson_documentation.homework = self.homework + changed = True + + if not lesson_documentation.group_note: + lesson_documentation.group_note = self.group_note + changed = True + + if changed: + lesson_documentation.save() + + def save(self, *args, **kwargs): + if get_site_preferences()["alsijil__carry_over"] and ( + self.topic or self.homework or self.group_note + ): + self._carry_over_data() + super().save(*args, **kwargs) + class Meta: verbose_name = _("Lesson documentation") verbose_name_plural = _("Lesson documentations") unique_together = [["lesson_period", "week"]] ordering = [ - "lesson_period__lesson__validity__date_start", + "year", "week", "lesson_period__period__weekday", "lesson_period__period__period", diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py index e2a55de885f3e415d9b4e461ab3192f899af2398..bcefc075e2ac5025ebaf2b361abe3f2325b16563 100644 --- a/aleksis/apps/alsijil/preferences.py +++ b/aleksis/apps/alsijil/preferences.py @@ -14,3 +14,29 @@ class BlockPersonalNotesForCancelled(BooleanPreference): name = "block_personal_notes_for_cancelled" default = True verbose_name = _("Block adding personal notes for cancelled lessons") + + +@site_preferences_registry.register +class CarryOverDataToNextPeriods(BooleanPreference): + section = alsijil + name = "carry_over" + default = True + verbose_name = _( + "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods" + ) + help_text = _( + "This will carry over data only if the data in the following periods are empty." + ) + + +@site_preferences_registry.register +class AllowOpenPeriodsOnSameDay(BooleanPreference): + section = alsijil + name = "open_periods_same_day" + default = False + verbose_name = _( + "Allow teachers to open lesson periods on the same day and not just at the beginning of the period" + ) + help_text = _( + "Lessons in the past are not affected by this setting, you can open them whenever you want." + ) diff --git a/aleksis/apps/alsijil/templates/alsijil/absences/register.html b/aleksis/apps/alsijil/templates/alsijil/absences/register.html index 908f3b32194889eb206244a30bf3b843a8193309..b14890e21438a6e452c4fa3e6c595f99d5b856dd 100644 --- a/aleksis/apps/alsijil/templates/alsijil/absences/register.html +++ b/aleksis/apps/alsijil/templates/alsijil/absences/register.html @@ -2,8 +2,8 @@ {% extends "core/base.html" %} {% load material_form i18n static %} -{% block browser_title %}{% blocktrans %}Manage absence{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}Manage absence{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Register absence{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Register absence{% endblocktrans %}{% endblock %} {% block content %} @@ -13,4 +13,12 @@ {% include "core/partials/save_button.html" %} </form> + <script> + $(document).ready(function () { + $("#id_date_start").change(function () { + $("#id_date_end").val($("#id_date_start").val()); + $("#id_date_end").change(); + }); + }); + </script> {% endblock %} diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html new file mode 100644 index 0000000000000000000000000000000000000000..dd907383585e258879539a07508a5e9c0aae7b81 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html @@ -0,0 +1,218 @@ +{# -*- engine:django -*- #} +{% extends "core/base.html" %} +{% load data_helpers %} +{% load week_helpers %} +{% load i18n %} + +{% block browser_title %}{% blocktrans %}Class register: person{% endblocktrans %}{% endblock %} + + +{% block page_title %} + {% blocktrans with person=person %} + Class register overview for {{ person }} + {% endblocktrans %} +{% endblock %} + +{% block content %} + <div class="row"> + <div class="col s12 m12 l6"> + <h5>{% trans "Unexcused absences" %}</h5> + + <ul class="collection"> + {% for note in unexcused_absences %} + {% weekday_to_date note.calendar_week note.lesson_period.period.weekday as note_date %} + <li class="collection-item"> + <form action="" method="post" class="right hide-on-small-only" style="margin-top: -7px;"> + {% csrf_token %} + {% trans "Mark as" %} + <input type="hidden" value="{{ note.pk }}" name="personal_note"> + {% include "alsijil/partials/mark_as_buttons.html" %} + <a class="btn-flat red-text" title="{% trans "Delete note" %}" + href="{% url "delete_personal_note" note.pk %}"> + <i class="material-icons center">cancel</i> + </a> + </form> + <i class="material-icons left red-text">warning</i> + <p class="no-margin"> + <a href="{% url "lesson_by_week_and_period" note.year note.week note.lesson_period.pk %}">{{ note_date }}, {{ note.lesson_period }}</a> + </p> + {% if note.remarks %} + <p class="no-margin"><em>{{ note.remarks }}</em></p> + {% endif %} + <form action="" method="post" class="hide-on-med-and-up"> + {% csrf_token %} + {% trans "Mark as" %} + <input type="hidden" value="{{ note.pk }}" name="personal_note"> + {% include "alsijil/partials/mark_as_buttons.html" %} + <a class="btn-flat red-text" title="{% trans "Delete note" %}" + href="{% url "delete_personal_note" note.pk %}"> + <i class="material-icons center">cancel</i> + </a> + </form> + </li> + {% empty %} + <li class="collection-item flow-text"> + {% trans "There are unexcused lessons." %} + </li> + {% endfor %} + </ul> + <h5>{% trans "Statistics on absences, tardiness and remarks" %}</h5> + <ul class="collapsible"> + {% for school_term, stat in stats %} + <li {% if forloop.first %}class="active"{% endif %}> + <div class="collapsible-header"> + <i class="material-icons">date_range</i>{{ school_term }}</div> + <div class="collapsible-body"> + <table> + <tr> + <th colspan="2">{% 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>{{ stat.excused }}</td> + </tr> + {% for excuse_type in excuse_types %} + <th>{{ excuse_type.name }}</th> + <td>{{ stat|get_dict:excuse_type.count_label }}</td> + {% endfor %} + <tr> + <th>{% trans 'Unexcused' %}</th> + <td>{{ stat.unexcused }}</td> + </tr> + <tr> + <th colspan="2">{% trans 'Tardiness' %}</th> + <td>{{ stat.tardiness }}'</td> + </tr> + {% for extra_mark in extra_marks %} + <tr> + <th colspan="2">{{ extra_mark.name }}</th> + <td>{{ stat|get_dict:extra_mark.count_label }}</td> + </tr> + {% endfor %} + </table> + </div> + </li> + {% endfor %} + </ul> + </div> + <div class="col s12 m12 l6"> + <h5>{% trans "Relevant personal notes" %}</h5> + <ul class="collapsible"> + <li> + <div> + <ul> + {% for note in personal_notes %} + {% ifchanged note.lesson_period.lesson.validity.school_term %}</ul></div></li> + <li {% if forloop.first %}class="active"{% endif %}> + <div class="collapsible-header"><i + class="material-icons">date_range</i>{{ note.lesson_period.lesson.validity.school_term }}</div> + <div class="collapsible-body"> + <ul class="collection"> + {% endifchanged %} + + {% ifchanged note.week %} + <li class="collection-item"> + <strong>{% blocktrans with week=note.week %}Week {{ week }}{% endblocktrans %}</strong> + </li> + {% endifchanged %} + {% weekday_to_date note.calendar_week note.lesson_period.period.weekday as note_date %} + {% ifchanged note_date %} + <li class="collection-item"> + <form action="" method="post" class="right hide-on-small-only" style="margin-top: -7px;"> + {% csrf_token %} + {% trans "Mark all as" %} + <input type="hidden" value="{{ note_date|date:"Y-m-d" }}" name="date"> + {% include "alsijil/partials/mark_as_buttons.html" %} + </form> + <i class="material-icons left">schedule</i> + {{ note_date }} + + <form action="" method="post" class="hide-on-med-and-up"> + {% csrf_token %} + {% trans "Mark all as" %} + <input type="hidden" value="{{ note_date|date:"Y-m-d" }}" name="date"> + {% include "alsijil/partials/mark_as_buttons.html" %} + </form> + </li> + {% endifchanged %} + + <li class="collection-item"> + <div class="row no-margin"> + <div class="col s2 m1"> + {{ note.lesson_period.period.period }}. + </div> + + <div class="col s10 m4"> + <i class="material-icons left">event_note</i> + <a href="{% url "lesson_by_week_and_period" note.year note.week note.lesson_period.pk %}"> + {{ note.lesson_period.get_subject.name }}<br/> + {{ note.lesson_period.get_teacher_names }} + </a> + </div> + + <div class="col s12 m7 no-padding"> + {% if note.absent and not note.excused %} + <form action="" method="post" class="right hide-on-small-only" style="margin-top: -7px;"> + {% csrf_token %} + {% trans "Mark as" %} + <input type="hidden" value="{{ note.pk }}" name="personal_note"> + {% include "alsijil/partials/mark_as_buttons.html" %} + <a class="btn-flat red-text" title="{% trans "Delete note" %}" + href="{% url "delete_personal_note" note.pk %}"> + <i class="material-icons center">cancel</i> + </a> + </form> + {% endif %} + + {% if note.absent %} + <div class="chip red white-text"> + {% trans 'Absent' %} + </div> + {% endif %} + {% if note.excused %} + <div class="chip green white-text"> + {% if note.excuse_type %} + {{ note.excuse_type.name }} + {% else %} + {% trans 'Excused' %} + {% endif %} + </div> + {% endif %} + + {% if note.late %} + <div class="chip orange white-text"> + {% blocktrans with late=note.late %}{{ late }}' late{% endblocktrans %} + </div> + {% endif %} + + {% for extra_mark in note.extra_marks.all %} + <div class="chip">{{ extra_mark.name }}</div> + {% endfor %} + + <em>{{ note.remarks }}</em> + + </div> + <div class="col s12 hide-on-med-and-up"> + {% if note.absent and not note.excused %} + <form action="" method="post"> + {% csrf_token %} + {% trans "Mark as" %} + <input type="hidden" value="{{ note.pk }}" name="personal_note"> + {% include "alsijil/partials/mark_as_buttons.html" %} + <a class="btn-flat red-text" title="{% trans "Delete note" %}" + href="{% url "delete_personal_note" note.pk %}"> + <i class="material-icons center">cancel</i> + </a> + </form> + {% endif %} + </div> + </li> + {% endfor %} + </li> + </ul> + </div> + </div> +{% endblock %} diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html b/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html new file mode 100644 index 0000000000000000000000000000000000000000..c3f5e35d48991bafd37ffdc3def7f445d1400247 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/persons.html @@ -0,0 +1,26 @@ +{# -*- engine:django -*- #} +{% extends "core/base.html" %} +{% load data_helpers %} +{% load week_helpers %} +{% load i18n %} + +{% block browser_title %}{% blocktrans %}My students{% endblocktrans %}{% endblock %} + + +{% block page_title %} + {% blocktrans %}My students{% endblocktrans %} +{% endblock %} + +{% block content %} + <div class="collection"> + {% for person in persons %} + <a class="collection-item" href="{% url "overview_person" person.pk %}"> + {{ person }} + </a> + {% empty %} + <li class="collection-item flow-text"> + {% blocktrans %}No students available.{% endblocktrans %} + </li> + {% endfor %} + </div> +{% endblock %} 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 d0761f8102f60e1ea899a8b1ba1d11c1e2402535..ea549f7f15783769f79a9d598304b856481adb18 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html @@ -35,7 +35,8 @@ <div class="row"> - <h4 class="col s12 m6">{% blocktrans with el=el week=week.week %}CW {{ week }}: {{ instance }}{% endblocktrans %} </h4> + <h4 class="col s12 m6">{% blocktrans with el=el week=week.week %}CW {{ week }}: + {{ instance }}{% endblocktrans %} </h4> {% include "chronos/partials/week_select.html" with wanted_week=week %} </div> @@ -111,7 +112,9 @@ {% blocktrans %}Personal notes{% endblocktrans %} </span> {% for person in persons %} - <h5 class="card-title">{{ person.person.full_name }}</h5> + <h5 class="card-title"> + <a href="{% url "overview_person" person.person.pk %}">{{ person.person.full_name }}</a> + </h5> <p class="card-text"> {% trans "Absent" %}: {{ person.person.absences_count }} ({{ person.person.unexcused_count }} {% trans "unexcused" %}) diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/mark_as_buttons.html b/aleksis/apps/alsijil/templates/alsijil/partials/mark_as_buttons.html new file mode 100644 index 0000000000000000000000000000000000000000..5b198afa4bceea55c2b749fa8b3f3b8d88b335e8 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/partials/mark_as_buttons.html @@ -0,0 +1,12 @@ +{% load i18n %} +<button type="submit" class="btn-flat tooltipped" name="excuse_type" value="e" title="{% trans "Excused" %}" + data-position="bottom" data-tooltip="{% trans "Excused" %}" style="width: 50px;"> + {% trans "e" %} +</button> +{% for excuse_type in excuse_types %} + <button type="submit" class="btn-flat tooltipped" value="{{ excuse_type.pk }}" name="excuse_type" + title="{{ excuse_type.name }}" data-position="bottom" data-tooltip="{{ excuse_type.name }}" + style="width: 50px;"> + {{ excuse_type.short_name }} + </button> +{% endfor %} diff --git a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html index 373ae6a88f6f42953dfa0b4ffeceb8a26716104b..03b75de7b70508885bf06f35e42d1058a5c80b1a 100644 --- a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html +++ b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html @@ -319,7 +319,7 @@ {% for note in person.personal_notes.all %} {% if note.lesson_period in lesson_periods %} {% if note.absent or note.late or note.remarks or note.extra_marks.all %} - {% period_to_date note.week note.lesson_period.period as note_date %} + {% weekday_to_date note.calendar_week note.lesson_period.period.weekday as note_date %} <tr> <td>{{ note_date }}</td> <td>{{ note.lesson_period.period.period }}</td> diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py index 7e7139c6c26fe7aa600b6b311b55ae731389c13b..e2bba60a0df002ccf4b110ea8ac5f1e22df8387a 100644 --- a/aleksis/apps/alsijil/urls.py +++ b/aleksis/apps/alsijil/urls.py @@ -26,6 +26,14 @@ urlpatterns = [ path( "print/group/<int:id_>", views.full_register_group, name="full_register_group" ), + path("persons/", views.my_students, name="my_students"), + path("persons/<int:id_>/", views.overview_person, name="overview_person"), + path("me/", views.overview_person, name="overview_me"), + path( + "notes/<int:pk>/delete/", + views.DeletePersonalNoteView.as_view(), + name="delete_personal_note", + ), path("absence/new", views.register_absence, name="register_absence"), path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"), path( diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 9c90ede28c1db9d34a2e7f1bff53e89cb53e3757..ce85d10136b7a1f566b4c4ad27b8afeb9369d35a 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -7,20 +7,22 @@ from django.http import Http404, HttpRequest, HttpResponse, HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse, reverse_lazy from django.utils.translation import ugettext as _ +from django.views.generic import DetailView +import reversion from calendarweek import CalendarWeek from django_tables2 import SingleTableView from reversion.views import RevisionMixin from rules.contrib.views import PermissionRequiredMixin from aleksis.apps.chronos.managers import TimetableType -from aleksis.apps.chronos.models import LessonPeriod +from aleksis.apps.chronos.models import LessonPeriod, TimePeriod from aleksis.apps.chronos.util.chronos_helpers import get_el_by_pk from aleksis.apps.chronos.util.date import get_weeks_for_year, week_weekday_to_date from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView from aleksis.core.models import Group, Person, SchoolTerm from aleksis.core.util import messages -from aleksis.core.util.core_helpers import get_site_preferences +from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional from .forms import ( ExcuseTypeForm, @@ -30,7 +32,7 @@ from .forms import ( RegisterAbsenceForm, SelectForm, ) -from .models import ExcuseType, ExtraMark, LessonDocumentation +from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote from .tables import ExcuseTypeTable, ExtraMarkTable @@ -83,6 +85,10 @@ def lesson( wanted_week[lesson_period.period.weekday], lesson_period.period.time_start, ) > datetime.now() + and not ( + get_site_preferences()["alsijil__open_periods_same_day"] + and wanted_week[lesson_period.period.weekday] <= datetime.now().date() + ) and not request.user.is_superuser ): raise PermissionDenied( @@ -121,7 +127,8 @@ def lesson( or not get_site_preferences()["alsijil__block_personal_notes_for_cancelled"] ): if personal_note_formset.is_valid(): - instances = personal_note_formset.save() + with reversion.create_revision(): + instances = personal_note_formset.save() # Iterate over personal notes and carry changed absences to following lessons for instance in instances: @@ -164,7 +171,10 @@ def week_view( lesson_periods = LessonPeriod.objects.annotate( has_documentation=Exists( LessonDocumentation.objects.filter( - ~Q(topic__exact=""), lesson_period=OuterRef("pk"), week=wanted_week.week + ~Q(topic__exact=""), + lesson_period=OuterRef("pk"), + week=wanted_week.week, + year=wanted_week.year, ) ) ).in_week(wanted_week) @@ -234,6 +244,7 @@ def week_view( filter=Q( personal_notes__lesson_period__in=lesson_periods_pk, personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, personal_notes__absent=True, ), distinct=True, @@ -243,6 +254,7 @@ def week_view( filter=Q( personal_notes__lesson_period__in=lesson_periods_pk, personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, personal_notes__absent=True, personal_notes__excused=False, ), @@ -253,6 +265,7 @@ def week_view( pk=OuterRef("pk"), personal_notes__lesson_period__in=lesson_periods_pk, personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, ) .distinct() .annotate(tardiness_sum=Sum("personal_notes__late")) @@ -269,6 +282,7 @@ def week_view( filter=Q( personal_notes__lesson_period__in=lesson_periods_pk, personal_notes__week=wanted_week.week, + personal_notes__year=wanted_week.year, personal_notes__extra_marks=extra_mark, ), distinct=True, @@ -282,7 +296,9 @@ def week_view( { "person": person, "personal_notes": person.personal_notes.filter( - week=wanted_week.week, lesson_period__in=lesson_periods_pk + week=wanted_week.week, + year=wanted_week.year, + lesson_period__in=lesson_periods_pk, ), } ) @@ -358,17 +374,17 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: ): documentations = list( filter( - lambda d: d.week == week.week, + lambda d: d.week == week.week and d.year == week.year, lesson_period.documentations.all(), ) ) notes = list( filter( - lambda d: d.week == week.week, + lambda d: d.week == week.week and d.year == week.year, lesson_period.personal_notes.all(), ) ) - substitution = lesson_period.get_substitution(week.week) + substitution = lesson_period.get_substitution(week) periods_by_day.setdefault(day, []).append( (lesson_period, documentations, notes, substitution) @@ -445,6 +461,147 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: return render(request, "alsijil/print/full_register.html", context) +def my_students(request: HttpRequest) -> HttpResponse: + context = {} + relevant_groups = ( + Group.objects.for_current_school_term_or_all() + .annotate(lessons_count=Count("lessons")) + .filter(lessons_count__gt=0, owners=request.user.person) + ) + persons = Person.objects.filter(member_of__in=relevant_groups) + context["persons"] = persons + return render(request, "alsijil/class_register/persons.html", context) + + +def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: + context = {} + person = objectgetter_optional( + Person, default="request.user.person", default_eval=True + )(request, id_) + context["person"] = person + + if request.method == "POST": + if request.POST.get("excuse_type"): + # Get excuse type + excuse_type = request.POST["excuse_type"] + found = False + if excuse_type == "e": + excuse_type = None + found = True + else: + try: + excuse_type = ExcuseType.objects.get(pk=int(excuse_type)) + found = True + except (ExcuseType.DoesNotExist, ValueError): + pass + + if found: + if request.POST.get("date"): + # Mark absences on date as excused + try: + date = datetime.strptime( + request.POST["date"], "%Y-%m-%d" + ).date() + + notes = person.personal_notes.filter( + week=date.isocalendar()[1], + lesson_period__period__weekday=date.weekday(), + lesson_period__lesson__validity__date_start__lte=date, + lesson_period__lesson__validity__date_end__gte=date, + absent=True, + excused=False, + ) + for note in notes: + note.excused = True + note.excuse_type = excuse_type + with reversion.create_revision(): + note.save() + + messages.success( + request, _("The absences have been marked as excused.") + ) + except ValueError: + pass + elif request.POST.get("personal_note"): + # Mark specific absence as excused + try: + note = PersonalNote.objects.get( + pk=int(request.POST["personal_note"]) + ) + if note.absent: + note.excused = True + note.excuse_type = excuse_type + with reversion.create_revision(): + note.save() + messages.success( + request, _("The absence has been marked as excused.") + ) + except (PersonalNote.DoesNotExist, ValueError): + pass + + person.refresh_from_db() + + unexcused_absences = person.personal_notes.filter(absent=True, excused=False) + context["unexcused_absences"] = unexcused_absences + + personal_notes = person.personal_notes.filter( + Q(absent=True) | Q(late__gt=0) | ~Q(remarks="") | Q(extra_marks__isnull=False) + ).order_by( + "-lesson_period__lesson__validity__date_start", + "-week", + "lesson_period__period__weekday", + "lesson_period__period__period", + ) + context["personal_notes"] = personal_notes + context["excuse_types"] = ExcuseType.objects.all() + + school_terms = SchoolTerm.objects.all().order_by("-date_start") + stats = [] + for school_term in school_terms: + stat = {} + personal_notes = PersonalNote.objects.filter( + person=person, lesson_period__lesson__validity__school_term=school_term + ) + + if not personal_notes.exists(): + continue + + stat.update( + personal_notes.filter(absent=True).aggregate(absences_count=Count("absent")) + ) + stat.update( + personal_notes.filter( + absent=True, excused=True, excuse_type__isnull=True + ).aggregate(excused=Count("absent")) + ) + stat.update( + personal_notes.filter(absent=True, excused=False).aggregate( + unexcused=Count("absent") + ) + ) + stat.update(personal_notes.aggregate(tardiness=Sum("late"))) + + for extra_mark in ExtraMark.objects.all(): + stat.update( + personal_notes.filter(extra_marks=extra_mark).aggregate( + **{extra_mark.count_label: Count("pk")} + ) + ) + + for excuse_type in ExcuseType.objects.all(): + stat.update( + personal_notes.filter(absent=True, excuse_type=excuse_type).aggregate( + **{excuse_type.count_label: Count("absent")} + ) + ) + + stats.append((school_term, stat)) + context["stats"] = stats + context["excuse_types"] = ExcuseType.objects.all() + context["extra_marks"] = ExtraMark.objects.all() + return render(request, "alsijil/class_register/person.html", context) + + def register_absence(request: HttpRequest) -> HttpResponse: context = {} @@ -457,25 +614,52 @@ def register_absence(request: HttpRequest) -> HttpResponse: start_date = register_absence_form.cleaned_data["date_start"] end_date = register_absence_form.cleaned_data["date_end"] from_period = register_absence_form.cleaned_data["from_period"] + to_period = register_absence_form.cleaned_data["to_period"] absent = register_absence_form.cleaned_data["absent"] excused = register_absence_form.cleaned_data["excused"] + excuse_type = register_absence_form.cleaned_data["excuse_type"] remarks = register_absence_form.cleaned_data["remarks"] # Mark person as absent delta = end_date - start_date for i in range(delta.days + 1): - from_period = from_period if i == 0 else 0 + from_period_on_day = from_period if i == 0 else TimePeriod.period_min + to_period_on_day = ( + to_period if i == delta.days else TimePeriod.period_max + ) day = start_date + timedelta(days=i) - person.mark_absent(day, from_period, absent, excused, remarks) + + person.mark_absent( + day, + from_period_on_day, + absent, + excused, + excuse_type, + remarks, + to_period_on_day, + ) messages.success(request, _("The absence has been saved.")) - return redirect("index") + return redirect("register_absence") context["register_absence_form"] = register_absence_form return render(request, "alsijil/absences/register.html", context) +class DeletePersonalNoteView(DetailView): + model = PersonalNote + template_name = "core/pages/delete.html" + + def post(self, request, *args, **kwargs): + note = self.get_object() + with reversion.create_revision(): + note.reset_values() + note.save() + messages.success(request, _("The personal note has been deleted.")) + return redirect("overview_person", note.person.pk) + + class ExtraMarkListView(SingleTableView, PermissionRequiredMixin): """Table of all extra marks."""