Files
blechreiz-website/eventplanner/serializers.py
2026-04-09 14:50:28 +02:00

57 lines
2.0 KiB
Python

from django.contrib.auth.models import User
from rest_framework import serializers
from .models import Event, EventParticipation
class ParticipationSerializer(serializers.Serializer):
"""Serializer for EventParticipation that handles username lookup."""
event = serializers.PrimaryKeyRelatedField(queryset=Event.objects.all())
user = serializers.CharField()
status = serializers.CharField(required=False)
comment = serializers.CharField(required=False, allow_blank=True)
def to_representation(self, instance):
"""Serialize an EventParticipation instance."""
return {
"event": instance.event.pk,
"user": instance.user.username,
"status": instance.status,
"comment": instance.comment,
}
def validate_user(self, value):
"""Look up user by username (case-insensitive)."""
try:
return User.objects.get(username__iexact=value)
except User.DoesNotExist:
raise serializers.ValidationError(f"User '{value}' does not exist")
def create(self, validated_data):
"""Create or update EventParticipation based on event and user."""
event = validated_data.get("event")
user = validated_data.get("user")
# Only include fields that were actually present in the request,
# so a status-only update doesn't wipe the comment (and vice versa).
defaults = {}
if "status" in validated_data:
defaults["status"] = validated_data["status"]
if "comment" in validated_data:
defaults["comment"] = validated_data["comment"]
participation, created = EventParticipation.objects.update_or_create(
event=event,
user=user,
defaults=defaults,
)
return participation
def update(self, instance, validated_data):
instance.status = validated_data.get("status", instance.status)
instance.comment = validated_data.get("comment", instance.comment)
instance.save()
return instance