diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d58e466b99296765d1b74fb19eb350e5e67b15ea..906f44538761575dc686cb0569f9b2fb61145e94 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -6,6 +6,14 @@ All notable changes to this project will be documented in this file.
 The format is based on `Keep a Changelog`_,
 and this project adheres to `Semantic Versioning`_.
 
+`4.0.0.dev1`_ - 2024-06-13
+--------------------------
+
+Added
+~~~~~
+
+* Support for entering absences for students in the new coursebook interface.
+
 `4.0.0.dev0`_ - 2024-04-23
 --------------------------
 
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
index 14411e9ce9c1c2780402890a80aa907b246262ff..2f15c3fd031c62ff9fc96cf5c35042f2274d3321 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookDay.vue
@@ -1,13 +1,14 @@
 <template>
-  <v-list-item :style="{ scrollMarginTop: '145px' }" two-line>
+  <v-list-item :style="{ scrollMarginTop: '145px' }" two-line class="px-0">
     <v-list-item-content>
-      <v-subheader class="text-h6">{{
+      <v-subheader class="text-h6 px-1">{{
         $d(date, "dateWithWeekday")
       }}</v-subheader>
       <v-list max-width="100%" class="pt-0 mt-n1">
         <v-list-item
           v-for="doc in docs"
           :key="'documentation-' + (doc.oldId || doc.id)"
+          class="px-1"
         >
           <documentation-modal
             :documentation="doc"
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
index e5493b07cda406fddbb3fccc89e5d1b42080ab89..b47ebbfbb1d1cd8219686f05085eb0eeb8f453d3 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookFilters.vue
@@ -45,6 +45,10 @@
 <script>
 import { coursesOfPerson, groupsByPerson } from "./coursebook.graphql";
 
+const TYPENAMES_TO_TYPES = {
+  CourseType: "course",
+  GroupType: "group",
+};
 export default {
   name: "CoursebookFilters",
   data() {
@@ -73,9 +77,9 @@ export default {
     selectable() {
       return [
         { header: this.$t("alsijil.coursebook.filter.groups") },
-        ...this.groups.map((group) => ({ type: "group", ...group })),
+        ...this.groups,
         { header: this.$t("alsijil.coursebook.filter.courses") },
-        ...this.courses.map((course) => ({ type: "course", ...course })),
+        ...this.courses,
       ];
     },
     selectLoading() {
@@ -86,14 +90,16 @@ export default {
     },
     currentObj() {
       return this.selectable.find(
-        (o) => o.type === this.value.objType && o.id === this.value.objId,
+        (o) =>
+          TYPENAMES_TO_TYPES[o.__typename] === this.value.objType &&
+          o.id === this.value.objId,
       );
     },
   },
   methods: {
     selectObject(selection) {
       this.$emit("input", {
-        objType: selection ? selection.type : null,
+        objType: selection ? TYPENAMES_TO_TYPES[selection.__typename] : null,
         objId: selection ? selection.id : null,
       });
     },
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
index a5136eb9f0c2535009fd78a02e7481aebacd12b4..52866931e7b2d31bbee85bc754a4a668066e8b73 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/CoursebookLoader.vue
@@ -1,12 +1,12 @@
 <template>
   <div>
-    <v-list-item v-for="i in numberOfDays" :key="'i-' + i">
+    <v-list-item v-for="i in numberOfDays" :key="'i-' + i" class="px-0">
       <v-list-item-content>
         <v-list-item-title>
           <v-skeleton-loader type="heading" />
         </v-list-item-title>
         <v-list max-width="100%">
-          <v-list-item v-for="j in numberOfDocs" :key="'j-' + j">
+          <v-list-item v-for="j in numberOfDocs" :key="'j-' + j" class="px-1">
             <DocumentationLoader />
           </v-list-item>
         </v-list>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3af1db58846f37b5e7e7837dba08a4468294269e
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
@@ -0,0 +1,187 @@
+<script>
+import AbsenceReasonButtons from "aleksis.apps.kolego/components/AbsenceReasonButtons.vue";
+import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
+import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReasonGroupSelect.vue";
+import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue";
+import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue";
+import mutateMixin from "aleksis.core/mixins/mutateMixin.js";
+import documentationPartMixin from "../documentation/documentationPartMixin";
+import LessonInformation from "../documentation/LessonInformation.vue";
+import { updateParticipationStatuses } from "./participationStatus.graphql";
+import SlideIterator from "aleksis.core/components/generic/SlideIterator.vue";
+
+export default {
+  name: "ManageStudentsDialog",
+  extends: MobileFullscreenDialog,
+  components: {
+    AbsenceReasonChip,
+    AbsenceReasonGroupSelect,
+    AbsenceReasonButtons,
+    CancelButton,
+    LessonInformation,
+    MobileFullscreenDialog,
+    SlideIterator,
+  },
+  mixins: [documentationPartMixin, mutateMixin],
+  data() {
+    return {
+      dialog: false,
+      search: "",
+      loadSelected: false,
+      selected: [],
+      isExpanded: false,
+    };
+  },
+  props: {
+    loadingIndicator: {
+      type: Boolean,
+      default: false,
+      required: false,
+    },
+  },
+  computed: {
+    items() {
+      return this.documentation.participations;
+    },
+  },
+  methods: {
+    sendToServer(participations, field, value) {
+      if (field !== "absenceReason") return;
+
+      this.mutate(
+        updateParticipationStatuses,
+        {
+          input: participations.map((participation) => ({
+            id: participation.id,
+            absenceReason: value === "present" ? null : value,
+          })),
+        },
+        (storedDocumentations, incomingStatuses) => {
+          const documentation = storedDocumentations.find(
+            (doc) => doc.id === this.documentation.id,
+          );
+
+          incomingStatuses.forEach((newStatus) => {
+            const participationStatus = documentation.participations.find(
+              (part) => part.id === newStatus.id,
+            );
+            participationStatus.absenceReason = newStatus.absenceReason;
+            participationStatus.isOptimistic = newStatus.isOptimistic;
+          });
+
+          return storedDocumentations;
+        },
+      );
+    },
+    handleMultipleAction(absenceReasonId) {
+      this.loadSelected = true;
+      this.sendToServer(this.selected, "absenceReason", absenceReasonId);
+      this.$once("save", this.resetMultipleAction);
+    },
+    resetMultipleAction() {
+      this.loadSelected = false;
+      this.$set(this.selected, []);
+      this.$refs.iterator.selected = [];
+    },
+  },
+};
+</script>
+
+<template>
+  <mobile-fullscreen-dialog
+    scrollable
+    v-bind="$attrs"
+    v-on="$listeners"
+    v-model="dialog"
+  >
+    <template #activator="activator">
+      <slot name="activator" v-bind="activator" />
+    </template>
+
+    <template #title>
+      <lesson-information v-bind="documentationPartProps" :compact="false" />
+      <v-scroll-x-transition leave-absolute>
+        <v-text-field
+          v-show="!isExpanded"
+          type="search"
+          v-model="search"
+          clearable
+          rounded
+          hide-details
+          single-line
+          prepend-inner-icon="$search"
+          dense
+          outlined
+          :placeholder="$t('actions.search')"
+          class="pt-4 full-width"
+        />
+      </v-scroll-x-transition>
+      <v-scroll-x-transition>
+        <div v-show="selected.length > 0" class="full-width mt-4">
+          <absence-reason-buttons
+            allow-empty
+            empty-value="present"
+            @input="handleMultipleAction"
+          />
+        </div>
+      </v-scroll-x-transition>
+    </template>
+    <template #content>
+      <slide-iterator
+        ref="iterator"
+        v-model="selected"
+        :items="items"
+        :search="search"
+        :item-key-getter="
+          (item) => 'documentation-' + documentation.id + '-student-' + item.id
+        "
+        :is-expanded.sync="isExpanded"
+        :loading="loadingIndicator || loadSelected"
+        :load-only-selected="loadSelected"
+        :disabled="loading"
+      >
+        <template #listItemContent="{ item }">
+          <v-list-item-title>
+            {{ item.person.fullName }}
+          </v-list-item-title>
+          <v-list-item-subtitle v-if="item.absenceReason">
+            <absence-reason-chip small :absence-reason="item.absenceReason" />
+          </v-list-item-subtitle>
+        </template>
+
+        <template #expandedItem="{ item, close }">
+          <v-card-title>
+            <v-tooltip bottom>
+              <template #activator="{ on, attrs }">
+                <v-btn v-bind="attrs" v-on="on" icon @click="close">
+                  <v-icon>$prev</v-icon>
+                </v-btn>
+              </template>
+              <span v-t="'actions.back_to_overview'" />
+            </v-tooltip>
+            {{ item.person.fullName }}
+          </v-card-title>
+          <v-card-text>
+            <absence-reason-group-select
+              allow-empty
+              empty-value="present"
+              :loadSelectedChip="loading"
+              :value="item.absenceReason?.id || 'present'"
+              @input="sendToServer([item], 'absenceReason', $event)"
+            />
+          </v-card-text>
+        </template>
+      </slide-iterator>
+    </template>
+
+    <template #actions>
+      <cancel-button
+        @click="dialog = false"
+        i18n-key="actions.close"
+        v-show="$vuetify.breakpoint.mobile"
+      />
+    </template>
+  </mobile-fullscreen-dialog>
+</template>
+
+<style scoped></style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
new file mode 100644
index 0000000000000000000000000000000000000000..572036c67955b3365bb46eb69f6ab41ee86cf074
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsTrigger.vue
@@ -0,0 +1,78 @@
+<script>
+import { DateTime } from "luxon";
+import ManageStudentsDialog from "./ManageStudentsDialog.vue";
+import documentationPartMixin from "../documentation/documentationPartMixin";
+import { touchDocumentation } from "./participationStatus.graphql";
+import mutateMixin from "aleksis.core/mixins/mutateMixin.js";
+
+export default {
+  name: "ManageStudentsTrigger",
+  components: { ManageStudentsDialog },
+  mixins: [documentationPartMixin, mutateMixin],
+  data() {
+    return {
+      canOpenParticipation: false,
+      timeout: null,
+    };
+  },
+  mounted() {
+    const lessonStart = DateTime.fromISO(this.documentation.datetimeStart);
+    const now = DateTime.now();
+    this.canOpenParticipation = now >= lessonStart;
+
+    if (!this.canOpenParticipation) {
+      this.timeout = setTimeout(
+        () => (this.canOpenParticipation = true),
+        lessonStart.diff(now).toObject().milliseconds,
+      );
+    }
+  },
+  beforeDestroy() {
+    if (this.timeout) {
+      clearTimeout(this.timeout);
+    }
+  },
+  methods: {
+    touchDocumentation() {
+      this.mutate(
+        touchDocumentation,
+        {
+          documentationId: this.documentation.id,
+        },
+        (storedDocumentations, incoming) => {
+          // ID may be different now
+          return storedDocumentations.map((doc) =>
+            doc.id === this.documentation.id
+              ? Object.assign(doc, incoming, { oldId: doc.id })
+              : doc,
+          );
+        },
+      );
+    },
+  },
+};
+</script>
+
+<template>
+  <manage-students-dialog
+    v-bind="documentationPartProps"
+    @update="() => null"
+    :loading-indicator="loading"
+  >
+    <template #activator="{ attrs, on }">
+      <v-chip
+        dense
+        color="primary"
+        outlined
+        :disabled="!canOpenParticipation || loading"
+        v-bind="attrs"
+        v-on="on"
+        @click="touchDocumentation"
+      >
+        <v-icon>$edit</v-icon>
+      </v-chip>
+    </template>
+  </manage-students-dialog>
+</template>
+
+<style scoped></style>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
new file mode 100644
index 0000000000000000000000000000000000000000..81a3a5fb1eb3a99bef25eb9938cd254b9068981b
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/participationStatus.graphql
@@ -0,0 +1,42 @@
+mutation updateParticipationStatuses(
+  $input: [BatchPatchParticipationStatusInput]!
+) {
+  updateParticipationStatuses(input: $input) {
+    items: participationStatuses {
+      id
+      isOptimistic
+      relatedDocumentation {
+        id
+      }
+      absenceReason {
+        id
+        name
+        shortName
+        colour
+      }
+    }
+  }
+}
+
+mutation touchDocumentation($documentationId: ID!) {
+  touchDocumentation(documentationId: $documentationId) {
+    items: documentation {
+      id
+      participations {
+        id
+        person {
+          id
+          firstName
+          fullName
+        }
+        absenceReason {
+          id
+          name
+          shortName
+          colour
+        }
+        isOptimistic
+      }
+    }
+  }
+}
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
index 8444f9e35af335080026b221424fda598068c6fc..6348a24f189033fc60e97325c0c69cde5d11fbc9 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -9,10 +9,6 @@ query coursesOfPerson {
   courses: coursesOfPerson {
     id
     name
-    groups {
-      id
-      name
-    }
   }
 }
 
@@ -70,6 +66,21 @@ query documentationsForCoursebook(
       colourFg
       colourBg
     }
+    participations {
+      id
+      person {
+        id
+        firstName
+        fullName
+      }
+      absenceReason {
+        id
+        name
+        shortName
+        colour
+      }
+      isOptimistic
+    }
     topic
     homework
     groupNote
@@ -92,6 +103,21 @@ mutation createOrUpdateDocumentations($input: [DocumentationInputType]!) {
       homework
       groupNote
       oldId
+      participations {
+        id
+        person {
+          id
+          firstName
+          fullName
+        }
+        absenceReason {
+          id
+          name
+          shortName
+          colour
+        }
+        isOptimistic
+      }
     }
   }
 }
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
index 09a04bcb67c6ae618fa0b1546a0171af30323885..652609dccaf430d3a4ab138f80ee2f810b84b4af 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
@@ -61,7 +61,7 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
         v-for="teacher in documentation.teachers"
         :key="documentation.id + '-teacher-' + teacher.id"
         :person="teacher"
-        no-link
+        :no-link="compact"
         v-bind="compact ? dialogActivator.attrs : {}"
         v-on="compact ? dialogActivator.on : {}"
       />
@@ -69,7 +69,7 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
         v-for="teacher in amendedTeachers"
         :key="documentation.id + '-amendedTeacher-' + teacher.id"
         :person="teacher"
-        no-link
+        :no-link="compact"
         v-bind="compact ? dialogActivator.attrs : {}"
         v-on="compact ? dialogActivator.on : {}"
         class="text-decoration-line-through"
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
index f85633f2e6f3864a20db9136f86cee4b51311719..bc0da4a742917e0639a0c1983186fad29764babb 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonNotes.vue
@@ -1,45 +1,71 @@
+<script setup>
+import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
+</script>
+
 <template>
   <div
     class="d-flex align-center justify-space-between justify-md-end flex-wrap gap"
   >
-    <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
-    <v-chip dense color="success">
-      <v-chip small dense class="mr-2" color="green darken-3 white--text"
-        >26</v-chip
-      >
-      von 30 anwesend
-    </v-chip>
-    <v-chip dense color="warning">
-      <v-chip small dense class="mr-2" color="orange darken-3 white--text"
-        >3</v-chip
-      >
-      entschuldigt
-    </v-chip>
-    <v-chip dense color="error">
-      <v-chip small dense class="mr-2" color="red darken-3 white--text"
-        >1</v-chip
-      >
-      unentschuldigt
+    <v-chip dense color="success" outlined v-if="total > 0">
+      {{ $t("alsijil.coursebook.present_number", { present, total }) }}
     </v-chip>
-    <v-chip dense color="grey lighten-1">
-      <v-chip small dense class="mr-2" color="grey darken-1 white--text"
-        >4</v-chip
-      >
-      Hausaufgaben vergessen
-    </v-chip>
-    <v-chip dense color="primary" outlined>
-      <v-icon>$edit</v-icon>
-    </v-chip>
-    <!-- eslint-enable @intlify/vue-i18n/no-raw-text -->
+    <absence-reason-chip
+      v-for="[reasonId, participations] in Object.entries(absences)"
+      :key="'reason-' + reasonId"
+      :absence-reason="participations[0].absenceReason"
+      dense
+    >
+      <template #append>
+        <span
+          >:
+          <span>
+            {{
+              participations
+                .slice(0, 5)
+                .map((participation) => participation.person.firstName)
+                .join(", ")
+            }}
+          </span>
+          <span v-if="participations.length > 5">
+            <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
+            +{{ participations.length - 5 }}
+            <!-- eslint-enable @intlify/vue-i18n/no-raw-text -->
+          </span>
+        </span>
+      </template>
+    </absence-reason-chip>
+
+    <manage-students-trigger v-bind="documentationPartProps" />
   </div>
 </template>
 
 <script>
 import documentationPartMixin from "./documentationPartMixin";
+import ManageStudentsTrigger from "../absences/ManageStudentsTrigger.vue";
 
 export default {
   name: "LessonNotes",
+  components: { ManageStudentsTrigger },
   mixins: [documentationPartMixin],
+  computed: {
+    total() {
+      return this.documentation.participations.length;
+    },
+    present() {
+      return this.documentation.participations.filter(
+        (p) => p.absenceReason === null,
+      ).length;
+    },
+    absences() {
+      // Get all course attendants who have an absence reason
+      return Object.groupBy(
+        this.documentation.participations.filter(
+          (p) => p.absenceReason !== null,
+        ),
+        ({ absenceReason }) => absenceReason.id,
+      );
+    },
+  },
 };
 </script>
 
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
index 165f1d2fd157bb35bf2831fc7973f480b29ccd0a..88a8e852f8cc6e333303034fb5f590d174708886 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
@@ -10,6 +10,13 @@ export default {
       type: Object,
       required: true,
     },
+    /**
+     * The query used by the coursebook. Used to update the store when data changes.
+     */
+    affectedQuery: {
+      type: Object,
+      required: true,
+    },
     /**
      * Whether the documentation is currently in the compact mode (meaning coursebook row)
      */
@@ -38,6 +45,7 @@ export default {
         documentation: this.documentation,
         compact: this.compact,
         dialogActivator: this.dialogActivator,
+        affectedQuery: this.affectedQuery,
       };
     },
   },
diff --git a/aleksis/apps/alsijil/frontend/messages/de.json b/aleksis/apps/alsijil/frontend/messages/de.json
index ac77624a53d8cc05cd7838491496dc51bf25f433..061816ac5a70b4b140c32224666b87cbd12ee7a4 100644
--- a/aleksis/apps/alsijil/frontend/messages/de.json
+++ b/aleksis/apps/alsijil/frontend/messages/de.json
@@ -50,6 +50,7 @@
         }
       },
       "title_plural": "Kursbuch",
+      "present_number": "{present}/{total} anwesend",
       "absences": {
         "title": "Abwesenheiten erfassen",
         "summary": "Zusammenfassung",
@@ -62,7 +63,20 @@
       "menu_title": "Entschuldigungsarten"
     },
     "extra_marks": {
-      "menu_title": "Zusätzliche Markierungen"
+      "menu_title": "Zusätzliche Markierungen",
+      "create": "Markierung erstellen",
+      "name": "Markierung",
+      "short_name": "Abkürzung",
+      "colour_fg": "Schriftfarbe",
+      "colour_bg": "Hintergrundfarbe",
+      "show_in_coursebook": "In Kursbuch-Ãœbersicht zeigen",
+      "show_in_coursebook_helptext": "Wenn aktiviert tauchen diese Markierungen in den Zeilen im Kursbuch auf."
+    },
+    "personal_notes": {
+      "note": "Notiz",
+      "create_personal_note": "Weitere Notiz",
+      "confirm_delete": "Notiz wirklich löschen?",
+      "confirm_delete_explanation": "Die Notiz \"{note}\" für {name} wird entfernt."
     },
     "group_roles": {
       "menu_title_assign": "Gruppenrollen zuweisen",
@@ -84,5 +98,8 @@
     "week": {
       "menu_title": "Aktuelle Woche"
     }
+  },
+  "actions": {
+    "back_to_overview": "Zurück zur Übersicht"
   }
 }
diff --git a/aleksis/apps/alsijil/frontend/messages/en.json b/aleksis/apps/alsijil/frontend/messages/en.json
index 44de1cad4ad9fc042e840fcbb069cf3f612add26..fb86946b95001d81dd2ff9235c02abd74a6291a8 100644
--- a/aleksis/apps/alsijil/frontend/messages/en.json
+++ b/aleksis/apps/alsijil/frontend/messages/en.json
@@ -74,6 +74,7 @@
         "courses": "Courses",
         "filter_for_obj": "Filter for group and course"
       },
+      "present_number": "{present}/{total} present",
       "no_data": "No lessons for the selected groups and courses in this period",
       "no_results": "No search results for {search}",
       "absences": {
@@ -84,5 +85,8 @@
         "warning": "Changes are permanent and can not be altered again from this menu once confirmed."
       }
     }
+  },
+  "actions": {
+    "back_to_overview": "Back to overview"
   }
 }
diff --git a/aleksis/apps/alsijil/frontend/messages/ru.json b/aleksis/apps/alsijil/frontend/messages/ru.json
index 80cd02ad8e25ac807b4c294140f076529dafd77e..3f20ae686429082b97521d0f36ba0bdca9e6367a 100644
--- a/aleksis/apps/alsijil/frontend/messages/ru.json
+++ b/aleksis/apps/alsijil/frontend/messages/ru.json
@@ -1,4 +1,7 @@
 {
+  "actions": {
+    "back_to_overview": "Назад к обзору"
+  },
   "alsijil": {
     "absence": {
       "menu_title": "Регистрация отсутствия"
diff --git a/aleksis/apps/alsijil/frontend/messages/uk.json b/aleksis/apps/alsijil/frontend/messages/uk.json
index 1c516bb201cf66daecc93129aa34de51f2860638..860e21a111aa1d70dd74c3e787bb1763fa977808 100644
--- a/aleksis/apps/alsijil/frontend/messages/uk.json
+++ b/aleksis/apps/alsijil/frontend/messages/uk.json
@@ -1,4 +1,7 @@
 {
+  "actions": {
+    "back_to_overview": "Назад до огляду"
+  },
   "alsijil": {
     "absence": {
       "menu_title": "Реєстрація відсутності"
diff --git a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
index 461e0f3cec97715fef05f37eae2d09b466b6e984..48140858293ae7990bfa39c1668d1807e11f51e4 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: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -111,7 +111,7 @@ msgid "Before"
 msgstr ""
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -152,20 +152,20 @@ msgid "You can't select a group and a teacher both."
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
@@ -178,8 +178,8 @@ msgstr ""
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -198,8 +198,8 @@ msgstr ""
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -272,38 +272,38 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -314,18 +314,18 @@ msgstr ""
 msgid "Extra marks"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -334,7 +334,7 @@ msgstr ""
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -343,7 +343,7 @@ msgstr ""
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -351,157 +351,161 @@ msgstr ""
 msgid "Group note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 msgid "Lesson Topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 msgid "Group Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 msgid "Documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 msgid "Documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 msgid "Groups of Person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 msgid "Absence Reason"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 msgid "Base Absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 msgid "Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 msgid "Extra Mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 msgid "Personal Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 msgid "Personal Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 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 8f5aa6cf99694bfd5f1220819de95475f837bfca..14c910ed3a24b89bc09e4cc6438137dfbcc92b5d 100644
--- a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-04-23 21:13+0200\n"
-"PO-Revision-Date: 2024-04-23 19:39+0000\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
+"PO-Revision-Date: 2024-06-13 09:24+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/de/>\n"
 "Language: de_DE\n"
@@ -111,7 +111,7 @@ msgid "Before"
 msgstr "Bevor"
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -152,20 +152,20 @@ msgid "You can't select a group and a teacher both."
 msgstr "Es kann nur entweder eine Gruppe oder eine Lehrkraft ausgewählt werden."
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr "Person"
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Startdatum"
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Enddatum"
@@ -178,8 +178,8 @@ msgstr "Startstunde"
 msgid "End period"
 msgstr "Endstunde"
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -198,8 +198,8 @@ msgstr "Abwesend"
 msgid "Excused"
 msgstr "Entschuldigt"
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -272,38 +272,38 @@ msgstr "Kann eine Gruppenrolle für diese Gruppe zuweisen"
 msgid "Can register an absence for a person"
 msgstr "Kann eine Absenz für eine Person registrieren"
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Als abwesend zählen"
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr "Wenn ausgewählt wird diese Entschuldigungsart als eine verpasste Stunde gezählt. Wenn nicht ausgewählt wird es nicht im Abwesenheitsbericht auftauchen."
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr "Entschuldigungsarten"
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr "Jahr"
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -314,18 +314,18 @@ msgstr "Jahr"
 msgid "Extra marks"
 msgstr "Zusätzliche Markierungen"
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr "Persönliche Notiz"
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Persönliche Notizen"
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -334,7 +334,7 @@ msgstr "Persönliche Notizen"
 msgid "Lesson topic"
 msgstr "Stundenthema"
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -343,7 +343,7 @@ msgstr "Stundenthema"
 msgid "Homework"
 msgstr "Hausaufgaben"
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -351,157 +351,161 @@ msgstr "Hausaufgaben"
 msgid "Group note"
 msgstr "Gruppennotiz"
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Stunden-Dokumentation"
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr "Stunden-Dokumentationen"
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr "Vordergrundfarbe"
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr "Hintergrundfarbe"
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr "In Kursbuch anzeigen"
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr "Zusätzliche Markierung"
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr "Kurs"
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr "Lehrkräfte"
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 msgid "Lesson Topic"
 msgstr "Stundenthema"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 msgid "Group Note"
 msgstr "Gruppennotiz"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr "Teilnahmestatus angelegt am"
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 msgid "Documentation"
 msgstr "Dokumentation"
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 msgid "Documentations"
 msgstr "Dokumentationen"
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 msgid "Groups of Person"
 msgstr "Gruppen der Person"
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 msgid "Absence Reason"
 msgstr "Abwesenheitsgrund"
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 msgid "Base Absence"
 msgstr "Basis-Abwesenheit"
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr "Teilnahmestatus"
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 msgid "Note"
 msgstr "Notiz"
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 msgid "Extra Mark"
 msgstr "Zusätzliche Markierung"
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 msgid "Personal Note"
 msgstr "Persönliche Notiz"
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 msgid "Personal Notes"
 msgstr "Persönliche Notizen"
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr "Farbe"
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr "Gruppenrolle"
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr "Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr "Kann Gruppenrolle zuweisen"
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr "Zugewiesene Person"
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Kann frei gelassen werden, wenn das Enddatum noch nicht feststeht"
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr "Zuweisung von Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr "Zuweisungen von Gruppenrollen"
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr "Kann die Stundenübersicht sehen"
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr "Kann die Wochenübersicht sehen"
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr "Kann komplettes Klassenbuch sehen"
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr "Kann eine Absenz registrieren"
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr "Kann alle Filter für persönliche Notizen anzeigen"
 
diff --git a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
index e283f3797931d09214dbc06954730515b45eda92..72c9ebda41b069fb1e4116b336be8aeff1427caa 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: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2021-06-16 11:59+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/fr/>\n"
@@ -123,7 +123,7 @@ msgid "Before"
 msgstr ""
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -168,20 +168,20 @@ msgid "You can't select a group and a teacher both."
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr "Personne"
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Date de début"
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Date de fin"
@@ -198,8 +198,8 @@ msgstr "De la période"
 msgid "End period"
 msgstr "De la période"
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -218,8 +218,8 @@ msgstr "Absent(e)"
 msgid "Excused"
 msgstr "Excusé"
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 #, fuzzy
@@ -306,29 +306,29 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr "Registre de la classe"
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
@@ -337,11 +337,11 @@ msgstr ""
 msgid "Excuse types"
 msgstr "Excusé"
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -352,20 +352,20 @@ msgstr ""
 msgid "Extra marks"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal note"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -374,7 +374,7 @@ msgstr "Notes personnelles"
 msgid "Lesson topic"
 msgstr "Sujet de cours"
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -383,7 +383,7 @@ msgstr "Sujet de cours"
 msgid "Homework"
 msgstr "Devoirs"
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -393,12 +393,12 @@ msgstr "Devoirs"
 msgid "Group note"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 #, fuzzy
@@ -406,118 +406,122 @@ msgstr "Documentation de cours"
 msgid "Lesson documentations"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr "Profs"
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 #, fuzzy
 #| msgid "Lesson topic"
 msgid "Lesson Topic"
 msgstr "Sujet de cours"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 #, fuzzy
 #| msgid "Group"
 msgid "Group Note"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 #, fuzzy
 #| msgid "Lesson documentation"
 msgid "Documentation"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 #, fuzzy
 #| msgid "Lesson documentation"
 msgid "Documentations"
 msgstr "Documentation de cours"
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 #, fuzzy
 #| msgid "Group"
 msgid "Groups of Person"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 #, fuzzy
 #| msgid "Absences"
 msgid "Absence Reason"
 msgstr "Absences"
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 #, fuzzy
 #| msgid "Absences"
 msgid "Base Absence"
 msgstr "Absences"
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 #, fuzzy
 #| msgid "Notes"
 msgid "Note"
 msgstr "Notes"
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 msgid "Extra Mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal Note"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal Notes"
 msgstr "Notes personnelles"
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 #, fuzzy
 #| msgid "Group"
 msgid "Group role"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
@@ -526,19 +530,19 @@ msgstr "Groupe"
 msgid "Group roles"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 #, fuzzy
 #| msgid "Persons in group"
 msgid "Can assign group role"
 msgstr "Personnes en groupe"
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 #, fuzzy
 #| msgid "Absences"
 msgid "Assigned person"
 msgstr "Absences"
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
@@ -547,41 +551,41 @@ msgstr "Absences"
 msgid "Groups"
 msgstr "Groupe"
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 #, fuzzy
 #| msgid "Personal overview"
 msgid "Can view lesson overview"
 msgstr "Vue d'ensemble personnelle"
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 #, fuzzy
 #| msgid "Class register"
 msgid "Can view full register"
 msgstr "Registre de la classe"
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 #, fuzzy
 #| msgid "Register absence"
 msgid "Can register absence"
 msgstr "Registre de Absence"
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 #, fuzzy
 #| msgid "List of all personal note filters"
 msgid "Can list all personal note filters"
diff --git a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
index a3ca7ecd62424293afd0f457fe4b67c95cbeb5af..474943af086754291a287070770f0e915f2f5c6b 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: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2020-07-26 14:08+0000\n"
 "Last-Translator: Julian <leuckerj@gmail.com>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/la/>\n"
@@ -111,7 +111,7 @@ msgid "Before"
 msgstr ""
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -152,20 +152,20 @@ msgid "You can't select a group and a teacher both."
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr "Persona"
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
@@ -178,8 +178,8 @@ msgstr ""
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -198,8 +198,8 @@ msgstr ""
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -272,40 +272,40 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Primus nomen"
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -316,20 +316,20 @@ msgstr ""
 msgid "Extra marks"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 #, fuzzy
 #| msgid "Person"
 msgid "Personal note"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -338,7 +338,7 @@ msgstr ""
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -347,7 +347,7 @@ msgstr ""
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -357,117 +357,121 @@ msgstr ""
 msgid "Group note"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 msgid "Lesson Topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 #, fuzzy
 #| msgid "Group"
 msgid "Group Note"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 msgid "Documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 msgid "Documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 #, fuzzy
 #| msgid "Group"
 msgid "Groups of Person"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 msgid "Absence Reason"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 msgid "Base Absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 msgid "Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 msgid "Extra Mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 #, fuzzy
 #| msgid "Person"
 msgid "Personal Note"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 #, fuzzy
 #| msgid "Person"
 msgid "Personal Notes"
 msgstr "Persona"
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 #, fuzzy
 #| msgid "Group"
 msgid "Group role"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
@@ -476,15 +480,15 @@ msgstr "Grex"
 msgid "Group roles"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
@@ -493,35 +497,35 @@ msgstr ""
 msgid "Groups"
 msgstr "Grex"
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 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 4a23675366e43a10b5190e5dfd31b46a442dd86f..7e8285208907941025f0a6da310079f0e35e214e 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: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgid "Before"
 msgstr ""
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -151,20 +151,20 @@ msgid "You can't select a group and a teacher both."
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
@@ -177,8 +177,8 @@ msgstr ""
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -197,8 +197,8 @@ msgstr ""
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -271,38 +271,38 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -313,18 +313,18 @@ msgstr ""
 msgid "Extra marks"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -333,7 +333,7 @@ msgstr ""
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -342,7 +342,7 @@ msgstr ""
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -350,157 +350,161 @@ msgstr ""
 msgid "Group note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 msgid "Lesson Topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 msgid "Group Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 msgid "Documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 msgid "Documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 msgid "Groups of Person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 msgid "Absence Reason"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 msgid "Base Absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 msgid "Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 msgid "Extra Mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 msgid "Personal Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 msgid "Personal Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr ""
 
diff --git a/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
index e1467925c5f0b0d1b4d9eebf9a8eea986c3785f3..aff00561b86b01e0dfb0862151a83a96fc6741cf 100644
--- a/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2023-05-26 04:38+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/ru/>\n"
@@ -111,7 +111,7 @@ msgid "Before"
 msgstr "До"
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -152,20 +152,20 @@ msgid "You can't select a group and a teacher both."
 msgstr "Вы не можете одновременно выбрать группу и преподавателя."
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr "Физлицо"
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Дата начала"
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Дата окончания"
@@ -178,8 +178,8 @@ msgstr "Начало уроков"
 msgid "End period"
 msgstr "Окончание уроков"
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -198,8 +198,8 @@ msgstr "Отсутствует"
 msgid "Excused"
 msgstr "Уважительно"
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -272,38 +272,38 @@ msgstr "Может назначать роль группы для этой гр
 msgid "Can register an absence for a person"
 msgstr "Может регистрировать отсутствия"
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr "Короткое имя"
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr "Полное имя"
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Количество отсутствующих"
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr "Если отмечено, этот тип объяснительной будет засчитан как пропущенный урок. Если не отмечено, то без записи в отчет о пропусках."
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr "Типы объяснительных"
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr "Год"
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -314,18 +314,18 @@ msgstr "Год"
 msgid "Extra marks"
 msgstr "Дополнительные отметки"
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr "Личная заметка"
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Личные заметки"
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -334,7 +334,7 @@ msgstr "Личные заметки"
 msgid "Lesson topic"
 msgstr "Тема урока"
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -343,7 +343,7 @@ msgstr "Тема урока"
 msgid "Homework"
 msgstr "Домашняя работа"
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -351,179 +351,183 @@ msgstr "Домашняя работа"
 msgid "Group note"
 msgstr "Групповая заметка"
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Учебный материал"
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr "Учебные материалы"
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr "Дополнительная отметка"
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr "Преподаватели"
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 #, fuzzy
 #| msgid "Lesson topic"
 msgid "Lesson Topic"
 msgstr "Тема урока"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 #, fuzzy
 #| msgid "Group note"
 msgid "Group Note"
 msgstr "Групповая заметка"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 #, fuzzy
 #| msgid "Lesson documentation"
 msgid "Documentation"
 msgstr "Учебный материал"
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 #, fuzzy
 #| msgid "Lesson documentations"
 msgid "Documentations"
 msgstr "Учебные материалы"
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 #, fuzzy
 #| msgid "Group roles"
 msgid "Groups of Person"
 msgstr "Роли групп"
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 #, fuzzy
 #| msgid "Absences"
 msgid "Absence Reason"
 msgstr "Пропуски"
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 #, fuzzy
 #| msgid "Absences"
 msgid "Base Absence"
 msgstr "Пропуски"
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 #, fuzzy
 #| msgid "Notes"
 msgid "Note"
 msgstr "Заметки"
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 #, fuzzy
 #| msgid "Extra mark"
 msgid "Extra Mark"
 msgstr "Дополнительная отметка"
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 #, fuzzy
 #| msgid "Personal note"
 msgid "Personal Note"
 msgstr "Личная заметка"
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal Notes"
 msgstr "Личные заметки"
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr "Иконка"
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr "Цвет"
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr "Роль группы"
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr "Роли групп"
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr "Может назначать роль группы"
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr "Назначенное физлицо"
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr "Группы"
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Если нет точной конечной даты, можно оставить незаполненным"
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr "Назначение роли группы"
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr "Назначение ролей групп"
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr "Может просматривать обзор урока"
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr "Может просматривать недельный обзор"
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr "Может просматривать весь журнал"
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr "Может регистрировать отсутствие"
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 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 4a23675366e43a10b5190e5dfd31b46a442dd86f..7e8285208907941025f0a6da310079f0e35e214e 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: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgid "Before"
 msgstr ""
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -151,20 +151,20 @@ msgid "You can't select a group and a teacher both."
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr ""
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr ""
@@ -177,8 +177,8 @@ msgstr ""
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -197,8 +197,8 @@ msgstr ""
 msgid "Excused"
 msgstr ""
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -271,38 +271,38 @@ msgstr ""
 msgid "Can register an absence for a person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -313,18 +313,18 @@ msgstr ""
 msgid "Extra marks"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -333,7 +333,7 @@ msgstr ""
 msgid "Lesson topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -342,7 +342,7 @@ msgstr ""
 msgid "Homework"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -350,157 +350,161 @@ msgstr ""
 msgid "Group note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 msgid "Lesson Topic"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 msgid "Group Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 msgid "Documentation"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 msgid "Documentations"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 msgid "Groups of Person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 msgid "Absence Reason"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 msgid "Base Absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 msgid "Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 msgid "Extra Mark"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 msgid "Personal Note"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 msgid "Personal Notes"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr ""
 
diff --git a/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
index 6353e21e708c593793b756827d3f056ba5edb008..d3663a8befb259e29f630d7b08355882257e5e4a 100644
--- a/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-04-23 21:13+0200\n"
+"POT-Creation-Date: 2024-06-13 11:19+0200\n"
 "PO-Revision-Date: 2023-01-25 05:58+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/uk/>\n"
@@ -111,7 +111,7 @@ msgid "Before"
 msgstr "Перед"
 
 #: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:371
-#: aleksis/apps/alsijil/models.py:471 aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:116
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:223
 #: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
@@ -152,20 +152,20 @@ msgid "You can't select a group and a teacher both."
 msgstr "Ви не можете обрати одночасно групу та викладача."
 
 #: aleksis/apps/alsijil/forms.py:193 aleksis/apps/alsijil/forms.py:291
-#: aleksis/apps/alsijil/models.py:609 aleksis/apps/alsijil/models.py:658
+#: aleksis/apps/alsijil/models.py:762 aleksis/apps/alsijil/models.py:819
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:27
 msgid "Person"
 msgstr "Особа"
 
 #: aleksis/apps/alsijil/forms.py:194 aleksis/apps/alsijil/forms.py:372
-#: aleksis/apps/alsijil/models.py:730
+#: aleksis/apps/alsijil/models.py:891
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
 msgid "Start date"
 msgstr "Дата початку"
 
 #: aleksis/apps/alsijil/forms.py:195 aleksis/apps/alsijil/forms.py:373
-#: aleksis/apps/alsijil/models.py:734
+#: aleksis/apps/alsijil/models.py:895
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
 msgid "End date"
 msgstr "Дата закінчення"
@@ -178,8 +178,8 @@ msgstr "Початок уроків"
 msgid "End period"
 msgstr "Закінчення уроків"
 
-#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/models.py:623
-#: aleksis/apps/alsijil/tables.py:117 aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/forms.py:198 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
 #: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:392
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
@@ -198,8 +198,8 @@ msgstr "Відсутній(-я)"
 msgid "Excused"
 msgstr "Пояснено"
 
-#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:79
-#: aleksis/apps/alsijil/models.py:255
+#: aleksis/apps/alsijil/forms.py:201 aleksis/apps/alsijil/models.py:84
+#: aleksis/apps/alsijil/models.py:260
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:72
 msgid "Excuse type"
@@ -272,38 +272,38 @@ msgstr "Може призначати роль групи для цієї гру
 msgid "Can register an absence for a person"
 msgstr "Може реєструвати відсутність особи"
 
-#: aleksis/apps/alsijil/models.py:58 aleksis/apps/alsijil/models.py:432
+#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/models.py:437
 msgid "Short name"
 msgstr "Коротке ім'я"
 
-#: aleksis/apps/alsijil/models.py:59 aleksis/apps/alsijil/models.py:433
-#: aleksis/apps/alsijil/models.py:694
+#: aleksis/apps/alsijil/models.py:64 aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:855
 #: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
 #: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
 msgid "Name"
 msgstr "Повне ім'я"
 
-#: aleksis/apps/alsijil/models.py:63 aleksis/apps/alsijil/tables.py:41
+#: aleksis/apps/alsijil/models.py:68 aleksis/apps/alsijil/tables.py:41
 msgid "Count as absent"
 msgstr "Кількість відсутніх"
 
-#: aleksis/apps/alsijil/models.py:65
+#: aleksis/apps/alsijil/models.py:70
 msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
 msgstr "Якщо відмічено, цей тип пояснення буде зарахований як пропущений урок. Якщо не відмічено, то без запису у звіт відсутності."
 
-#: aleksis/apps/alsijil/models.py:80
+#: aleksis/apps/alsijil/models.py:85
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
 #: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
 msgid "Excuse types"
 msgstr "Типи пояснень"
 
-#: aleksis/apps/alsijil/models.py:235 aleksis/apps/alsijil/models.py:334
+#: aleksis/apps/alsijil/models.py:240 aleksis/apps/alsijil/models.py:339
 msgid "Year"
 msgstr "Рік"
 
-#: aleksis/apps/alsijil/models.py:260 aleksis/apps/alsijil/models.py:450
+#: aleksis/apps/alsijil/models.py:265 aleksis/apps/alsijil/models.py:455
 #: aleksis/apps/alsijil/tables.py:120
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
@@ -314,18 +314,18 @@ msgstr "Рік"
 msgid "Extra marks"
 msgstr "Додаткові відмітки"
 
-#: aleksis/apps/alsijil/models.py:294
+#: aleksis/apps/alsijil/models.py:299
 msgid "Personal note"
 msgstr "Особиста нотатка"
 
-#: aleksis/apps/alsijil/models.py:295
+#: aleksis/apps/alsijil/models.py:300
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:370
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:21
 msgid "Personal notes"
 msgstr "Особисті нотатки"
 
-#: aleksis/apps/alsijil/models.py:346
+#: aleksis/apps/alsijil/models.py:351
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:259
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:337
@@ -334,7 +334,7 @@ msgstr "Особисті нотатки"
 msgid "Lesson topic"
 msgstr "Тема уроку"
 
-#: aleksis/apps/alsijil/models.py:347 aleksis/apps/alsijil/models.py:483
+#: aleksis/apps/alsijil/models.py:352 aleksis/apps/alsijil/models.py:490
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:129
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:265
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
@@ -343,7 +343,7 @@ msgstr "Тема уроку"
 msgid "Homework"
 msgstr "Домашня робота"
 
-#: aleksis/apps/alsijil/models.py:348
+#: aleksis/apps/alsijil/models.py:353
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:271
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:346
@@ -351,179 +351,183 @@ msgstr "Домашня робота"
 msgid "Group note"
 msgstr "Групова нотатка"
 
-#: aleksis/apps/alsijil/models.py:398
+#: aleksis/apps/alsijil/models.py:403
 #: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:16
 msgid "Lesson documentation"
 msgstr "Учбовий матеріал"
 
-#: aleksis/apps/alsijil/models.py:399
+#: aleksis/apps/alsijil/models.py:404
 #: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:77
 msgid "Lesson documentations"
 msgstr "Учбові матеріали"
 
-#: aleksis/apps/alsijil/models.py:435
+#: aleksis/apps/alsijil/models.py:440
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:436
+#: aleksis/apps/alsijil/models.py:441
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:438
+#: aleksis/apps/alsijil/models.py:443
 msgid "Show in coursebook"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:449
+#: aleksis/apps/alsijil/models.py:454
 msgid "Extra mark"
 msgstr "Додаткова відмітка"
 
-#: aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/models.py:474
 msgid "Course"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:479 aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/models.py:486 aleksis/apps/alsijil/tables.py:111
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:127
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:253
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:331
 msgid "Teachers"
 msgstr "Викладачі"
 
-#: aleksis/apps/alsijil/models.py:482
+#: aleksis/apps/alsijil/models.py:489
 #, fuzzy
 #| msgid "Lesson topic"
 msgid "Lesson Topic"
 msgstr "Тема уроку"
 
-#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/models.py:491
 #, fuzzy
 #| msgid "Group note"
 msgid "Group Note"
 msgstr "Групова нотатка"
 
-#: aleksis/apps/alsijil/models.py:512 aleksis/apps/alsijil/models.py:619
-#: aleksis/apps/alsijil/models.py:665
+#: aleksis/apps/alsijil/models.py:495
+msgid "Participation touched at"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:524 aleksis/apps/alsijil/models.py:772
+#: aleksis/apps/alsijil/models.py:826
 #, fuzzy
 #| msgid "Lesson documentation"
 msgid "Documentation"
 msgstr "Учбовий матеріал"
 
-#: aleksis/apps/alsijil/models.py:513
+#: aleksis/apps/alsijil/models.py:525
 #, fuzzy
 #| msgid "Lesson documentations"
 msgid "Documentations"
 msgstr "Учбові матеріали"
 
-#: aleksis/apps/alsijil/models.py:612
+#: aleksis/apps/alsijil/models.py:765
 #, fuzzy
 #| msgid "Group roles"
 msgid "Groups of Person"
 msgstr "Ролі груп"
 
-#: aleksis/apps/alsijil/models.py:625
+#: aleksis/apps/alsijil/models.py:778
 #, fuzzy
 #| msgid "Absences"
 msgid "Absence Reason"
 msgstr "Відсутності"
 
-#: aleksis/apps/alsijil/models.py:634
+#: aleksis/apps/alsijil/models.py:790
 #, fuzzy
 #| msgid "Absences"
 msgid "Base Absence"
 msgstr "Відсутності"
 
-#: aleksis/apps/alsijil/models.py:641 aleksis/apps/alsijil/models.py:642
+#: aleksis/apps/alsijil/models.py:802 aleksis/apps/alsijil/models.py:803
 msgid "Participation Status"
 msgstr ""
 
-#: aleksis/apps/alsijil/models.py:670
+#: aleksis/apps/alsijil/models.py:831
 #, fuzzy
 #| msgid "Notes"
 msgid "Note"
 msgstr "Нотатки"
 
-#: aleksis/apps/alsijil/models.py:672
+#: aleksis/apps/alsijil/models.py:833
 #, fuzzy
 #| msgid "Extra mark"
 msgid "Extra Mark"
 msgstr "Додаткова відмітка"
 
-#: aleksis/apps/alsijil/models.py:679
+#: aleksis/apps/alsijil/models.py:840
 #, fuzzy
 #| msgid "Personal note"
 msgid "Personal Note"
 msgstr "Особиста нотатка"
 
-#: aleksis/apps/alsijil/models.py:680
+#: aleksis/apps/alsijil/models.py:841
 #, fuzzy
 #| msgid "Personal notes"
 msgid "Personal Notes"
 msgstr "Особисті нотатки"
 
-#: aleksis/apps/alsijil/models.py:695
+#: aleksis/apps/alsijil/models.py:856
 msgid "Icon"
 msgstr "Піктограма"
 
-#: aleksis/apps/alsijil/models.py:696
+#: aleksis/apps/alsijil/models.py:857
 msgid "Colour"
 msgstr "Колір"
 
-#: aleksis/apps/alsijil/models.py:702 aleksis/apps/alsijil/models.py:717
+#: aleksis/apps/alsijil/models.py:863 aleksis/apps/alsijil/models.py:878
 #: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
 msgid "Group role"
 msgstr "Роль групи"
 
-#: aleksis/apps/alsijil/models.py:703
+#: aleksis/apps/alsijil/models.py:864
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
 #: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
 msgid "Group roles"
 msgstr "Ролі груп"
 
-#: aleksis/apps/alsijil/models.py:704
+#: aleksis/apps/alsijil/models.py:865
 msgid "Can assign group role"
 msgstr "Може призначати роль групи"
 
-#: aleksis/apps/alsijil/models.py:723
+#: aleksis/apps/alsijil/models.py:884
 msgid "Assigned person"
 msgstr "Призначена особа"
 
-#: aleksis/apps/alsijil/models.py:728 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/models.py:889 aleksis/apps/alsijil/tables.py:105
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:124
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:242
 #: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:321
 msgid "Groups"
 msgstr "Групи"
 
-#: aleksis/apps/alsijil/models.py:735
+#: aleksis/apps/alsijil/models.py:896
 msgid "Can be left empty if end date is not clear yet"
 msgstr "Якщо немає точної кінцевої дати, можна залишити порожнім"
 
-#: aleksis/apps/alsijil/models.py:750
+#: aleksis/apps/alsijil/models.py:911
 msgid "Group role assignment"
 msgstr "Призначення ролі групи"
 
-#: aleksis/apps/alsijil/models.py:751
+#: aleksis/apps/alsijil/models.py:912
 msgid "Group role assignments"
 msgstr "Призначення ролі групи"
 
-#: aleksis/apps/alsijil/models.py:758
+#: aleksis/apps/alsijil/models.py:919
 msgid "Can view lesson overview"
 msgstr "Може бачити огляд уроку"
 
-#: aleksis/apps/alsijil/models.py:759
+#: aleksis/apps/alsijil/models.py:920
 msgid "Can view week overview"
 msgstr "Може бачити огляд тижня"
 
-#: aleksis/apps/alsijil/models.py:760
+#: aleksis/apps/alsijil/models.py:921
 msgid "Can view full register"
 msgstr "Може бачити весь журнал"
 
-#: aleksis/apps/alsijil/models.py:761
+#: aleksis/apps/alsijil/models.py:922
 msgid "Can register absence"
 msgstr "Може реєструвати пропуск"
 
-#: aleksis/apps/alsijil/models.py:762
+#: aleksis/apps/alsijil/models.py:923
 msgid "Can list all personal note filters"
 msgstr "Може бачити усі фільтри особистих нотаток"
 
diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py
index 2e8b2e558e78c84ac83674840f0a3f8b2eb259c5..7d0130805275359672d1337133eacd1b0a2b62ad 100644
--- a/aleksis/apps/alsijil/managers.py
+++ b/aleksis/apps/alsijil/managers.py
@@ -11,7 +11,7 @@ from django.utils.translation import gettext as _
 from calendarweek import CalendarWeek
 
 from aleksis.apps.chronos.managers import DateRangeQuerySetMixin
-from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations
+from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations, PolymorphicBaseManager
 
 if TYPE_CHECKING:
     from aleksis.core.models import Group
@@ -187,3 +187,27 @@ class GroupRoleAssignmentQuerySet(DateRangeQuerySetMixin, QuerySet):
     def for_group(self, group: "Group"):
         """Filter all role assignments for a group."""
         return self.filter(Q(groups=group) | Q(groups__child_groups=group))
+
+
+class DocumentationManager(PolymorphicBaseManager):
+    """Manager adding specific methods to documentations."""
+
+    def get_queryset(self):
+        """Ensure often used related data are loaded as well."""
+        return (
+            super()
+            .get_queryset()
+            .select_related(
+                "course",
+                "subject",
+            )
+            .prefetch_related("teachers")
+        )
+
+
+class ParticipationStatusManager(PolymorphicBaseManager):
+    """Manager adding specific methods to participation statuses."""
+
+    def get_queryset(self):
+        """Ensure often used related data are loaded as well."""
+        return super().get_queryset().select_related("person", "absence_reason", "base_absence")
diff --git a/aleksis/apps/alsijil/migrations/0022_documentation_participation_touched_at.py b/aleksis/apps/alsijil/migrations/0022_documentation_participation_touched_at.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef09ddca37a893128571818368982e29bd0c219f
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0022_documentation_participation_touched_at.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.0.6 on 2024-06-06 09:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('alsijil', '0021_remove_participationstatus_absent_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='documentation',
+            name='participation_touched_at',
+            field=models.DateTimeField(blank=True, null=True, verbose_name='Participation touched at'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 4dd7ba00143dab7094cf8d17d82b8412f11fa322..62bb12542db0a739fc39cf4a5b77f60a331463ee 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -2,14 +2,17 @@ from datetime import date, datetime
 from typing import Optional, Union
 from urllib.parse import urlparse
 
+from django.contrib.auth.models import User
+from django.core.exceptions import PermissionDenied
 from django.core.exceptions import PermissionDenied
 from django.db import models
 from django.db.models import QuerySet
 from django.db.models.constraints import CheckConstraint
 from django.db.models.query_utils import Q
-from django.http import HttpRequest
 from django.urls import reverse
+from django.utils import timezone
 from django.utils.formats import date_format
+from django.utils.timezone import localdate, localtime, now
 from django.utils.timezone import localdate, localtime
 from django.utils.translation import gettext_lazy as _
 from django.contrib.auth.models import User
@@ -25,12 +28,14 @@ from aleksis.apps.alsijil.data_checks import (
     PersonalNoteOnHolidaysDataCheck,
 )
 from aleksis.apps.alsijil.managers import (
+    DocumentationManager,
     GroupRoleAssignmentManager,
     GroupRoleAssignmentQuerySet,
     GroupRoleManager,
     GroupRoleQuerySet,
     LessonDocumentationManager,
     LessonDocumentationQuerySet,
+    ParticipationStatusManager,
     PersonalNoteManager,
     PersonalNoteQuerySet,
 )
@@ -43,7 +48,7 @@ from aleksis.apps.kolego.models import Absence as KolegoAbsence
 from aleksis.apps.kolego.models import AbsenceReason
 from aleksis.core.data_checks import field_validation_data_check_factory
 from aleksis.core.mixins import ExtensibleModel, GlobalPermissionModel
-from aleksis.core.models import CalendarEvent, Group, SchoolTerm
+from aleksis.core.models import CalendarEvent, Group, Person, SchoolTerm
 from aleksis.core.util.core_helpers import get_site_preferences
 from aleksis.core.util.model_helpers import ICONS
 
@@ -461,6 +466,8 @@ class Documentation(CalendarEvent):
 
     # FIXME: DataCheck
 
+    objects = DocumentationManager()
+
     course = models.ForeignKey(
         Course,
         models.PROTECT,
@@ -486,6 +493,11 @@ class Documentation(CalendarEvent):
     homework = models.CharField(verbose_name=_("Homework"), max_length=255, blank=True)
     group_note = models.CharField(verbose_name=_("Group Note"), max_length=255, blank=True)
 
+    # Used to track whether participations have been filled in
+    participation_touched_at = models.DateTimeField(
+        blank=True, null=True, verbose_name=_("Participation touched at")
+    )
+
     def get_subject(self) -> str:
         if self.subject:
             return self.subject
@@ -519,9 +531,9 @@ class Documentation(CalendarEvent):
 
     @classmethod
     def get_documentations_for_events(
-            cls,
-            events: list,
-            incomplete: Optional[bool] = False,
+        cls,
+        events: list,
+        incomplete: Optional[bool] = False,
     ) -> tuple:
         """Get all the documentations for the events.
         Create dummy documentations if none exist.
@@ -573,11 +585,11 @@ class Documentation(CalendarEvent):
 
     @classmethod
     def get_documentations_for_person(
-            cls,
-            person: int,
-            start: datetime,
-            end: datetime,
-            incomplete: Optional[bool] = False,
+        cls,
+        person: int,
+        start: datetime,
+        end: datetime,
+        incomplete: Optional[bool] = False,
     ) -> tuple:
         """Get all the documentations for the person from start to end datetime.
         Create dummy documentations if none exist.
@@ -585,7 +597,7 @@ class Documentation(CalendarEvent):
         """
         event_params = {
             "type": "PARTICIPANT",
-            "id": person,
+            "obj_id": person,
         }
 
         events = LessonEvent.get_single_events(
@@ -600,65 +612,54 @@ class Documentation(CalendarEvent):
 
     @classmethod
     def parse_dummy(
-            cls,
-            _id: str,
+        cls,
+        _id: str,
     ) -> tuple:
-        """Parse dummy id string into lesson_event, datetime_start, datetime_end.
-        """
+        """Parse dummy id string into lesson_event, datetime_start, datetime_end."""
         dummy, lesson_event_id, datetime_start_iso, datetime_end_iso = _id.split(";")
         lesson_event = LessonEvent.objects.get(id=lesson_event_id)
 
         datetime_start = datetime.fromisoformat(datetime_start_iso).astimezone(
             lesson_event.timezone
         )
-        datetime_end = datetime.fromisoformat(datetime_end_iso).astimezone(
-            lesson_event.timezone
-        )
+        datetime_end = datetime.fromisoformat(datetime_end_iso).astimezone(lesson_event.timezone)
         return (lesson_event, datetime_start, datetime_end)
 
     @classmethod
     def create_from_lesson_event(
-            cls,
-            user: User,
-            lesson_event: LessonEvent,
-            datetime_start: datetime,
-            datetime_end: datetime,
+        cls,
+        user: User,
+        lesson_event: LessonEvent,
+        datetime_start: datetime,
+        datetime_end: datetime,
     ) -> "Documentation":
-        """ Create a documentation from a lesson_event with start and end datetime.
+        """Create a documentation from a lesson_event with start and end datetime.
         User is needed for permission checking.
         """
         if not user.has_perm(
-                "alsijil.add_documentation_for_lesson_event_rule", lesson_event
-            ) or not (
-                get_site_preferences()["alsijil__allow_edit_future_documentations"] == "all"
-                or (
-                    get_site_preferences()["alsijil__allow_edit_future_documentations"]
-                    == "current_day"
-                    and datetime_start.date() <= localdate()
-                )
-                or (
-                    get_site_preferences()["alsijil__allow_edit_future_documentations"]
-                    == "current_time"
-                    and datetime_start <= localtime()
-                )
-            ):
+            "alsijil.add_documentation_for_lesson_event_rule", lesson_event
+        ) or not (
+            get_site_preferences()["alsijil__allow_edit_future_documentations"] == "all"
+            or (
+                get_site_preferences()["alsijil__allow_edit_future_documentations"] == "current_day"
+                and datetime_start.date() <= localdate()
+            )
+            or (
+                get_site_preferences()["alsijil__allow_edit_future_documentations"]
+                == "current_time"
+                and datetime_start <= localtime()
+            )
+        ):
             raise PermissionDenied()
 
         if lesson_event.amends:
-            if lesson_event.course:
-                course = lesson_event.course
-            else:
-                course = lesson_event.amends.course
+            course = lesson_event.course if lesson_event.course else lesson_event.amends.course
 
-            if lesson_event.subject:
-                subject = lesson_event.subject
-            else:
-                subject = lesson_event.amends.subject
+            subject = lesson_event.subject if lesson_event.subject else lesson_event.amends.subject
 
-            if lesson_event.teachers:
-                teachers = lesson_event.teachers
-            else:
-                teachers = lesson_event.amends.teachers
+            teachers = (
+                lesson_event.teachers if lesson_event.teachers else lesson_event.amends.teachers
+            )
         else:
             course, subject, teachers = (
                 lesson_event.course,
@@ -672,41 +673,81 @@ class Documentation(CalendarEvent):
             amends=lesson_event,
             course=course,
             subject=subject,
-            topic="",
-            homework="",
-            group_note="",
         )
         obj.teachers.set(teachers.all())
         obj.save()
 
         # Create Participation Statuses
-        # Cannot use djangos bulk_create method, as then the save method of the
-        # superclass wouldn't be called
-
-        for member in lesson_event.all_members:
-            # TODO: Check for preexisting absences in kolego
-            # TODO: maybe only create if the lesson start is in the past
-            status = ParticipationStatus.objects.create(
-                person=member,
-                related_documentation=obj,
-                datetime_start=datetime_start,
-                datetime_end=datetime_end,
-                timezone=lesson_event.timezone,
-            )
-            status.groups_of_person.set(member.member_of.all())
-            status.save()
+        obj.touch()
 
         return obj
 
     @classmethod
-    def get_or_create_by_id(cls, _id: str|int, user):
+    def get_or_create_by_id(cls, _id: str | int, user):
         if _id.startswith("DUMMY"):
             return cls.create_from_lesson_event(
                 user,
                 *cls.parse_dummy(_id),
+            ), True
+
+        return cls.objects.get(id=_id), False
+
+    def touch(self):
+        """Ensure that participation statuses are created for this documentation."""
+        if (
+            self.participation_touched_at
+            or not self.amends
+            or self.value_start_datetime(self) > now()
+        ):
+            # There is no source to update from or it's too early
+            return
+
+        lesson_event: LessonEvent = self.amends
+        all_members = lesson_event.all_members
+        member_pks = [p.pk for p in all_members]
+
+        new_persons = Person.objects.filter(Q(pk__in=member_pks)).prefetch_related("member_of")
+
+        # Get absences from Kolego
+        events = KolegoAbsence.get_single_events(
+            self.value_start_datetime(self),
+            self.value_end_datetime(self),
+            None,
+            {"persons": member_pks},
+            with_reference_object=True,
+        )
+        kolego_absences_map = {a["REFERENCE_OBJECT"].person: a["REFERENCE_OBJECT"] for a in events}
+
+        new_participations = []
+        new_groups_of_person = []
+        for person in new_persons:
+            participation_status = ParticipationStatus(
+                person=person,
+                related_documentation=self,
+                datetime_start=self.datetime_start,
+                datetime_end=self.datetime_end,
+                timezone=self.timezone,
             )
 
-        return cls.objects.get(id=_id)
+            # Take over data from Kolego absence
+            if person in kolego_absences_map:
+                participation_status.fill_from_kolego(kolego_absences_map[person])
+
+            participation_status.save()
+
+            new_groups_of_person += [
+                ParticipationStatus.groups_of_person.through(
+                    group=group, participationstatus=participation_status
+                )
+                for group in person.member_of.all()
+            ]
+            new_participations.append(participation_status)
+        ParticipationStatus.groups_of_person.through.objects.bulk_create(new_groups_of_person)
+
+        self.participation_touched_at = timezone.now()
+        self.save()
+
+        return new_participations
 
 
 class ParticipationStatus(CalendarEvent):
@@ -718,6 +759,8 @@ class ParticipationStatus(CalendarEvent):
 
     # FIXME: DataChecks
 
+    objects = ParticipationStatusManager()
+
     person = models.ForeignKey(
         "core.Person", models.CASCADE, related_name="participations", verbose_name=_("Person")
     )
@@ -750,8 +793,13 @@ class ParticipationStatus(CalendarEvent):
         verbose_name=_("Base Absence"),
     )
 
+    def fill_from_kolego(self, kolego_absence: KolegoAbsence):
+        """Take over data from a Kolego absence."""
+        self.base_absence = kolego_absence
+        self.absence_reason = kolego_absence.reason
+
     def __str__(self) -> str:
-        return f"{self.related_documentation}, {self.person}"
+        return f"{self.related_documentation.id}, {self.person}"
 
     class Meta:
         verbose_name = _("Participation Status")
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index b7fa4d04a23df031ff479870c17cf5f1a3d53446..9045598fdf362f0bedb57424fd73bb450d80d669 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -12,8 +12,10 @@ from aleksis.core.util.predicates import (
 
 from .util.predicates import (
     can_edit_documentation,
+    can_edit_participation_status,
     can_view_any_documentation,
     can_view_documentation,
+    can_view_participation_status,
     has_lesson_group_object_perm,
     has_person_group_object_perm,
     has_personal_note_group_perm,
@@ -24,6 +26,7 @@ from .util.predicates import (
     is_group_owner,
     is_group_role_assignment_group_owner,
     is_in_allowed_time_range,
+    is_in_allowed_time_range_for_participation_status,
     is_lesson_event_group_owner,
     is_lesson_event_teacher,
     is_lesson_original_teacher,
@@ -414,3 +417,21 @@ edit_documentation_predicate = (
 )
 add_perm("alsijil.edit_documentation_rule", edit_documentation_predicate)
 add_perm("alsijil.delete_documentation_rule", edit_documentation_predicate)
+
+view_participation_status_for_documentation_predicate = has_person & (
+    has_global_perm("alsijil.change_participationstatus") | can_view_participation_status
+)
+add_perm(
+    "alsijil.view_participation_status_for_documentation_rule",
+    view_participation_status_for_documentation_predicate,
+)
+
+edit_participation_status_for_documentation_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_rule",
+    edit_participation_status_for_documentation_predicate,
+)
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 10ae6235944bba2b2d7df9fbc9cd636d8190a412..e38272d256fb9696d699c67e027443fea94043ae 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -5,6 +5,7 @@ from django.db.models.query_utils import Q
 
 import graphene
 
+from aleksis.apps.chronos.models import LessonEvent
 from aleksis.apps.cursus.models import Course
 from aleksis.apps.cursus.schema import CourseType
 from aleksis.core.models import Group, Person
@@ -17,7 +18,11 @@ from ..models import Documentation
 from .documentation import (
     DocumentationBatchCreateOrUpdateMutation,
     DocumentationType,
+    LessonsForPersonType,
+    TouchDocumentationMutation,
 )
+from .participation_status import ParticipationStatusBatchPatchMutation
+
 from .absences import (
     LessonsForPersonType,
     AbsencesForPersonsCreateMutation,
@@ -144,6 +149,8 @@ class Query(graphene.ObjectType):
             | Q(groups__parent_groups__owners=person)
         )
 
+
+
     @staticmethod
     def resolve_lessons_for_persons(
         root,
@@ -175,4 +182,6 @@ class Query(graphene.ObjectType):
 
 class Mutation(graphene.ObjectType):
     create_or_update_documentations = DocumentationBatchCreateOrUpdateMutation.Field()
+    touch_documentation = TouchDocumentationMutation.Field()
+    update_participation_statuses = ParticipationStatusBatchPatchMutation.Field()
     create_absences_for_persons = AbsencesForPersonsCreateMutation.Field()
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index e8443965d140c31977ffbe3770cb870d471ba907..63aecfdfc0e5115250e2e4d59c34d41c8375530e 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -1,11 +1,7 @@
-from datetime import datetime
-
 from django.core.exceptions import PermissionDenied
-from django.utils.timezone import localdate, localtime
 
 import graphene
 from graphene_django.types import DjangoObjectType
-from guardian.shortcuts import get_objects_for_user
 from reversion import create_revision, set_comment, set_user
 
 from aleksis.apps.alsijil.util.predicates import can_edit_documentation, is_in_allowed_time_range
@@ -19,6 +15,7 @@ from aleksis.core.schema.base import (
 )
 
 from ..models import Documentation
+from .participation_status import ParticipationStatusType
 
 
 class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
@@ -37,6 +34,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
             "date_start",
             "date_end",
             "teachers",
+            "participations",
         )
         filter_fields = {
             "id": ["exact", "lte", "gte"],
@@ -46,6 +44,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
     course = graphene.Field(CourseType, required=False)
     amends = graphene.Field(lambda: LessonEventType, required=False)
     subject = graphene.Field(SubjectType, required=False)
+    participations = graphene.List(ParticipationStatusType, required=False)
 
     future_notice = graphene.Boolean(required=False)
 
@@ -69,9 +68,17 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
             info.context.user, root
         )
 
-    @classmethod
-    def get_queryset(cls, queryset, info):
-        return get_objects_for_user(info.context.user, "alsijil.view_documentation", queryset)
+    @staticmethod
+    def resolve_participations(root: Documentation, info, **kwargs):
+        if not info.context.user.has_perm(
+            "alsijil.view_participation_status_for_documentation_rule", root
+        ):
+            return []
+
+        # A dummy documentation will not have any participations
+        if str(root.pk).startswith("DUMMY") or not hasattr(root, "participations"):
+            return []
+        return root.participations.select_related("absence_reason", "base_absence").all()
 
 
 class DocumentationInputType(graphene.InputObjectType):
@@ -85,6 +92,11 @@ class DocumentationInputType(graphene.InputObjectType):
     group_note = graphene.String(required=False)
 
 
+class LessonsForPersonType(graphene.ObjectType):
+    id = graphene.ID()  # noqa
+    lessons = graphene.List(DocumentationType)
+
+
 class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
     class Arguments:
         input = graphene.List(DocumentationInputType)
@@ -97,7 +109,7 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
 
         # Sadly, we can't use the update_or_create method since create_defaults
         # is only introduced in Django 5.0
-        obj = Documentation.get_or_create_by_id(_id, info.context.user)
+        obj, __ = Documentation.get_or_create_by_id(_id, info.context.user)
 
         if not info.context.user.has_perm("alsijil.edit_documentation_rule", obj):
             raise PermissionDenied()
@@ -125,3 +137,25 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
             objs = [cls.create_or_update(info, doc) for doc in input]
 
         return DocumentationBatchCreateOrUpdateMutation(documentations=objs)
+
+
+class TouchDocumentationMutation(graphene.Mutation):
+    class Arguments:
+        documentation_id = graphene.ID(required=True)
+
+    documentation = graphene.Field(DocumentationType)
+
+    def mutate(root, info, documentation_id):
+        documentation, created = Documentation.get_or_create_by_id(
+            documentation_id, info.context.user
+        )
+
+        if not info.context.user.has_perm(
+            "alsijil.edit_participation_status_for_documentation_rule", documentation
+        ):
+            raise PermissionDenied()
+
+        if not created:
+            documentation.touch()
+
+        return TouchDocumentationMutation(documentation=documentation)
diff --git a/aleksis/apps/alsijil/schema/participation_status.py b/aleksis/apps/alsijil/schema/participation_status.py
new file mode 100644
index 0000000000000000000000000000000000000000..246ae52a0aab7e7bf57f102ccd7e6558d4639496
--- /dev/null
+++ b/aleksis/apps/alsijil/schema/participation_status.py
@@ -0,0 +1,46 @@
+from django.core.exceptions import PermissionDenied
+
+from graphene_django import DjangoObjectType
+
+from aleksis.apps.alsijil.models import ParticipationStatus
+from aleksis.core.schema.base import (
+    BaseBatchPatchMutation,
+    DjangoFilterMixin,
+    OptimisticResponseTypeMixin,
+    PermissionsTypeMixin,
+)
+
+
+class ParticipationStatusType(
+    OptimisticResponseTypeMixin,
+    PermissionsTypeMixin,
+    DjangoFilterMixin,
+    DjangoObjectType,
+):
+    class Meta:
+        model = ParticipationStatus
+        fields = (
+            "id",
+            "person",
+            "absence_reason",
+            "related_documentation",
+            "base_absence",
+        )
+
+
+class ParticipationStatusBatchPatchMutation(BaseBatchPatchMutation):
+    class Meta:
+        model = ParticipationStatus
+        fields = ("id", "absence_reason")  # Only the reason can be updated after creation
+        return_field_name = "participationStatuses"
+
+    @classmethod
+    def check_permissions(cls, root, info, input, *args, **kwargs):  # noqa: A002
+        pass
+
+    @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
+        ):
+            raise PermissionDenied()
diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index fe7746948d807f3afede2a8fd3a11b41358965f5..9f06195e279b6e9bc9564731146d33ea7995498d 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -2,7 +2,7 @@ from typing import Any, Union
 
 from django.contrib.auth.models import User
 from django.db.models import Q
-from django.utils.timezone import localdate, localtime
+from django.utils.timezone import localdate, now
 
 from rules import predicate
 
@@ -420,11 +420,17 @@ def can_view_any_documentation(user: User):
     """Predicate which checks if the user is allowed to view any documentation."""
     allowed_lesson_events = LessonEvent.objects.related_to_person(user.person)
 
-    return Documentation.objects.filter(
+    if allowed_lesson_events.exists():
+        return True
+
+    if Documentation.objects.filter(
         Q(teachers=user.person)
         | Q(amends__in=allowed_lesson_events)
         | Q(course__teachers=user.person)
-    ).exists()
+    ).exists():
+        return True
+
+    return False
 
 
 @predicate
@@ -440,6 +446,34 @@ def can_edit_documentation(user: User, obj: Documentation):
     return False
 
 
+@predicate
+def can_view_participation_status(user: User, obj: Documentation):
+    """Predicate which checks if the user is allowed to view participation for a documentation."""
+    if obj:
+        if is_documentation_teacher(user, obj):
+            return True
+        if obj.amends:
+            return is_lesson_event_teacher(user, obj.amends) | is_lesson_event_group_owner(
+                user, obj.amends
+            )
+        if obj.course:
+            return is_course_teacher(user, obj.course)
+    return False
+
+
+@predicate
+def can_edit_participation_status(user: User, obj: Documentation):
+    """Predicate which checks if the user is allowed to edit participation for a documentation."""
+    if obj:
+        if is_documentation_teacher(user, obj):
+            return True
+        if obj.amends:
+            return is_lesson_event_teacher(user, obj.amends) | is_lesson_event_group_owner(
+                user, obj.amends
+            )
+    return False
+
+
 @predicate
 def is_in_allowed_time_range(user: User, obj: Documentation):
     """Predicate which checks if the documentation is in the allowed time range for editing."""
@@ -447,12 +481,20 @@ def is_in_allowed_time_range(user: User, obj: Documentation):
         get_site_preferences()["alsijil__allow_edit_future_documentations"] == "all"
         or (
             get_site_preferences()["alsijil__allow_edit_future_documentations"] == "current_day"
-            and obj.datetime_start.date() <= localdate()
+            and obj.value_start_datetime(obj).date() <= localdate()
         )
         or (
             get_site_preferences()["alsijil__allow_edit_future_documentations"] == "current_time"
-            and obj.datetime_start <= localtime()
+            and obj.value_start_datetime(obj) <= now()
         )
     ):
         return True
     return False
+
+
+@predicate
+def is_in_allowed_time_range_for_participation_status(user: User, obj: Documentation):
+    """Predicate which checks if the documentation is in the allowed time range for editing."""
+    if obj and obj.value_start_datetime(obj) <= now():
+        return True
+    return False
diff --git a/pyproject.toml b/pyproject.toml
index 276683bae087de62a39719ae078ecc0b223a0590..f8457ce5c4feec15c21f780d08ab960c05418d4f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-App-Alsijil"
-version = "4.0.0.dev1"
+version = "4.0.0.dev3"
 packages = [
     { include = "aleksis" }
 ]
@@ -52,7 +52,7 @@ python = "^3.10"
 aleksis-core = "^4.0.0.dev7"
 aleksis-app-chronos = "^4.0.0.dev3"
 aleksis-app-stoelindeling = { version = "^3.0.dev1", optional = true }
-aleksis-app-kolego = "^0.1.0.dev0"
+aleksis-app-kolego = "^0.1.0.dev2"
 
 [tool.poetry.extras]
 seatingplans = ["aleksis-app-stoelindeling"]