diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 7b74944b11716f608edf15958f90f7c5aec4c7ca..ca1e2e5bffa70497f3522cde05cbb264b81be51b 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -6,11 +6,13 @@ from django.db.models import Count from django.utils.translation import gettext_lazy as _ from django_select2.forms import 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.predicates import check_global_permission from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote @@ -51,12 +53,7 @@ class SelectForm(forms.Form): queryset=None, label=_("Group"), required=False, widget=Select2Widget, ) teacher = forms.ModelChoiceField( - queryset=Person.objects.annotate( - lessons_count=Count("lessons_as_teacher") - ).filter(lessons_count__gt=0), - label=_("Teacher"), - required=False, - widget=Select2Widget, + queryset=None, label=_("Teacher"), required=False, widget=Select2Widget, ) def clean(self) -> dict: @@ -78,12 +75,22 @@ class SelectForm(forms.Form): return data def __init__(self, *args, **kwargs): + self.request = kwargs.pop("request") super().__init__(*args, **kwargs) self.fields["group"].queryset = ( Group.objects.for_current_school_term_or_all() .annotate(lessons_count=Count("lessons")) .filter(lessons_count__gt=0) ) + if not check_global_permission(self.request.user, "alsijil.view_week"): + self.fields["group"].queryset = self.fields["group"].queryset & get_objects_for_user( + self.request.user, "core.register_absence_group", Group + ) + self.fields["teacher"].queryset = ( + Person.objects.annotate(lessons_count=Count("lessons_as_teacher")).filter(lessons_count__gt=0) + ) + if not check_global_permission(self.request.user, "alsijil.view_week"): + self.fields["teacher"].queryset = self.fields["teacher"].queryset.filter(pk=self.request.user.person.pk) PersonalNoteFormSet = forms.modelformset_factory( @@ -99,11 +106,9 @@ class RegisterAbsenceForm(forms.Form): ) date_start = forms.DateField(label=_("Start date"), initial=datetime.today) date_end = forms.DateField(label=_("End date"), initial=datetime.today) + person = forms.ModelChoiceField(label=_("Person"), queryset=None, widget=Select2Widget) from_period = forms.ChoiceField(label=_("Start period")) to_period = forms.ChoiceField(label=_("End period")) - person = forms.ModelChoiceField( - label=_("Person"), queryset=Person.objects.all(), widget=Select2Widget - ) absent = forms.BooleanField(label=_("Absent"), initial=True, required=False) excused = forms.BooleanField(label=_("Excused"), initial=True, required=False) excuse_type = forms.ModelChoiceField( @@ -115,9 +120,23 @@ class RegisterAbsenceForm(forms.Form): remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False) def __init__(self, *args, **kwargs): + self.request = kwargs.pop("request") super().__init__(*args, **kwargs) period_choices = TimePeriod.period_choices - + if check_global_permission(self.request.user, "alsijil.register_absence"): + self.fields["person"].queryset = Person.objects.all() + else: + self.fields["person"].queryset = ( + get_objects_for_user(self.request.user, "core.register_absence_person", Person) + .union(Person.objects.filter(member_of__owners=self.request.user.person)) + .union( + Person.objects.filter( + member_of__in=get_objects_for_user( + self.request.user, "core.register_absence_group", Group + ) + ) + ) + ) self.fields["from_period"].choices = period_choices self.fields["to_period"].choices = period_choices self.fields["from_period"].initial = TimePeriod.period_min diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 9bf9be6a57a7359c63c29e7e92ec1f7371e32c01..c9b1877cf55e767777263142e60ae51101ce7a34 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -206,7 +206,7 @@ def week_view( initial = {type_.value: instance} else: initial = {} - select_form = SelectForm(request.POST or None, initial=initial) + select_form = SelectForm(request.POST or None, initial=initial, request=request) if request.method == "POST": if select_form.is_valid(): @@ -474,7 +474,7 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: def register_absence(request: HttpRequest) -> HttpResponse: context = {} - register_absence_form = RegisterAbsenceForm(request.POST or None) + register_absence_form = RegisterAbsenceForm(request.POST or None, request=request) if request.method == "POST": if register_absence_form.is_valid() and request.user.has_perm(