This commit is contained in:
Louis Mazin 2026-09-20 01:02:36 +02:00
parent 27587397db
commit 0937fbcbb9
4 changed files with 44 additions and 13 deletions

View File

@ -1,9 +1,9 @@
from django.db import models from django.db import models
from django.contrib.auth import get_user_model from django.conf import settings
from datetime import datetime from datetime import datetime
class TimeEntry(models.Model): class TimeEntry(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='time_entries') user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='time_entries')
date = models.DateField() date = models.DateField()
start_time = models.TimeField(null=True, blank=True) start_time = models.TimeField(null=True, blank=True)
end_time = models.TimeField(null=True, blank=True) end_time = models.TimeField(null=True, blank=True)

View File

@ -1,15 +1,12 @@
from rest_framework import serializers from rest_framework import serializers
from django.contrib.auth import get_user_model from django.conf import settings
from .models import TimeEntry from .models import TimeEntry
User = get_user_model()
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = User model = settings.AUTH_USER_MODEL
fields = ['id', 'username', 'first_name', 'last_name'] fields = ['id', 'username', 'first_name', 'last_name']
@ -50,7 +47,7 @@ class TimeEntrySerializer(serializers.ModelSerializer):
class TimeEntryCreateSerializer(serializers.ModelSerializer): class TimeEntryCreateSerializer(serializers.ModelSerializer):
user_id = serializers.PrimaryKeyRelatedField( user_id = serializers.PrimaryKeyRelatedField(
source='user', source='user',
queryset=User.objects.all(), queryset=settings.AUTH_USER_MODEL.objects.all(),
write_only=True, write_only=True,
required=False, required=False,
) )

View File

@ -6,6 +6,7 @@ from .views import (
TimeEntryDetailView, TimeEntryDetailView,
TimeEntryUpdateView, TimeEntryUpdateView,
WeeklySummaryView, WeeklySummaryView,
DebugDatabaseView
) )
urlpatterns = [ urlpatterns = [
@ -16,4 +17,5 @@ urlpatterns = [
path('entries/<int:entry_id>/update/', TimeEntryUpdateView.as_view(), name='time-entry-update'), path('entries/<int:entry_id>/update/', TimeEntryUpdateView.as_view(), name='time-entry-update'),
path('weekly-summary/', WeeklySummaryView.as_view(), name='user-weekly-summary'), path('weekly-summary/', WeeklySummaryView.as_view(), name='user-weekly-summary'),
path('weekly-summary/<int:user_id>/', WeeklySummaryView.as_view(), name='weekly-summary'), path('weekly-summary/<int:user_id>/', WeeklySummaryView.as_view(), name='weekly-summary'),
path('debug-database/', DebugDatabaseView.as_view()),
] ]

View File

@ -2,8 +2,8 @@ from rest_framework import generics, status
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView from rest_framework.views import APIView
from django.contrib.auth import get_user_model from django.conf import settings
from django.db import transaction from django.db import transaction, connection
from django.utils import timezone from django.utils import timezone
from datetime import timedelta from datetime import timedelta
from datetime import time as datetime_time from datetime import time as datetime_time
@ -16,8 +16,40 @@ from .serializers import (
WeeklySummarySerializer WeeklySummarySerializer
) )
User = get_user_model() class DebugDatabaseView(APIView):
permission_classes = []
def get(self, request):
with connection.cursor() as cursor:
cursor.execute("""
SELECT
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'time_tracking_timeentry'
AND COLUMN_NAME = 'user_id'
AND REFERENCED_TABLE_NAME IS NOT NULL
""")
foreign_keys = [
{
'constraint': row[0],
'column': row[1],
'referenced_table': row[2],
'referenced_column': row[3],
}
for row in cursor.fetchall()
]
return Response({
'database': connection.settings_dict.get('NAME'),
'user_model': str(settings.AUTH_USER_MODEL),
'foreign_keys': foreign_keys,
})
class TimeEntryListView(generics.ListAPIView): class TimeEntryListView(generics.ListAPIView):
serializer_class = TimeEntrySerializer serializer_class = TimeEntrySerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@ -253,8 +285,8 @@ class WeeklySummaryView(APIView):
user = request.user user = request.user
if user_id and (request.user.is_staff or request.user.is_superuser): if user_id and (request.user.is_staff or request.user.is_superuser):
try: try:
user = User.objects.get(id=user_id) user = settings.AUTH_USER_MODEL.objects.get(id=user_id)
except User.DoesNotExist: except settings.AUTH_USER_MODEL.DoesNotExist:
return Response({'error': 'Utilisateur non trouvé'}, status=status.HTTP_404_NOT_FOUND) return Response({'error': 'Utilisateur non trouvé'}, status=status.HTTP_404_NOT_FOUND)
serializer = WeeklySummarySerializer(build_weekly_summary(user)) serializer = WeeklySummarySerializer(build_weekly_summary(user))