Louis Mazin 4db822aebe big maj
2026-10-05 17:52:28 +02:00

84 lines
3.0 KiB
Python

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