190 lines
6.8 KiB
Python
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)
|