Initial commit

This commit is contained in:
Kristof committed 2026-10-14 12:29:29 +02:00
commit 536ff43ce4
158 files changed
+30355

No files matched your search

+69
View File
@@ -0,0 +1,69 @@
"""
Internaat › Aanwezigheden: per intern, per dag een ochtend- en een avondcontrole (aanwezig / afwezig / nog niet
gecontroleerd). De internen komen uit Informat (Internaat-API); de registraties staan in de schooldatabase
(tabel internaat_aanwezigheid) en zijn dus gedeeld met alle opvoeders.
"""
from datetime import date, timedelta
from database import execute_query
MOMENTEN = ('ochtend', 'avond')
STATUSSEN = ('aanwezig', 'afwezig') # 'leeg' = geen rij
DAGEN = ['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za', 'Zo']
DAGEN_VOLUIT = ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag']
def ensure_table():
execute_query("""
CREATE TABLE IF NOT EXISTS internaat_aanwezigheid (
Datum DATE NOT NULL,
Persoon_ID VARCHAR(64) NOT NULL,
Moment VARCHAR(10) NOT NULL,
Status VARCHAR(10) NOT NULL,
Naam VARCHAR(200) NULL,
Bijgewerkt DATETIME NOT NULL,
Door VARCHAR(255) NULL,
PRIMARY KEY (Datum, Persoon_ID, Moment),
KEY idx_aanw_persoon (Persoon_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""", commit=True)
def maandag_van(d):
return d - timedelta(days=d.weekday())
def schooljaar_van(d):
start = d.year if d.month >= 9 else d.year - 1
return f"{start}-{str(start + 1)[-2:]}"
def week(maandag):
"""{'<persoon>:<dagindex>:<moment>': status} voor de week vanaf `maandag`."""
ensure_table()
rijen = execute_query("SELECT Datum, Persoon_ID, Moment, Status FROM internaat_aanwezigheid "
"WHERE Datum BETWEEN %s AND %s", (maandag, maandag + timedelta(days=6))) or []
return {f"{r['Persoon_ID']}:{(r['Datum'] - maandag).days}:{r['Moment']}": r['Status'] for r in rijen}
def zet(datum, persoon_id, moment, status, naam=None, door=None):
"""Bewaart één controle. status 'leeg' wist de registratie."""
if moment not in MOMENTEN:
raise ValueError("Onbekend moment.")
ensure_table()
if status == 'leeg':
execute_query("DELETE FROM internaat_aanwezigheid WHERE Datum = %s AND Persoon_ID = %s AND Moment = %s",
(datum, persoon_id, moment), commit=True)
return
if status not in STATUSSEN:
raise ValueError("Onbekende status.")
execute_query("INSERT INTO internaat_aanwezigheid (Datum, Persoon_ID, Moment, Status, Naam, Bijgewerkt, Door) "
"VALUES (%s, %s, %s, %s, %s, NOW(), %s) ON DUPLICATE KEY UPDATE Status = VALUES(Status), "
"Naam = VALUES(Naam), Bijgewerkt = NOW(), Door = VALUES(Door)",
(datum, persoon_id, moment, status, (naam or '')[:200] or None, door), commit=True)
def groep_van(r, meerdere_internaten=False):
"""Groep in het register: het blok van de kamer, anders de vestiging (met het internaat ervoor als er meerdere zijn)."""
blok = (r.get('kamer') or '').split(' verd.')[0].split(' nr.')[0]
groep = blok.replace('blok', 'Blok') if blok.startswith('blok') else (r.get('vestiging') or 'Zonder kamer')
return f"{r['internaat']} · {groep}" if meerdere_internaten else groep