diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue
index ef97f2ddb73cd0eb5714e1a8818e97fb54fde67a..8dbe68847629ba81e0bca1da804c516de4562bf4 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue
@@ -15,6 +15,7 @@
 
       <lesson-notes class="span-2" v-bind="documentationPartProps" />
       <participation-list
+        v-if="documentation.canEditParticipationStatus"
         :include-present="false"
         class="participation-list"
         v-bind="documentationPartProps"
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index ed1da5ee7538b53ac64b5a9d152ce38f1425ebe7..5303a40e57e3bf7ac6bbeba98da2f6e206be6007 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -535,6 +535,7 @@ class Documentation(CalendarEvent):
         events: list,
         incomplete: Optional[bool] = False,
         absences_exist: Optional[bool] = False,
+        request: Optional[HttpRequest] = None,
     ) -> tuple:
         """Get all the documentations for the events.
         Create dummy documentations if none exist.
@@ -566,11 +567,22 @@ class Documentation(CalendarEvent):
 
             doc = next(existing_documentations_event, None)
             if doc:
-                if (incomplete and doc.topic) or (
-                    absences_exist
-                    and (
-                        not doc.participations.all()
-                        or not [d for d in doc.participations.all() if d.absence_reason]
+                if (
+                    (incomplete and doc.topic)
+                    or (
+                        not request.user.has_perm(
+                            "alsijil.edit_participation_status_for_documentation_rule", doc
+                        )
+                        and not doc.participations.filter(
+                            person__pk=request.user.person.pk, absence_reason__isnull=False
+                        ).exists()
+                    )
+                    or (
+                        absences_exist
+                        and (
+                            not doc.participations.all()
+                            or not [d for d in doc.participations.all() if d.absence_reason]
+                        )
                     )
                 ):
                     continue
@@ -609,6 +621,7 @@ class Documentation(CalendarEvent):
         start: datetime,
         end: datetime,
         incomplete: Optional[bool] = False,
+        request: Optional[HttpRequest] = None,
     ) -> tuple:
         """Get all the documentations for the person from start to end datetime.
         Create dummy documentations if none exist.
@@ -627,7 +640,7 @@ class Documentation(CalendarEvent):
             with_reference_object=True,
         )
 
-        return Documentation.get_documentations_for_events(start, end, events, incomplete)
+        return Documentation.get_documentations_for_events(start, end, events, incomplete, request)
 
     @classmethod
     def parse_dummy(
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index 8b8e15e7b0250c76651144190ea4153b4e5717df..171a0765737f8b68164af78b3823c96481eef044 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -431,11 +431,19 @@ add_perm(
     view_participation_status_for_documentation_predicate,
 )
 
-edit_participation_status_for_documentation_predicate = (
+edit_participation_status_for_documentation_with_time_range_predicate = (
     has_person
     & (has_global_perm("alsijil.change_participationstatus") | can_edit_participation_status)
     & is_in_allowed_time_range_for_participation_status
 )
+add_perm(
+    "alsijil.edit_participation_status_for_documentation_with_time_range_rule",
+    edit_participation_status_for_documentation_with_time_range_predicate,
+)
+
+edit_participation_status_for_documentation_predicate = has_person & (
+    has_global_perm("alsijil.change_participationstatus") | can_edit_participation_status
+)
 add_perm(
     "alsijil.edit_participation_status_for_documentation_rule",
     edit_participation_status_for_documentation_predicate,
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 97ec4f187e036a246772b709c75942018fb1d4d9..ceb9bbd4bd9e1593f7dd19a21795dd5192ad2ee3 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -141,6 +141,7 @@ class Query(graphene.ObjectType):
             events,
             incomplete,
             absences_exist,
+            info.context,
         )
         return docs + dummies
 
@@ -218,6 +219,7 @@ class Query(graphene.ObjectType):
                 person,
                 start,
                 end,
+                info.context,
             )
 
             lessons_for_person.append(LessonsForPersonType(id=person, lessons=docs + dummies))
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 6132340c5bb15999c90ffd19ceaf098f0547acc8..cdb2eaca122330f70bd75023a463f2dc1dc0e8e7 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -180,7 +180,8 @@ class TouchDocumentationMutation(graphene.Mutation):
         )
 
         if not info.context.user.has_perm(
-            "alsijil.edit_participation_status_for_documentation_rule", documentation
+            "alsijil.edit_participation_status_for_documentation_with_time_range_rule",
+            documentation,
         ):
             raise PermissionDenied()
 
diff --git a/aleksis/apps/alsijil/schema/participation_status.py b/aleksis/apps/alsijil/schema/participation_status.py
index 2b9ebb25f37fabcc58415da613980d171114996d..fcf15df815619fcc808770116347458d8f7daf02 100644
--- a/aleksis/apps/alsijil/schema/participation_status.py
+++ b/aleksis/apps/alsijil/schema/participation_status.py
@@ -73,7 +73,8 @@ class ParticipationStatusBatchPatchMutation(BaseBatchPatchMutation):
     @classmethod
     def after_update_obj(cls, root, info, input, obj, full_input):  # noqa: A002
         if not info.context.user.has_perm(
-            "alsijil.edit_participation_status_for_documentation_rule", obj.related_documentation
+            "alsijil.edit_participation_status_for_documentation_with_time_range_rule",
+            obj.related_documentation,
         ):
             raise PermissionDenied()