diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..ccc75937408fdbeb5e724bb618e223bb390182a4 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +<!-- AlekSIS is developed on EduGit. GitHub only serves as + backup mirror and to help people find the project. If + possible, please submit your merge request on EduGit! + + EduGit accepts logins with GitHub accounts. +--> + +[ ] I have read the above and have no way to contribute on EduGit +[ ] I understand that GitHub's terms of service exclude young and + learning contributors, but still cannot contribute on EduGit + instead. diff --git a/aleksis/apps/alsijil/data_checks.py b/aleksis/apps/alsijil/data_checks.py index 98decd9aaa5cfac0ace215146ab9740a19a1927b..be36446beaf9d1bfc2474df29242f47a23d9a1c8 100644 --- a/aleksis/apps/alsijil/data_checks.py +++ b/aleksis/apps/alsijil/data_checks.py @@ -56,11 +56,15 @@ class NoPersonalNotesInCancelledLessonsDataCheck(DataCheck): def check_data(cls): from .models import PersonalNote - personal_notes = PersonalNote.objects.filter( - lesson_period__substitutions__cancelled=True, - lesson_period__substitutions__week=F("week"), - lesson_period__substitutions__year=F("year"), - ).prefetch_related("lesson_period", "lesson_period__substitutions") + personal_notes = ( + PersonalNote.objects.not_empty() + .filter( + lesson_period__substitutions__cancelled=True, + lesson_period__substitutions__week=F("week"), + lesson_period__substitutions__year=F("year"), + ) + .prefetch_related("lesson_period", "lesson_period__substitutions") + ) for note in personal_notes: logging.info(f"Check personal note {note}") @@ -119,9 +123,9 @@ class LessonDocumentationOnHolidaysDataCheck(DataCheck): holidays = Holiday.objects.all() - documentations = LessonDocumentation.objects.filter( - ~Q(topic="") | ~Q(group_note="") | ~Q(homework="") - ).annotate(actual_date=weekday_to_date) + documentations = LessonDocumentation.objects.not_empty().annotate( + actual_date=weekday_to_date + ) q = Q() for holiday in holidays: @@ -155,9 +159,7 @@ class PersonalNoteOnHolidaysDataCheck(DataCheck): holidays = Holiday.objects.all() - personal_notes = PersonalNote.objects.filter( - ~Q(remarks="") | Q(absent=True) | ~Q(late=0) | Q(extra_marks__isnull=False) - ).annotate(actual_date=weekday_to_date) + personal_notes = PersonalNote.objects.not_empty().annotate(actual_date=weekday_to_date) q = Q() for holiday in holidays: diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 9624e5208e614319527a95b33feae1fea4e84b6b..228e825bae4e1170a3327629b6c8a973c192f7c0 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -5,17 +5,24 @@ from django.core.exceptions import ValidationError from django.db.models import Count, Q from django.utils.translation import gettext_lazy as _ -from django_global_request.middleware import get_request -from django_select2.forms import Select2Widget +from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, Select2Widget from guardian.shortcuts import get_objects_for_user from material import Fieldset, Layout, Row from aleksis.apps.chronos.managers import TimetableType from aleksis.apps.chronos.models import TimePeriod from aleksis.core.models import Group, Person +from aleksis.core.util.core_helpers import get_site_preferences from aleksis.core.util.predicates import check_global_permission -from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote +from .models import ( + ExcuseType, + ExtraMark, + GroupRole, + GroupRoleAssignment, + LessonDocumentation, + PersonalNote, +) class LessonDocumentationForm(forms.ModelForm): @@ -75,8 +82,8 @@ class SelectForm(forms.Form): data["instance"] = instance return data - def __init__(self, *args, **kwargs): - self.request = get_request() + def __init__(self, request, *args, **kwargs): + self.request = request super().__init__(*args, **kwargs) person = self.request.user.person @@ -138,7 +145,6 @@ class RegisterAbsenceForm(forms.Form): remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False) def __init__(self, *args, **kwargs): - self.request = get_request() super().__init__(*args, **kwargs) period_choices = TimePeriod.period_choices @@ -162,3 +168,89 @@ class ExcuseTypeForm(forms.ModelForm): class Meta: model = ExcuseType fields = ["short_name", "name"] + + +class GroupRoleForm(forms.ModelForm): + layout = Layout("name", "icon", "colour") + + class Meta: + model = GroupRole + fields = ["name", "icon", "colour"] + + +class AssignGroupRoleForm(forms.ModelForm): + layout_base = ["groups", "person", "role", Row("date_start", "date_end")] + + groups = forms.ModelMultipleChoiceField( + label=_("Group"), + required=True, + queryset=Group.objects.all(), + widget=ModelSelect2MultipleWidget( + model=Group, + search_fields=["name__icontains", "short_name__icontains"], + attrs={"data-minimum-input-length": 0, "class": "browser-default",}, + ), + ) + person = forms.ModelChoiceField( + label=_("Person"), + required=True, + queryset=Person.objects.all(), + widget=ModelSelect2Widget( + model=Person, + search_fields=[ + "first_name__icontains", + "last_name__icontains", + "short_name__icontains", + ], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, + ), + ) + + def __init__(self, request, *args, **kwargs): + self.request = request + initial = kwargs.get("initial", {}) + + # Build layout with or without groups field + base_layout = self.layout_base[:] + if "groups" in initial: + base_layout.remove("groups") + self.layout = Layout(*base_layout) + + super().__init__(*args, **kwargs) + + if "groups" in initial: + self.fields["groups"].required = False + + # Filter persons and groups by permissions + if not self.request.user.has_perm("alsijil.assign_grouprole"): # Global permission + persons = Person.objects + if initial.get("groups"): + persons = persons.filter(member_of__in=initial["groups"]) + if get_site_preferences()["alsijil__group_owners_can_assign_roles_to_parents"]: + persons = persons.filter( + Q(member_of__owners=self.request.user.person) + | Q(children__member_of__owners=self.request.user.person) + ) + else: + persons = persons.filter(member_of__owners=self.request.user.person) + self.fields["person"].queryset = persons + + if "groups" not in initial: + groups = Group.objects.for_current_school_term_or_all().filter( + owners=self.request.user.person + ) + self.fields["groups"].queryset = groups + + def clean_groups(self): + """Ensure that only permitted groups are used.""" + return self.initial["groups"] if "groups" in self.initial else self.cleaned_data["groups"] + + class Meta: + model = GroupRoleAssignment + fields = ["groups", "person", "role", "date_start", "date_end"] + + +class GroupRoleAssignmentEditForm(forms.ModelForm): + class Meta: + model = GroupRoleAssignment + fields = ["date_start", "date_end"] diff --git a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po index cc86fc5cf3595ae437aef2bd28e649204b1af4ff..a98f11e58e851ea9d34f885b57c0be53c9f646a9 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-12-05 21:26+0100\n" +"POT-Creation-Date: 2021-01-22 22:01+0100\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,11 +18,63 @@ 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" +#: data_checks.py:15 +msgid "Delete object" +msgstr "" + +#: data_checks.py:25 +msgid "Set current groups" +msgstr "" + +#: data_checks.py:36 +msgid "Reset personal note to defaults" +msgstr "" + +#: data_checks.py:48 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" + +#: data_checks.py:49 +msgid "The personal note is related to a cancelled lesson." +msgstr "" + +#: data_checks.py:72 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" + +#: data_checks.py:73 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "" + +#: data_checks.py:107 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" + +#: data_checks.py:108 +msgid "The lesson documentation is on holidays." +msgstr "" + +#: data_checks.py:143 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" + +#: data_checks.py:144 +msgid "The personal note is on holidays." +msgstr "" + +#: data_checks.py:174 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" + +#: data_checks.py:175 +msgid "The personal note is marked as excused, but not as absent." +msgstr "" + #: forms.py:29 msgid "Homework for the next lesson" msgstr "" -#: forms.py:54 templates/alsijil/class_register/week_view.html:168 +#: forms.py:54 templates/alsijil/class_register/week_view.html:191 #: templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "" @@ -53,16 +105,16 @@ msgid "End period" msgstr "" #: forms.py:130 templates/alsijil/absences/register_confirm.html:52 -#: templates/alsijil/class_register/lesson.html:243 +#: templates/alsijil/class_register/lesson.html:247 #: templates/alsijil/class_register/person.html:207 -#: templates/alsijil/class_register/week_view.html:261 +#: templates/alsijil/class_register/week_view.html:287 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:131 templates/alsijil/absences/register_confirm.html:56 -#: templates/alsijil/class_register/lesson.html:245 +#: templates/alsijil/class_register/lesson.html:249 #: templates/alsijil/class_register/person.html:98 #: templates/alsijil/class_register/person.html:215 #: templates/alsijil/partials/mark_as_buttons.html:2 @@ -73,14 +125,14 @@ msgstr "" msgid "Excused" msgstr "" -#: forms.py:133 models.py:37 models.py:64 -#: templates/alsijil/class_register/lesson.html:246 -#: templates/alsijil/class_register/lesson.html:281 +#: forms.py:133 models.py:45 models.py:79 +#: templates/alsijil/class_register/lesson.html:250 +#: templates/alsijil/class_register/lesson.html:285 msgid "Excuse type" msgstr "" -#: forms.py:138 templates/alsijil/class_register/lesson.html:248 -#: templates/alsijil/class_register/lesson.html:302 +#: forms.py:138 templates/alsijil/class_register/lesson.html:252 +#: templates/alsijil/class_register/lesson.html:306 #: templates/alsijil/print/full_register.html:314 msgid "Remarks" msgstr "" @@ -111,14 +163,14 @@ msgstr "" msgid "My students" msgstr "" -#: menus.py:71 models.py:38 templates/alsijil/excuse_type/list.html:8 +#: menus.py:71 models.py:46 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #: templates/alsijil/partials/legend.html:26 msgid "Excuse types" msgstr "" -#: menus.py:82 models.py:70 models.py:201 -#: templates/alsijil/class_register/lesson.html:247 +#: menus.py:82 models.py:84 models.py:232 +#: templates/alsijil/class_register/lesson.html:251 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 #: templates/alsijil/partials/legend.html:41 @@ -163,75 +215,75 @@ msgstr "" msgid "Can register an absence for a person" msgstr "" -#: models.py:25 models.py:188 +#: models.py:33 models.py:219 msgid "Short name" msgstr "" -#: models.py:26 models.py:189 templates/alsijil/class_register/groups.html:20 +#: models.py:34 models.py:220 templates/alsijil/class_register/groups.html:20 #: templates/alsijil/partials/persons_with_stats.html:14 #: templates/alsijil/partials/persons_with_stats.html:24 msgid "Name" msgstr "" -#: models.py:54 models.py:121 +#: models.py:69 models.py:144 msgid "Year" msgstr "" -#: models.py:101 +#: models.py:122 msgid "Personal note" msgstr "" -#: models.py:102 templates/alsijil/class_register/lesson.html:101 -#: templates/alsijil/class_register/lesson.html:233 -#: templates/alsijil/class_register/week_view.html:68 -#: templates/alsijil/class_register/week_view.html:242 +#: models.py:123 templates/alsijil/class_register/lesson.html:105 +#: templates/alsijil/class_register/lesson.html:237 +#: templates/alsijil/class_register/week_view.html:71 +#: templates/alsijil/class_register/week_view.html:267 msgid "Personal notes" msgstr "" -#: models.py:127 templates/alsijil/class_register/lesson.html:129 -#: templates/alsijil/class_register/week_view.html:90 -#: templates/alsijil/class_register/week_view.html:177 -#: templates/alsijil/print/full_register.html:371 +#: models.py:150 templates/alsijil/class_register/lesson.html:133 +#: templates/alsijil/class_register/week_view.html:106 +#: templates/alsijil/class_register/week_view.html:200 +#: templates/alsijil/print/full_register.html:369 msgid "Lesson topic" msgstr "" -#: models.py:128 templates/alsijil/class_register/lesson.html:137 -#: templates/alsijil/class_register/week_view.html:91 -#: templates/alsijil/class_register/week_view.html:183 -#: templates/alsijil/class_register/week_view.html:216 -#: templates/alsijil/print/full_register.html:372 +#: models.py:151 templates/alsijil/class_register/lesson.html:141 +#: templates/alsijil/class_register/week_view.html:107 +#: templates/alsijil/class_register/week_view.html:206 +#: templates/alsijil/class_register/week_view.html:239 +#: templates/alsijil/print/full_register.html:370 msgid "Homework" msgstr "" -#: models.py:129 templates/alsijil/class_register/lesson.html:145 -#: templates/alsijil/class_register/week_view.html:92 -#: templates/alsijil/class_register/week_view.html:189 -#: templates/alsijil/class_register/week_view.html:222 +#: models.py:152 templates/alsijil/class_register/lesson.html:149 +#: templates/alsijil/class_register/week_view.html:108 +#: templates/alsijil/class_register/week_view.html:212 +#: templates/alsijil/class_register/week_view.html:245 msgid "Group note" msgstr "" -#: models.py:171 templates/alsijil/class_register/lesson.html:97 -#: templates/alsijil/class_register/lesson.html:120 +#: models.py:202 templates/alsijil/class_register/lesson.html:101 +#: templates/alsijil/class_register/lesson.html:124 msgid "Lesson documentation" msgstr "" -#: models.py:172 templates/alsijil/class_register/week_view.html:67 +#: models.py:203 templates/alsijil/class_register/week_view.html:68 msgid "Lesson documentations" msgstr "" -#: models.py:200 +#: models.py:231 msgid "Extra mark" msgstr "" -#: models.py:208 +#: models.py:239 msgid "Can view week overview" msgstr "" -#: models.py:209 +#: models.py:240 msgid "Can register absence" msgstr "" -#: models.py:210 +#: models.py:241 msgid "Can list all personal note filters" msgstr "" @@ -263,6 +315,10 @@ msgstr "" msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." msgstr "" +#: preferences.py:68 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -274,13 +330,13 @@ msgstr "" #: templates/alsijil/absences/register.html:5 #: templates/alsijil/absences/register.html:6 #: templates/alsijil/class_register/person.html:30 -#: templates/alsijil/class_register/week_view.html:256 +#: templates/alsijil/class_register/week_view.html:282 #: templates/alsijil/partials/persons_with_stats.html:115 msgid "Register absence" msgstr "" #: templates/alsijil/absences/register.html:9 -#: templates/alsijil/class_register/lesson.html:242 +#: templates/alsijil/class_register/lesson.html:246 msgid "Person" msgstr "" @@ -382,13 +438,12 @@ msgid "My next lesson" msgstr "" #: templates/alsijil/class_register/lesson.html:46 -#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:171 #, python-format msgid "%(period)s. period" msgstr "" -#: templates/alsijil/class_register/lesson.html:77 -#: templates/alsijil/class_register/lesson.html:359 +#: templates/alsijil/class_register/lesson.html:79 #, python-format msgid "" "\n" @@ -396,8 +451,7 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:85 -#: templates/alsijil/class_register/lesson.html:367 +#: templates/alsijil/class_register/lesson.html:87 #, python-format msgid "" "\n" @@ -405,40 +459,40 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:107 +#: templates/alsijil/class_register/lesson.html:111 msgid "Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:111 -#: templates/alsijil/class_register/lesson.html:342 +#: templates/alsijil/class_register/lesson.html:115 +#: templates/alsijil/class_register/lesson.html:346 msgid "Change history" msgstr "" -#: templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/lesson.html:170 msgid "Overview: Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:173 +#: templates/alsijil/class_register/lesson.html:177 msgid "Lesson topic of previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:180 +#: templates/alsijil/class_register/lesson.html:184 msgid "Homework for this lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:187 +#: templates/alsijil/class_register/lesson.html:191 msgid "Group notes for previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:194 +#: templates/alsijil/class_register/lesson.html:198 msgid "Absent persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:201 +#: templates/alsijil/class_register/lesson.html:205 msgid "Late persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:244 +#: templates/alsijil/class_register/lesson.html:248 #: templates/alsijil/class_register/person.html:110 #: templates/alsijil/partials/persons_with_stats.html:17 #: templates/alsijil/partials/persons_with_stats.html:34 @@ -447,10 +501,33 @@ msgstr "" msgid "Tardiness" msgstr "" -#: templates/alsijil/class_register/lesson.html:267 +#: templates/alsijil/class_register/lesson.html:271 msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/lesson.html:364 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:372 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:387 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" + #: templates/alsijil/class_register/person.html:8 msgid "Class register: person" msgstr "" @@ -555,44 +632,44 @@ msgid "" " %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:84 +#: templates/alsijil/class_register/week_view.html:100 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:86 +#: templates/alsijil/class_register/week_view.html:102 msgid "Groups" msgstr "" -#: templates/alsijil/class_register/week_view.html:88 -#: templates/alsijil/class_register/week_view.html:163 +#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:186 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:89 -#: templates/alsijil/class_register/week_view.html:173 +#: templates/alsijil/class_register/week_view.html:105 +#: templates/alsijil/class_register/week_view.html:196 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:262 +#: templates/alsijil/class_register/week_view.html:288 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:265 +#: templates/alsijil/class_register/week_view.html:291 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:268 +#: templates/alsijil/class_register/week_view.html:294 #: templates/alsijil/partials/persons_with_stats.html:94 msgid "Count of tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:297 +#: templates/alsijil/class_register/week_view.html:323 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:300 +#: templates/alsijil/class_register/week_view.html:326 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -661,7 +738,7 @@ msgid "Data complete" msgstr "" #: templates/alsijil/partials/lesson_status_icon.html:12 -#: templates/alsijil/print/full_register.html:406 +#: templates/alsijil/print/full_register.html:404 msgid "Lesson cancelled" msgstr "" @@ -678,9 +755,9 @@ 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 +#: templates/alsijil/print/full_register.html:334 +#: templates/alsijil/print/full_register.html:422 +#: templates/alsijil/print/full_register.html:437 msgid "e" msgstr "" @@ -836,17 +913,17 @@ msgid "Date" msgstr "" #: templates/alsijil/print/full_register.html:309 -#: templates/alsijil/print/full_register.html:369 +#: templates/alsijil/print/full_register.html:367 msgid "Pe." msgstr "" #: templates/alsijil/print/full_register.html:310 -#: templates/alsijil/print/full_register.html:370 +#: templates/alsijil/print/full_register.html:368 msgid "Subj." msgstr "" #: templates/alsijil/print/full_register.html:311 -#: templates/alsijil/print/full_register.html:374 +#: templates/alsijil/print/full_register.html:372 msgid "Te." msgstr "" @@ -854,70 +931,70 @@ msgstr "" msgid "Tard." msgstr "" -#: templates/alsijil/print/full_register.html:330 +#: templates/alsijil/print/full_register.html:329 msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:363 +#: templates/alsijil/print/full_register.html:361 msgid "Lesson documentation for week" msgstr "" -#: templates/alsijil/print/full_register.html:373 +#: templates/alsijil/print/full_register.html:371 msgid "Notes" msgstr "" -#: views.py:65 +#: views.py:68 msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:93 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:127 +#: views.py:141 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:151 +#: views.py:165 msgid "The personal notes have been saved." msgstr "" -#: views.py:570 +#: views.py:591 msgid "The absences have been marked as excused." msgstr "" -#: views.py:585 +#: views.py:606 msgid "The absence has been marked as excused." msgstr "" -#: views.py:721 +#: views.py:749 msgid "The absence has been saved." msgstr "" -#: views.py:741 +#: views.py:770 msgid "The personal note has been deleted." msgstr "" -#: views.py:762 +#: views.py:792 msgid "The extra mark has been created." msgstr "" -#: views.py:773 +#: views.py:804 msgid "The extra mark has been saved." msgstr "" -#: views.py:783 +#: views.py:815 msgid "The extra mark has been deleted." msgstr "" -#: views.py:803 +#: views.py:836 msgid "The excuse type has been created." msgstr "" -#: views.py:814 +#: views.py:848 msgid "The excuse type has been saved." msgstr "" -#: views.py:824 +#: views.py:859 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 add03b74eeb7a5e69c3c19dce2a7bedb2038c90d..d08013a0fb09c1e5dc6a9d3b254bb9e090124963 100644 --- a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po +++ b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-12-05 21:26+0100\n" -"PO-Revision-Date: 2020-12-05 20:56+0000\n" -"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" +"POT-Creation-Date: 2021-01-22 22:01+0100\n" +"PO-Revision-Date: 2021-02-06 22:49+0000\n" +"Last-Translator: Dominik George <dominik.george@teckids.org>\n" "Language-Team: German <https://translate.edugit.org/projects/aleksis/" "aleksis-app-alsijil/de/>\n" "Language: de_DE\n" @@ -17,13 +17,76 @@ 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.3.2\n" +"X-Generator: Weblate 4.4\n" + +#: data_checks.py:15 +msgid "Delete object" +msgstr "Objekt löschen" + +#: data_checks.py:25 +msgid "Set current groups" +msgstr "Aktuelle Gruppen setzen" + +#: data_checks.py:36 +msgid "Reset personal note to defaults" +msgstr "Persönliche Notiz zurücksetzen" + +#: data_checks.py:48 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" +"Sicherstellen, dass es keine persönlichen Notizen in ausgefallenen Stunden " +"gibt" + +#: data_checks.py:49 +msgid "The personal note is related to a cancelled lesson." +msgstr "Die persönliche Notiz ist einer ausgefallenen Stunde zugeordnet." + +#: data_checks.py:72 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" +"Sicherstellen, dass \"groups_of_person\" für alle persönlichen Notizen " +"gesetzt ist" + +#: data_checks.py:73 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "Die persönliche Notiz hat keine Gruppe in \"groups_of_person\"." + +#: data_checks.py:107 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" +"Sicherstellen, dass es keine ausgefüllten Stundendokumentationen in den " +"Ferien gibt" + +#: data_checks.py:108 +msgid "The lesson documentation is on holidays." +msgstr "Die Stundendokumentation ist in den Ferien." + +#: data_checks.py:143 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" +"Sicherstellen, dass es keine ausgefüllten persönlichen Notizen in den Ferien " +"gibt" + +#: data_checks.py:144 +msgid "The personal note is on holidays." +msgstr "Die persönliche Notiz ist in den Ferien." + +#: data_checks.py:174 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" +"Sicherstellen, dass es keine entschuldigten persönlichen Notizen ohne eine " +"Absenz gibt" + +#: data_checks.py:175 +msgid "The personal note is marked as excused, but not as absent." +msgstr "" +"Die persönliche Notiz ist als entschuldigt, aber nicht als abwesend markiert." #: forms.py:29 msgid "Homework for the next lesson" msgstr "Hausaufgabe zur nächsten Stunde" -#: forms.py:54 templates/alsijil/class_register/week_view.html:168 +#: forms.py:54 templates/alsijil/class_register/week_view.html:191 #: templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "Gruppe" @@ -54,16 +117,16 @@ msgid "End period" msgstr "Endstunde" #: forms.py:130 templates/alsijil/absences/register_confirm.html:52 -#: templates/alsijil/class_register/lesson.html:243 +#: templates/alsijil/class_register/lesson.html:247 #: templates/alsijil/class_register/person.html:207 -#: templates/alsijil/class_register/week_view.html:261 +#: templates/alsijil/class_register/week_view.html:287 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "Abwesend" #: forms.py:131 templates/alsijil/absences/register_confirm.html:56 -#: templates/alsijil/class_register/lesson.html:245 +#: templates/alsijil/class_register/lesson.html:249 #: templates/alsijil/class_register/person.html:98 #: templates/alsijil/class_register/person.html:215 #: templates/alsijil/partials/mark_as_buttons.html:2 @@ -74,14 +137,14 @@ msgstr "Abwesend" msgid "Excused" msgstr "Entschuldigt" -#: forms.py:133 models.py:37 models.py:64 -#: templates/alsijil/class_register/lesson.html:246 -#: templates/alsijil/class_register/lesson.html:281 +#: forms.py:133 models.py:45 models.py:79 +#: templates/alsijil/class_register/lesson.html:250 +#: templates/alsijil/class_register/lesson.html:285 msgid "Excuse type" msgstr "Entschuldigungsart" -#: forms.py:138 templates/alsijil/class_register/lesson.html:248 -#: templates/alsijil/class_register/lesson.html:302 +#: forms.py:138 templates/alsijil/class_register/lesson.html:252 +#: templates/alsijil/class_register/lesson.html:306 #: templates/alsijil/print/full_register.html:314 msgid "Remarks" msgstr "Bemerkungen" @@ -110,16 +173,16 @@ msgstr "Meine Übersicht" #: menus.py:60 templates/alsijil/class_register/persons.html:5 #: templates/alsijil/class_register/persons.html:9 msgid "My students" -msgstr "Meine Schüler*innen" +msgstr "Meine Schülerinnen und Schüler" -#: menus.py:71 models.py:38 templates/alsijil/excuse_type/list.html:8 +#: menus.py:71 models.py:46 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #: templates/alsijil/partials/legend.html:26 msgid "Excuse types" msgstr "Entschuldigungsarten" -#: menus.py:82 models.py:70 models.py:201 -#: templates/alsijil/class_register/lesson.html:247 +#: menus.py:82 models.py:84 models.py:232 +#: templates/alsijil/class_register/lesson.html:251 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 #: templates/alsijil/partials/legend.html:41 @@ -164,75 +227,75 @@ msgstr "Kann eine Absenz für alle Mitglieder eine Gruppe registrieren" msgid "Can register an absence for a person" msgstr "Kann eine Absenz für eine Person registrieren" -#: models.py:25 models.py:188 +#: models.py:33 models.py:219 msgid "Short name" msgstr "Kurzname" -#: models.py:26 models.py:189 templates/alsijil/class_register/groups.html:20 +#: models.py:34 models.py:220 templates/alsijil/class_register/groups.html:20 #: templates/alsijil/partials/persons_with_stats.html:14 #: templates/alsijil/partials/persons_with_stats.html:24 msgid "Name" msgstr "Name" -#: models.py:54 models.py:121 +#: models.py:69 models.py:144 msgid "Year" msgstr "Jahr" -#: models.py:101 +#: models.py:122 msgid "Personal note" msgstr "Persönliche Notiz" -#: models.py:102 templates/alsijil/class_register/lesson.html:101 -#: templates/alsijil/class_register/lesson.html:233 -#: templates/alsijil/class_register/week_view.html:68 -#: templates/alsijil/class_register/week_view.html:242 +#: models.py:123 templates/alsijil/class_register/lesson.html:105 +#: templates/alsijil/class_register/lesson.html:237 +#: templates/alsijil/class_register/week_view.html:71 +#: templates/alsijil/class_register/week_view.html:267 msgid "Personal notes" msgstr "Persönliche Notizen" -#: models.py:127 templates/alsijil/class_register/lesson.html:129 -#: templates/alsijil/class_register/week_view.html:90 -#: templates/alsijil/class_register/week_view.html:177 -#: templates/alsijil/print/full_register.html:371 +#: models.py:150 templates/alsijil/class_register/lesson.html:133 +#: templates/alsijil/class_register/week_view.html:106 +#: templates/alsijil/class_register/week_view.html:200 +#: templates/alsijil/print/full_register.html:369 msgid "Lesson topic" msgstr "Stundenthema" -#: models.py:128 templates/alsijil/class_register/lesson.html:137 -#: templates/alsijil/class_register/week_view.html:91 -#: templates/alsijil/class_register/week_view.html:183 -#: templates/alsijil/class_register/week_view.html:216 -#: templates/alsijil/print/full_register.html:372 +#: models.py:151 templates/alsijil/class_register/lesson.html:141 +#: templates/alsijil/class_register/week_view.html:107 +#: templates/alsijil/class_register/week_view.html:206 +#: templates/alsijil/class_register/week_view.html:239 +#: templates/alsijil/print/full_register.html:370 msgid "Homework" msgstr "Hausaufgaben" -#: models.py:129 templates/alsijil/class_register/lesson.html:145 -#: templates/alsijil/class_register/week_view.html:92 -#: templates/alsijil/class_register/week_view.html:189 -#: templates/alsijil/class_register/week_view.html:222 +#: models.py:152 templates/alsijil/class_register/lesson.html:149 +#: templates/alsijil/class_register/week_view.html:108 +#: templates/alsijil/class_register/week_view.html:212 +#: templates/alsijil/class_register/week_view.html:245 msgid "Group note" msgstr "Gruppennotiz" -#: models.py:171 templates/alsijil/class_register/lesson.html:97 -#: templates/alsijil/class_register/lesson.html:120 +#: models.py:202 templates/alsijil/class_register/lesson.html:101 +#: templates/alsijil/class_register/lesson.html:124 msgid "Lesson documentation" msgstr "Stunden-Dokumentation" -#: models.py:172 templates/alsijil/class_register/week_view.html:67 +#: models.py:203 templates/alsijil/class_register/week_view.html:68 msgid "Lesson documentations" msgstr "Stunden-Dokumentationen" -#: models.py:200 +#: models.py:231 msgid "Extra mark" msgstr "Zusätzliche Markierung" -#: models.py:208 +#: models.py:239 msgid "Can view week overview" msgstr "Kann die Wochenübersicht sehen" -#: models.py:209 +#: models.py:240 msgid "Can register absence" msgstr "Kann eine Absenz registrieren" -#: models.py:210 +#: models.py:241 msgid "Can list all personal note filters" msgstr "Kann alle Filter für persönliche Notizen anzeigen" @@ -264,6 +327,10 @@ msgstr "Erlaube Lehrkräften, Unterrichtsstunden bereits am gleichen Tag und nic 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." +#: preferences.py:68 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "Lehrkräften erlauben, Daten für Stunden in den Ferien hinzuzufügen" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "Bearbeiten" @@ -275,13 +342,13 @@ msgstr "Löschen" #: templates/alsijil/absences/register.html:5 #: templates/alsijil/absences/register.html:6 #: templates/alsijil/class_register/person.html:30 -#: templates/alsijil/class_register/week_view.html:256 +#: templates/alsijil/class_register/week_view.html:282 #: templates/alsijil/partials/persons_with_stats.html:115 msgid "Register absence" msgstr "Abwesenheit eintragen" #: templates/alsijil/absences/register.html:9 -#: templates/alsijil/class_register/lesson.html:242 +#: templates/alsijil/class_register/lesson.html:246 msgid "Person" msgstr "Person" @@ -324,8 +391,7 @@ msgid "" " " msgstr "" "\n" -" Es gibt keine betroffenen Stunden. Das Eintragen dieser " -"Abwesenheit wird keinen Effekt haben.\n" +" Es gibt keine betroffenen Stunden. Das Eintragen dieser Abwesenheit wird keinen Effekt haben.\n" " " #: templates/alsijil/absences/register_confirm.html:59 @@ -338,14 +404,14 @@ msgstr "Abbrechen" #: templates/alsijil/class_register/groups.html:21 msgid "Students" -msgstr "Schüler*innen" +msgstr "Schülerinnen und Schüler" #: templates/alsijil/class_register/groups.html:35 #: templates/alsijil/class_register/groups.html:69 #: templates/alsijil/class_register/week_view.html:40 #: templates/alsijil/class_register/week_view.html:51 msgid "Students list" -msgstr "Schüler*innenliste" +msgstr "Liste der Schülerinnen und Schüler" #: templates/alsijil/class_register/groups.html:39 #: templates/alsijil/class_register/groups.html:75 @@ -375,7 +441,7 @@ msgstr "Keine Gruppen verfügbar." #: templates/alsijil/class_register/groups.html:64 msgid "students" -msgstr "Schüler*innen" +msgstr "Schülerinnen und Schüler" #: templates/alsijil/class_register/lesson.html:5 msgid "Lesson" @@ -394,13 +460,12 @@ msgid "My next lesson" msgstr "Meine nächste Stunde" #: templates/alsijil/class_register/lesson.html:46 -#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:171 #, python-format msgid "%(period)s. period" msgstr "%(period)s. Stunde" -#: templates/alsijil/class_register/lesson.html:77 -#: templates/alsijil/class_register/lesson.html:359 +#: templates/alsijil/class_register/lesson.html:79 #, python-format msgid "" "\n" @@ -411,8 +476,7 @@ msgstr "" " Vorherige %(subject)s Stunde\n" " " -#: templates/alsijil/class_register/lesson.html:85 -#: templates/alsijil/class_register/lesson.html:367 +#: templates/alsijil/class_register/lesson.html:87 #, python-format msgid "" "\n" @@ -423,40 +487,40 @@ msgstr "" " Nächste %(subject)s Stunde\n" " " -#: templates/alsijil/class_register/lesson.html:107 +#: templates/alsijil/class_register/lesson.html:111 msgid "Previous lesson" msgstr "Vorherige Unterrichtsstunde" -#: templates/alsijil/class_register/lesson.html:111 -#: templates/alsijil/class_register/lesson.html:342 +#: templates/alsijil/class_register/lesson.html:115 +#: templates/alsijil/class_register/lesson.html:346 msgid "Change history" msgstr "Veränderungen" -#: templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/lesson.html:170 msgid "Overview: Previous lesson" msgstr "Übersicht: Vorherige Stunde" -#: templates/alsijil/class_register/lesson.html:173 +#: templates/alsijil/class_register/lesson.html:177 msgid "Lesson topic of previous lesson:" msgstr "Stundenthema der vorherigen Stunde:" -#: templates/alsijil/class_register/lesson.html:180 +#: templates/alsijil/class_register/lesson.html:184 msgid "Homework for this lesson:" msgstr "Hausaufgaben zu dieser Stunde:" -#: templates/alsijil/class_register/lesson.html:187 +#: templates/alsijil/class_register/lesson.html:191 msgid "Group notes for previous lesson:" msgstr "Gruppennotizen für die vorherige Stunde:" -#: templates/alsijil/class_register/lesson.html:194 +#: templates/alsijil/class_register/lesson.html:198 msgid "Absent persons:" msgstr "Abwesende Personen:" -#: templates/alsijil/class_register/lesson.html:201 +#: templates/alsijil/class_register/lesson.html:205 msgid "Late persons:" msgstr "Verspätete Personen:" -#: templates/alsijil/class_register/lesson.html:244 +#: templates/alsijil/class_register/lesson.html:248 #: templates/alsijil/class_register/person.html:110 #: templates/alsijil/partials/persons_with_stats.html:17 #: templates/alsijil/partials/persons_with_stats.html:34 @@ -465,10 +529,43 @@ msgstr "Verspätete Personen:" msgid "Tardiness" msgstr "Verspätung" -#: templates/alsijil/class_register/lesson.html:267 +#: templates/alsijil/class_register/lesson.html:271 msgid "Tardiness (in m)" msgstr "Verspätung (in m)" +#: templates/alsijil/class_register/lesson.html:364 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" +"\n" +" Vorherige %(subject)s Stunde\n" +" " + +#: templates/alsijil/class_register/lesson.html:372 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" +"\n" +" Nächste %(subject)s Stunde\n" +" " + +#: templates/alsijil/class_register/lesson.html:387 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" +"\n" +" Diese Stunde ist in den Ferien und kann somit nicht " +"bearbeitet werden.\n" +" " + #: templates/alsijil/class_register/person.html:8 msgid "Class register: person" msgstr "Klassenbuch: Person" @@ -563,7 +660,7 @@ msgstr "%(late)s' verspätet" #: templates/alsijil/class_register/students_list.html:12 #, python-format msgid "Students list: %(group)s" -msgstr "Schüler*innenliste: %(group)s" +msgstr "Liste der Schülerinnen und Schüler: %(group)s" #: templates/alsijil/class_register/week_view.html:23 msgid "Select" @@ -578,44 +675,44 @@ msgstr "" "KW %(week)s: \n" "%(instance)s" -#: templates/alsijil/class_register/week_view.html:84 +#: templates/alsijil/class_register/week_view.html:100 msgid "Period" msgstr "Stunde" -#: templates/alsijil/class_register/week_view.html:86 +#: templates/alsijil/class_register/week_view.html:102 msgid "Groups" msgstr "Gruppen" -#: templates/alsijil/class_register/week_view.html:88 -#: templates/alsijil/class_register/week_view.html:163 +#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:186 #: 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:89 -#: templates/alsijil/class_register/week_view.html:173 +#: templates/alsijil/class_register/week_view.html:105 +#: templates/alsijil/class_register/week_view.html:196 msgid "Teachers" msgstr "Lehrkräfte" -#: templates/alsijil/class_register/week_view.html:262 +#: templates/alsijil/class_register/week_view.html:288 msgid "unexcused" msgstr "unentschuldigt" -#: templates/alsijil/class_register/week_view.html:265 +#: templates/alsijil/class_register/week_view.html:291 msgid "Summed up tardiness" msgstr "Summierte Verspätung" -#: templates/alsijil/class_register/week_view.html:268 +#: templates/alsijil/class_register/week_view.html:294 #: templates/alsijil/partials/persons_with_stats.html:94 msgid "Count of tardiness" msgstr "Anzahl der Verspätungen" -#: templates/alsijil/class_register/week_view.html:297 +#: templates/alsijil/class_register/week_view.html:323 msgid "No lessons available" msgstr "Keine Stunden verfügbar" -#: templates/alsijil/class_register/week_view.html:300 +#: templates/alsijil/class_register/week_view.html:326 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -691,7 +788,7 @@ msgid "Data complete" msgstr "Daten vollständig" #: templates/alsijil/partials/lesson_status_icon.html:12 -#: templates/alsijil/print/full_register.html:406 +#: templates/alsijil/print/full_register.html:404 msgid "Lesson cancelled" msgstr "Stunde ist ausgefallen" @@ -708,15 +805,15 @@ 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 +#: templates/alsijil/print/full_register.html:334 +#: templates/alsijil/print/full_register.html:422 +#: templates/alsijil/print/full_register.html:437 msgid "e" msgstr "e" #: templates/alsijil/partials/persons_with_stats.html:7 msgid "No students available." -msgstr "Keine Schüler*innen verfügbar." +msgstr "Keine Schülerinnen und Schüler verfügbar." #: templates/alsijil/partials/persons_with_stats.html:15 #: templates/alsijil/partials/persons_with_stats.html:25 @@ -880,17 +977,17 @@ msgid "Date" msgstr "Datum" #: templates/alsijil/print/full_register.html:309 -#: templates/alsijil/print/full_register.html:369 +#: templates/alsijil/print/full_register.html:367 msgid "Pe." msgstr "Std." #: templates/alsijil/print/full_register.html:310 -#: templates/alsijil/print/full_register.html:370 +#: templates/alsijil/print/full_register.html:368 msgid "Subj." msgstr "Fa." #: templates/alsijil/print/full_register.html:311 -#: templates/alsijil/print/full_register.html:374 +#: templates/alsijil/print/full_register.html:372 msgid "Te." msgstr "Lk." @@ -898,73 +995,73 @@ msgstr "Lk." msgid "Tard." msgstr "Verspät." -#: templates/alsijil/print/full_register.html:330 +#: templates/alsijil/print/full_register.html:329 msgid "Yes" msgstr "Ja" -#: templates/alsijil/print/full_register.html:363 +#: templates/alsijil/print/full_register.html:361 msgid "Lesson documentation for week" msgstr "Unterrichtsdokumentation für Woche" -#: templates/alsijil/print/full_register.html:373 +#: templates/alsijil/print/full_register.html:371 msgid "Notes" msgstr "Notizen" -#: views.py:65 +#: views.py:68 msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" "Sie haben eine ungültige Stunde ausgewählt oder es\n" " läuft momentan keine Stunde." -#: views.py:90 +#: views.py:93 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:127 +#: views.py:141 msgid "The lesson documentation has been saved." msgstr "Die Stunden-Dokumentation wurde gespeichert." -#: views.py:151 +#: views.py:165 msgid "The personal notes have been saved." msgstr "Die persönlichen Notizen wurden gespeichert." -#: views.py:570 +#: views.py:591 msgid "The absences have been marked as excused." msgstr "Die Fehlzeiten wurden als entschuldigt markiert." -#: views.py:585 +#: views.py:606 msgid "The absence has been marked as excused." msgstr "Die Fehlzeit wurde als entschuldigt markiert." -#: views.py:721 +#: views.py:749 msgid "The absence has been saved." msgstr "Die Abwesenheit wurde gespeichert." -#: views.py:741 +#: views.py:770 msgid "The personal note has been deleted." msgstr "Die persönliche Notiz wurde gelöscht." -#: views.py:762 +#: views.py:792 msgid "The extra mark has been created." msgstr "Die zusätzliche Markierung wurde erstellt." -#: views.py:773 +#: views.py:804 msgid "The extra mark has been saved." msgstr "Die zusätzliche Markierung wurde gespeichert." -#: views.py:783 +#: views.py:815 msgid "The extra mark has been deleted." msgstr "Die zusätzliche Markierung wurde gelöscht." -#: views.py:803 +#: views.py:836 msgid "The excuse type has been created." msgstr "Die Entschuldigungsart wurde erstellt." -#: views.py:814 +#: views.py:848 msgid "The excuse type has been saved." msgstr "Die Entschuldigunsart wurde gespeichert." -#: views.py:824 +#: views.py:859 msgid "The excuse type has been deleted." msgstr "Die Entschuldigungsart wurde gelöscht." diff --git a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po index 404d2879d67b75879d9fbae9e3f467a4f78e4f96..d848e625848478871d3a2f37c74f913a506feaef 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-12-05 21:26+0100\n" +"POT-Creation-Date: 2021-01-22 22:01+0100\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,11 +18,73 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.0.1\n" +#: data_checks.py:15 +msgid "Delete object" +msgstr "" + +#: data_checks.py:25 +msgid "Set current groups" +msgstr "" + +#: data_checks.py:36 +#, fuzzy +#| msgid "Relevant personal notes" +msgid "Reset personal note to defaults" +msgstr "Notes personnelles importantes" + +#: data_checks.py:48 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" + +#: data_checks.py:49 +#, fuzzy +#| msgid "Lesson documentation for calendar week" +msgid "The personal note is related to a cancelled lesson." +msgstr "Documentation de cours pour la semaine calendrier" + +#: data_checks.py:72 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" + +#: data_checks.py:73 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "" + +#: data_checks.py:107 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" + +#: data_checks.py:108 +#, fuzzy +#| msgid "Lesson documentation for calendar week" +msgid "The lesson documentation is on holidays." +msgstr "Documentation de cours pour la semaine calendrier" + +#: data_checks.py:143 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" + +#: data_checks.py:144 +#, fuzzy +#| msgid "Lesson documentation for calendar week" +msgid "The personal note is on holidays." +msgstr "Documentation de cours pour la semaine calendrier" + +#: data_checks.py:174 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" + +#: data_checks.py:175 +#, fuzzy +#| msgid "Lesson documentation for calendar week" +msgid "The personal note is marked as excused, but not as absent." +msgstr "Documentation de cours pour la semaine calendrier" + #: forms.py:29 msgid "Homework for the next lesson" msgstr "" -#: forms.py:54 templates/alsijil/class_register/week_view.html:168 +#: forms.py:54 templates/alsijil/class_register/week_view.html:191 #: templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "Groupe" @@ -57,16 +119,16 @@ msgid "End period" msgstr "De la période" #: forms.py:130 templates/alsijil/absences/register_confirm.html:52 -#: templates/alsijil/class_register/lesson.html:243 +#: templates/alsijil/class_register/lesson.html:247 #: templates/alsijil/class_register/person.html:207 -#: templates/alsijil/class_register/week_view.html:261 +#: templates/alsijil/class_register/week_view.html:287 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "Absent(e)" #: forms.py:131 templates/alsijil/absences/register_confirm.html:56 -#: templates/alsijil/class_register/lesson.html:245 +#: templates/alsijil/class_register/lesson.html:249 #: templates/alsijil/class_register/person.html:98 #: templates/alsijil/class_register/person.html:215 #: templates/alsijil/partials/mark_as_buttons.html:2 @@ -77,16 +139,16 @@ msgstr "Absent(e)" msgid "Excused" msgstr "Excusé" -#: forms.py:133 models.py:37 models.py:64 -#: templates/alsijil/class_register/lesson.html:246 -#: templates/alsijil/class_register/lesson.html:281 +#: forms.py:133 models.py:45 models.py:79 +#: templates/alsijil/class_register/lesson.html:250 +#: templates/alsijil/class_register/lesson.html:285 #, fuzzy #| msgid "Excused" msgid "Excuse type" msgstr "Excusé" -#: forms.py:138 templates/alsijil/class_register/lesson.html:248 -#: templates/alsijil/class_register/lesson.html:302 +#: forms.py:138 templates/alsijil/class_register/lesson.html:252 +#: templates/alsijil/class_register/lesson.html:306 #: templates/alsijil/print/full_register.html:314 msgid "Remarks" msgstr "Remarque" @@ -121,7 +183,7 @@ msgstr "Vue d'ensemble personnelle" msgid "My students" msgstr "" -#: menus.py:71 models.py:38 templates/alsijil/excuse_type/list.html:8 +#: menus.py:71 models.py:46 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #: templates/alsijil/partials/legend.html:26 #, fuzzy @@ -129,8 +191,8 @@ msgstr "" msgid "Excuse types" msgstr "Excusé" -#: menus.py:82 models.py:70 models.py:201 -#: templates/alsijil/class_register/lesson.html:247 +#: menus.py:82 models.py:84 models.py:232 +#: templates/alsijil/class_register/lesson.html:251 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 #: templates/alsijil/partials/legend.html:41 @@ -185,85 +247,85 @@ msgstr "" msgid "Can register an absence for a person" msgstr "Registre de la classe" -#: models.py:25 models.py:188 +#: models.py:33 models.py:219 #, fuzzy #| msgid "First name" msgid "Short name" msgstr "Prénom" -#: models.py:26 models.py:189 templates/alsijil/class_register/groups.html:20 +#: models.py:34 models.py:220 templates/alsijil/class_register/groups.html:20 #: templates/alsijil/partials/persons_with_stats.html:14 #: templates/alsijil/partials/persons_with_stats.html:24 msgid "Name" msgstr "" -#: models.py:54 models.py:121 +#: models.py:69 models.py:144 msgid "Year" msgstr "" -#: models.py:101 +#: models.py:122 #, fuzzy #| msgid "Personal notes" msgid "Personal note" msgstr "Notes personnelles" -#: models.py:102 templates/alsijil/class_register/lesson.html:101 -#: templates/alsijil/class_register/lesson.html:233 -#: templates/alsijil/class_register/week_view.html:68 -#: templates/alsijil/class_register/week_view.html:242 +#: models.py:123 templates/alsijil/class_register/lesson.html:105 +#: templates/alsijil/class_register/lesson.html:237 +#: templates/alsijil/class_register/week_view.html:71 +#: templates/alsijil/class_register/week_view.html:267 msgid "Personal notes" msgstr "Notes personnelles" -#: models.py:127 templates/alsijil/class_register/lesson.html:129 -#: templates/alsijil/class_register/week_view.html:90 -#: templates/alsijil/class_register/week_view.html:177 -#: templates/alsijil/print/full_register.html:371 +#: models.py:150 templates/alsijil/class_register/lesson.html:133 +#: templates/alsijil/class_register/week_view.html:106 +#: templates/alsijil/class_register/week_view.html:200 +#: templates/alsijil/print/full_register.html:369 msgid "Lesson topic" msgstr "Sujet de cours" -#: models.py:128 templates/alsijil/class_register/lesson.html:137 -#: templates/alsijil/class_register/week_view.html:91 -#: templates/alsijil/class_register/week_view.html:183 -#: templates/alsijil/class_register/week_view.html:216 -#: templates/alsijil/print/full_register.html:372 +#: models.py:151 templates/alsijil/class_register/lesson.html:141 +#: templates/alsijil/class_register/week_view.html:107 +#: templates/alsijil/class_register/week_view.html:206 +#: templates/alsijil/class_register/week_view.html:239 +#: templates/alsijil/print/full_register.html:370 msgid "Homework" msgstr "Devoirs" -#: models.py:129 templates/alsijil/class_register/lesson.html:145 -#: templates/alsijil/class_register/week_view.html:92 -#: templates/alsijil/class_register/week_view.html:189 -#: templates/alsijil/class_register/week_view.html:222 +#: models.py:152 templates/alsijil/class_register/lesson.html:149 +#: templates/alsijil/class_register/week_view.html:108 +#: templates/alsijil/class_register/week_view.html:212 +#: templates/alsijil/class_register/week_view.html:245 #, fuzzy #| msgid "Group" msgid "Group note" msgstr "Groupe" -#: models.py:171 templates/alsijil/class_register/lesson.html:97 -#: templates/alsijil/class_register/lesson.html:120 +#: models.py:202 templates/alsijil/class_register/lesson.html:101 +#: templates/alsijil/class_register/lesson.html:124 msgid "Lesson documentation" msgstr "Documentation de cours" -#: models.py:172 templates/alsijil/class_register/week_view.html:67 +#: models.py:203 templates/alsijil/class_register/week_view.html:68 #, fuzzy #| msgid "Lesson documentation" msgid "Lesson documentations" msgstr "Documentation de cours" -#: models.py:200 +#: models.py:231 msgid "Extra mark" msgstr "" -#: models.py:208 +#: models.py:239 msgid "Can view week overview" msgstr "" -#: models.py:209 +#: models.py:240 #, fuzzy #| msgid "Register absence" msgid "Can register absence" msgstr "Registre de Absence" -#: models.py:210 +#: models.py:241 #, fuzzy #| msgid "List of all personal note filters" msgid "Can list all personal note filters" @@ -297,6 +359,12 @@ msgstr "" msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." msgstr "" +#: preferences.py:68 +#, fuzzy +#| msgid "Teachers and lessons in group" +msgid "Allow teachers to add data for lessons in holidays" +msgstr "Profs et cours en groupe" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -308,13 +376,13 @@ msgstr "" #: templates/alsijil/absences/register.html:5 #: templates/alsijil/absences/register.html:6 #: templates/alsijil/class_register/person.html:30 -#: templates/alsijil/class_register/week_view.html:256 +#: templates/alsijil/class_register/week_view.html:282 #: templates/alsijil/partials/persons_with_stats.html:115 msgid "Register absence" msgstr "Registre de Absence" #: templates/alsijil/absences/register.html:9 -#: templates/alsijil/class_register/lesson.html:242 +#: templates/alsijil/class_register/lesson.html:246 msgid "Person" msgstr "Personne" @@ -432,14 +500,13 @@ msgid "My next lesson" msgstr "Lecon actuelle" #: templates/alsijil/class_register/lesson.html:46 -#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:171 #, fuzzy, python-format #| msgid "From period" msgid "%(period)s. period" msgstr "De la période" -#: templates/alsijil/class_register/lesson.html:77 -#: templates/alsijil/class_register/lesson.html:359 +#: templates/alsijil/class_register/lesson.html:79 #, python-format msgid "" "\n" @@ -447,8 +514,7 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:85 -#: templates/alsijil/class_register/lesson.html:367 +#: templates/alsijil/class_register/lesson.html:87 #, python-format msgid "" "\n" @@ -456,44 +522,44 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:107 +#: templates/alsijil/class_register/lesson.html:111 #, fuzzy #| msgid "Current lesson" msgid "Previous lesson" msgstr "Lecon actuelle" -#: templates/alsijil/class_register/lesson.html:111 -#: templates/alsijil/class_register/lesson.html:342 +#: templates/alsijil/class_register/lesson.html:115 +#: templates/alsijil/class_register/lesson.html:346 msgid "Change history" msgstr "Changement d' histoire" -#: templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/lesson.html:170 msgid "Overview: Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:173 +#: templates/alsijil/class_register/lesson.html:177 msgid "Lesson topic of previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:180 +#: templates/alsijil/class_register/lesson.html:184 msgid "Homework for this lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:187 +#: templates/alsijil/class_register/lesson.html:191 msgid "Group notes for previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:194 +#: templates/alsijil/class_register/lesson.html:198 #, fuzzy #| msgid "Absences" msgid "Absent persons:" msgstr "Absences" -#: templates/alsijil/class_register/lesson.html:201 +#: templates/alsijil/class_register/lesson.html:205 msgid "Late persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:244 +#: templates/alsijil/class_register/lesson.html:248 #: templates/alsijil/class_register/person.html:110 #: templates/alsijil/partials/persons_with_stats.html:17 #: templates/alsijil/partials/persons_with_stats.html:34 @@ -502,12 +568,43 @@ msgstr "" msgid "Tardiness" msgstr "Retard" -#: templates/alsijil/class_register/lesson.html:267 +#: templates/alsijil/class_register/lesson.html:271 #, fuzzy #| msgid "Tardiness" msgid "Tardiness (in m)" msgstr "Retard" +#: templates/alsijil/class_register/lesson.html:364 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:372 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:387 +#, fuzzy +#| msgid "" +#| "\n" +#| " There are no lessons for the selected group, teacher, room or time.\n" +#| " " +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" +"\n" +" Il n' y a pas des cours pour le groupe sélectionné, les profs, le salle ou le temps.\n" +" " + #: templates/alsijil/class_register/person.html:8 #, fuzzy #| msgid "Class register" @@ -616,48 +713,48 @@ msgid "" " %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:84 +#: templates/alsijil/class_register/week_view.html:100 msgid "Period" msgstr "Période" -#: templates/alsijil/class_register/week_view.html:86 +#: templates/alsijil/class_register/week_view.html:102 #, fuzzy #| msgid "Group" msgid "Groups" msgstr "Groupe" -#: templates/alsijil/class_register/week_view.html:88 -#: templates/alsijil/class_register/week_view.html:163 +#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:186 #: 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:89 -#: templates/alsijil/class_register/week_view.html:173 +#: templates/alsijil/class_register/week_view.html:105 +#: templates/alsijil/class_register/week_view.html:196 msgid "Teachers" msgstr "Profs" -#: templates/alsijil/class_register/week_view.html:262 +#: templates/alsijil/class_register/week_view.html:288 msgid "unexcused" msgstr "Injustifié(e)" -#: templates/alsijil/class_register/week_view.html:265 +#: templates/alsijil/class_register/week_view.html:291 msgid "Summed up tardiness" msgstr "Résumé des retards" -#: templates/alsijil/class_register/week_view.html:268 +#: templates/alsijil/class_register/week_view.html:294 #: templates/alsijil/partials/persons_with_stats.html:94 #, fuzzy #| msgid "Summed up tardiness" msgid "Count of tardiness" msgstr "Résumé des retards" -#: templates/alsijil/class_register/week_view.html:297 +#: templates/alsijil/class_register/week_view.html:323 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:300 +#: templates/alsijil/class_register/week_view.html:326 #, fuzzy #| msgid "" #| "\n" @@ -736,7 +833,7 @@ msgid "Data complete" msgstr "" #: templates/alsijil/partials/lesson_status_icon.html:12 -#: templates/alsijil/print/full_register.html:406 +#: templates/alsijil/print/full_register.html:404 msgid "Lesson cancelled" msgstr "Cours annulés" @@ -753,9 +850,9 @@ 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 +#: templates/alsijil/print/full_register.html:334 +#: templates/alsijil/print/full_register.html:422 +#: templates/alsijil/print/full_register.html:437 msgid "e" msgstr "e" @@ -917,17 +1014,17 @@ msgid "Date" msgstr "Date" #: templates/alsijil/print/full_register.html:309 -#: templates/alsijil/print/full_register.html:369 +#: templates/alsijil/print/full_register.html:367 msgid "Pe." msgstr "" #: templates/alsijil/print/full_register.html:310 -#: templates/alsijil/print/full_register.html:370 +#: templates/alsijil/print/full_register.html:368 msgid "Subj." msgstr "" #: templates/alsijil/print/full_register.html:311 -#: templates/alsijil/print/full_register.html:374 +#: templates/alsijil/print/full_register.html:372 msgid "Te." msgstr "" @@ -935,81 +1032,81 @@ msgstr "" msgid "Tard." msgstr "" -#: templates/alsijil/print/full_register.html:330 +#: templates/alsijil/print/full_register.html:329 msgid "Yes" msgstr "Oui" -#: templates/alsijil/print/full_register.html:363 +#: templates/alsijil/print/full_register.html:361 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "Lesson documentation for week" msgstr "Documentation de cours pour la semaine calendrier" -#: templates/alsijil/print/full_register.html:373 +#: templates/alsijil/print/full_register.html:371 msgid "Notes" msgstr "Notes" -#: views.py:65 +#: views.py:68 msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:93 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:127 +#: views.py:141 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The lesson documentation has been saved." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:151 +#: views.py:165 msgid "The personal notes have been saved." msgstr "" -#: views.py:570 +#: views.py:591 msgid "The absences have been marked as excused." msgstr "" -#: views.py:585 +#: views.py:606 msgid "The absence has been marked as excused." msgstr "" -#: views.py:721 +#: views.py:749 msgid "The absence has been saved." msgstr "" -#: views.py:741 +#: views.py:770 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The personal note has been deleted." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:762 +#: views.py:792 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The extra mark has been created." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:773 +#: views.py:804 #, fuzzy #| msgid "Lesson documentation for calendar week" msgid "The extra mark has been saved." msgstr "Documentation de cours pour la semaine calendrier" -#: views.py:783 +#: views.py:815 msgid "The extra mark has been deleted." msgstr "" -#: views.py:803 +#: views.py:836 msgid "The excuse type has been created." msgstr "" -#: views.py:814 +#: views.py:848 msgid "The excuse type has been saved." msgstr "" -#: views.py:824 +#: views.py:859 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 053c32a5484cf531503f41a76d6e56ff51bcd59c..f084ed1f6bee2fb6607fb04229f5c1e492a7fd7d 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-12-05 21:26+0100\n" +"POT-Creation-Date: 2021-01-22 22:01+0100\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,11 +18,63 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.0.1\n" +#: data_checks.py:15 +msgid "Delete object" +msgstr "" + +#: data_checks.py:25 +msgid "Set current groups" +msgstr "" + +#: data_checks.py:36 +msgid "Reset personal note to defaults" +msgstr "" + +#: data_checks.py:48 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" + +#: data_checks.py:49 +msgid "The personal note is related to a cancelled lesson." +msgstr "" + +#: data_checks.py:72 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" + +#: data_checks.py:73 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "" + +#: data_checks.py:107 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" + +#: data_checks.py:108 +msgid "The lesson documentation is on holidays." +msgstr "" + +#: data_checks.py:143 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" + +#: data_checks.py:144 +msgid "The personal note is on holidays." +msgstr "" + +#: data_checks.py:174 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" + +#: data_checks.py:175 +msgid "The personal note is marked as excused, but not as absent." +msgstr "" + #: forms.py:29 msgid "Homework for the next lesson" msgstr "" -#: forms.py:54 templates/alsijil/class_register/week_view.html:168 +#: forms.py:54 templates/alsijil/class_register/week_view.html:191 #: templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "Grex" @@ -53,16 +105,16 @@ msgid "End period" msgstr "" #: forms.py:130 templates/alsijil/absences/register_confirm.html:52 -#: templates/alsijil/class_register/lesson.html:243 +#: templates/alsijil/class_register/lesson.html:247 #: templates/alsijil/class_register/person.html:207 -#: templates/alsijil/class_register/week_view.html:261 +#: templates/alsijil/class_register/week_view.html:287 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:131 templates/alsijil/absences/register_confirm.html:56 -#: templates/alsijil/class_register/lesson.html:245 +#: templates/alsijil/class_register/lesson.html:249 #: templates/alsijil/class_register/person.html:98 #: templates/alsijil/class_register/person.html:215 #: templates/alsijil/partials/mark_as_buttons.html:2 @@ -73,14 +125,14 @@ msgstr "" msgid "Excused" msgstr "" -#: forms.py:133 models.py:37 models.py:64 -#: templates/alsijil/class_register/lesson.html:246 -#: templates/alsijil/class_register/lesson.html:281 +#: forms.py:133 models.py:45 models.py:79 +#: templates/alsijil/class_register/lesson.html:250 +#: templates/alsijil/class_register/lesson.html:285 msgid "Excuse type" msgstr "" -#: forms.py:138 templates/alsijil/class_register/lesson.html:248 -#: templates/alsijil/class_register/lesson.html:302 +#: forms.py:138 templates/alsijil/class_register/lesson.html:252 +#: templates/alsijil/class_register/lesson.html:306 #: templates/alsijil/print/full_register.html:314 msgid "Remarks" msgstr "" @@ -113,14 +165,14 @@ msgstr "" msgid "My students" msgstr "" -#: menus.py:71 models.py:38 templates/alsijil/excuse_type/list.html:8 +#: menus.py:71 models.py:46 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #: templates/alsijil/partials/legend.html:26 msgid "Excuse types" msgstr "" -#: menus.py:82 models.py:70 models.py:201 -#: templates/alsijil/class_register/lesson.html:247 +#: menus.py:82 models.py:84 models.py:232 +#: templates/alsijil/class_register/lesson.html:251 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 #: templates/alsijil/partials/legend.html:41 @@ -165,81 +217,81 @@ msgstr "" msgid "Can register an absence for a person" msgstr "" -#: models.py:25 models.py:188 +#: models.py:33 models.py:219 #, fuzzy #| msgid "First name" msgid "Short name" msgstr "Primus nomen" -#: models.py:26 models.py:189 templates/alsijil/class_register/groups.html:20 +#: models.py:34 models.py:220 templates/alsijil/class_register/groups.html:20 #: templates/alsijil/partials/persons_with_stats.html:14 #: templates/alsijil/partials/persons_with_stats.html:24 msgid "Name" msgstr "" -#: models.py:54 models.py:121 +#: models.py:69 models.py:144 msgid "Year" msgstr "" -#: models.py:101 +#: models.py:122 #, fuzzy #| msgid "Person" msgid "Personal note" msgstr "Persona" -#: models.py:102 templates/alsijil/class_register/lesson.html:101 -#: templates/alsijil/class_register/lesson.html:233 -#: templates/alsijil/class_register/week_view.html:68 -#: templates/alsijil/class_register/week_view.html:242 +#: models.py:123 templates/alsijil/class_register/lesson.html:105 +#: templates/alsijil/class_register/lesson.html:237 +#: templates/alsijil/class_register/week_view.html:71 +#: templates/alsijil/class_register/week_view.html:267 msgid "Personal notes" msgstr "" -#: models.py:127 templates/alsijil/class_register/lesson.html:129 -#: templates/alsijil/class_register/week_view.html:90 -#: templates/alsijil/class_register/week_view.html:177 -#: templates/alsijil/print/full_register.html:371 +#: models.py:150 templates/alsijil/class_register/lesson.html:133 +#: templates/alsijil/class_register/week_view.html:106 +#: templates/alsijil/class_register/week_view.html:200 +#: templates/alsijil/print/full_register.html:369 msgid "Lesson topic" msgstr "" -#: models.py:128 templates/alsijil/class_register/lesson.html:137 -#: templates/alsijil/class_register/week_view.html:91 -#: templates/alsijil/class_register/week_view.html:183 -#: templates/alsijil/class_register/week_view.html:216 -#: templates/alsijil/print/full_register.html:372 +#: models.py:151 templates/alsijil/class_register/lesson.html:141 +#: templates/alsijil/class_register/week_view.html:107 +#: templates/alsijil/class_register/week_view.html:206 +#: templates/alsijil/class_register/week_view.html:239 +#: templates/alsijil/print/full_register.html:370 msgid "Homework" msgstr "" -#: models.py:129 templates/alsijil/class_register/lesson.html:145 -#: templates/alsijil/class_register/week_view.html:92 -#: templates/alsijil/class_register/week_view.html:189 -#: templates/alsijil/class_register/week_view.html:222 +#: models.py:152 templates/alsijil/class_register/lesson.html:149 +#: templates/alsijil/class_register/week_view.html:108 +#: templates/alsijil/class_register/week_view.html:212 +#: templates/alsijil/class_register/week_view.html:245 #, fuzzy #| msgid "Group" msgid "Group note" msgstr "Grex" -#: models.py:171 templates/alsijil/class_register/lesson.html:97 -#: templates/alsijil/class_register/lesson.html:120 +#: models.py:202 templates/alsijil/class_register/lesson.html:101 +#: templates/alsijil/class_register/lesson.html:124 msgid "Lesson documentation" msgstr "" -#: models.py:172 templates/alsijil/class_register/week_view.html:67 +#: models.py:203 templates/alsijil/class_register/week_view.html:68 msgid "Lesson documentations" msgstr "" -#: models.py:200 +#: models.py:231 msgid "Extra mark" msgstr "" -#: models.py:208 +#: models.py:239 msgid "Can view week overview" msgstr "" -#: models.py:209 +#: models.py:240 msgid "Can register absence" msgstr "" -#: models.py:210 +#: models.py:241 msgid "Can list all personal note filters" msgstr "" @@ -271,6 +323,10 @@ msgstr "" msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." msgstr "" +#: preferences.py:68 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -282,13 +338,13 @@ msgstr "" #: templates/alsijil/absences/register.html:5 #: templates/alsijil/absences/register.html:6 #: templates/alsijil/class_register/person.html:30 -#: templates/alsijil/class_register/week_view.html:256 +#: templates/alsijil/class_register/week_view.html:282 #: templates/alsijil/partials/persons_with_stats.html:115 msgid "Register absence" msgstr "" #: templates/alsijil/absences/register.html:9 -#: templates/alsijil/class_register/lesson.html:242 +#: templates/alsijil/class_register/lesson.html:246 msgid "Person" msgstr "Persona" @@ -390,13 +446,12 @@ msgid "My next lesson" msgstr "" #: templates/alsijil/class_register/lesson.html:46 -#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:171 #, python-format msgid "%(period)s. period" msgstr "" -#: templates/alsijil/class_register/lesson.html:77 -#: templates/alsijil/class_register/lesson.html:359 +#: templates/alsijil/class_register/lesson.html:79 #, python-format msgid "" "\n" @@ -404,8 +459,7 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:85 -#: templates/alsijil/class_register/lesson.html:367 +#: templates/alsijil/class_register/lesson.html:87 #, python-format msgid "" "\n" @@ -413,40 +467,40 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:107 +#: templates/alsijil/class_register/lesson.html:111 msgid "Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:111 -#: templates/alsijil/class_register/lesson.html:342 +#: templates/alsijil/class_register/lesson.html:115 +#: templates/alsijil/class_register/lesson.html:346 msgid "Change history" msgstr "" -#: templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/lesson.html:170 msgid "Overview: Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:173 +#: templates/alsijil/class_register/lesson.html:177 msgid "Lesson topic of previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:180 +#: templates/alsijil/class_register/lesson.html:184 msgid "Homework for this lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:187 +#: templates/alsijil/class_register/lesson.html:191 msgid "Group notes for previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:194 +#: templates/alsijil/class_register/lesson.html:198 msgid "Absent persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:201 +#: templates/alsijil/class_register/lesson.html:205 msgid "Late persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:244 +#: templates/alsijil/class_register/lesson.html:248 #: templates/alsijil/class_register/person.html:110 #: templates/alsijil/partials/persons_with_stats.html:17 #: templates/alsijil/partials/persons_with_stats.html:34 @@ -455,10 +509,33 @@ msgstr "" msgid "Tardiness" msgstr "" -#: templates/alsijil/class_register/lesson.html:267 +#: templates/alsijil/class_register/lesson.html:271 msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/lesson.html:364 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:372 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:387 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" + #: templates/alsijil/class_register/person.html:8 msgid "Class register: person" msgstr "" @@ -563,46 +640,46 @@ msgid "" " %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:84 +#: templates/alsijil/class_register/week_view.html:100 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:86 +#: templates/alsijil/class_register/week_view.html:102 #, fuzzy #| msgid "Group" msgid "Groups" msgstr "Grex" -#: templates/alsijil/class_register/week_view.html:88 -#: templates/alsijil/class_register/week_view.html:163 +#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:186 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:89 -#: templates/alsijil/class_register/week_view.html:173 +#: templates/alsijil/class_register/week_view.html:105 +#: templates/alsijil/class_register/week_view.html:196 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:262 +#: templates/alsijil/class_register/week_view.html:288 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:265 +#: templates/alsijil/class_register/week_view.html:291 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:268 +#: templates/alsijil/class_register/week_view.html:294 #: templates/alsijil/partials/persons_with_stats.html:94 msgid "Count of tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:297 +#: templates/alsijil/class_register/week_view.html:323 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:300 +#: templates/alsijil/class_register/week_view.html:326 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -671,7 +748,7 @@ msgid "Data complete" msgstr "" #: templates/alsijil/partials/lesson_status_icon.html:12 -#: templates/alsijil/print/full_register.html:406 +#: templates/alsijil/print/full_register.html:404 msgid "Lesson cancelled" msgstr "" @@ -688,9 +765,9 @@ 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 +#: templates/alsijil/print/full_register.html:334 +#: templates/alsijil/print/full_register.html:422 +#: templates/alsijil/print/full_register.html:437 msgid "e" msgstr "" @@ -848,17 +925,17 @@ msgid "Date" msgstr "dies" #: templates/alsijil/print/full_register.html:309 -#: templates/alsijil/print/full_register.html:369 +#: templates/alsijil/print/full_register.html:367 msgid "Pe." msgstr "" #: templates/alsijil/print/full_register.html:310 -#: templates/alsijil/print/full_register.html:370 +#: templates/alsijil/print/full_register.html:368 msgid "Subj." msgstr "" #: templates/alsijil/print/full_register.html:311 -#: templates/alsijil/print/full_register.html:374 +#: templates/alsijil/print/full_register.html:372 msgid "Te." msgstr "" @@ -866,71 +943,71 @@ msgstr "" msgid "Tard." msgstr "" -#: templates/alsijil/print/full_register.html:330 +#: templates/alsijil/print/full_register.html:329 msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:363 +#: templates/alsijil/print/full_register.html:361 msgid "Lesson documentation for week" msgstr "" -#: templates/alsijil/print/full_register.html:373 +#: templates/alsijil/print/full_register.html:371 msgid "Notes" msgstr "" -#: views.py:65 +#: views.py:68 msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:93 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:127 +#: views.py:141 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:151 +#: views.py:165 msgid "The personal notes have been saved." msgstr "" -#: views.py:570 +#: views.py:591 msgid "The absences have been marked as excused." msgstr "" -#: views.py:585 +#: views.py:606 msgid "The absence has been marked as excused." msgstr "" -#: views.py:721 +#: views.py:749 msgid "The absence has been saved." msgstr "" -#: views.py:741 +#: views.py:770 msgid "The personal note has been deleted." msgstr "" -#: views.py:762 +#: views.py:792 msgid "The extra mark has been created." msgstr "" -#: views.py:773 +#: views.py:804 msgid "The extra mark has been saved." msgstr "" -#: views.py:783 +#: views.py:815 msgid "The extra mark has been deleted." msgstr "" -#: views.py:803 +#: views.py:836 msgid "The excuse type has been created." msgstr "" -#: views.py:814 +#: views.py:848 msgid "The excuse type has been saved." msgstr "" -#: views.py:824 +#: views.py:859 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 219d7af7ff7ca661ccb440d5fab0002ecb546788..4704f58a5eb1586fdaf87d76c815c27f80e81c30 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-12-05 21:26+0100\n" +"POT-Creation-Date: 2021-01-22 22:01+0100\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,11 +17,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: data_checks.py:15 +msgid "Delete object" +msgstr "" + +#: data_checks.py:25 +msgid "Set current groups" +msgstr "" + +#: data_checks.py:36 +msgid "Reset personal note to defaults" +msgstr "" + +#: data_checks.py:48 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" + +#: data_checks.py:49 +msgid "The personal note is related to a cancelled lesson." +msgstr "" + +#: data_checks.py:72 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" + +#: data_checks.py:73 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "" + +#: data_checks.py:107 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" + +#: data_checks.py:108 +msgid "The lesson documentation is on holidays." +msgstr "" + +#: data_checks.py:143 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" + +#: data_checks.py:144 +msgid "The personal note is on holidays." +msgstr "" + +#: data_checks.py:174 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" + +#: data_checks.py:175 +msgid "The personal note is marked as excused, but not as absent." +msgstr "" + #: forms.py:29 msgid "Homework for the next lesson" msgstr "" -#: forms.py:54 templates/alsijil/class_register/week_view.html:168 +#: forms.py:54 templates/alsijil/class_register/week_view.html:191 #: templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "" @@ -52,16 +104,16 @@ msgid "End period" msgstr "" #: forms.py:130 templates/alsijil/absences/register_confirm.html:52 -#: templates/alsijil/class_register/lesson.html:243 +#: templates/alsijil/class_register/lesson.html:247 #: templates/alsijil/class_register/person.html:207 -#: templates/alsijil/class_register/week_view.html:261 +#: templates/alsijil/class_register/week_view.html:287 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:131 templates/alsijil/absences/register_confirm.html:56 -#: templates/alsijil/class_register/lesson.html:245 +#: templates/alsijil/class_register/lesson.html:249 #: templates/alsijil/class_register/person.html:98 #: templates/alsijil/class_register/person.html:215 #: templates/alsijil/partials/mark_as_buttons.html:2 @@ -72,14 +124,14 @@ msgstr "" msgid "Excused" msgstr "" -#: forms.py:133 models.py:37 models.py:64 -#: templates/alsijil/class_register/lesson.html:246 -#: templates/alsijil/class_register/lesson.html:281 +#: forms.py:133 models.py:45 models.py:79 +#: templates/alsijil/class_register/lesson.html:250 +#: templates/alsijil/class_register/lesson.html:285 msgid "Excuse type" msgstr "" -#: forms.py:138 templates/alsijil/class_register/lesson.html:248 -#: templates/alsijil/class_register/lesson.html:302 +#: forms.py:138 templates/alsijil/class_register/lesson.html:252 +#: templates/alsijil/class_register/lesson.html:306 #: templates/alsijil/print/full_register.html:314 msgid "Remarks" msgstr "" @@ -110,14 +162,14 @@ msgstr "" msgid "My students" msgstr "" -#: menus.py:71 models.py:38 templates/alsijil/excuse_type/list.html:8 +#: menus.py:71 models.py:46 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #: templates/alsijil/partials/legend.html:26 msgid "Excuse types" msgstr "" -#: menus.py:82 models.py:70 models.py:201 -#: templates/alsijil/class_register/lesson.html:247 +#: menus.py:82 models.py:84 models.py:232 +#: templates/alsijil/class_register/lesson.html:251 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 #: templates/alsijil/partials/legend.html:41 @@ -162,75 +214,75 @@ msgstr "" msgid "Can register an absence for a person" msgstr "" -#: models.py:25 models.py:188 +#: models.py:33 models.py:219 msgid "Short name" msgstr "" -#: models.py:26 models.py:189 templates/alsijil/class_register/groups.html:20 +#: models.py:34 models.py:220 templates/alsijil/class_register/groups.html:20 #: templates/alsijil/partials/persons_with_stats.html:14 #: templates/alsijil/partials/persons_with_stats.html:24 msgid "Name" msgstr "" -#: models.py:54 models.py:121 +#: models.py:69 models.py:144 msgid "Year" msgstr "" -#: models.py:101 +#: models.py:122 msgid "Personal note" msgstr "" -#: models.py:102 templates/alsijil/class_register/lesson.html:101 -#: templates/alsijil/class_register/lesson.html:233 -#: templates/alsijil/class_register/week_view.html:68 -#: templates/alsijil/class_register/week_view.html:242 +#: models.py:123 templates/alsijil/class_register/lesson.html:105 +#: templates/alsijil/class_register/lesson.html:237 +#: templates/alsijil/class_register/week_view.html:71 +#: templates/alsijil/class_register/week_view.html:267 msgid "Personal notes" msgstr "" -#: models.py:127 templates/alsijil/class_register/lesson.html:129 -#: templates/alsijil/class_register/week_view.html:90 -#: templates/alsijil/class_register/week_view.html:177 -#: templates/alsijil/print/full_register.html:371 +#: models.py:150 templates/alsijil/class_register/lesson.html:133 +#: templates/alsijil/class_register/week_view.html:106 +#: templates/alsijil/class_register/week_view.html:200 +#: templates/alsijil/print/full_register.html:369 msgid "Lesson topic" msgstr "" -#: models.py:128 templates/alsijil/class_register/lesson.html:137 -#: templates/alsijil/class_register/week_view.html:91 -#: templates/alsijil/class_register/week_view.html:183 -#: templates/alsijil/class_register/week_view.html:216 -#: templates/alsijil/print/full_register.html:372 +#: models.py:151 templates/alsijil/class_register/lesson.html:141 +#: templates/alsijil/class_register/week_view.html:107 +#: templates/alsijil/class_register/week_view.html:206 +#: templates/alsijil/class_register/week_view.html:239 +#: templates/alsijil/print/full_register.html:370 msgid "Homework" msgstr "" -#: models.py:129 templates/alsijil/class_register/lesson.html:145 -#: templates/alsijil/class_register/week_view.html:92 -#: templates/alsijil/class_register/week_view.html:189 -#: templates/alsijil/class_register/week_view.html:222 +#: models.py:152 templates/alsijil/class_register/lesson.html:149 +#: templates/alsijil/class_register/week_view.html:108 +#: templates/alsijil/class_register/week_view.html:212 +#: templates/alsijil/class_register/week_view.html:245 msgid "Group note" msgstr "" -#: models.py:171 templates/alsijil/class_register/lesson.html:97 -#: templates/alsijil/class_register/lesson.html:120 +#: models.py:202 templates/alsijil/class_register/lesson.html:101 +#: templates/alsijil/class_register/lesson.html:124 msgid "Lesson documentation" msgstr "" -#: models.py:172 templates/alsijil/class_register/week_view.html:67 +#: models.py:203 templates/alsijil/class_register/week_view.html:68 msgid "Lesson documentations" msgstr "" -#: models.py:200 +#: models.py:231 msgid "Extra mark" msgstr "" -#: models.py:208 +#: models.py:239 msgid "Can view week overview" msgstr "" -#: models.py:209 +#: models.py:240 msgid "Can register absence" msgstr "" -#: models.py:210 +#: models.py:241 msgid "Can list all personal note filters" msgstr "" @@ -262,6 +314,10 @@ msgstr "" msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." msgstr "" +#: preferences.py:68 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -273,13 +329,13 @@ msgstr "" #: templates/alsijil/absences/register.html:5 #: templates/alsijil/absences/register.html:6 #: templates/alsijil/class_register/person.html:30 -#: templates/alsijil/class_register/week_view.html:256 +#: templates/alsijil/class_register/week_view.html:282 #: templates/alsijil/partials/persons_with_stats.html:115 msgid "Register absence" msgstr "" #: templates/alsijil/absences/register.html:9 -#: templates/alsijil/class_register/lesson.html:242 +#: templates/alsijil/class_register/lesson.html:246 msgid "Person" msgstr "" @@ -381,13 +437,12 @@ msgid "My next lesson" msgstr "" #: templates/alsijil/class_register/lesson.html:46 -#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:171 #, python-format msgid "%(period)s. period" msgstr "" -#: templates/alsijil/class_register/lesson.html:77 -#: templates/alsijil/class_register/lesson.html:359 +#: templates/alsijil/class_register/lesson.html:79 #, python-format msgid "" "\n" @@ -395,8 +450,7 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:85 -#: templates/alsijil/class_register/lesson.html:367 +#: templates/alsijil/class_register/lesson.html:87 #, python-format msgid "" "\n" @@ -404,40 +458,40 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:107 +#: templates/alsijil/class_register/lesson.html:111 msgid "Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:111 -#: templates/alsijil/class_register/lesson.html:342 +#: templates/alsijil/class_register/lesson.html:115 +#: templates/alsijil/class_register/lesson.html:346 msgid "Change history" msgstr "" -#: templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/lesson.html:170 msgid "Overview: Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:173 +#: templates/alsijil/class_register/lesson.html:177 msgid "Lesson topic of previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:180 +#: templates/alsijil/class_register/lesson.html:184 msgid "Homework for this lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:187 +#: templates/alsijil/class_register/lesson.html:191 msgid "Group notes for previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:194 +#: templates/alsijil/class_register/lesson.html:198 msgid "Absent persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:201 +#: templates/alsijil/class_register/lesson.html:205 msgid "Late persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:244 +#: templates/alsijil/class_register/lesson.html:248 #: templates/alsijil/class_register/person.html:110 #: templates/alsijil/partials/persons_with_stats.html:17 #: templates/alsijil/partials/persons_with_stats.html:34 @@ -446,10 +500,33 @@ msgstr "" msgid "Tardiness" msgstr "" -#: templates/alsijil/class_register/lesson.html:267 +#: templates/alsijil/class_register/lesson.html:271 msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/lesson.html:364 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:372 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:387 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" + #: templates/alsijil/class_register/person.html:8 msgid "Class register: person" msgstr "" @@ -554,44 +631,44 @@ msgid "" " %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:84 +#: templates/alsijil/class_register/week_view.html:100 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:86 +#: templates/alsijil/class_register/week_view.html:102 msgid "Groups" msgstr "" -#: templates/alsijil/class_register/week_view.html:88 -#: templates/alsijil/class_register/week_view.html:163 +#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:186 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:89 -#: templates/alsijil/class_register/week_view.html:173 +#: templates/alsijil/class_register/week_view.html:105 +#: templates/alsijil/class_register/week_view.html:196 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:262 +#: templates/alsijil/class_register/week_view.html:288 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:265 +#: templates/alsijil/class_register/week_view.html:291 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:268 +#: templates/alsijil/class_register/week_view.html:294 #: templates/alsijil/partials/persons_with_stats.html:94 msgid "Count of tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:297 +#: templates/alsijil/class_register/week_view.html:323 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:300 +#: templates/alsijil/class_register/week_view.html:326 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -660,7 +737,7 @@ msgid "Data complete" msgstr "" #: templates/alsijil/partials/lesson_status_icon.html:12 -#: templates/alsijil/print/full_register.html:406 +#: templates/alsijil/print/full_register.html:404 msgid "Lesson cancelled" msgstr "" @@ -677,9 +754,9 @@ 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 +#: templates/alsijil/print/full_register.html:334 +#: templates/alsijil/print/full_register.html:422 +#: templates/alsijil/print/full_register.html:437 msgid "e" msgstr "" @@ -835,17 +912,17 @@ msgid "Date" msgstr "" #: templates/alsijil/print/full_register.html:309 -#: templates/alsijil/print/full_register.html:369 +#: templates/alsijil/print/full_register.html:367 msgid "Pe." msgstr "" #: templates/alsijil/print/full_register.html:310 -#: templates/alsijil/print/full_register.html:370 +#: templates/alsijil/print/full_register.html:368 msgid "Subj." msgstr "" #: templates/alsijil/print/full_register.html:311 -#: templates/alsijil/print/full_register.html:374 +#: templates/alsijil/print/full_register.html:372 msgid "Te." msgstr "" @@ -853,70 +930,70 @@ msgstr "" msgid "Tard." msgstr "" -#: templates/alsijil/print/full_register.html:330 +#: templates/alsijil/print/full_register.html:329 msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:363 +#: templates/alsijil/print/full_register.html:361 msgid "Lesson documentation for week" msgstr "" -#: templates/alsijil/print/full_register.html:373 +#: templates/alsijil/print/full_register.html:371 msgid "Notes" msgstr "" -#: views.py:65 +#: views.py:68 msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:93 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:127 +#: views.py:141 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:151 +#: views.py:165 msgid "The personal notes have been saved." msgstr "" -#: views.py:570 +#: views.py:591 msgid "The absences have been marked as excused." msgstr "" -#: views.py:585 +#: views.py:606 msgid "The absence has been marked as excused." msgstr "" -#: views.py:721 +#: views.py:749 msgid "The absence has been saved." msgstr "" -#: views.py:741 +#: views.py:770 msgid "The personal note has been deleted." msgstr "" -#: views.py:762 +#: views.py:792 msgid "The extra mark has been created." msgstr "" -#: views.py:773 +#: views.py:804 msgid "The extra mark has been saved." msgstr "" -#: views.py:783 +#: views.py:815 msgid "The extra mark has been deleted." msgstr "" -#: views.py:803 +#: views.py:836 msgid "The excuse type has been created." msgstr "" -#: views.py:814 +#: views.py:848 msgid "The excuse type has been saved." msgstr "" -#: views.py:824 +#: views.py:859 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 219d7af7ff7ca661ccb440d5fab0002ecb546788..4704f58a5eb1586fdaf87d76c815c27f80e81c30 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-12-05 21:26+0100\n" +"POT-Creation-Date: 2021-01-22 22:01+0100\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,11 +17,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: data_checks.py:15 +msgid "Delete object" +msgstr "" + +#: data_checks.py:25 +msgid "Set current groups" +msgstr "" + +#: data_checks.py:36 +msgid "Reset personal note to defaults" +msgstr "" + +#: data_checks.py:48 +msgid "Ensure that there are no personal notes in cancelled lessons" +msgstr "" + +#: data_checks.py:49 +msgid "The personal note is related to a cancelled lesson." +msgstr "" + +#: data_checks.py:72 +msgid "Ensure that 'groups_of_person' is set for every personal note" +msgstr "" + +#: data_checks.py:73 +msgid "The personal note has no group in 'groups_of_person'." +msgstr "" + +#: data_checks.py:107 +msgid "Ensure that there are no filled out lesson documentations on holidays" +msgstr "" + +#: data_checks.py:108 +msgid "The lesson documentation is on holidays." +msgstr "" + +#: data_checks.py:143 +msgid "Ensure that there are no filled out personal notes on holidays" +msgstr "" + +#: data_checks.py:144 +msgid "The personal note is on holidays." +msgstr "" + +#: data_checks.py:174 +msgid "Ensure that there are no excused personal notes without an absence" +msgstr "" + +#: data_checks.py:175 +msgid "The personal note is marked as excused, but not as absent." +msgstr "" + #: forms.py:29 msgid "Homework for the next lesson" msgstr "" -#: forms.py:54 templates/alsijil/class_register/week_view.html:168 +#: forms.py:54 templates/alsijil/class_register/week_view.html:191 #: templates/alsijil/print/full_register.html:199 msgid "Group" msgstr "" @@ -52,16 +104,16 @@ msgid "End period" msgstr "" #: forms.py:130 templates/alsijil/absences/register_confirm.html:52 -#: templates/alsijil/class_register/lesson.html:243 +#: templates/alsijil/class_register/lesson.html:247 #: templates/alsijil/class_register/person.html:207 -#: templates/alsijil/class_register/week_view.html:261 +#: templates/alsijil/class_register/week_view.html:287 #: templates/alsijil/print/full_register.html:75 #: templates/alsijil/print/full_register.html:312 msgid "Absent" msgstr "" #: forms.py:131 templates/alsijil/absences/register_confirm.html:56 -#: templates/alsijil/class_register/lesson.html:245 +#: templates/alsijil/class_register/lesson.html:249 #: templates/alsijil/class_register/person.html:98 #: templates/alsijil/class_register/person.html:215 #: templates/alsijil/partials/mark_as_buttons.html:2 @@ -72,14 +124,14 @@ msgstr "" msgid "Excused" msgstr "" -#: forms.py:133 models.py:37 models.py:64 -#: templates/alsijil/class_register/lesson.html:246 -#: templates/alsijil/class_register/lesson.html:281 +#: forms.py:133 models.py:45 models.py:79 +#: templates/alsijil/class_register/lesson.html:250 +#: templates/alsijil/class_register/lesson.html:285 msgid "Excuse type" msgstr "" -#: forms.py:138 templates/alsijil/class_register/lesson.html:248 -#: templates/alsijil/class_register/lesson.html:302 +#: forms.py:138 templates/alsijil/class_register/lesson.html:252 +#: templates/alsijil/class_register/lesson.html:306 #: templates/alsijil/print/full_register.html:314 msgid "Remarks" msgstr "" @@ -110,14 +162,14 @@ msgstr "" msgid "My students" msgstr "" -#: menus.py:71 models.py:38 templates/alsijil/excuse_type/list.html:8 +#: menus.py:71 models.py:46 templates/alsijil/excuse_type/list.html:8 #: templates/alsijil/excuse_type/list.html:9 #: templates/alsijil/partials/legend.html:26 msgid "Excuse types" msgstr "" -#: menus.py:82 models.py:70 models.py:201 -#: templates/alsijil/class_register/lesson.html:247 +#: menus.py:82 models.py:84 models.py:232 +#: templates/alsijil/class_register/lesson.html:251 #: templates/alsijil/extra_mark/list.html:8 #: templates/alsijil/extra_mark/list.html:9 #: templates/alsijil/partials/legend.html:41 @@ -162,75 +214,75 @@ msgstr "" msgid "Can register an absence for a person" msgstr "" -#: models.py:25 models.py:188 +#: models.py:33 models.py:219 msgid "Short name" msgstr "" -#: models.py:26 models.py:189 templates/alsijil/class_register/groups.html:20 +#: models.py:34 models.py:220 templates/alsijil/class_register/groups.html:20 #: templates/alsijil/partials/persons_with_stats.html:14 #: templates/alsijil/partials/persons_with_stats.html:24 msgid "Name" msgstr "" -#: models.py:54 models.py:121 +#: models.py:69 models.py:144 msgid "Year" msgstr "" -#: models.py:101 +#: models.py:122 msgid "Personal note" msgstr "" -#: models.py:102 templates/alsijil/class_register/lesson.html:101 -#: templates/alsijil/class_register/lesson.html:233 -#: templates/alsijil/class_register/week_view.html:68 -#: templates/alsijil/class_register/week_view.html:242 +#: models.py:123 templates/alsijil/class_register/lesson.html:105 +#: templates/alsijil/class_register/lesson.html:237 +#: templates/alsijil/class_register/week_view.html:71 +#: templates/alsijil/class_register/week_view.html:267 msgid "Personal notes" msgstr "" -#: models.py:127 templates/alsijil/class_register/lesson.html:129 -#: templates/alsijil/class_register/week_view.html:90 -#: templates/alsijil/class_register/week_view.html:177 -#: templates/alsijil/print/full_register.html:371 +#: models.py:150 templates/alsijil/class_register/lesson.html:133 +#: templates/alsijil/class_register/week_view.html:106 +#: templates/alsijil/class_register/week_view.html:200 +#: templates/alsijil/print/full_register.html:369 msgid "Lesson topic" msgstr "" -#: models.py:128 templates/alsijil/class_register/lesson.html:137 -#: templates/alsijil/class_register/week_view.html:91 -#: templates/alsijil/class_register/week_view.html:183 -#: templates/alsijil/class_register/week_view.html:216 -#: templates/alsijil/print/full_register.html:372 +#: models.py:151 templates/alsijil/class_register/lesson.html:141 +#: templates/alsijil/class_register/week_view.html:107 +#: templates/alsijil/class_register/week_view.html:206 +#: templates/alsijil/class_register/week_view.html:239 +#: templates/alsijil/print/full_register.html:370 msgid "Homework" msgstr "" -#: models.py:129 templates/alsijil/class_register/lesson.html:145 -#: templates/alsijil/class_register/week_view.html:92 -#: templates/alsijil/class_register/week_view.html:189 -#: templates/alsijil/class_register/week_view.html:222 +#: models.py:152 templates/alsijil/class_register/lesson.html:149 +#: templates/alsijil/class_register/week_view.html:108 +#: templates/alsijil/class_register/week_view.html:212 +#: templates/alsijil/class_register/week_view.html:245 msgid "Group note" msgstr "" -#: models.py:171 templates/alsijil/class_register/lesson.html:97 -#: templates/alsijil/class_register/lesson.html:120 +#: models.py:202 templates/alsijil/class_register/lesson.html:101 +#: templates/alsijil/class_register/lesson.html:124 msgid "Lesson documentation" msgstr "" -#: models.py:172 templates/alsijil/class_register/week_view.html:67 +#: models.py:203 templates/alsijil/class_register/week_view.html:68 msgid "Lesson documentations" msgstr "" -#: models.py:200 +#: models.py:231 msgid "Extra mark" msgstr "" -#: models.py:208 +#: models.py:239 msgid "Can view week overview" msgstr "" -#: models.py:209 +#: models.py:240 msgid "Can register absence" msgstr "" -#: models.py:210 +#: models.py:241 msgid "Can list all personal note filters" msgstr "" @@ -262,6 +314,10 @@ msgstr "" msgid "Lessons in the past are not affected by this setting, you can open them whenever you want." msgstr "" +#: preferences.py:68 +msgid "Allow teachers to add data for lessons in holidays" +msgstr "" + #: tables.py:16 tables.py:36 msgid "Edit" msgstr "" @@ -273,13 +329,13 @@ msgstr "" #: templates/alsijil/absences/register.html:5 #: templates/alsijil/absences/register.html:6 #: templates/alsijil/class_register/person.html:30 -#: templates/alsijil/class_register/week_view.html:256 +#: templates/alsijil/class_register/week_view.html:282 #: templates/alsijil/partials/persons_with_stats.html:115 msgid "Register absence" msgstr "" #: templates/alsijil/absences/register.html:9 -#: templates/alsijil/class_register/lesson.html:242 +#: templates/alsijil/class_register/lesson.html:246 msgid "Person" msgstr "" @@ -381,13 +437,12 @@ msgid "My next lesson" msgstr "" #: templates/alsijil/class_register/lesson.html:46 -#: templates/alsijil/class_register/lesson.html:167 +#: templates/alsijil/class_register/lesson.html:171 #, python-format msgid "%(period)s. period" msgstr "" -#: templates/alsijil/class_register/lesson.html:77 -#: templates/alsijil/class_register/lesson.html:359 +#: templates/alsijil/class_register/lesson.html:79 #, python-format msgid "" "\n" @@ -395,8 +450,7 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:85 -#: templates/alsijil/class_register/lesson.html:367 +#: templates/alsijil/class_register/lesson.html:87 #, python-format msgid "" "\n" @@ -404,40 +458,40 @@ msgid "" " " msgstr "" -#: templates/alsijil/class_register/lesson.html:107 +#: templates/alsijil/class_register/lesson.html:111 msgid "Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:111 -#: templates/alsijil/class_register/lesson.html:342 +#: templates/alsijil/class_register/lesson.html:115 +#: templates/alsijil/class_register/lesson.html:346 msgid "Change history" msgstr "" -#: templates/alsijil/class_register/lesson.html:166 +#: templates/alsijil/class_register/lesson.html:170 msgid "Overview: Previous lesson" msgstr "" -#: templates/alsijil/class_register/lesson.html:173 +#: templates/alsijil/class_register/lesson.html:177 msgid "Lesson topic of previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:180 +#: templates/alsijil/class_register/lesson.html:184 msgid "Homework for this lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:187 +#: templates/alsijil/class_register/lesson.html:191 msgid "Group notes for previous lesson:" msgstr "" -#: templates/alsijil/class_register/lesson.html:194 +#: templates/alsijil/class_register/lesson.html:198 msgid "Absent persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:201 +#: templates/alsijil/class_register/lesson.html:205 msgid "Late persons:" msgstr "" -#: templates/alsijil/class_register/lesson.html:244 +#: templates/alsijil/class_register/lesson.html:248 #: templates/alsijil/class_register/person.html:110 #: templates/alsijil/partials/persons_with_stats.html:17 #: templates/alsijil/partials/persons_with_stats.html:34 @@ -446,10 +500,33 @@ msgstr "" msgid "Tardiness" msgstr "" -#: templates/alsijil/class_register/lesson.html:267 +#: templates/alsijil/class_register/lesson.html:271 msgid "Tardiness (in m)" msgstr "" +#: templates/alsijil/class_register/lesson.html:364 +#, python-format +msgid "" +"\n" +" Previous %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:372 +#, python-format +msgid "" +"\n" +" Next %(subject)s lesson\n" +" " +msgstr "" + +#: templates/alsijil/class_register/lesson.html:387 +msgid "" +"\n" +" This lesson overlaps with holidays and can't be edited.\n" +" " +msgstr "" + #: templates/alsijil/class_register/person.html:8 msgid "Class register: person" msgstr "" @@ -554,44 +631,44 @@ msgid "" " %(instance)s" msgstr "" -#: templates/alsijil/class_register/week_view.html:84 +#: templates/alsijil/class_register/week_view.html:100 msgid "Period" msgstr "" -#: templates/alsijil/class_register/week_view.html:86 +#: templates/alsijil/class_register/week_view.html:102 msgid "Groups" msgstr "" -#: templates/alsijil/class_register/week_view.html:88 -#: templates/alsijil/class_register/week_view.html:163 +#: templates/alsijil/class_register/week_view.html:104 +#: templates/alsijil/class_register/week_view.html:186 #: templates/alsijil/print/full_register.html:169 #: templates/alsijil/print/full_register.html:200 msgid "Subject" msgstr "" -#: templates/alsijil/class_register/week_view.html:89 -#: templates/alsijil/class_register/week_view.html:173 +#: templates/alsijil/class_register/week_view.html:105 +#: templates/alsijil/class_register/week_view.html:196 msgid "Teachers" msgstr "" -#: templates/alsijil/class_register/week_view.html:262 +#: templates/alsijil/class_register/week_view.html:288 msgid "unexcused" msgstr "" -#: templates/alsijil/class_register/week_view.html:265 +#: templates/alsijil/class_register/week_view.html:291 msgid "Summed up tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:268 +#: templates/alsijil/class_register/week_view.html:294 #: templates/alsijil/partials/persons_with_stats.html:94 msgid "Count of tardiness" msgstr "" -#: templates/alsijil/class_register/week_view.html:297 +#: templates/alsijil/class_register/week_view.html:323 msgid "No lessons available" msgstr "" -#: templates/alsijil/class_register/week_view.html:300 +#: templates/alsijil/class_register/week_view.html:326 msgid "" "\n" " There are no lessons for the selected group or teacher in this week.\n" @@ -660,7 +737,7 @@ msgid "Data complete" msgstr "" #: templates/alsijil/partials/lesson_status_icon.html:12 -#: templates/alsijil/print/full_register.html:406 +#: templates/alsijil/print/full_register.html:404 msgid "Lesson cancelled" msgstr "" @@ -677,9 +754,9 @@ 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 +#: templates/alsijil/print/full_register.html:334 +#: templates/alsijil/print/full_register.html:422 +#: templates/alsijil/print/full_register.html:437 msgid "e" msgstr "" @@ -835,17 +912,17 @@ msgid "Date" msgstr "" #: templates/alsijil/print/full_register.html:309 -#: templates/alsijil/print/full_register.html:369 +#: templates/alsijil/print/full_register.html:367 msgid "Pe." msgstr "" #: templates/alsijil/print/full_register.html:310 -#: templates/alsijil/print/full_register.html:370 +#: templates/alsijil/print/full_register.html:368 msgid "Subj." msgstr "" #: templates/alsijil/print/full_register.html:311 -#: templates/alsijil/print/full_register.html:374 +#: templates/alsijil/print/full_register.html:372 msgid "Te." msgstr "" @@ -853,70 +930,70 @@ msgstr "" msgid "Tard." msgstr "" -#: templates/alsijil/print/full_register.html:330 +#: templates/alsijil/print/full_register.html:329 msgid "Yes" msgstr "" -#: templates/alsijil/print/full_register.html:363 +#: templates/alsijil/print/full_register.html:361 msgid "Lesson documentation for week" msgstr "" -#: templates/alsijil/print/full_register.html:373 +#: templates/alsijil/print/full_register.html:371 msgid "Notes" msgstr "" -#: views.py:65 +#: views.py:68 msgid "You either selected an invalid lesson or there is currently no lesson in progress." msgstr "" -#: views.py:90 +#: views.py:93 msgid "You are not allowed to create a lesson documentation for a lesson in the future." msgstr "" -#: views.py:127 +#: views.py:141 msgid "The lesson documentation has been saved." msgstr "" -#: views.py:151 +#: views.py:165 msgid "The personal notes have been saved." msgstr "" -#: views.py:570 +#: views.py:591 msgid "The absences have been marked as excused." msgstr "" -#: views.py:585 +#: views.py:606 msgid "The absence has been marked as excused." msgstr "" -#: views.py:721 +#: views.py:749 msgid "The absence has been saved." msgstr "" -#: views.py:741 +#: views.py:770 msgid "The personal note has been deleted." msgstr "" -#: views.py:762 +#: views.py:792 msgid "The extra mark has been created." msgstr "" -#: views.py:773 +#: views.py:804 msgid "The extra mark has been saved." msgstr "" -#: views.py:783 +#: views.py:815 msgid "The extra mark has been deleted." msgstr "" -#: views.py:803 +#: views.py:836 msgid "The excuse type has been created." msgstr "" -#: views.py:814 +#: views.py:848 msgid "The excuse type has been saved." msgstr "" -#: views.py:824 +#: views.py:859 msgid "The excuse type has been deleted." msgstr "" diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py index b2589345adac4c2c02159ea54fc872fe9055408a..862e33a6d6a1cf0c8893359a65cb9a8ea6440da5 100644 --- a/aleksis/apps/alsijil/managers.py +++ b/aleksis/apps/alsijil/managers.py @@ -1,3 +1,13 @@ +from datetime import date, datetime +from typing import Optional, Sequence, Union + +from django.db.models import QuerySet +from django.db.models.query import Prefetch +from django.db.models.query_utils import Q + +from calendarweek import CalendarWeek + +from aleksis.apps.chronos.managers import DateRangeQuerySetMixin from aleksis.core.managers import CurrentSiteManagerWithoutMigrations @@ -21,3 +31,69 @@ class PersonalNoteManager(CurrentSiteManagerWithoutMigrations): ) .prefetch_related("extra_marks") ) + + +class PersonalNoteQuerySet(QuerySet): + def not_empty(self): + """Get all not empty personal notes.""" + return self.filter( + ~Q(remarks="") | Q(absent=True) | ~Q(late=0) | Q(extra_marks__isnull=False) + ) + + +class LessonDocumentationManager(CurrentSiteManagerWithoutMigrations): + pass + + +class LessonDocumentationQuerySet(QuerySet): + def not_empty(self): + """Get all not empty lesson documentations.""" + return self.filter(~Q(topic="") | ~Q(group_note="") | ~Q(homework="")) + + +class GroupRoleManager(CurrentSiteManagerWithoutMigrations): + pass + + +class GroupRoleQuerySet(QuerySet): + def with_assignments( + self, time_ref: Union[date, CalendarWeek], groups: Sequence["Group"] + ) -> QuerySet: + from aleksis.apps.alsijil.models import GroupRoleAssignment + + if isinstance(time_ref, CalendarWeek): + qs = GroupRoleAssignment.objects.in_week(time_ref) + else: + qs = GroupRoleAssignment.objects.on_day(time_ref) + + qs = qs.for_groups(groups).distinct() + return self.prefetch_related(Prefetch("assignments", queryset=qs,)) + + +class GroupRoleAssignmentManager(CurrentSiteManagerWithoutMigrations): + pass + + +class GroupRoleAssignmentQuerySet(DateRangeQuerySetMixin, QuerySet): + def within_dates(self, start: date, end: date): + """Filter for all role assignments within a date range.""" + return self.filter( + Q(date_start__lte=end) & (Q(date_end__gte=start) | Q(date_end__isnull=True)) + ) + + def at_time(self, when: Optional[datetime] = None): + """Filter for role assignments assigned at a certain point in time.""" + now = when or datetime.now() + + return self.on_day(now.date()) + + def for_groups(self, groups: Sequence["Group"]): + """Filter all role assignments for a sequence of groups.""" + qs = self + for group in groups: + qs = qs.for_group(group) + return qs + + def for_group(self, group: "Group"): + """Filter all role assignments for a group.""" + return self.filter(Q(groups=group) | Q(groups__child_groups=group)) diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py index f90052a765147b8555840d84f24203b12f09b248..951ee5b8e7d1757bc899542977507026e65a6fa8 100644 --- a/aleksis/apps/alsijil/menus.py +++ b/aleksis/apps/alsijil/menus.py @@ -67,6 +67,17 @@ MENUS = { ), ], }, + { + "name": _("Assign group role"), + "url": "assign_group_role_multiple", + "icon": "assignment_ind", + "validators": [ + ( + "aleksis.core.util.predicates.permission_validator", + "alsijil.assign_grouprole_for_multiple", + ), + ], + }, { "name": _("Excuse types"), "url": "excuse_types", @@ -89,6 +100,17 @@ MENUS = { ), ], }, + { + "name": _("Manage group roles"), + "url": "group_roles", + "icon": "assignment_ind", + "validators": [ + ( + "aleksis.core.util.predicates.permission_validator", + "alsijil.view_grouproles", + ), + ], + }, ], } ] diff --git a/aleksis/apps/alsijil/migrations/0003_extra_mark.py b/aleksis/apps/alsijil/migrations/0003_extra_mark.py index 307d9168a296661c8b520b55a1b5cd400b5e6df3..9f8d658c2668e7fcc7598320d1d99161527a0699 100644 --- a/aleksis/apps/alsijil/migrations/0003_extra_mark.py +++ b/aleksis/apps/alsijil/migrations/0003_extra_mark.py @@ -64,7 +64,6 @@ class Migration(migrations.Migration): name="extra_marks", field=models.ManyToManyField( blank=True, - null=True, to="alsijil.ExtraMark", verbose_name="Extra marks", ), diff --git a/aleksis/apps/alsijil/migrations/0008_global_permissions.py b/aleksis/apps/alsijil/migrations/0008_global_permissions.py new file mode 100644 index 0000000000000000000000000000000000000000..609fc703c60cee7770c06d819b06b309a22c56af --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0008_global_permissions.py @@ -0,0 +1,28 @@ +# Generated by Django 3.1.5 on 2021-01-21 14:55 + +import django.contrib.sites.managers +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('alsijil', '0007_personal_note_lesson_documentation_year'), + ] + + operations = [ + migrations.CreateModel( + name='AlsijilGlobalPermissions', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', models.JSONField(default=dict, editable=False)), + ], + options={ + 'permissions': (('view_week', 'Can view week overview'), ('register_absence', 'Can register absence'), ('list_personal_note_filters', 'Can list all personal note filters')), + 'managed': False, + }, + managers=[ + ('objects', django.contrib.sites.managers.CurrentSiteManager()), + ], + ), + ] diff --git a/aleksis/apps/alsijil/migrations/0009_group_roles.py b/aleksis/apps/alsijil/migrations/0009_group_roles.py new file mode 100644 index 0000000000000000000000000000000000000000..ec8a061f05353e080a6b343eb7fbaa78f73b8146 --- /dev/null +++ b/aleksis/apps/alsijil/migrations/0009_group_roles.py @@ -0,0 +1,52 @@ +# Generated by Django 3.1.5 on 2021-02-07 15:21 + +import aleksis.apps.chronos.managers +from aleksis.core.util.model_helpers import ICONS +import colorfield.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_default_dashboard'), + ('sites', '0002_alter_domain_unique'), + ('alsijil', '0008_global_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='GroupRole', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', models.JSONField(default=dict, editable=False)), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('icon', models.CharField(blank=True, choices=(lambda: ICONS)(), max_length=50, verbose_name='Icon')), + ('colour', colorfield.fields.ColorField(blank=True, default='', max_length=18, verbose_name='Colour')), + ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), + ], + options={ + 'verbose_name': 'Group role', + 'verbose_name_plural': 'Group roles', + }, + ), + migrations.CreateModel( + name='GroupRoleAssignment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', models.JSONField(default=dict, editable=False)), + ('date_start', models.DateField(verbose_name='Start date')), + ('date_end', models.DateField(blank=True, help_text='Can be left empty if end date is not clear yet', null=True, verbose_name='End date')), + ('groups', models.ManyToManyField(related_name='group_roles', to='core.Group', verbose_name='Groups')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_roles', to='core.person', verbose_name='Assigned person')), + ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='alsijil.grouprole', verbose_name='Group role')), + ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), + ], + options={ + 'verbose_name': 'Group role assignment', + 'verbose_name_plural': 'Group role assignments', + }, + bases=(aleksis.apps.chronos.managers.GroupPropertiesMixin, models.Model), + ), + ] diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 0946e8241b74c490764a10b8c569493def441166..09024eae5eab9a692adac8ea8e0bc085bcf8b4e1 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -7,10 +7,7 @@ from django.db.models.expressions import Subquery from django.urls import reverse from django.utils.translation import gettext as _ -import reversion from calendarweek import CalendarWeek -from django_global_request.middleware import get_request -from reversion import set_user from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod from aleksis.core.models import Group, Person @@ -97,29 +94,23 @@ def mark_absent( else dict(extra_lesson=register_object) ) - with reversion.create_revision(): - set_user(get_request().user) - personal_note, created = ( - PersonalNote.objects.select_related(None) - .prefetch_related(None) - .update_or_create( - person=self, - defaults={ - "absent": absent, - "excused": excused, - "excuse_type": excuse_type, - }, - **q_attrs, - ) + personal_note, created = ( + PersonalNote.objects.select_related(None) + .prefetch_related(None) + .update_or_create( + person=self, + defaults={"absent": absent, "excused": excused, "excuse_type": excuse_type,}, + **q_attrs, ) - personal_note.groups_of_person.set(self.member_of.all()) + ) + 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() return lesson_periods.count() + extra_lessons.count() @@ -380,7 +371,8 @@ def generate_person_list_with_class_register_statistics( self: Group, persons: Optional[Iterable] = None ) -> QuerySet: """Get with class register statistics annotated list of all members.""" - persons = persons or self.members.all() + if persons is None: + persons = self.members.all() school_term_q = ( Q(personal_notes__lesson_period__lesson__validity__school_term=self.school_term) | Q(personal_notes__extra_lesson__school_term=self.school_term) diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index c319bf34d1b2ddd8325d48b4a9621f51f2b67261..726bc3e7aaf60c950fe7f5cbc94f163e680821a6 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -8,6 +8,7 @@ from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _ from calendarweek import CalendarWeek +from colorfield.fields import ColorField from aleksis.apps.alsijil.data_checks import ( ExcusesWithoutAbsences, @@ -16,12 +17,23 @@ from aleksis.apps.alsijil.data_checks import ( NoPersonalNotesInCancelledLessonsDataCheck, PersonalNoteOnHolidaysDataCheck, ) -from aleksis.apps.alsijil.managers import PersonalNoteManager +from aleksis.apps.alsijil.managers import ( + GroupRoleAssignmentManager, + GroupRoleAssignmentQuerySet, + GroupRoleManager, + GroupRoleQuerySet, + LessonDocumentationManager, + LessonDocumentationQuerySet, + PersonalNoteManager, + PersonalNoteQuerySet, +) +from aleksis.apps.chronos.managers import GroupPropertiesMixin from aleksis.apps.chronos.mixins import WeekRelatedMixin from aleksis.apps.chronos.models import Event, ExtraLesson, LessonPeriod from aleksis.core.mixins import ExtensibleModel from aleksis.core.models import SchoolTerm from aleksis.core.util.core_helpers import get_site_preferences +from aleksis.core.util.model_helpers import ICONS def isidentifier(value: str) -> bool: @@ -135,7 +147,7 @@ class PersonalNote(RegisterObjectRelatedMixin, ExtensibleModel): ExcusesWithoutAbsences, ] - objects = PersonalNoteManager() + objects = PersonalNoteManager.from_queryset(PersonalNoteQuerySet)() person = models.ForeignKey("core.Person", models.CASCADE, related_name="personal_notes") groups_of_person = models.ManyToManyField("core.Group", related_name="+") @@ -162,9 +174,7 @@ class PersonalNote(RegisterObjectRelatedMixin, ExtensibleModel): remarks = models.CharField(max_length=200, blank=True) - extra_marks = models.ManyToManyField( - "ExtraMark", null=True, blank=True, verbose_name=_("Extra marks") - ) + extra_marks = models.ManyToManyField("ExtraMark", blank=True, verbose_name=_("Extra marks")) def save(self, *args, **kwargs): if self.excuse_type: @@ -220,6 +230,8 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel): Non-personal, includes the topic and homework of the lesson. """ + objects = LessonDocumentationManager.from_queryset(LessonDocumentationQuerySet)() + data_checks = [LessonDocumentationOnHolidaysDataCheck] week = models.IntegerField(blank=True, null=True) @@ -321,6 +333,63 @@ class ExtraMark(ExtensibleModel): verbose_name_plural = _("Extra marks") +class GroupRole(ExtensibleModel): + objects = GroupRoleManager.from_queryset(GroupRoleQuerySet)() + + name = models.CharField(max_length=255, verbose_name=_("Name")) + icon = models.CharField(max_length=50, blank=True, choices=ICONS, verbose_name=_("Icon")) + colour = ColorField(blank=True, verbose_name=_("Colour")) + + def __str__(self): + return self.name + + class Meta: + verbose_name = _("Group role") + verbose_name_plural = _("Group roles") + + +class GroupRoleAssignment(GroupPropertiesMixin, ExtensibleModel): + objects = GroupRoleAssignmentManager.from_queryset(GroupRoleAssignmentQuerySet)() + + role = models.ForeignKey( + GroupRole, + on_delete=models.CASCADE, + related_name="assignments", + verbose_name=_("Group role"), + ) + person = models.ForeignKey( + "core.Person", + on_delete=models.CASCADE, + related_name="group_roles", + verbose_name=_("Assigned person"), + ) + groups = models.ManyToManyField( + "core.Group", related_name="group_roles", verbose_name=_("Groups"), + ) + date_start = models.DateField(verbose_name=_("Start date")) + date_end = models.DateField( + blank=True, + null=True, + verbose_name=_("End date"), + help_text=_("Can be left empty if end date is not clear yet"), + ) + + def __str__(self): + date_end = date_format(self.date_end) if self.date_end else "?" + return f"{self.role}: {self.person}, {date_format(self.date_start)}–{date_end}" + + @property + def date_range(self) -> str: + if not self.date_end: + return f"{date_format(self.date_start)}–?" + else: + return f"{date_format(self.date_start)}–{date_format(self.date_end)}" + + class Meta: + verbose_name = _("Group role assignment") + verbose_name_plural = _("Group role assignments") + + class AlsijilGlobalPermissions(ExtensibleModel): class Meta: managed = False diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py index 4ced04f41ba56db628b4dc4438242a81bc36f5eb..98cdcc7104271ed1ee9d5e8a8313cd87cee57bc8 100644 --- a/aleksis/apps/alsijil/preferences.py +++ b/aleksis/apps/alsijil/preferences.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext as _ from dynamic_preferences.preferences import Section from dynamic_preferences.types import BooleanPreference -from aleksis.core.registries import site_preferences_registry +from aleksis.core.registries import person_preferences_registry, site_preferences_registry alsijil = Section("alsijil", verbose_name=_("Class register")) @@ -46,6 +46,14 @@ class CarryOverDataToNextPeriods(BooleanPreference): help_text = _("This will carry over data only if the data in the following periods are empty.") +@site_preferences_registry.register +class CarryOverPersonalNotesToNextPeriods(BooleanPreference): + section = alsijil + name = "carry_over_personal_notes" + default = True + verbose_name = _("Carry over personal notes to all following lesson periods on the same day.") + + @site_preferences_registry.register class AllowOpenPeriodsOnSameDay(BooleanPreference): section = alsijil @@ -66,3 +74,30 @@ class AllowEntriesInHolidays(BooleanPreference): name = "allow_entries_in_holidays" default = False verbose_name = _("Allow teachers to add data for lessons in holidays") + + +@site_preferences_registry.register +class GroupOwnersCanAssignRolesToParents(BooleanPreference): + section = alsijil + name = "group_owners_can_assign_roles_to_parents" + default = False + verbose_name = _( + "Allow group owners to assign group roles to the parents of the group's members" + ) + + +@person_preferences_registry.register +class ShowGroupRolesInWeekView(BooleanPreference): + section = alsijil + name = "group_roles_in_week_view" + default = True + verbose_name = _("Show assigned group roles in week view") + help_text = _("Only week view of groups") + + +@person_preferences_registry.register +class ShowGroupRolesInLessonView(BooleanPreference): + section = alsijil + name = "group_roles_in_lesson_view" + default = True + verbose_name = _("Show assigned group roles in lesson view") diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py index 36f6a93e01f6505918902e9370dd75f36906ad49..f36db7aa5a3b532d2b143c109c7daf089391c96a 100644 --- a/aleksis/apps/alsijil/rules.py +++ b/aleksis/apps/alsijil/rules.py @@ -14,11 +14,13 @@ from .util.predicates import ( has_personal_note_group_perm, is_group_member, is_group_owner, + is_group_role_assignment_group_owner, is_lesson_parent_group_owner, is_lesson_participant, is_lesson_teacher, is_none, is_own_personal_note, + is_owner_of_any_group, is_person_group_owner, is_person_primary_group_owner, is_personal_note_lesson_parent_group_owner, @@ -218,3 +220,56 @@ add_perm("alsijil.edit_extramark", edit_extramark_predicate) # Delete extra mark delete_extramark_predicate = view_extramarks_predicate & has_global_perm("alsijil.delete_extramark") add_perm("alsijil.delete_extramark", delete_extramark_predicate) + +# View group role list +view_group_roles_predicate = has_global_perm("alsijil.view_grouprole") +add_perm("alsijil.view_grouproles", view_group_roles_predicate) + +# Add group role +add_group_role_predicate = view_group_roles_predicate & has_global_perm("alsijil.add_grouprole") +add_perm("alsijil.add_grouprole", add_group_role_predicate) + +# Edit group role +edit_group_role_predicate = view_group_roles_predicate & has_global_perm("alsijil.change_grouprole") +add_perm("alsijil.edit_grouprole", edit_group_role_predicate) + +# Delete group role +delete_group_role_predicate = view_group_roles_predicate & has_global_perm( + "alsijil.delete_grouprole" +) +add_perm("alsijil.delete_grouprole", delete_group_role_predicate) + +view_assigned_group_roles_predicate = ( + is_group_owner + | is_lesson_teacher + | is_lesson_parent_group_owner + | has_global_perm("alsjil.assign_grouprole") + | has_object_perm("alsijil.assign_grouprole") +) +add_perm("alsijil.view_assigned_grouproles", view_assigned_group_roles_predicate) + +assign_group_role_person_predicate = is_person_group_owner | has_global_perm( + "alsjil.assign_grouprole" +) +add_perm("alsijil.assign_grouprole_to_person", assign_group_role_person_predicate) + +assign_group_role_for_multiple_predicate = is_owner_of_any_group | has_global_perm( + "alsjil.assign_grouprole" +) +add_perm("alsijil.assign_grouprole_for_multiple", assign_group_role_for_multiple_predicate) + +assign_group_role_group_predicate = view_assigned_group_roles_predicate +add_perm("alsijil.assign_grouprole_for_group", assign_group_role_group_predicate) + +edit_group_role_assignment_predicate = ( + has_global_perm("alsjil.assign_grouprole") | is_group_role_assignment_group_owner +) +add_perm("alsijil.edit_grouproleassignment", edit_group_role_assignment_predicate) + +stop_group_role_assignment_predicate = edit_group_role_assignment_predicate +add_perm("alsijil.stop_grouproleassignment", stop_group_role_assignment_predicate) + +delete_group_role_assignment_predicate = ( + has_global_perm("alsjil.assign_grouprole") | is_group_role_assignment_group_owner +) +add_perm("alsijil.delete_grouproleassignment", delete_group_role_assignment_predicate) diff --git a/aleksis/apps/alsijil/tables.py b/aleksis/apps/alsijil/tables.py index b9a8e68404d6b2672dfbb37d2433e55cad08cf08..c3835e973164f5a6cd3b50540fa7b9f5a3d4ea43 100644 --- a/aleksis/apps/alsijil/tables.py +++ b/aleksis/apps/alsijil/tables.py @@ -1,3 +1,4 @@ +from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ import django_tables2 as tables @@ -48,3 +49,32 @@ class ExcuseTypeTable(tables.Table): self.columns.hide("edit") if not request.user.has_perm("alsijil.delete_excusetype"): self.columns.hide("delete") + + +class GroupRoleTable(tables.Table): + class Meta: + attrs = {"class": "highlight"} + + name = tables.LinkColumn("edit_excuse_type", args=[A("id")]) + edit = tables.LinkColumn( + "edit_group_role", + args=[A("id")], + text=_("Edit"), + attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}}, + ) + delete = tables.LinkColumn( + "delete_group_role", + args=[A("id")], + text=_("Delete"), + attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}}, + ) + + def render_name(self, value, record): + context = dict(role=record) + return render_to_string("alsijil/group_role/chip.html", context) + + def before_render(self, request): + if not request.user.has_perm("alsijil.edit_grouprole"): + self.columns.hide("edit") + if not request.user.has_perm("alsijil.delete_grouprole"): + self.columns.hide("delete") diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html b/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html index a2bf6799df9a4f9390fd1a912d5eb9dab51c3cef..f300f3b8457eed468cb3bad31821eb8d94033cf8 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/groups.html @@ -1,6 +1,6 @@ {# -*- engine:django -*- #} {% extends "core/base.html" %} -{% load i18n static %} +{% load i18n static rules %} {% block browser_title %}{% blocktrans %}My groups{% endblocktrans %}{% endblock %} @@ -38,6 +38,13 @@ <i class="material-icons left">view_week</i> {% trans "Week view" %} </a> + {% has_perm "alsijil.view_assigned_grouproles" user group as can_view_assigned_group_roles %} + {% if can_view_assigned_group_roles %} + <a class="btn primary waves-effect waves-light" href="{% url 'assigned_group_roles' group.pk %}"> + <i class="material-icons left">assignment_ind</i> + {% trans "Roles" %} + </a> + {% endif %} <a class="btn primary waves-effect waves-light" href="{% url "full_register_group" group.pk %}" target="_blank"> <i class="material-icons left">print</i> @@ -75,6 +82,15 @@ {% trans "Week view" %} </a> </p> + {% has_perm "alsijil.view_assigned_grouproles" user group as can_view_assigned_group_roles %} + {% if can_view_assigned_group_roles %} + <p> + <a class="btn primary waves-effect waves-light" href="{% url 'assigned_group_roles' group.pk %}"> + <i class="material-icons left">assignment_ind</i> + {% trans "Roles" %} + </a> + </p> + {% endif %} <p> <a class="btn primary waves-effect waves-light" href="{% url "full_register_group" group.pk %}" target="_blank"> diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html index 68c8fcccdabc20c7269a41fc29492a16567076b5..80ad5de27ce9654bb43dd77d0724fb408c295dad 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html @@ -120,6 +120,11 @@ <a href="#previous-lesson">{% trans "Previous lesson" %}</a> </li> {% endif %} + {% if group_roles %} + <li class="tab"> + <a href="#group-roles">{% trans "Group roles" %}</a> + </li> + {% endif %} <li class="tab"> <a href="#version-history">{% trans "Change history" %}</a> </li> @@ -266,7 +271,13 @@ {% if can_edit_register_object_personalnote %} <tr> {{ form.id }} - <td>{{ form.person_name }}{{ form.person_name.value }}</td> + <td>{{ form.person_name }}{{ form.person_name.value }} + <p> + {% for assignment in form.instance.person.group_roles.all %} + {% include "alsijil/group_role/chip.html" with role=assignment.role %} + {% endfor %} + </p> + </td> <td class="center-align"> <label> {{ form.absent }} @@ -319,7 +330,13 @@ </tr> {% else %} <tr> - <td>{{ form.person_name.value }}</td> + <td>{{ form.person_name.value }} + <p> + {% for assignment in form.instance.person.group_roles.all %} + {% include "alsijil/group_role/chip.html" with role=assignment.role %} + {% endfor %} + </p> + </td> <td><i class="material-icons center">{{ form.absent.value|yesno:"check,clear" }}</i></td> <td> <i class="material-icons center">{{ form.late.value|yesno:"check,clear" }}</i> @@ -347,6 +364,12 @@ </div> {% endif %} + {% if group_roles %} + <div class="col s12" id="group-roles"> + {% include "alsijil/group_role/partials/assigned_roles.html" with roles=group_roles group=lesson_period.lesson.groups.first back_url=back_url %} + </div> + {% endif %} + {% if can_view_lesson_documentation %} <div class="col s12" id="version-history"> <div class="card"> 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 22b936effe6b28f51c3a1086882084d3725ff3a8..92f92a2b242e497b60cf3a79fde1542810b650e2 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html @@ -64,12 +64,17 @@ <div class="row"> <div class="col s12"> <ul class="tabs"> - <li class="tab col s6"> + <li class="tab col"> <a class="active" href="#week-overview">{% trans "Lesson documentations" %}</a> </li> - <li class="tab col s6"> - <a class="active" href="#personal-notes">{% trans "Personal notes" %}</a> + <li class="tab col"> + <a href="#personal-notes">{% trans "Personal notes" %}</a> </li> + {% if group_roles %} + <li class="tab col"> + <a href="#group-roles">{% trans "Group roles" %}</a> + </li> + {% endif %} </ul> </div> <div class="col s12" id="week-overview"> @@ -328,6 +333,11 @@ </a> {% endif %} </h5> + <p> + {% for assignment in person.person.group_roles.all %} + {% include "alsijil/group_role/chip.html" with role=assignment.role small=assignment.date_range %} + {% endfor %} + </p> <p class="card-text"> {% trans "Absent" %}: {{ person.person.absences_count }} ({{ person.person.unexcused_count }} {% trans "unexcused" %}) @@ -360,6 +370,11 @@ </div> </div> </div> + {% if group_roles %} + <div class="col s12" id="group-roles"> + {% include "alsijil/group_role/partials/assigned_roles.html" with roles=group_roles group=group back_url=back_url %} + </div> + {% endif %} </div> {% else %} <div class="card red darken-1"> diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html b/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html new file mode 100644 index 0000000000000000000000000000000000000000..a4a5ac137179ea12278d16029c06428221c0ef25 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/assign.html @@ -0,0 +1,41 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n rules any_js material_form %} + +{% block browser_title %} + {% if group %} + {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %} + {% else %} + {% trans "Assign group role" %} + {% endif %} +{% endblock %} +{% block page_title %} + {% if group %} + {% blocktrans with group=group.name %}Assign group role for {{ group }}{% endblocktrans %} + {% else %} + {% trans "Assign group role" %} + {% endif %} +{% endblock %} + +{% block extra_head %} + {{ form.media.css }} + {% include_css "select2-materialize" %} +{% endblock %} + +{% block content %} + <form action="" method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + + <button type="submit" class="btn green waves-effect waves-light"> + <i class="material-icons left">assignment_ind</i> + {% trans "Assign" %} + </button> + </form> + + {% include_js "select2-materialize" %} + {{ form.media.js }} +{% endblock %} + diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html b/aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html new file mode 100644 index 0000000000000000000000000000000000000000..087dffaaf7151272b97c71e60ca178bc994547a3 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html @@ -0,0 +1,93 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n rules any_js material_form static %} +{% load render_table from django_tables2 %} + +{% block browser_title %} + {% blocktrans with group=object.name %}Group roles for {{ group }}{% endblocktrans %} +{% endblock %} +{% block page_title %} + {% blocktrans with group=object.name %}Group roles for {{ group }}{% endblocktrans %} +{% endblock %} + +{% block extra_head %} + {{ block.super }} + <link rel="stylesheet" href="{% static "css/alsijil/alsijil.css" %}"/> +{% endblock %} + +{% block content %} + {% url "assigned_group_roles" object.pk as back_url %} + + <p> + {% has_perm "alsijil.view_my_groups" user as can_view_group_overview %} + {% if can_view_group_overview %} + <a class="btn waves-effect waves-light" href="{% url "my_groups" %}"> + <i class="material-icons left">arrow_back</i> + {% trans "Back to my groups" %} + </a> + {% endif %} + + {% has_perm "alsijil.assign_grouprole_for_group" user object as can_assign_group_role %} + {% if can_assign_group_role %} + <a class="btn green waves-effect waves-light" href="{% url "assign_group_role" object.pk %}"> + <i class="material-icons left">assignment_ind</i> + {% trans "Assign a role to a person" %} + </a> + {% endif %} + </p> + + <div class="row"> + <div class="col s12"> + <ul class="tabs"> + <li class="tab"> + <a class="active" href="#current">{% trans "Current roles" %} ({{ today|date:"SHORT_DATE_FORMAT" }})</a> + </li> + <li class="tab"> + <a href="#all">{% trans "All assignments" %}</a> + </li> + </ul> + </div> + + <div id="current" class="col s12"> + {% include "alsijil/group_role/partials/assigned_roles.html" with roles=roles group=object back_url=back_url %} + </div> + + + <div class="col s12 " id="all"> + <table class="responsive-table"> + <thead> + <tr> + <th class="chip-height">{% trans "Group role" %}</th> + <th>{% trans "Person" %}</th> + <th>{% trans "Start date" %}</th> + <th>{% trans "End date" %}</th> + <th>{% trans "Actions" %}</th> + </tr> + </thead> + {% for assignment in assignments %} + <tr> + <td> + {% include "alsijil/group_role/chip.html" with role=assignment.role %} + </td> + <td> + {{ assignment.person }} + </td> + <td>{{ assignment.date_start }}</td> + <td>{{ assignment.date_end|default:"–" }}</td> + <td> + <a class="btn waves-effect waves-light dropdown-trigger" href="#" + data-target="dropdown-{{ assignment.pk }}-d2"> + <i class="material-icons left">list</i> + {% trans "Actions" %} + </a> + {% include "alsijil/group_role/partials/assignment_options.html" with assignment=assignment back_url=back_url suffix="-d2" %} + </td> + </tr> + {% endfor %} + </table> + </div> + </div> +{% endblock %} + diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html b/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html new file mode 100644 index 0000000000000000000000000000000000000000..530ffa05b531acd34bfa7726b374e56ee703298b --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/chip.html @@ -0,0 +1,9 @@ +{# -*- engine:django -*- #} + +<div class="chip white-text" style="background-color: {{ role.colour|default:"black" }};"> + <i class="material-icons left">{{ role.icon|default:"assignment_ind" }}</i> + {{ role.name }} + {% if small %} + <small>({{ small }})</small> + {% endif %} +</div> \ No newline at end of file diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/create.html b/aleksis/apps/alsijil/templates/alsijil/group_role/create.html new file mode 100644 index 0000000000000000000000000000000000000000..5f83f575f37c43431cbaac9f75ee1b511755ad04 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/create.html @@ -0,0 +1,15 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} +{% load material_form i18n %} + +{% block browser_title %}{% blocktrans %}Create group role{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Create group role{% endblocktrans %}{% endblock %} + +{% block content %} + <form method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + {% include "core/partials/save_button.html" %} + </form> +{% endblock %} diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/edit.html b/aleksis/apps/alsijil/templates/alsijil/group_role/edit.html new file mode 100644 index 0000000000000000000000000000000000000000..2e19c9cafe6ca7e31785d0345204dfe0785d90ec --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/edit.html @@ -0,0 +1,18 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} +{% load material_form i18n %} + +{% block browser_title %}{% blocktrans %}Edit group role{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Edit group role{% endblocktrans %}{% endblock %} + +{% block content %} + + <form method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + {% include "core/partials/save_button.html" %} + </form> + + {{ form.media.js }} +{% endblock %} diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html b/aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html new file mode 100644 index 0000000000000000000000000000000000000000..bc5038654980374fcd0c65639b7c4d3488871625 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html @@ -0,0 +1,18 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n rules material_form %} + +{% block browser_title %}{% blocktrans %}Edit group role assignment{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Edit group role assignment{% endblocktrans %}{% endblock %} + +{% block content %} + <form action="" method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + + {% include "core/partials/save_button.html" %} + </form> +{% endblock %} + diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/list.html b/aleksis/apps/alsijil/templates/alsijil/group_role/list.html new file mode 100644 index 0000000000000000000000000000000000000000..f3e4a487edfcec8761f978f89b25640b7580da40 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/list.html @@ -0,0 +1,22 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n rules %} +{% load render_table from django_tables2 %} + +{% block browser_title %}{% blocktrans %}Group roles{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Group roles{% endblocktrans %}{% endblock %} + +{% block content %} + {% has_perm "alsijil.add_grouprole" user as add_group_role %} + {% if add_group_role %} + <a class="btn green waves-effect waves-light" href="{% url 'create_group_role' %}"> + <i class="material-icons left">add</i> + {% trans "Create group role" %} + </a> + {% endif %} + + {% render_table table %} +{% endblock %} + diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html b/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html new file mode 100644 index 0000000000000000000000000000000000000000..bc8c16f022b528cd666b3056d61317ad7fd297d8 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html @@ -0,0 +1,47 @@ +{% load i18n rules %} +{% has_perm "alsijil.assign_grouprole_for_group" user group as can_assign_group_role %} +<div class="collection"> + {% for role in roles %} + <div class="collection-item"> + <div class="row no-margin"> + <div class="col s12 m5 l4 xl3 no-padding"> + {% if can_assign_group_role %} + <a class="btn waves-effect waves-light right hide-on-med-and-up" + href="{% url "assign_group_role" group.pk role.pk %}?next={{ back_url }}"> + <i class="material-icons center">add</i> + </a> + {% endif %} + + <div class="btn-margin"> + {% include "alsijil/group_role/chip.html" with role=role %} + </div> + </div> + + <div class="col s12 m7 l8 xl9 no-padding"> + {% if can_assign_group_role %} + <a class="btn waves-effect waves-light right hide-on-small-only" + href="{% url "assign_group_role" group.pk role.pk %}?next={{ back_url }}"> + <i class="material-icons center">add</i> + </a> + {% endif %} + + {% for assignment in role.assignments.all %} + {% include "alsijil/group_role/partials/assignment.html" with assignment=assignment group=group back_url=back_url %} + {% empty %} + <div class="grey-text darken-3">{% trans "No one assigned." %}</div> + {% endfor %} + </div> + </div> + </div> + {% endfor %} +</div> + +<div class="alert primary"> + <div> + <i class="material-icons left">info</i> + {% blocktrans %} + You can get some additional actions for each group role assignment if you click on the name of the + corresponding person. + {% endblocktrans %} + </div> +</div> \ No newline at end of file diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment.html b/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment.html new file mode 100644 index 0000000000000000000000000000000000000000..673e05f2ccca7f23b2a890ce9f403b569eccfbe4 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment.html @@ -0,0 +1,8 @@ +<a class="chip dropdown-trigger" href="#" + data-target="dropdown-{{ assignment.pk }}" title="{{ assignment }}">{{ assignment.person }} + {% if group not in assignment.groups.all %} + <small>({{ assignment.group_names }})</small> + {% endif %} +</a> + +{% include "alsijil/group_role/partials/assignment_options.html" with assignment=assignment back_url=back_url %} \ No newline at end of file diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html b/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html new file mode 100644 index 0000000000000000000000000000000000000000..ff50720db9dacd5437fb4b43ecf19e9719138de3 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html @@ -0,0 +1,33 @@ +{# -*- engine:django -*- #} + +{% load i18n rules %} + +{% has_perm "alsijil.edit_grouproleassignment" user assignment as can_edit %} +{% has_perm "alsijil.stop_grouproleassignment" user assignment as can_stop %} +{% has_perm "alsijil.delete_grouproleassignment" user assignment as can_delete %} + +<ul id="dropdown-{{ assignment.pk }}{{ suffix }}" class="dropdown-content"> + {% if can_edit %} + <li> + <a href="{% url "edit_group_role_assignment" assignment.pk %}?next={{ back_url }}"> + <i class="material-icons left">edit</i> {% trans "Edit" %} + </a> + </li> + {% endif %} + + {% if not assignment.date_end and can_stop %} + <li> + <a href="#"> + <i class="material-icons left">stop</i> {% trans "Stop" %} + </a> + </li> + {% endif %} + + {% if can_delete %} + <li> + <a href="{% url "delete_group_role_assignment" assignment.pk %}?next={{ back_url }}" class="red-text"> + <i class="material-icons left">delete</i> {% trans "Delete" %} + </a> + </li> + {% endif %} +</ul> \ No newline at end of file diff --git a/aleksis/apps/alsijil/templates/alsijil/group_role/warning.html b/aleksis/apps/alsijil/templates/alsijil/group_role/warning.html new file mode 100644 index 0000000000000000000000000000000000000000..d90d2e8205b1c91c18e74e02654fde3daebc4971 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/warning.html @@ -0,0 +1,10 @@ +{% load i18n %} +<div class="alert warning"> + <p> + <i class="material-icons left">warning</i> + {% blocktrans %} + This function should only be used to define alternatives to the default excuse which also will be counted extra. + Don't use this to create a default excuse or if you don't divide between different types of excuse. + {% endblocktrans %} + </p> +</div> diff --git a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html index 4458204ed6f9d8b3c6a92ac728284cc824b5d7ae..5772a420824feb6ec55ca87f44fcfb65544eec15 100644 --- a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html +++ b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html @@ -316,8 +316,7 @@ </thead> <tbody> - {% for note in person.personal_notes.all %} - {% if note.register_object in register_objects %} + {% for note in person.filtered_notes %} {% if note.absent or note.late or note.remarks or note.extra_marks.all %} <tr> {% if note.date %} @@ -348,20 +347,20 @@ {% endif %} {% endif %} {% endif %} - </td> - <td> - {% if note.late %} - {{ note.late }}' - {% endif %} - </td> - <td> - {% for extra_mark in note.extra_marks.all %} - {{ extra_mark.short_name }}{% if not forloop.last %},{% endif %} - {% endfor %} - </td> - <td>{{ note.remarks }}</td> - </tr> - {% endif %} + {% endif %} + </td> + <td> + {% if note.late %} + {{ note.late }}' + {% endif %} + </td> + <td> + {% for extra_mark in note.extra_marks.all %} + {{ extra_mark.short_name }}{% if not forloop.last %},{% endif %} + {% endfor %} + </td> + <td>{{ note.remarks }}</td> + </tr> {% endif %} {% endfor %} </tbody> diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py index ca5da439368beb869b38035b49261b84480ae47e..16ba0d0b9c5c4c976c26222a8542d3e96a93b1aa 100644 --- a/aleksis/apps/alsijil/urls.py +++ b/aleksis/apps/alsijil/urls.py @@ -57,4 +57,47 @@ urlpatterns = [ views.ExcuseTypeDeleteView.as_view(), name="delete_excuse_type", ), + path("group_roles/", views.GroupRoleListView.as_view(), name="group_roles"), + path("group_roles/create/", views.GroupRoleCreateView.as_view(), name="create_group_role"), + path("group_roles/<int:pk>/edit/", views.GroupRoleEditView.as_view(), name="edit_group_role",), + path( + "group_roles/<int:pk>/delete/", + views.GroupRoleDeleteView.as_view(), + name="delete_group_role", + ), + path( + "groups/<int:pk>/group_roles/", + views.AssignedGroupRolesView.as_view(), + name="assigned_group_roles", + ), + path( + "groups/<int:pk>/group_roles/assign/", + views.AssignGroupRoleView.as_view(), + name="assign_group_role", + ), + path( + "groups/<int:pk>/group_roles/<int:role_pk>/assign/", + views.AssignGroupRoleView.as_view(), + name="assign_group_role", + ), + path( + "group_roles/assignments/<int:pk>/edit/", + views.GroupRoleAssignmentEditView.as_view(), + name="edit_group_role_assignment", + ), + path( + "group_roles/assignments/<int:pk>/stop/", + views.GroupRoleAssignmentStopView.as_view(), + name="stop_group_role_assignment", + ), + path( + "group_roles/assignments/<int:pk>/delete/", + views.GroupRoleAssignmentDeleteView.as_view(), + name="delete_group_role_assignment", + ), + path( + "group_roles/assignments/assign/", + views.AssignGroupRoleMultipleView.as_view(), + name="assign_group_role_multiple", + ), ] diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py index 2faca64ddecac2b60d0f9539201921a1d0185388..27bdc4b9798c304b0ad20981bc918449f800db2b 100644 --- a/aleksis/apps/alsijil/util/predicates.py +++ b/aleksis/apps/alsijil/util/predicates.py @@ -245,3 +245,24 @@ def is_personal_note_lesson_parent_group_owner(user: User, obj: PersonalNote) -> def is_teacher(user: User, obj: Person) -> bool: """Predicate which checks if the provided object is a teacher.""" return user.person.is_teacher + + +@predicate +def is_group_role_assignment_group_owner(user: User, obj: Union[Group, Person]) -> bool: + """Predicate for group owners of a group role assignment. + + Checks whether the person linked to the user is the owner of the groups + linked to the given group role assignment. + If there isn't provided a group role assignment, it will return `False`. + """ + if obj: + for group in obj.groups.all(): + if user.person in list(group.owners.all()): + return True + return False + + +@predicate +def is_owner_of_any_group(user: User, obj): + """Predicate which checks if the person is group owner of any group.""" + return Group.objects.filter(owners=user.person).exists() diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 7442f4a2ed61cb55ee76e09821dc9468724c9168..3029596f01ac7d5949b3086599d5927b1aa4a311 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -1,6 +1,7 @@ +from contextlib import nullcontext from copy import deepcopy from datetime import date, datetime, timedelta -from typing import Optional +from typing import Any, Dict, Optional from django.core.exceptions import PermissionDenied from django.db.models import Count, Exists, OuterRef, Prefetch, Q, Subquery, Sum @@ -9,6 +10,7 @@ from django.db.models.functions import Extract 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 import timezone from django.utils.decorators import method_decorator from django.utils.translation import ugettext as _ from django.views.decorators.cache import never_cache @@ -24,21 +26,36 @@ from aleksis.apps.chronos.managers import TimetableType from aleksis.apps.chronos.models import Event, ExtraLesson, Holiday, LessonPeriod, TimePeriod from aleksis.apps.chronos.util.build import build_weekdays 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.mixins import ( + AdvancedCreateView, + AdvancedDeleteView, + AdvancedEditView, + SuccessNextMixin, +) from aleksis.core.models import Group, Person, SchoolTerm from aleksis.core.util import messages from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional from .forms import ( + AssignGroupRoleForm, ExcuseTypeForm, ExtraMarkForm, + GroupRoleAssignmentEditForm, + GroupRoleForm, LessonDocumentationForm, PersonalNoteFormSet, RegisterAbsenceForm, SelectForm, ) -from .models import ExcuseType, ExtraMark, PersonalNote -from .tables import ExcuseTypeTable, ExtraMarkTable +from .models import ( + ExcuseType, + ExtraMark, + GroupRole, + GroupRoleAssignment, + LessonDocumentation, + PersonalNote, +) +from .tables import ExcuseTypeTable, ExtraMarkTable, GroupRoleTable from .util.alsijil_helpers import ( annotate_documentations, get_register_object_by_pk, @@ -127,6 +144,10 @@ def register_object( if isinstance(register_object, LessonPeriod) else None ) + back_url = reverse( + "lesson_by_week_and_period", args=[wanted_week.year, wanted_week.week, lesson_period.pk] + ) + context["back_url"] = back_url context["register_object"] = register_object context["week"] = wanted_week @@ -141,6 +162,14 @@ def register_object( ) if not blocked_because_holidays: + # Group roles + show_group_roles = request.user.person.preferences[ + "alsijil__group_roles_in_lesson_view" + ] and request.user.has_perm("alsijil.view_assigned_grouproles", lesson_period) + if show_group_roles: + groups = lesson_period.lesson.groups.all() + group_roles = GroupRole.objects.with_assignments(date_of_lesson, groups) + context["group_roles"] = group_roles # Create or get lesson documentation object; can be empty when first opening lesson lesson_documentation = register_object.get_or_create_lesson_documentation(wanted_week) @@ -155,6 +184,16 @@ def register_object( persons = Person.objects.all() persons_qs = register_object.get_personal_notes(persons, wanted_week) + + # Annotate group roles + if show_group_roles: + persons_qs = persons_qs.prefetch_related( + Prefetch( + "person__group_roles", + queryset=GroupRoleAssignment.objects.on_day(date_of_lesson).for_groups(groups), + ), + ) + personal_note_formset = PersonalNoteFormSet( request.POST or None, queryset=persons_qs, prefix="personal_notes" ) @@ -185,17 +224,22 @@ def register_object( reversion.set_user(request.user) instances = personal_note_formset.save() - if not isinstance(register_object, Event): + if ( + not isinstance(register_object, Event) + and get_site_preferences()["alsijil__carry_over_personal_notes"] + ): # Iterate over personal notes # and carry changed absences to following lessons - for instance in instances: - instance.person.mark_absent( - wanted_week[register_object.period.weekday], - register_object.period.period + 1, - instance.absent, - instance.excused, - instance.excuse_type, - ) + with reversion.create_revision(): + reversion.set_user(request.user) + for instance in instances: + instance.person.mark_absent( + wanted_week[lesson_period.period.weekday], + lesson_period.period.period + 1, + instance.absent, + instance.excused, + instance.excuse_type, + ) messages.success(request, _("The personal notes have been saved.")) @@ -269,9 +313,14 @@ def week_view( # Add a form to filter the view if type_: initial = {type_.value: instance} + back_url = reverse( + "week_view_by_week", args=[wanted_week.year, wanted_week.week, type_.value, instance.pk] + ) else: initial = {} - select_form = SelectForm(request.POST or None, initial=initial) + back_url = reverse("week_view_by_week", args=[wanted_week.year, wanted_week.week]) + context["back_url"] = back_url + select_form = SelectForm(request, request.POST or None, initial=initial) if request.method == "POST": if select_form.is_valid(): @@ -291,6 +340,16 @@ def week_view( else: group = None + # Group roles + show_group_roles = ( + group + and request.user.person.preferences["alsijil__group_roles_in_week_view"] + and request.user.has_perm("alsijil.view_assigned_grouproles", group) + ) + if show_group_roles: + group_roles = GroupRole.objects.with_assignments(wanted_week, [group]) + context["group_roles"] = group_roles + extra_marks = ExtraMark.objects.all() if query_exists: @@ -340,56 +399,62 @@ def week_view( ) ) - persons_qs = ( - persons_qs.distinct() - .prefetch_related( - Prefetch( - "personal_notes", - queryset=PersonalNote.objects.filter( - Q( - week=wanted_week.week, - year=wanted_week.year, - lesson_period__in=lesson_periods_pk, - ) - | Q( - event__date_start__lte=wanted_week[6], - event__date_end__gte=wanted_week[0], - event__in=events_pk, - ) - | Q( - extra_lesson__week=wanted_week.week, - extra_lesson__year=wanted_week.year, - extra_lesson__in=extra_lessons_pk, - ) - ), - ), - "member_of__owners", - ) - .annotate( - absences_count=Count( - "personal_notes", - filter=personal_notes_q & Q(personal_notes__absent=True,), - distinct=True, - ), - unexcused_count=Count( - "personal_notes", - filter=personal_notes_q - & Q(personal_notes__absent=True, personal_notes__excused=False,), - distinct=True, - ), - tardiness_sum=Subquery( - Person.objects.filter(personal_notes_q) - .filter(pk=OuterRef("pk"),) - .distinct() - .annotate(tardiness_sum=Sum("personal_notes__late")) - .values("tardiness_sum") + persons_qs = persons_qs.distinct().prefetch_related( + Prefetch( + "personal_notes", + queryset=PersonalNote.objects.filter( + Q( + week=wanted_week.week, + year=wanted_week.year, + lesson_period__in=lesson_periods_pk, + ) + | Q( + event__date_start__lte=wanted_week[6], + event__date_end__gte=wanted_week[0], + event__in=events_pk, + ) + | Q( + extra_lesson__week=wanted_week.week, + extra_lesson__year=wanted_week.year, + extra_lesson__in=extra_lessons_pk, + ) ), - tardiness_count=Count( - "personal_notes", - filter=personal_notes_q & ~Q(personal_notes__late=0), - distinct=True, + ), + "member_of__owners", + ) + + # Annotate group roles + if show_group_roles: + persons_qs = persons_qs.prefetch_related( + Prefetch( + "group_roles", + queryset=GroupRoleAssignment.objects.in_week(wanted_week).for_group(group), ), ) + persons_qs = persons_qs.annotate( + absences_count=Count( + "personal_notes", + filter=personal_notes_q & Q(personal_notes__absent=True,), + distinct=True, + ), + unexcused_count=Count( + "personal_notes", + filter=personal_notes_q + & Q(personal_notes__absent=True, personal_notes__excused=False,), + distinct=True, + ), + tardiness_sum=Subquery( + Person.objects.filter(personal_notes_q) + .filter(pk=OuterRef("pk"),) + .distinct() + .annotate(tardiness_sum=Sum("personal_notes__late")) + .values("tardiness_sum") + ), + tardiness_count=Count( + "personal_notes", + filter=personal_notes_q & ~Q(personal_notes__late=0), + distinct=True, + ), ) for extra_mark in extra_marks: @@ -480,43 +545,29 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: group = get_object_or_404(Group, pk=id_) - # Get all lesson periods for the selected group - lesson_periods = ( - LessonPeriod.objects.filter_group(group) - .distinct() + personal_notes = ( + PersonalNote.objects.select_related("lesson_period") .prefetch_related( - "documentations", - "personal_notes", - "personal_notes__excuse_type", - "personal_notes__extra_marks", - "personal_notes__person", - "personal_notes__groups_of_person", + "lesson_period__substitutions", "lesson_period__lesson__teachers", "groups_of_person" ) - ) - events = ( - Event.objects.filter_group(group) - .distinct() - .prefetch_related( - "documentations", - "personal_notes", - "personal_notes__excuse_type", - "personal_notes__extra_marks", - "personal_notes__person", - "personal_notes__groups_of_person", + .not_empty() + .filter( + Q(lesson_period__lesson__groups=group) + | Q(lesson_period__lesson__groups__parent_groups=group) ) ) - extra_lessons = ( - ExtraLesson.objects.filter_group(group) - .distinct() - .prefetch_related( - "documentations", - "personal_notes", - "personal_notes__excuse_type", - "personal_notes__extra_marks", - "personal_notes__person", - "personal_notes__groups_of_person", + documentations = ( + LessonDocumentation.objects.select_related("lesson_period") + .not_empty() + .filter( + Q(lesson_period__lesson__groups=group) + | Q(lesson_period__lesson__groups__parent_groups=group) ) ) + # Get all lesson periods for the selected group + lesson_periods = LessonPeriod.objects.filter_group(group).distinct() + events = Event.objects.filter_group(group).distinct() + extra_lessons = ExtraLesson.objects.filter_group(group).distinct() weeks = CalendarWeek.weeks_within(group.school_term.date_start, group.school_term.date_end) register_objects_by_day = {} @@ -546,6 +597,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: ) ) + weeks = CalendarWeek.weeks_within(group.school_term.date_start, group.school_term.date_end,) + for lesson_period in lesson_periods: for week in weeks: day = week[lesson_period.period.weekday] @@ -555,39 +608,38 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: <= day <= lesson_period.lesson.validity.date_end ): - documentations = list( + filtered_documentations = list( filter( - lambda d: d.week == week.week and d.year == week.year, - lesson_period.documentations.all(), + lambda d: d.week == week.week + and d.year == week.year + and d.lesson_period == lesson_period, + documentations, ) ) - notes = list( + filtered_personal_notes = list( filter( - lambda d: d.week == week.week and d.year == week.year, - lesson_period.personal_notes.all(), + lambda d: d.week == week.week + and d.year == week.year + and d.lesson_period == lesson_period, + personal_notes, ) ) substitution = lesson_period.get_substitution(week) register_objects_by_day.setdefault(day, []).append( - (lesson_period, documentations, notes, substitution) + (lesson_period, filtered_documentations, filtered_personal_notes, substitution) ) - persons = Person.objects.prefetch_related( - "personal_notes", - "personal_notes__excuse_type", - "personal_notes__extra_marks", - "personal_notes__lesson_period__lesson__subject", - "personal_notes__lesson_period__substitutions", - "personal_notes__lesson_period__substitutions__subject", - "personal_notes__lesson_period__substitutions__teachers", - "personal_notes__lesson_period__lesson__teachers", - "personal_notes__lesson_period__period", - ) + persons = Person.objects.prefetch_related(None).select_related(None) persons = group.generate_person_list_with_class_register_statistics(persons) + prefetched_persons = [] + for person in persons: + person.filtered_notes = list(filter(lambda d: d.person == person, personal_notes)) + prefetched_persons.append(person) + context["school_term"] = group.school_term - context["persons"] = persons + context["persons"] = prefetched_persons context["excuse_types"] = ExcuseType.objects.all() context["extra_marks"] = ExtraMark.objects.all() context["group"] = group @@ -751,9 +803,8 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp context["unexcused_absences"] = unexcused_absences personal_notes = ( - allowed_personal_notes.filter( - Q(absent=True) | Q(late__gt=0) | ~Q(remarks="") | Q(extra_marks__isnull=False) - ) + allowed_personal_notes.not_empty() + .filter(Q(absent=True) | Q(late__gt=0) | ~Q(remarks="") | Q(extra_marks__isnull=False)) .annotate( school_term_start=Case( When(event__isnull=False, then="event__school_term__date_start"), @@ -883,16 +934,17 @@ def register_absence(request: HttpRequest, id_: int) -> HttpResponse: if holiday: continue - affected_count += person.mark_absent( - day, - from_period_on_day, - absent, - excused, - excuse_type, - remarks, - to_period_on_day, - dry_run=not confirmed, - ) + with reversion.create_revision() if confirmed else nullcontext(): + affected_count += person.mark_absent( + day, + from_period_on_day, + absent, + excused, + excuse_type, + remarks, + to_period_on_day, + dry_run=not confirmed, + ) if not confirmed: # Show confirmation page @@ -1014,3 +1066,169 @@ class ExcuseTypeDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDelet template_name = "core/pages/delete.html" success_url = reverse_lazy("excuse_types") success_message = _("The excuse type has been deleted.") + + +class GroupRoleListView(PermissionRequiredMixin, SingleTableView): + """Table of all group roles.""" + + model = GroupRole + table_class = GroupRoleTable + permission_required = "alsijil.view_grouproles" + template_name = "alsijil/group_role/list.html" + + +@method_decorator(never_cache, name="dispatch") +class GroupRoleCreateView(PermissionRequiredMixin, AdvancedCreateView): + """Create view for group roles.""" + + model = GroupRole + form_class = GroupRoleForm + permission_required = "alsijil.add_grouprole" + template_name = "alsijil/group_role/create.html" + success_url = reverse_lazy("group_roles") + success_message = _("The group role has been created.") + + +@method_decorator(never_cache, name="dispatch") +class GroupRoleEditView(PermissionRequiredMixin, AdvancedEditView): + """Edit view for group roles.""" + + model = GroupRole + form_class = GroupRoleForm + permission_required = "alsijil.edit_grouprole" + template_name = "alsijil/group_role/edit.html" + success_url = reverse_lazy("group_roles") + success_message = _("The group role has been saved.") + + +@method_decorator(never_cache, "dispatch") +class GroupRoleDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView): + """Delete view for group roles.""" + + model = GroupRole + permission_required = "alsijil.delete_grouprole" + template_name = "core/pages/delete.html" + success_url = reverse_lazy("group_roles") + success_message = _("The group role has been deleted.") + + +class AssignedGroupRolesView(PermissionRequiredMixin, DetailView): + permission_required = "alsijil.view_assigned_grouproles" + model = Group + template_name = "alsijil/group_role/assigned_list.html" + + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: + context = super().get_context_data() + + today = timezone.now().date() + context["today"] = today + + self.roles = GroupRole.objects.with_assignments(today, [self.object]) + context["roles"] = self.roles + assignments = ( + GroupRoleAssignment.objects.filter( + Q(groups=self.object) | Q(groups__child_groups=self.object) + ) + .distinct() + .order_by("-date_start") + ) + context["assignments"] = assignments + return context + + +@method_decorator(never_cache, name="dispatch") +class AssignGroupRoleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCreateView): + model = GroupRoleAssignment + form_class = AssignGroupRoleForm + permission_required = "alsijil.assign_grouprole_for_group" + template_name = "alsijil/group_role/assign.html" + success_message = _("The group role has been assigned.") + + def get_success_url(self) -> str: + return reverse("assigned_group_roles", args=[self.group.pk]) + + def get_permission_object(self): + self.group = get_object_or_404(Group, pk=self.kwargs.get("pk")) + try: + self.role = GroupRole.objects.get(pk=self.kwargs.get("role_pk")) + except GroupRole.DoesNotExist: + self.role = None + return self.group + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs["request"] = self.request + kwargs["initial"] = {"role": self.role, "groups": [self.group]} + return kwargs + + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: + context = super().get_context_data(**kwargs) + context["role"] = self.role + context["group"] = self.group + return context + + +@method_decorator(never_cache, name="dispatch") +class AssignGroupRoleMultipleView(PermissionRequiredMixin, SuccessNextMixin, AdvancedCreateView): + model = GroupRoleAssignment + form_class = AssignGroupRoleForm + permission_required = "alsijil.assign_grouprole_for_multiple" + template_name = "alsijil/group_role/assign.html" + success_message = _("The group role has been assigned.") + + def get_success_url(self) -> str: + return reverse("assign_group_role_multiple") + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs["request"] = self.request + return kwargs + + +@method_decorator(never_cache, name="dispatch") +class GroupRoleAssignmentEditView(PermissionRequiredMixin, SuccessNextMixin, AdvancedEditView): + """Edit view for group role assignments.""" + + model = GroupRoleAssignment + form_class = GroupRoleAssignmentEditForm + permission_required = "alsijil.edit_grouproleassignment" + template_name = "alsijil/group_role/edit_assignment.html" + success_message = _("The group role assignment has been saved.") + + def get_success_url(self) -> str: + pk = self.object.groups.first().pk + return reverse("assigned_group_roles", args=[pk]) + + +@method_decorator(never_cache, "dispatch") +class GroupRoleAssignmentStopView(PermissionRequiredMixin, SuccessNextMixin, DetailView): + model = GroupRoleAssignment + permission_required = "alsijil.stop_grouproleassignment" + + def get_success_url(self) -> str: + pk = self.object.groups.first().pk + return reverse("assigned_group_roles", args=[pk]) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + if not self.object.date_end: + self.object.date_end = timezone.now().date() + self.object.save() + messages.success(request, _("The group role assignment has been stopped.")) + return redirect(self.get_success_url()) + + +@method_decorator(never_cache, "dispatch") +class GroupRoleAssignmentDeleteView( + PermissionRequiredMixin, RevisionMixin, SuccessNextMixin, AdvancedDeleteView +): + """Delete view for group role assignments.""" + + model = GroupRoleAssignment + permission_required = "alsijil.delete_grouproleassignment" + template_name = "core/pages/delete.html" + success_message = _("The group role assignment has been deleted.") + + def get_success_url(self) -> str: + pk = self.object.groups.first().pk + return reverse("assigned_group_roles", args=[pk]) diff --git a/poetry.lock b/poetry.lock index 5627b6cdf7e024e79988102ae4126d19bcbc8b3d..3655bc843d5f5e08d532cd8e0aa240fe0b2972a2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -126,7 +126,7 @@ rules = ">=2.2,<3.0" spdx-license-list = ">=0.5.0,<0.6.0" [package.extras] -celery = ["Celery[django,redis] (>=5.0.0,<6.0.0)", "celery-haystack (>=0.10.0,<0.11.0)", "django-celery-beat (>=2.0.0,<3.0.0)", "django-celery-email (>=3.0.0,<4.0.0)", "django-celery-results (>=2.0.0,<3.0.0)"] +celery = ["Celery[redis,django] (>=5.0.0,<6.0.0)", "celery-haystack (>=0.10.0,<0.11.0)", "django-celery-beat (>=2.0.0,<3.0.0)", "django-celery-email (>=3.0.0,<4.0.0)", "django-celery-results (>=2.0.0,<3.0.0)"] ldap = ["django-auth-ldap (>=2.2,<3.0)"] [package.source] @@ -796,7 +796,7 @@ management-command = ["django-compressor (>=2.4)"] [[package]] name = "django-select2" -version = "7.6.0" +version = "7.6.1" description = "Select2 option fields for Django" category = "main" optional = false @@ -949,7 +949,7 @@ yaml = ["ruamel.yaml"] [[package]] name = "faker" -version = "5.5.1" +version = "5.6.3" description = "Faker is a Python package that generates fake data for you." category = "main" optional = false @@ -1414,17 +1414,16 @@ python-versions = ">=3.5" [[package]] name = "pyjwt" -version = "2.0.0" +version = "1.7.1" description = "JSON Web Token implementation in Python" category = "main" optional = false -python-versions = ">=3.6" +python-versions = "*" [package.extras] -crypto = ["cryptography (>=3.3.1,<4.0.0)"] -dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1,<4.0.0)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] +crypto = ["cryptography (>=1.4)"] +flake8 = ["flake8", "flake8-import-order", "pep8-naming"] +test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"] [[package]] name = "pyparsing" @@ -1458,14 +1457,14 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-cov" -version = "2.10.1" +version = "2.11.1" description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] -coverage = ">=4.4" +coverage = ">=5.2.1" pytest = ">=4.6" [package.extras] @@ -1543,11 +1542,11 @@ python-versions = "*" [[package]] name = "pyyaml" -version = "5.3.1" +version = "5.4" description = "YAML parser and emitter for Python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "qrcode" @@ -1637,7 +1636,7 @@ python-versions = "*" [[package]] name = "safety" -version = "1.10.2.post1" +version = "1.10.3" description = "Checks installed dependencies for known vulnerabilities." category = "dev" optional = false @@ -1863,7 +1862,7 @@ python-versions = "*" [[package]] name = "testfixtures" -version = "6.17.0" +version = "6.17.1" description = "A collection of helpers and mock objects for unit tests and doc tests." category = "dev" optional = false @@ -1930,14 +1929,14 @@ telegram = ["requests"] [[package]] name = "twilio" -version = "6.50.1" +version = "6.51.0" description = "Twilio API client and TwiML generator" category = "main" optional = false python-versions = "*" [package.dependencies] -PyJWT = ">=1.4.2" +PyJWT = "1.7.1" pytz = "*" requests = {version = ">=2.0.0", markers = "python_version >= \"3.0\""} six = "*" @@ -2095,7 +2094,6 @@ click = [ ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] colour = [ {file = "colour-0.1.5-py2.py3-none-any.whl", hash = "sha256:33f6db9d564fadc16e59921a56999b79571160ce09916303d35346dddc17978c"}, @@ -2305,8 +2303,8 @@ django-sass-processor = [ {file = "django-sass-processor-0.8.2.tar.gz", hash = "sha256:9b46a12ca8bdcb397d46fbcc49e6a926ff9f76a93c5efeb23b495419fd01fc7a"}, ] django-select2 = [ - {file = "django-select2-7.6.0.tar.gz", hash = "sha256:6a85ae28d865f13d32451fce750357d5cb639096472e1066b2ba21c2257d6141"}, - {file = "django_select2-7.6.0-py2.py3-none-any.whl", hash = "sha256:614cda6aee0972161c4c062ea28c17b98868b3a019cce708a3185aadb8c2ca99"}, + {file = "django-select2-7.6.1.tar.gz", hash = "sha256:25362c5bafe082a19add598fb0a69e3239b94759691a0ac8e01ab7fba8e650ad"}, + {file = "django_select2-7.6.1-py2.py3-none-any.whl", hash = "sha256:dc6b6fa737b6ea0b673e27c218955dd51a3fb81b2b28af93ce87703b24f4faf8"}, ] django-settings-context-processor = [ {file = "django-settings-context-processor-0.2.tar.gz", hash = "sha256:d37c853d69a3069f5abbf94c7f4f6fc0fac38bbd0524190cd5a250ba800e496a"}, @@ -2346,8 +2344,8 @@ dynaconf = [ {file = "dynaconf-3.1.2.tar.gz", hash = "sha256:9b34ab2f811a81755f5eb4beac77a69e1e0887528c7e37fc4bc83fed52dcf502"}, ] faker = [ - {file = "Faker-5.5.1-py3-none-any.whl", hash = "sha256:ec1f502d85e6ca6b47d651ccd797c18a67c8a184cbbea5de37a253ced360258d"}, - {file = "Faker-5.5.1.tar.gz", hash = "sha256:29b0f01e5c3f499f15798aeed5ebd0e6dad7ab90651479e48d52851c638553af"}, + {file = "Faker-5.6.3-py3-none-any.whl", hash = "sha256:23c9855bdf22435a528472dc5749b65069e5b1807d7a9bc6dde5865763243859"}, + {file = "Faker-5.6.3.tar.gz", hash = "sha256:eb1625d72ad8f59984bea3ec25b6b56c690ac28b058fd95f23d758743595c741"}, ] flake8 = [ {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, @@ -2415,7 +2413,6 @@ importlib-metadata = [ {file = "importlib_metadata-3.4.0.tar.gz", hash = "sha256:fa5daa4477a7414ae34e95942e4dd07f62adf589143c875c133c1e53c4eff38d"}, ] iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ @@ -2622,8 +2619,6 @@ pycryptodome = [ {file = "pycryptodome-3.9.9-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:5598dc6c9dbfe882904e54584322893eff185b98960bbe2cdaaa20e8a437b6e5"}, {file = "pycryptodome-3.9.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1cfdb92dca388e27e732caa72a1cc624520fe93752a665c3b6cd8f1a91b34916"}, {file = "pycryptodome-3.9.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f19e6ef750f677d924d9c7141f54bade3cd56695bbfd8a9ef15d0378557dfe4"}, - {file = "pycryptodome-3.9.9-cp27-cp27m-win32.whl", hash = "sha256:a3d8a9efa213be8232c59cdc6b65600276508e375e0a119d710826248fd18d37"}, - {file = "pycryptodome-3.9.9-cp27-cp27m-win_amd64.whl", hash = "sha256:50826b49fbca348a61529693b0031cdb782c39060fb9dca5ac5dff858159dc5a"}, {file = "pycryptodome-3.9.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:19cb674df6c74a14b8b408aa30ba8a89bd1c01e23505100fb45f930fbf0ed0d9"}, {file = "pycryptodome-3.9.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:28f75e58d02019a7edc7d4135203d2501dfc47256d175c72c9798f9a129a49a7"}, {file = "pycryptodome-3.9.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:6d3baaf82681cfb1a842f1c8f77beac791ceedd99af911e4f5fabec32bae2259"}, @@ -2634,26 +2629,17 @@ pycryptodome = [ {file = "pycryptodome-3.9.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:7798e73225a699651888489fbb1dbc565e03a509942a8ce6194bbe6fb582a41f"}, {file = "pycryptodome-3.9.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:46e96aeb8a9ca8b1edf9b1fd0af4bf6afcf3f1ca7fa35529f5d60b98f3e4e959"}, {file = "pycryptodome-3.9.9-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:843e5f10ecdf9d307032b8b91afe9da1d6ed5bb89d0bbec5c8dcb4ba44008e11"}, - {file = "pycryptodome-3.9.9-cp36-cp36m-win32.whl", hash = "sha256:b68794fba45bdb367eeb71249c26d23e61167510a1d0c3d6cf0f2f14636e62ee"}, - {file = "pycryptodome-3.9.9-cp36-cp36m-win_amd64.whl", hash = "sha256:60febcf5baf70c566d9d9351c47fbd8321da9a4edf2eff45c4c31c86164ca794"}, {file = "pycryptodome-3.9.9-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:4ed27951b0a17afd287299e2206a339b5b6d12de9321e1a1575261ef9c4a851b"}, {file = "pycryptodome-3.9.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9000877383e2189dafd1b2fc68c6c726eca9a3cfb6d68148fbb72ccf651959b6"}, {file = "pycryptodome-3.9.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:faa682c404c218e8788c3126c9a4b8fbcc54dc245b5b6e8ea5b46f3b63bd0c84"}, {file = "pycryptodome-3.9.9-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:62c488a21c253dadc9f731a32f0ac61e4e436d81a1ea6f7d1d9146ed4d20d6bd"}, - {file = "pycryptodome-3.9.9-cp37-cp37m-win32.whl", hash = "sha256:834b790bbb6bd18956f625af4004d9c15eed12d5186d8e57851454ae76d52215"}, - {file = "pycryptodome-3.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:70d807d11d508433daf96244ec1c64e55039e8a35931fc5ea9eee94dbe3cb6b5"}, {file = "pycryptodome-3.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:27397aee992af69d07502126561d851ba3845aa808f0e55c71ad0efa264dd7d4"}, {file = "pycryptodome-3.9.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d7ec2bd8f57c559dd24e71891c51c25266a8deb66fc5f02cc97c7fb593d1780a"}, {file = "pycryptodome-3.9.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e15bde67ccb7d4417f627dd16ffe2f5a4c2941ce5278444e884cb26d73ecbc61"}, {file = "pycryptodome-3.9.9-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5c3c4865730dfb0263f822b966d6d58429d8b1e560d1ddae37685fd9e7c63161"}, - {file = "pycryptodome-3.9.9-cp38-cp38-win32.whl", hash = "sha256:76b1a34d74bb2c91bce460cdc74d1347592045627a955e9a252554481c17c52f"}, - {file = "pycryptodome-3.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:6e4227849e4231a3f5b35ea5bdedf9a82b3883500e5624f00a19156e9a9ef861"}, {file = "pycryptodome-3.9.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2a68df525b387201a43b27b879ce8c08948a430e883a756d6c9e3acdaa7d7bd8"}, {file = "pycryptodome-3.9.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a4599c0ca0fc027c780c1c45ed996d5bef03e571470b7b1c7171ec1e1a90914c"}, {file = "pycryptodome-3.9.9-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b4e6b269a8ddaede774e5c3adbef6bf452ee144e6db8a716d23694953348cd86"}, - {file = "pycryptodome-3.9.9-cp39-cp39-win32.whl", hash = "sha256:a199e9ca46fc6e999e5f47fce342af4b56c7de85fae893c69ab6aa17531fb1e1"}, - {file = "pycryptodome-3.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:6e89bb3826e6f84501e8e3b205c22595d0c5492c2f271cbb9ee1c48eb1866645"}, - {file = "pycryptodome-3.9.9.tar.gz", hash = "sha256:910e202a557e1131b1c1b3f17a63914d57aac55cf9fb9b51644962841c3995c4"}, ] pydocstyle = [ {file = "pydocstyle-5.1.1-py3-none-any.whl", hash = "sha256:aca749e190a01726a4fb472dd4ef23b5c9da7b9205c0a7857c06533de13fd678"}, @@ -2668,8 +2654,8 @@ pygments = [ {file = "Pygments-2.7.4.tar.gz", hash = "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"}, ] pyjwt = [ - {file = "PyJWT-2.0.0-py3-none-any.whl", hash = "sha256:5c2ff2eb27d7e342dfc3cafcc16412781f06db2690fbef81922b0172598f085b"}, - {file = "PyJWT-2.0.0.tar.gz", hash = "sha256:7a2b271c6dac2fda9e0c33d176c4253faba2c6c6b3a99c7f28a32c3c97522779"}, + {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, + {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -2680,8 +2666,8 @@ pytest = [ {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, ] pytest-cov = [ - {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, - {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, + {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, + {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, ] pytest-django = [ {file = "pytest-django-3.10.0.tar.gz", hash = "sha256:4de6dbd077ed8606616958f77655fed0d5e3ee45159475671c7fa67596c6dba6"}, @@ -2707,17 +2693,27 @@ pytz = [ {file = "pytz-2020.5.tar.gz", hash = "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5"}, ] pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, + {file = "PyYAML-5.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f7a21e3d99aa3095ef0553e7ceba36fb693998fbb1226f1392ce33681047465f"}, + {file = "PyYAML-5.4-cp27-cp27m-win32.whl", hash = "sha256:52bf0930903818e600ae6c2901f748bc4869c0c406056f679ab9614e5d21a166"}, + {file = "PyYAML-5.4-cp27-cp27m-win_amd64.whl", hash = "sha256:a36a48a51e5471513a5aea920cdad84cbd56d70a5057cca3499a637496ea379c"}, + {file = "PyYAML-5.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5e7ac4e0e79a53451dc2814f6876c2fa6f71452de1498bbe29c0b54b69a986f4"}, + {file = "PyYAML-5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc552b6434b90d9dbed6a4f13339625dc466fd82597119897e9489c953acbc22"}, + {file = "PyYAML-5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0dc9f2eb2e3c97640928dec63fd8dc1dd91e6b6ed236bd5ac00332b99b5c2ff9"}, + {file = "PyYAML-5.4-cp36-cp36m-win32.whl", hash = "sha256:5a3f345acff76cad4aa9cb171ee76c590f37394186325d53d1aa25318b0d4a09"}, + {file = "PyYAML-5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:f3790156c606299ff499ec44db422f66f05a7363b39eb9d5b064f17bd7d7c47b"}, + {file = "PyYAML-5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:124fd7c7bc1e95b1eafc60825f2daf67c73ce7b33f1194731240d24b0d1bf628"}, + {file = "PyYAML-5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8b818b6c5a920cbe4203b5a6b14256f0e5244338244560da89b7b0f1313ea4b6"}, + {file = "PyYAML-5.4-cp37-cp37m-win32.whl", hash = "sha256:737bd70e454a284d456aa1fa71a0b429dd527bcbf52c5c33f7c8eee81ac16b89"}, + {file = "PyYAML-5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:7242790ab6c20316b8e7bb545be48d7ed36e26bbe279fd56f2c4a12510e60b4b"}, + {file = "PyYAML-5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cc547d3ead3754712223abb7b403f0a184e4c3eae18c9bb7fd15adef1597cc4b"}, + {file = "PyYAML-5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8635d53223b1f561b081ff4adecb828fd484b8efffe542edcfdff471997f7c39"}, + {file = "PyYAML-5.4-cp38-cp38-win32.whl", hash = "sha256:26fcb33776857f4072601502d93e1a619f166c9c00befb52826e7b774efaa9db"}, + {file = "PyYAML-5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2243dd033fd02c01212ad5c601dafb44fbb293065f430b0d3dbf03f3254d615"}, + {file = "PyYAML-5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:31ba07c54ef4a897758563e3a0fcc60077698df10180abe4b8165d9895c00ebf"}, + {file = "PyYAML-5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:02c78d77281d8f8d07a255e57abdbf43b02257f59f50cc6b636937d68efa5dd0"}, + {file = "PyYAML-5.4-cp39-cp39-win32.whl", hash = "sha256:fdc6b2cb4b19e431994f25a9160695cc59a4e861710cc6fc97161c5e845fc579"}, + {file = "PyYAML-5.4-cp39-cp39-win_amd64.whl", hash = "sha256:8bf38641b4713d77da19e91f8b5296b832e4db87338d6aeffe422d42f1ca896d"}, + {file = "PyYAML-5.4.tar.gz", hash = "sha256:3c49e39ac034fd64fd576d63bb4db53cda89b362768a67f07749d55f128ac18a"}, ] qrcode = [ {file = "qrcode-6.1-py2.py3-none-any.whl", hash = "sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5"}, @@ -2799,16 +2795,14 @@ restructuredtext-lint = [ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6ac7e45367b1317e56f1461719c853fd6825226f45b835df7436bb04031fd8a"}, - {file = "ruamel.yaml.clib-0.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b4b0d31f2052b3f9f9b5327024dc629a253a83d8649d4734ca7f35b60ec3e9e5"}, {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, ] rules = [ {file = "rules-2.2.tar.gz", hash = "sha256:9bae429f9d4f91a375402990da1541f9e093b0ac077221d57124d06eeeca4405"}, ] safety = [ - {file = "safety-1.10.2.post1-py2.py3-none-any.whl", hash = "sha256:6f50edff1c5162d096cacd9557406b32c021c77fe8d2229750eeff22a3e10dfe"}, - {file = "safety-1.10.2.post1.tar.gz", hash = "sha256:1d8f904c7df7c99f094154a6d2c3ae9703fd2fa58914bd80e005e860a9f4045c"}, + {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"}, + {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"}, ] scramp = [ {file = "scramp-1.2.0-py3-none-any.whl", hash = "sha256:74815c25aad1fe0b5fb994e96c3de63e8695164358a80138352aaadfa4760350"}, @@ -2886,8 +2880,8 @@ termcolor = [ {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, ] testfixtures = [ - {file = "testfixtures-6.17.0-py2.py3-none-any.whl", hash = "sha256:ebcc3e024d47bb58a60cdc678604151baa0c920ae2814004c89ac9066de31b2c"}, - {file = "testfixtures-6.17.0.tar.gz", hash = "sha256:fa7c170df68ca6367eda061e9ec339ae3e6d3679c31e04033f83ef97a7d7d0ce"}, + {file = "testfixtures-6.17.1-py2.py3-none-any.whl", hash = "sha256:9ed31e83f59619e2fa17df053b241e16e0608f4580f7b5a9333a0c9bdcc99137"}, + {file = "testfixtures-6.17.1.tar.gz", hash = "sha256:5ec3a0dd6f71cc4c304fbc024a10cc293d3e0b852c868014b9f233203e149bda"}, ] "testing.common.database" = [ {file = "testing.common.database-2.0.3-py2.py3-none-any.whl", hash = "sha256:e3ed492bf480a87f271f74c53b262caf5d85c8bc09989a8f534fa2283ec52492"}, @@ -2910,7 +2904,7 @@ tqdm = [ {file = "tqdm-4.56.0.tar.gz", hash = "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"}, ] twilio = [ - {file = "twilio-6.50.1.tar.gz", hash = "sha256:dd8371c9b4ea422d6de7526b63b587da82e8488f2b3f6b1258d2cad6e4006a65"}, + {file = "twilio-6.51.0.tar.gz", hash = "sha256:de98a05858e6efdf87bfa4c8f7e773adf1885cfcbb6531356840bcd17dc4c444"}, ] typed-ast = [ {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, diff --git a/pyproject.toml b/pyproject.toml index 00bc076de5d8b3d08347847ffd8994b3abc75307..b1785568543f35b537b5d46965a5b2cc48b7fa02 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "AlekSIS-App-Alsijil" -version = "2.0a3.dev0" +version = "2.0a4.dev0" packages = [ { include = "aleksis" } ] diff --git a/tox.ini b/tox.ini index e1283a1b72150383c5c2c9b7fbf43abb6cdf6ea2..f09d243fd2ddcd42c0eae1a6c298c08eb9557a13 100644 --- a/tox.ini +++ b/tox.ini @@ -35,6 +35,7 @@ commands = [testenv:build] commands_pre = + poetry run sh -c "cd aleksis; aleksis-admin compilemessages" commands = poetry build [testenv:docs]