This commit is contained in:
Louis Mazin 2026-09-19 23:06:36 +02:00
parent 3946411a25
commit 4d27d791f1
2 changed files with 106 additions and 14 deletions

View File

@ -1,34 +1,82 @@
from rest_framework import serializers from rest_framework import serializers
from django.contrib.auth.models import User from django.contrib.auth import get_user_model
from .models import TimeEntry from .models import TimeEntry
User = get_user_model()
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'first_name', 'last_name']
class TimeEntrySerializer(serializers.ModelSerializer): class TimeEntrySerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta: class Meta:
model = TimeEntry model = TimeEntry
fields = '__all__' fields = [
read_only_fields = ('user',) 'id',
'user',
'date',
'start_time',
'end_time',
'created_at',
'updated_at',
'duration',
'day_of_week',
]
read_only_fields = [
'id',
'user',
'created_at',
'updated_at',
'duration',
'day_of_week',
]
def create(self, validated_data): def create(self, validated_data):
# Set the user to the current request user
validated_data['user'] = self.context['request'].user validated_data['user'] = self.context['request'].user
return super().create(validated_data) return super().create(validated_data)
def update(self, instance, validated_data): def update(self, instance, validated_data):
# Prevent updating the user field
validated_data.pop('user', None) validated_data.pop('user', None)
return super().update(instance, validated_data) return super().update(instance, validated_data)
class TimeEntryCreateSerializer(serializers.ModelSerializer): class TimeEntryCreateSerializer(serializers.ModelSerializer):
user_id = serializers.PrimaryKeyRelatedField(
source='user',
queryset=User.objects.all(),
write_only=True,
required=False,
)
class Meta: class Meta:
model = TimeEntry model = TimeEntry
fields = ['date', 'start_time', 'end_time'] fields = ['user_id', 'date', 'start_time', 'end_time']
def validate(self, attrs): def validate(self, attrs):
if not attrs.get('start_time') and not attrs.get('end_time'): if not attrs.get('start_time') and not attrs.get('end_time'):
raise serializers.ValidationError('Une heure d’entrée ou de sortie est requise.') raise serializers.ValidationError(
if attrs.get('start_time') and attrs.get('end_time') and attrs['end_time'] <= attrs['start_time']: 'Une heure d’entrée ou de sortie est requise.'
raise serializers.ValidationError('L’heure de sortie doit être après l’heure d’entrée.') )
if (
attrs.get('start_time')
and attrs.get('end_time')
and attrs['end_time'] <= attrs['start_time']
):
raise serializers.ValidationError(
'L’heure de sortie doit être après l’entrée.'
)
return attrs return attrs
class TimeEntryUpdateSerializer(serializers.ModelSerializer): class TimeEntryUpdateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = TimeEntry model = TimeEntry
@ -36,13 +84,24 @@ class TimeEntryUpdateSerializer(serializers.ModelSerializer):
def validate(self, attrs): def validate(self, attrs):
if not attrs.get('start_time') and not attrs.get('end_time'): if not attrs.get('start_time') and not attrs.get('end_time'):
raise serializers.ValidationError('Une heure d’entrée ou de sortie est requise.') raise serializers.ValidationError(
if attrs.get('start_time') and attrs.get('end_time') and attrs['end_time'] <= attrs['start_time']: 'Une heure d’entrée ou de sortie est requise.'
raise serializers.ValidationError('L’heure de sortie doit être après l’heure d’entrée.') )
if (
attrs.get('start_time')
and attrs.get('end_time')
and attrs['end_time'] <= attrs['start_time']
):
raise serializers.ValidationError(
'L’heure de sortie doit être après l’heure d’entrée.'
)
return attrs return attrs
class WeeklySummarySerializer(serializers.Serializer): class WeeklySummarySerializer(serializers.Serializer):
user = serializers.CharField() user = serializers.CharField()
username = serializers.CharField() username = serializers.CharField()
total_hours = serializers.FloatField() total_hours = serializers.FloatField()
entries = serializers.ListField(child=serializers.DictField()) entries = serializers.ListField(child=serializers.DictField())

View File

@ -32,7 +32,40 @@ class TimeEntryCreateView(generics.CreateAPIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def perform_create(self, serializer): def perform_create(self, serializer):
serializer.save(user=self.request.user) requested_user = serializer.validated_data.pop('user', None)
if requested_user is not None:
if not (
self.request.user.is_staff
or self.request.user.is_superuser
):
from rest_framework.exceptions import PermissionDenied
raise PermissionDenied(
"Vous ne pouvez pas créer un pointage pour un autre utilisateur."
)
self.created_entry = serializer.save(user=requested_user)
else:
self.created_entry = serializer.save(user=self.request.user)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
output_serializer = TimeEntrySerializer(
self.created_entry,
context={'request': request},
)
headers = self.get_success_headers(serializer.data)
return Response(
output_serializer.data,
status=status.HTTP_201_CREATED,
headers=headers,
)
class TimeEntryScanView(APIView): class TimeEntryScanView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]