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(