from rest_framework import serializers from users.permissions import is_admin from .models import Event, EventProfile class EventSerializer(serializers.ModelSerializer): class Meta: model = Event fields = [ 'id', 'created_by', 'start_date', 'end_date', 'start_time', 'end_time', 'color', 'name', 'is_public', 'created_at', 'updated_at', ] read_only_fields = ['id', 'created_by', 'created_at', 'updated_at'] class EventCreateSerializer(serializers.ModelSerializer): color = serializers.RegexField( r'^#[0-9a-fA-F]{6}$', required=False, allow_null=True, allow_blank=True, ) class Meta: model = Event fields = [ 'start_date', 'end_date', 'start_time', 'end_time', 'color', 'name', 'is_public', ] def validate(self, attrs): request = self.context.get('request') if request is None or not is_admin(request.user): # En création comme en PATCH, les événements non-admin restent privés. attrs['is_public'] = False values = { field: attrs.get(field, getattr(self.instance, field, None)) for field in ('start_date', 'end_date', 'start_time', 'end_time') } if values['start_date'] is None or values['end_date'] is None: raise serializers.ValidationError('Les dates de début et de fin sont requises.') if values['end_date'] < values['start_date']: raise serializers.ValidationError({'end_date': 'La fin doit suivre le début.'}) if ( values['start_date'] == values['end_date'] and values['start_time'] is not None and values['end_time'] is not None and values['end_time'] <= values['start_time'] ): raise serializers.ValidationError({'end_time': 'La fin doit suivre le début.'}) return attrs class EventUpdateSerializer(EventCreateSerializer): pass class EventProfileSerializer(serializers.ModelSerializer): color = serializers.RegexField( r'^#[0-9a-fA-F]{6}$', required=False, allow_null=True, allow_blank=True, ) class Meta: model = EventProfile fields = [ 'id', 'created_by', 'name', 'start_time', 'end_time', 'color', 'is_public', 'created_at', 'updated_at', ] read_only_fields = ['id', 'created_by', 'created_at', 'updated_at'] def validate(self, attrs): request = self.context.get('request') if request is None or not is_admin(request.user): # Un utilisateur non-admin ne peut pas mémoriser un profil public. attrs['is_public'] = False # Les dates ne font volontairement pas partie d'un profil. On ne peut donc # pas conclure qu'une heure de fin plus petite correspond à une erreur : # le profil peut être utilisé pour un événement qui se termine le lendemain. return attrs