124 lines
4.6 KiB
Python
124 lines
4.6 KiB
Python
from rest_framework import serializers
|
|
from django.contrib.auth import get_user_model
|
|
from .models import Skill, Event, TaskArea, Shift, ShiftSignup, EventTemplate
|
|
from apps.users.serializers import UserSerializer
|
|
|
|
User = get_user_model()
|
|
|
|
class SkillSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Skill
|
|
fields = ['id', 'name', 'description', 'color', 'created_at']
|
|
|
|
class ShiftSignupSerializer(serializers.ModelSerializer):
|
|
display_name = serializers.SerializerMethodField()
|
|
is_guest = serializers.SerializerMethodField()
|
|
is_self = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = ShiftSignup
|
|
fields = ['id', 'display_name', 'is_guest', 'is_self', 'created_at']
|
|
|
|
def get_is_guest(self, obj):
|
|
return obj.user is None
|
|
|
|
def _is_own_signup(self, obj, request):
|
|
if not request:
|
|
return False
|
|
if request.user and request.user.is_authenticated:
|
|
return obj.user_id == request.user.id
|
|
|
|
# Check session key for guest user
|
|
session_key = getattr(request.session, 'session_key', None)
|
|
if session_key and obj.guest_session_key and obj.guest_session_key == session_key:
|
|
return True
|
|
|
|
return False
|
|
|
|
def get_is_self(self, obj):
|
|
request = self.context.get('request')
|
|
return self._is_own_signup(obj, request)
|
|
|
|
def get_display_name(self, obj):
|
|
request = self.context.get('request')
|
|
|
|
# Authenticated users see real names of all participants
|
|
if request and request.user and request.user.is_authenticated:
|
|
if obj.user:
|
|
return obj.user.get_display_name()
|
|
return obj.guest_name or "Gast"
|
|
|
|
# Guest users see their own real name for their own signups
|
|
if request and self._is_own_signup(obj, request):
|
|
return obj.guest_name or "Gast"
|
|
|
|
# Other participants are anonymized for privacy
|
|
return "Belegt (Anonym)"
|
|
|
|
class ShiftSerializer(serializers.ModelSerializer):
|
|
required_skills = SkillSerializer(many=True, read_only=True)
|
|
required_skill_ids = serializers.PrimaryKeyRelatedField(
|
|
queryset=Skill.objects.all(), many=True, write_only=True, required=False, source='required_skills'
|
|
)
|
|
signups = serializers.SerializerMethodField()
|
|
signups_count = serializers.SerializerMethodField()
|
|
is_full = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Shift
|
|
fields = [
|
|
'id', 'task_area', 'title', 'date', 'start_time', 'end_time',
|
|
'max_participants', 'required_skills', 'required_skill_ids',
|
|
'signups', 'signups_count', 'is_full'
|
|
]
|
|
|
|
def get_signups(self, obj):
|
|
signups_qs = obj.signups.all()
|
|
serializer = ShiftSignupSerializer(signups_qs, many=True, context=self.context)
|
|
return serializer.data
|
|
|
|
def get_signups_count(self, obj):
|
|
return obj.signups.count()
|
|
|
|
def get_is_full(self, obj):
|
|
return obj.signups.count() >= obj.max_participants
|
|
|
|
class TaskAreaSerializer(serializers.ModelSerializer):
|
|
shifts = ShiftSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = TaskArea
|
|
fields = ['id', 'event', 'name', 'description', 'order', 'shifts']
|
|
|
|
class EventSerializer(serializers.ModelSerializer):
|
|
task_areas = TaskAreaSerializer(many=True, read_only=True)
|
|
created_by_name = serializers.SerializerMethodField()
|
|
co_managers = UserSerializer(many=True, read_only=True)
|
|
co_manager_ids = serializers.PrimaryKeyRelatedField(
|
|
queryset=User.objects.all(), many=True, write_only=True, required=False, source='co_managers'
|
|
)
|
|
|
|
class Meta:
|
|
model = Event
|
|
fields = [
|
|
'id', 'title', 'description', 'location',
|
|
'start_date', 'end_date', 'is_active', 'created_by', 'created_by_name',
|
|
'co_managers', 'co_manager_ids',
|
|
'task_areas', 'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['created_by', 'created_at', 'updated_at']
|
|
|
|
def get_created_by_name(self, obj):
|
|
return obj.created_by.get_display_name() if obj.created_by else "Unbekannt"
|
|
|
|
class EventTemplateSerializer(serializers.ModelSerializer):
|
|
created_by_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = EventTemplate
|
|
fields = ['id', 'name', 'description', 'template_data', 'created_by', 'created_by_name', 'created_at']
|
|
read_only_fields = ['created_by', 'created_at']
|
|
|
|
def get_created_by_name(self, obj):
|
|
return obj.created_by.get_display_name() if obj.created_by else "System"
|