roosterwijs/backend/modules/personenwizard/views.py
bes-r c845588e5e
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
Add roles modules audit logging and CI
2026-07-04 23:01:06 +02:00

50 lines
2.1 KiB
Python

"""Bulk-import van personen (leerlingen/medewerkers). Geen eigen model."""
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from core.audit import audit_log
from core.models import Groep, Persoon, Rol
from core.permissions import CoreDataPermission, module_permission_class
GELDIGE_ROLLEN = {r.value for r in Rol}
PersonenwizardModuleEnabled = module_permission_class("personenwizard")
@api_view(["POST"])
@permission_classes([CoreDataPermission, PersonenwizardModuleEnabled])
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
audit_log(request, "import", "Persoon", {"aangemaakt": aangemaakt, "rol": rol})
return Response({"aangemaakt": aangemaakt, "meldingen": meldingen})