45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
"""Bulk-import van personen (leerlingen/medewerkers). Geen eigen model."""
|
|
from rest_framework.decorators import api_view
|
|
from rest_framework.response import Response
|
|
|
|
from core.models import Groep, Persoon, Rol
|
|
|
|
GELDIGE_ROLLEN = {r.value for r in Rol}
|
|
|
|
|
|
@api_view(["POST"])
|
|
def personen_import(request):
|
|
rol = request.data.get("rol")
|
|
personen = request.data.get("personen") or []
|
|
groep_aanmaken = bool(request.data.get("groep_aanmaken"))
|
|
if rol not in GELDIGE_ROLLEN:
|
|
return Response({"detail": "Onbekende rol."}, status=400)
|
|
if not isinstance(personen, list):
|
|
return Response({"detail": "personen moet een lijst zijn."}, status=400)
|
|
|
|
groep_cache = {g.naam.lower(): g for g in Groep.objects.all()}
|
|
aangemaakt = 0
|
|
meldingen = []
|
|
for i, p in enumerate(personen):
|
|
vn = str(p.get("voornaam") or "").strip()
|
|
an = str(p.get("achternaam") or "").strip()
|
|
if not vn and not an:
|
|
continue
|
|
if not an:
|
|
meldingen.append({"regel": i + 1, "melding": "achternaam ontbreekt — overgeslagen"})
|
|
continue
|
|
obj = Persoon(voornaam=vn, achternaam=an, rol=rol)
|
|
if rol == Rol.LEERLING:
|
|
gnaam = str(p.get("groep") or "").strip()
|
|
if gnaam:
|
|
g = groep_cache.get(gnaam.lower())
|
|
if not g and groep_aanmaken:
|
|
g = Groep.objects.create(naam=gnaam)
|
|
groep_cache[gnaam.lower()] = g
|
|
if g:
|
|
obj.groep = g
|
|
else:
|
|
meldingen.append({"regel": i + 1, "melding": f"groep '{gnaam}' niet gevonden — leerling zonder groep aangemaakt"})
|
|
obj.save()
|
|
aangemaakt += 1
|
|
return Response({"aangemaakt": aangemaakt, "meldingen": meldingen})
|