from django.contrib.auth import get_user_model from rest_framework import serializers from core.models import Persoon from .models import Gebruikersprofiel, Gebruikersrol User = get_user_model() class GebruikerSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True, required=False, allow_blank=True, style={"input_type": "password"}) rol = serializers.ChoiceField(choices=Gebruikersrol.choices, required=False) persoon = serializers.PrimaryKeyRelatedField( queryset=Persoon.objects.all(), required=False, allow_null=True ) persoon_naam = serializers.SerializerMethodField() rol_label = serializers.SerializerMethodField() class Meta: model = User fields = [ "id", "username", "password", "first_name", "last_name", "email", "is_staff", "is_active", "rol", "rol_label", "persoon", "persoon_naam", "last_login", ] read_only_fields = ["last_login"] # --- profiel-helpers --- def _profiel(self, user): return getattr(user, "gebruikersprofiel", None) def get_persoon_naam(self, user): p = self._profiel(user) return p.persoon.volledige_naam if (p and p.persoon_id) else None def get_rol_label(self, user): p = self._profiel(user) return p.get_rol_display() if p else None def to_representation(self, user): data = super().to_representation(user) p = self._profiel(user) data["rol"] = p.rol if p else None data["persoon"] = p.persoon_id if p else None return data def validate(self, data): if not self.instance and not data.get("password"): raise serializers.ValidationError({"password": "Een wachtwoord is verplicht voor een nieuwe gebruiker."}) return data def create(self, validated_data): rol = validated_data.pop("rol", Gebruikersrol.MEDEWERKER) persoon = validated_data.pop("persoon", None) password = validated_data.pop("password", None) user = User(**validated_data) user.set_password(password) user.save() Gebruikersprofiel.objects.create(user=user, rol=rol, persoon=persoon) return user def update(self, user, validated_data): rol = validated_data.pop("rol", None) persoon = validated_data.pop("persoon", "__keep__") password = validated_data.pop("password", None) for k, v in validated_data.items(): setattr(user, k, v) if password: user.set_password(password) user.save() profiel, _ = Gebruikersprofiel.objects.get_or_create(user=user) if rol is not None: profiel.rol = rol if persoon != "__keep__": profiel.persoon = persoon profiel.save() # Ververs de gecachete reverse-relatie, anders toont de respons de oude rol. user.gebruikersprofiel = profiel return user