80 lines
2.9 KiB
Python
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
|