Attendance Tracking for Free Schools #380

Closed
opened 2026-04-08 11:52:13 +02:00 by ZugBahnHof · 20 comments
ZugBahnHof commented 2026-04-08 11:52:13 +02:00 (Migrated from edugit.org)

Milestones

A. Get more insights in the work of community-run/democratic schools
B. Implement two major attendance tracking modes for democratic schools: Attendance by different teachers tracking for sub-courses
C. Implement two major attendance tracking modes for democratic schools: Student self check-in

Mode I: Attendance by different teachers tracking for sub-courses

Milestone 5.B

Idee

  • mehrere "Sub-Kurse", also gleichzeitig stattfindende Lehrveranstaltungen
  • Lehrkräfte geben an, wer teilnimmt
  • man muss nicht an allen teilnehmen, sondern nur an einer aus einem Block

Mode II: Student Self Check-In

Milestone 5.A

Ideen

  • NFC-Reader verteilen, vorne in Angebotsräumen
  • Schüler*innen haben NFC-Karte
  • Übersicht für Lernbegleiter*innen:
    • Wer ist eingechecked?
      • pro Raum/Angebot
      • pro Kind: wo ist es?
    • alle Kinder: wer ist gar nicht eingechecked und nicht entschuldigt (rot)?
  • Möglichkeit für Lernbegleiter*in, Kind selber einzuchecken
  • Auswertung pro Kind als Grundlage für Gespräche

Mittagessen, Ganztag

  • angemeldet/erwartet?
    • Vom Büro gepflegt
  • man muss sich einchecken
    • wenn erwartet: alles gut
    • wenn nicht erwartet: Check-In klappt trotzdem, aber Hinweis

morgens

  • sind sie überhaupt in der Schule? Anwesenheit für den Tag.
  • entschuldigt?
  • kommt später?
  • im Morgenkreis: alle halten Karte auf Reader
  • Arbeitszeiterfassung (Lernbegleiter*innen und Eltern)
    • Reader im Teamzimmer
    • manuell, einfach („angefangen” und „aufgehört” mit wenigen Klicks)
    • Pausenzeit automatisch abziehen

während des Tages

  • erstmal auf unbestimmt (wenn nicht eingechecked und nicht entschuldigt)

gehen zu Angebot

  • Lernbegleiter*innen sitzen im Angebotsraum
  • Kinder kommen zu Angeboten, halten Karte auf Reader

gehen in kein Angebot

  • für „Abhängen” registrieren
  • in Gruppen-Aufenthaltsräumen

„Spezial-Angebote” (z.B. Sport, Ausflug)

  • Orte, an denen ggf. kein Reader sein kann
  • portabler Reader, Smartphone

Check-Out

  • automatisch bei Stundenende
  • manuell wenn nötig, z.B. wenn sie mittendrin gehen
  • manuell beim Verlassen der Schule

Derzeitiges Datenmodell

class ParticipationStatus(CalendarEvent):
    """A participation or absence record about a single person.
    Used in the class register to note participation or absence of a student
    in a documented unit (e.g. a single lesson event or a custom time frame; see Documentation).
    """
    person: core.Person
    groups_of_person: List[core.Group]
    related_documentation: alsijil.Documentation

    # Absence part
    absence_reason: Optional[kolego.AbsenceReason]
    base_absence: Optional[kolego.Absence]
    tardiness: int = 0

class Documentation(CalendarEvent):
	# Links to chronos.LessonEvent via amends
	course: cursus.Course # contains group(s)
    subject: Optional[cursus.Subject]
    teachers: List[core.Person]

    topic: string
    homework: string
    group_note: string
  • was können wir darstellen?
    • An/Abwesenheit in Bezug auf eine Documentation → diese zeigt dann auf bspw ein LessonEvent aus Chronos
      • Documentation hat Gruppe, Subject, Timeframe
      • Start/Ende vom ParticipationStatus muss nicht mit Start/Ende von der Documentation übereinstimmen
      • Als Anwesend gilt ein ParticipationStatus ohne Absence und ohne AbsenceReason
        • AbsenceReasons haben ein count_as_absent-Feld, however das wird nur für abschließende Berechnungen verwendet, man ist trotzdem faktisch nicht Teil der Lehrveranstaltung (vgl. schulisch entschuldigt)
    • vollständige Abwesenheit über einen Stundenplan-unabhängigen Zeitraum mittels Kolego Absence
      • Bei Erstellen/Refresh der Documentation werden automatisch ParticipationStatus Objekte angelegt (alle mit Kolego-Absence sind abwesend, alle anderen per default anwesend)
      • dadurch wäre nur ein "check-out" möglich, kein "check-in"
    • Zuordnung, wer in einer Stunde anwesend sein sollte
      • Documentations haben einen Course, darin wird auf Gruppe(n) verwiesen
      • Status Quo: alle Gruppenmitglieder jeder der Gruppen des Kurses bekommen einen ParticipationStatus, der besagt, sie seien anwesend

Anforderungen

aus den beiden Modes folgen folgende Usecases:

  1. Anwesenheit in einer Documentation beeinflusst Anwesenheit in einer anderen
    • Umsetzung: ???
    • Vorschlag:
      • Lehrer checkt ein (erstellt ParticipationStatus)
      • → in parallelen Documentations wird kein Status erstellt (oder schon einer, aber der abwesend (ggf mit AbsencReason die nicht als absent zählt) besagt)
      • → wenn manuell ein ParticipationStatus erstellt wird, muss gefragt werden, was mit den anderen, die gleichzeitig sind, passieren soll (löschen, auf abwesend setzen, ignorieren)
  2. Übersicht für Students, wo sie gerade eingecheckt (anwesend) sind
  3. Übersicht für Teachers, wo eine Person gerade eingecheckt ist (siehe Punkt 2)
  4. Übersicht für Teachers, wer an einem Fach teilnimmt [done]
  5. Möglichkeit für Teachers, andere einzuchecken
    • Umsetzung:
      • ParticipationStatus manuell (und nicht automatisch) erstellen
  6. Möglichkeit für Students, sich selbst einzuchecken
    • Umsetzung:
      • Students können ParticipationStatus selber verwalten
      • Dann sind aber permissions pro AbsenceReason notwendig, falls nur Eltern/Lehrer entschuldigen können sollen
  7. Einchecken für non-Lesson-Events (bzw ohne Documentation?)
    • für bspw Mittagessen
    • Workaround derzeit wäre, das als auch als (freiwillige?) Unterrichtsstunden zu modellieren
    • Ansonsten die notwendige Verlinkung zur Documentation entfernen? Oder generisch auf CalendarEvent zeigen?
  8. Unterscheidung zwischen eingechecked (anwesend), abwesend und unbestimmt
    • Umsetzung: ParticipationStatus manuell (und nicht automatisch) erstellen
    • siehe Punkt 5.
  9. Früherer bzw Manueller Checkout
    • Umsetzung: Endzeitpunkt des ParticipationStatus anpassbar machen

Notwendige Änderungen

Backend

  • Automatisches erstellen von ParticipationStatus deaktivierbar machen
  • Beim (automatischen aber auch manuellen) Erstellen vom ParticipationStatus überprüfen, ob es einen zeitlich überlappenden für gleiche Person gibt, und das entsprechend berücksichtigen (bspw Abbruch bei automatisch, Nachfrage bei manuell)
  • (ggf.) Permission-basierte Unterscheidung, wer welchen (bzw überhaupt einen) AbsenceReason vergeben darf (bspw nur Eltern+Lehrer entschuldigt, nur Lehrer schulisch entschuldigt, etc.)

Frontend

  • eine ähnliche Personen-spezifische Seite wie die Kursbuch-Statistik (welche ja nur ParticipationStati mit Abwesenheit anzeigt), aber mit allen (anwesenden) Statūs
    • → hier können Schüler und Lehrer sehen, wo eine Person (gerade) ist
  • im Kursbuch im ManageStudentsDialog sollte es eine Möglichkeit geben, manuell einen ParticipationStatus zu erstellen ("eine An/Abwesenheit loggen"), je nach permissions können sich da Schüler auch selbst einchecken
  • (if time permits) eine eigene Seite, worüber self-checkin, Übersicht über Participations und aktuell laufende Stunden vereinfacht und zentralisiert ist
  • (if time permits) in einem ParticipationStatus im Kursbuch eintragbar machen, wann der tatsächlich begonnen/geendet hat

Further thoughts (dev meeting)

  • a subject (?) used for courses tracking the general presence on a day
    • also used for „Nachmittagsangebot”
    • if a student is checked in to this, but not to another lesson, the status is „unknown” -> go find the student
    • if a student is not checked in and has no Kolego absence -> same as above

Linked to #370 (self-checkin via NFC)


Meeting on 23.04.2026

  • we need CourseTypes in Cursus to differentiate, which Lessons have which Participation Creation behaviour (if lesson is null → default to global preference)
  • add third case: on_first_touch for auto, manual for teacher-only, open_check_in
  • add fourth case: mandatory_check_in → automatically mark all students as absent
  • add a second button for self-checkin (depending on mode)
  • hide register-participation dialog if you cannot do that (permission/mode)
  • new widget on person page: show current participation(s), on full-screen show all
# Milestones A. Get more insights in the work of community-run/democratic schools B. Implement two major attendance tracking modes for democratic schools: *Attendance by different teachers tracking for sub-courses* C. Implement two major attendance tracking modes for democratic schools: *Student self check-in* # Mode I: Attendance by different teachers tracking for sub-courses Milestone 5.B ## Idee - mehrere "Sub-Kurse", also gleichzeitig stattfindende Lehrveranstaltungen - Lehrkräfte geben an, wer teilnimmt - man muss nicht an allen teilnehmen, sondern nur an einer aus einem Block # Mode II: Student Self Check-In Milestone 5.A ## Ideen - NFC-Reader verteilen, vorne in Angebotsräumen - Schüler\*innen haben NFC-Karte - Übersicht für Lernbegleiter\*innen: - Wer ist eingechecked? - pro Raum/Angebot - pro Kind: wo ist es? - alle Kinder: wer ist gar nicht eingechecked und nicht entschuldigt (rot)? - Möglichkeit für Lernbegleiter\*in, Kind selber einzuchecken - Auswertung pro Kind als Grundlage für Gespräche ## Mittagessen, Ganztag - angemeldet/erwartet? - Vom Büro gepflegt - man muss sich einchecken - wenn erwartet: alles gut - wenn nicht erwartet: Check-In klappt trotzdem, aber Hinweis ## morgens - sind sie überhaupt in der Schule? Anwesenheit für den Tag. - entschuldigt? - kommt später? - im Morgenkreis: alle halten Karte auf Reader - Arbeitszeiterfassung (Lernbegleiter\*innen und Eltern) - Reader im Teamzimmer - manuell, einfach („angefangen” und „aufgehört” mit wenigen Klicks) - Pausenzeit automatisch abziehen ## während des Tages - erstmal auf unbestimmt (wenn nicht eingechecked und nicht entschuldigt) ### gehen zu Angebot - Lernbegleiter\*innen sitzen im Angebotsraum - Kinder kommen zu Angeboten, halten Karte auf Reader ### gehen in kein Angebot - für „Abhängen” registrieren - in Gruppen-Aufenthaltsräumen ### „Spezial-Angebote” (z.B. Sport, Ausflug) - Orte, an denen ggf. kein Reader sein kann - portabler Reader, Smartphone ## Check-Out - automatisch bei Stundenende - manuell wenn nötig, z.B. wenn sie mittendrin gehen - manuell beim Verlassen der Schule # Derzeitiges Datenmodell ```python class ParticipationStatus(CalendarEvent): """A participation or absence record about a single person. Used in the class register to note participation or absence of a student in a documented unit (e.g. a single lesson event or a custom time frame; see Documentation). """ person: core.Person groups_of_person: List[core.Group] related_documentation: alsijil.Documentation # Absence part absence_reason: Optional[kolego.AbsenceReason] base_absence: Optional[kolego.Absence] tardiness: int = 0 class Documentation(CalendarEvent): # Links to chronos.LessonEvent via amends course: cursus.Course # contains group(s) subject: Optional[cursus.Subject] teachers: List[core.Person] topic: string homework: string group_note: string ``` - was können wir darstellen? - An/Abwesenheit in Bezug auf eine `Documentation` → diese zeigt dann auf bspw ein `LessonEvent` aus Chronos - `Documentation` hat Gruppe, Subject, Timeframe - Start/Ende vom `ParticipationStatus` muss nicht mit Start/Ende von der Documentation übereinstimmen - Als Anwesend gilt ein `ParticipationStatus` ohne Absence und ohne `AbsenceReason` - `AbsenceReasons` haben ein `count_as_absent`-Feld, however das wird nur für abschließende Berechnungen verwendet, man ist trotzdem faktisch nicht Teil der Lehrveranstaltung (vgl. schulisch entschuldigt) - vollständige Abwesenheit über einen Stundenplan-unabhängigen Zeitraum mittels Kolego `Absence` - Bei Erstellen/Refresh der Documentation werden automatisch `ParticipationStatus` Objekte angelegt (alle mit Kolego-`Absence` sind abwesend, alle anderen per default anwesend) - dadurch wäre nur ein "check-out" möglich, kein "check-in" - Zuordnung, wer in einer Stunde anwesend sein sollte - `Documentation`s haben einen `Course`, darin wird auf Gruppe(n) verwiesen - Status Quo: alle Gruppenmitglieder jeder der Gruppen des Kurses bekommen einen `ParticipationStatus`, der besagt, sie seien anwesend # Anforderungen aus den beiden Modes folgen folgende Usecases: 1. [ ] Anwesenheit in einer Documentation beeinflusst Anwesenheit in einer anderen - Umsetzung: ??? - Vorschlag: - Lehrer checkt ein (erstellt `ParticipationStatus`) - → in parallelen Documentations wird kein Status erstellt (oder schon einer, aber der abwesend (ggf mit `AbsencReason` die nicht als absent zählt) besagt) - → wenn manuell ein `ParticipationStatus` erstellt wird, muss gefragt werden, was mit den anderen, die gleichzeitig sind, passieren soll (löschen, auf abwesend setzen, ignorieren) 2. [ ] Übersicht für Students, wo sie gerade eingecheckt (anwesend) sind 3. [ ] Übersicht für Teachers, wo eine Person gerade eingecheckt ist (siehe Punkt 2) 4. [x] Übersicht für Teachers, wer an einem Fach teilnimmt [done] 5. [x] Möglichkeit für Teachers, andere einzuchecken - Umsetzung: - `ParticipationStatus` manuell (und nicht automatisch) erstellen 6. [ ] Möglichkeit für Students, sich selbst einzuchecken - Umsetzung: - Students können `ParticipationStatus` selber verwalten - Dann sind aber permissions pro `AbsenceReason` notwendig, falls nur Eltern/Lehrer entschuldigen können sollen 7. [ ] Einchecken für non-Lesson-Events (bzw ohne Documentation?) - für bspw Mittagessen - Workaround derzeit wäre, das als auch als (freiwillige?) Unterrichtsstunden zu modellieren - Ansonsten die notwendige Verlinkung zur Documentation entfernen? Oder generisch auf `CalendarEvent` zeigen? 8. [ ] Unterscheidung zwischen eingechecked (anwesend), abwesend und unbestimmt - Umsetzung: `ParticipationStatus` manuell (und nicht automatisch) erstellen - siehe Punkt 5. 9. [ ] Früherer bzw Manueller Checkout - Umsetzung: Endzeitpunkt des `ParticipationStatus` anpassbar machen # Notwendige Änderungen ## Backend - Automatisches erstellen von `ParticipationStatus` deaktivierbar machen - Beim (automatischen aber auch manuellen) Erstellen vom `ParticipationStatus` überprüfen, ob es einen zeitlich überlappenden für gleiche Person gibt, und das entsprechend berücksichtigen (bspw Abbruch bei automatisch, Nachfrage bei manuell) - (ggf.) Permission-basierte Unterscheidung, wer welchen (bzw überhaupt einen) `AbsenceReason` vergeben darf (bspw nur Eltern+Lehrer `entschuldigt`, nur Lehrer `schulisch entschuldigt`, etc.) ## Frontend - eine ähnliche Personen-spezifische Seite wie die Kursbuch-Statistik (welche ja nur ParticipationStati mit Abwesenheit anzeigt), aber mit allen (anwesenden) Statūs - → hier können Schüler und Lehrer sehen, wo eine Person (gerade) ist - im Kursbuch im `ManageStudentsDialog` sollte es eine Möglichkeit geben, manuell einen `ParticipationStatus` zu erstellen ("eine An/Abwesenheit loggen"), je nach permissions können sich da Schüler auch selbst einchecken - (if time permits) eine eigene Seite, worüber self-checkin, Übersicht über Participations und aktuell laufende Stunden vereinfacht und zentralisiert ist - (if time permits) in einem ParticipationStatus im Kursbuch eintragbar machen, wann der tatsächlich begonnen/geendet hat # Further thoughts (dev meeting) * a subject (?) used for courses tracking the general presence on a day - also used for „Nachmittagsangebot” - if a student is checked in to this, but not to another lesson, the status is „unknown” -> go find the student - if a student is not checked in and has no Kolego absence -> same as above --- Linked to #370 (self-checkin via NFC) --- Meeting on 23.04.2026 - [x] we need CourseTypes in Cursus to differentiate, which Lessons have which Participation Creation behaviour (if lesson is null → default to global preference) - [x] add third case: `on_first_touch` for auto, `manual` for teacher-only, `open_check_in` - [x] add fourth case: `mandatory_check_in` → automatically mark all students as absent - [x] add a second button for self-checkin (depending on mode) - [x] hide register-participation dialog if you cannot do that (permission/mode) - [x] new widget on person page: show current participation(s), on full-screen show all
ZugBahnHof commented 2026-04-08 11:52:14 +02:00 (Migrated from edugit.org)

changed due date to April 24, 2026

changed due date to April 24, 2026
ZugBahnHof commented 2026-04-08 11:52:56 +02:00 (Migrated from edugit.org)

marked this issue as related to #370

marked this issue as related to #370
ZugBahnHof commented 2026-04-08 11:53:08 +02:00 (Migrated from edugit.org)

marked this issue as related to #377

marked this issue as related to #377
ZugBahnHof commented 2026-04-08 11:53:52 +02:00 (Migrated from edugit.org)

marked this issue as related to #378

marked this issue as related to #378
ZugBahnHof commented 2026-04-08 11:54:14 +02:00 (Migrated from edugit.org)

Probably should build on top of !909

Probably should build on top of !909
ZugBahnHof commented 2026-04-08 12:51:53 +02:00 (Migrated from edugit.org)

created branch 380-attendance-tracking-for-free-schools to address this issue

created branch [`380-attendance-tracking-for-free-schools`](/AlekSIS/official/AlekSIS-App-Alsijil/-/compare/master...380-attendance-tracking-for-free-schools) to address this issue
ZugBahnHof commented 2026-04-08 12:52:12 +02:00 (Migrated from edugit.org)

mentioned in merge request !915

mentioned in merge request !915
magicfelix commented 2026-04-08 21:03:19 +02:00 (Migrated from edugit.org)

changed the description

changed the description
yuha commented 2026-04-15 19:12:25 +02:00 (Migrated from edugit.org)

mentioned in issue #370

mentioned in issue #370
ZugBahnHof commented 2026-04-22 15:40:24 +02:00 (Migrated from edugit.org)

marked the checklist item Möglichkeit für Teachers, andere einzuchecken as completed

marked the checklist item **Möglichkeit für Teachers, andere einzuchecken** as completed
ZugBahnHof commented 2026-04-23 17:33:57 +02:00 (Migrated from edugit.org)

changed the description

changed the description
yuha commented 2026-04-23 18:47:03 +02:00 (Migrated from edugit.org)

marked this issue as related to AlekSIS-App-Cursus#51

marked this issue as related to AlekSIS-App-Cursus#51
ZugBahnHof commented 2026-04-24 18:36:46 +02:00 (Migrated from edugit.org)

marked the checklist item we need CourseTypes in Cursus to differentiate, which Lessons have which Participation Creation behaviour (if lesson is null → default to global preference) as completed

marked the checklist item **we need CourseTypes in Cursus to differentiate, which Lessons have which Participation Creation behaviour \(if lesson is null → default to global preference\)** as completed
ZugBahnHof commented 2026-04-24 18:36:49 +02:00 (Migrated from edugit.org)

marked the checklist item add third case: on_first_touch for auto, manual for teacher-only, open_check_in as completed

marked the checklist item **add third case: on\_first\_touch for auto, manual for teacher\-only, open\_check\_in** as completed
ZugBahnHof commented 2026-04-24 18:36:52 +02:00 (Migrated from edugit.org)

marked the checklist item add fourth case: mandatory_check_in → automatically mark all students as absent as completed

marked the checklist item **add fourth case: mandatory\_check\_in → automatically mark all students as absent** as completed
ZugBahnHof commented 2026-04-24 18:36:54 +02:00 (Migrated from edugit.org)

marked the checklist item add a second button for self-checkin (depending on mode) as completed

marked the checklist item **add a second button for self\-checkin \(depending on mode\)** as completed
ZugBahnHof commented 2026-04-24 18:36:57 +02:00 (Migrated from edugit.org)

marked the checklist item hide register-participation dialog if you cannot do that (permission/mode) as completed

marked the checklist item **hide register\-participation dialog if you cannot do that \(permission/mode\)** as completed
yuha commented 2026-04-24 23:26:48 +02:00 (Migrated from edugit.org)

marked this issue as related to AlekSIS-App-Chronos#278

marked this issue as related to AlekSIS-App-Chronos#278
yuha commented 2026-04-24 23:27:51 +02:00 (Migrated from edugit.org)

marked the checklist item new widget on person page: show current participation(s), on full-screen show all as completed

marked the checklist item **new widget on person page: show current participation\(s\), on full\-screen show all** as completed
hansegucker commented 2026-04-25 14:50:42 +02:00 (Migrated from edugit.org)

mentioned in commit 54e9989c50

mentioned in commit 54e9989c50e554ec6620b14fe4c87d76b260ffcc
hansegucker (Migrated from edugit.org) closed this issue 2026-04-25 14:50:45 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aleksis/AlekSIS-App-Alsijil#380
No description provided.