84 lines
3.0 KiB
Python
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
|