Louis Mazin 5a56f5383d init
2026-09-13 18:56:33 +02:00

190 lines
6.8 KiB
Python

from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from django.contrib.auth.models import User
from django.utils import timezone
from datetime import datetime, date, timedelta
from .models import TimeEntry
from .serializers import (
TimeEntrySerializer,
TimeEntryCreateSerializer,
TimeEntryUpdateSerializer,
WeeklySummarySerializer
)
class TimeEntryListView(generics.ListAPIView):
serializer_class = TimeEntrySerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
user = self.request.user
# Staff members can view all entries, regular users only their own
if user.is_staff or user.is_superuser:
return TimeEntry.objects.all()
return TimeEntry.objects.filter(user=user)
class TimeEntryCreateView(generics.CreateAPIView):
serializer_class = TimeEntryCreateSerializer
permission_classes = [IsAuthenticated]
def perform_create(self, serializer):
serializer.save(user=self.request.user)
class TimeEntryDetailView(generics.RetrieveUpdateDestroyAPIView):
serializer_class = TimeEntrySerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
user = self.request.user
# Staff members can view all entries, regular users only their own
if user.is_staff or user.is_superuser:
return TimeEntry.objects.all()
return TimeEntry.objects.filter(user=user)
class TimeEntryUpdateView(APIView):
permission_classes = [IsAuthenticated]
def put(self, request, entry_id):
try:
entry = TimeEntry.objects.get(id=entry_id)
# Check if user is authorized to update this entry
if not (request.user.is_staff or request.user.is_superuser or entry.user == request.user):
return Response(
{'error': 'Accès refusé'},
status=status.HTTP_403_FORBIDDEN
)
serializer = TimeEntryUpdateSerializer(entry, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
except TimeEntry.DoesNotExist:
return Response(
{'error': 'Pointage non trouvé'},
status=status.HTTP_404_NOT_FOUND
)
class WeeklySummaryView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, user_id=None):
# If user_id is provided and user is staff, get that user's summary
# Otherwise, get current user's summary
if user_id and (request.user.is_staff or request.user.is_superuser):
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return Response(
{'error': 'Utilisateur non trouvé'},
status=status.HTTP_404_NOT_FOUND
)
else:
user = request.user
# Get current week (Monday to Sunday)
today = timezone.now().date()
start_of_week = today - timedelta(days=today.weekday())
end_of_week = start_of_week + timedelta(days=6)
# Get all time entries for the current week for this user
entries = TimeEntry.objects.filter(
user=user,
date__gte=start_of_week,
date__lte=end_of_week
).order_by('date')
# Group entries by day
days_data = []
for i in range(7):
current_day = start_of_week + timedelta(days=i)
day_entries = entries.filter(date=current_day)
if day_entries.exists():
# Get the first entry for this day (assuming one entry per day)
entry = day_entries.first()
days_data.append({
'date': entry.date.isoformat(),
'day': entry.date.strftime('%A'),
'start_time': str(entry.start_time),
'end_time': str(entry.end_time),
'duration': entry.duration
})
else:
days_data.append({
'date': current_day.isoformat(),
'day': current_day.strftime('%A'),
'start_time': None,
'end_time': None,
'duration': 0
})
total_hours = sum(entry.duration for entry in entries)
summary = {
'user': user.username,
'username': user.username,
'total_hours': round(total_hours, 2),
'days': days_data
}
serializer = WeeklySummarySerializer(summary)
return Response(serializer.data)
class UserWeeklySummaryView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
# Get current user's weekly summary
user = request.user
# Get current week (Monday to Sunday)
today = timezone.now().date()
start_of_week = today - timedelta(days=today.weekday())
end_of_week = start_of_week + timedelta(days=6)
# Get all time entries for the current week for this user
entries = TimeEntry.objects.filter(
user=user,
date__gte=start_of_week,
date__lte=end_of_week
).order_by('date')
# Group entries by day
days_data = []
for i in range(7):
current_day = start_of_week + timedelta(days=i)
day_entries = entries.filter(date=current_day)
if day_entries.exists():
# Get the first entry for this day (assuming one entry per day)
entry = day_entries.first()
days_data.append({
'date': entry.date.isoformat(),
'day': entry.date.strftime('%A'),
'start_time': str(entry.start_time),
'end_time': str(entry.end_time),
'duration': entry.duration
})
else:
days_data.append({
'date': current_day.isoformat(),
'day': current_day.strftime('%A'),
'start_time': None,
'end_time': None,
'duration': 0
})
total_hours = sum(entry.duration for entry in entries)
summary = {
'user': user.username,
'username': user.username,
'total_hours': round(total_hours, 2),
'days': days_data
}
serializer = WeeklySummarySerializer(summary)
return Response(serializer.data)