from rest_framework import serializers from .models import AvailabilityRequest, ScheduleEntry class ScheduleEntrySerializer(serializers.ModelSerializer): status_label = serializers.CharField(source="get_status_display", read_only=True) class Meta: model = ScheduleEntry fields = "__all__" read_only_fields = ["created_at", "updated_at"] def validate(self, attrs): sd = attrs.get("start_date", getattr(self.instance, "start_date", None)) ed = attrs.get("end_date", getattr(self.instance, "end_date", None)) st = attrs.get("start_time", getattr(self.instance, "start_time", None)) et = attrs.get("end_time", getattr(self.instance, "end_time", None)) if sd and ed and ed < sd: raise serializers.ValidationError({"end_date": "La date de fin doit être après la date de début."}) if st and et and et <= st: raise serializers.ValidationError({"end_time": "L'heure de fin doit être après l'heure de début."}) return attrs class AvailabilityRequestCreateSerializer(serializers.ModelSerializer): class Meta: model = AvailabilityRequest fields = ["guest_name", "message"] def validate_guest_name(self, value): value = value.strip() if len(value) < 2: raise serializers.ValidationError("Indique ton prénom ou ton nom.") return value class AvailabilityRequestPublicSerializer(serializers.ModelSerializer): status_label = serializers.CharField(source="get_status_display", read_only=True) class Meta: model = AvailabilityRequest fields = ["public_token", "guest_name", "message", "status", "status_label", "duration_minutes", "available_until", "response_message", "requested_at", "responded_at"] class AvailabilityRequestAdminSerializer(AvailabilityRequestPublicSerializer): class Meta(AvailabilityRequestPublicSerializer.Meta): fields = ["id"] + AvailabilityRequestPublicSerializer.Meta.fields class AvailabilityResponseSerializer(serializers.Serializer): status = serializers.ChoiceField(choices=["accepted", "refused"]) duration_minutes = serializers.IntegerField(required=False, allow_null=True, min_value=1, max_value=1440) response_message = serializers.CharField(required=False, allow_blank=True, max_length=500)