PIVOT 1.1.0
This commit is contained in:
commit
8a53234eb6
161 files changed
+31109
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user