roosterwijs/backend/modules/accounts/serializers.py

80 lines
2.9 KiB
Python

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