50 lines
2.1 KiB
Python
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})
|