roosterwijs/README.md

82 lines
3.3 KiB
Markdown

# Roosterwijs
Modulair, flexibel roostersysteem voor het speciaal onderwijs (uil-logo: een
uil staat voor wijsheid → *Roosterwijs*). Zie `PLAN.md` voor de visie en de
fasering, en `DEPLOY.md` voor draaien op een test-/productieserver.
Status: **Fase 0** (fundament + plugin-framework), **Fase 1** (kerndomein:
personen, groepen, subgroepen, functies) en **Fase 2** (schooljaarkalender +
roosterblokken) zijn klaar. Medewerkers kunnen meerdere functies hebben uit een
beheerbare functie-catalogus.
## Wat er nu staat
- **Backend** (`backend/`) — Django + Django REST Framework.
- `plugins/` — het plugin-framework: een moduleregister, opslag van de
aan/uit-status per module en een beheer-API.
- `core/` — de kern (altijd actief). **Fase 1**: modellen Persoon, Groep en
Subgroep met een volledige CRUD-API. Roosterblokken en kalender volgen in
fase 2.
- `modules/printing/` en `modules/accounts/` — twee voorbeeldmodules die
zich bij opstarten aanmelden bij het register.
- **Frontend** (`frontend/`) — React (Vite). Zijbalk met Roosterwijs-logo die
alleen menu's toont van ingeschakelde modules, beheerschermen voor
**Personen**, **Groepen** en **Subgroepen**, en een scherm **Modulebeheer**.
## Hoe modulariteit werkt (het verkoopargument)
1. Een module is een gewone Django-app met een `apps.py` die in `ready()` een
`ModuleSpec` registreert (naam, beschrijving, versie, afhankelijkheden en
menu-items).
2. Het register weet wélke modules bestaan; de database onthoudt of ze **aan**
staan. Een beheerder schakelt ze per school in/uit via Modulebeheer.
3. Uitgeschakelde modules leveren geen menu's of schermen — de kern blijft
overal gelijk, modules zijn los bij te schakelen.
Een nieuwe module toevoegen = nieuwe app maken, één regel in
`MODULE_APPS` (in `backend/config/settings.py`), klaar.
## Starten
### Backend (Django, poort 8000)
```bash
cd backend
pip install -r requirements.txt
python manage.py migrate
python manage.py createsuperuser # optioneel, voor /admin/
python manage.py runserver
```
API-eindpunten:
- `GET /api/modules/` — alle modules met status.
- `POST /api/modules/<key>/state/` — body `{"enabled": true|false}`.
- `GET /api/info/` — korte systeem-/gezondheidsinfo.
- CRUD-endpoints (telkens met `PATCH`/`DELETE` op `/<id>/`):
`/api/personen/` (filter `?rol=leerling`), `/api/groepen/`,
`/api/subgroepen/`, `/api/functies/`, `/api/schooljaren/`,
`/api/kalenderdagen/` (filter `?schooljaar=<id>`), `/api/tijdsloten/`,
`/api/activiteiten/`, `/api/locaties/`, `/api/roosterblokken/`
(filters `?schooljaar=`, `?groep=`, `?subgroep=`, `?leerling=`).
- `/admin/` — Django-admin (personen, groepen, subgroepen en modulestatus).
> Draait SQLite niet op je projectmap (bv. op een netwerkschijf)? Zet dan
> `ROOSTER_DB_PATH` naar een lokaal pad, of pas `DATABASES` aan.
### Frontend (React, poort 5173)
```bash
cd frontend
npm install
npm run dev
```
De dev-server stuurt `/api` automatisch door naar de backend op poort 8000.
Open daarna http://localhost:5173 en ga naar **Modulebeheer** om modules
aan/uit te zetten.
## Volgende stap (Fase 3 & 4)
Flexibiliteit & uitzonderingen (individuele afwijkingen, afwezigheid/vervanging,
vrije dagen die blokken automatisch uitschakelen) en conflictdetectie
(dubbele inzet van personen/leerlingen, locatiebotsingen).