feat: Amorçage de la gestion des absences [#16]

This commit is contained in:
N3WT DE COMPET
2025-05-03 23:32:19 +02:00
parent 1c75927bba
commit cb4fe74a9e
5 changed files with 338 additions and 42 deletions

View File

@ -132,3 +132,32 @@ class PaymentMode(models.Model):
def __str__(self):
return f"{self.get_mode_display()} - {self.get_type_display()}"
class AbsenceMoment(models.IntegerChoices):
MORNING = 1, 'Morning'
AFTERNOON = 2, 'Afternoon'
TOTAL = 3, 'Total'
class AbsenceReason(models.IntegerChoices):
JUSTIFIED_ABSENCE = 1, 'Justified Absence'
UNJUSTIFIED_ABSENCE = 2, 'Unjustified Absence'
JUSTIFIED_LATE = 3, 'Justified Late'
UNJUSTIFIED_LATE = 4, 'Unjustified Late'
class AbsenceManagement(models.Model):
day = models.DateField()
moment = models.IntegerField(
choices=AbsenceMoment.choices,
default=AbsenceMoment.TOTAL
)
reason = models.IntegerField(
choices=AbsenceReason.choices,
default=AbsenceReason.UNJUSTIFIED_ABSENCE
)
student = models.ForeignKey(
'Subscriptions.Student',
on_delete=models.CASCADE,
related_name='absences'
)
def __str__(self):
return f"{self.student} - {self.day} - {self.get_moment_display()} - {self.get_reason_display()}"

View File

@ -1,5 +1,5 @@
from rest_framework import serializers
from .models import Teacher, Speciality, SchoolClass, Planning, LEVEL_CHOICES, Discount, Fee, PaymentPlan, PaymentMode
from .models import Teacher, Speciality, SchoolClass, Planning, LEVEL_CHOICES, Discount, Fee, PaymentPlan, PaymentMode, AbsenceManagement
from Auth.models import Profile, ProfileRole
from Subscriptions.models import Student
from Establishment.models import Establishment
@ -8,6 +8,11 @@ from N3wtSchool import settings, bdd
from django.utils import timezone
import pytz
class AbsenceManagementSerializer(serializers.ModelSerializer):
class Meta:
model = AbsenceManagement
fields = '__all__'
class SpecialitySerializer(serializers.ModelSerializer):
updated_date_formatted = serializers.SerializerMethodField()

View File

@ -16,7 +16,9 @@ from .views import (
PaymentPlanListCreateView,
PaymentPlanDetailView,
PaymentModeListCreateView,
PaymentModeDetailView
PaymentModeDetailView,
AbsenceManagementListCreateView,
AbsenceManagementDetailView
)
urlpatterns = [
@ -42,5 +44,8 @@ urlpatterns = [
re_path(r'^paymentPlans/(?P<id>[0-9]+)$', PaymentPlanDetailView.as_view(), name="payment_plan_detail"),
re_path(r'^paymentModes$', PaymentModeListCreateView.as_view(), name="payment_mode_list_create"),
re_path(r'^paymentModes/(?P<id>[0-9]+)$', PaymentModeDetailView.as_view(), name="payment_mode_detail")
re_path(r'^paymentModes/(?P<id>[0-9]+)$', PaymentModeDetailView.as_view(), name="payment_mode_detail"),
re_path(r'^absences$', AbsenceManagementListCreateView.as_view(), name="absence_list_create"),
re_path(r'^absences/(?P<id>[0-9]+)$', AbsenceManagementDetailView.as_view(), name="absence_detail"),
]

View File

@ -12,7 +12,8 @@ from .models import (
Discount,
Fee,
PaymentPlan,
PaymentMode
PaymentMode,
AbsenceManagement
)
from .serializers import (
TeacherSerializer,
@ -22,7 +23,8 @@ from .serializers import (
DiscountSerializer,
FeeSerializer,
PaymentPlanSerializer,
PaymentModeSerializer
PaymentModeSerializer,
AbsenceManagementSerializer
)
from N3wtSchool.bdd import delete_object, getAllObjects, getObject
@ -411,3 +413,48 @@ class PaymentModeDetailView(APIView):
def delete(self, request, id):
return delete_object(PaymentMode, id)
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')
class AbsenceManagementListCreateView(APIView):
def get(self, request):
absences = AbsenceManagement.objects.all()
serializer = AbsenceManagementSerializer(absences, many=True)
return JsonResponse(serializer.data, safe=False, status=status.HTTP_200_OK)
def post(self, request):
serializer = AbsenceManagementSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False, status=status.HTTP_201_CREATED)
return JsonResponse(serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')
class AbsenceManagementDetailView(APIView):
def get(self, request, id):
try:
absence = AbsenceManagement.objects.get(id=id)
serializer = AbsenceManagementSerializer(absence)
return JsonResponse(serializer.data, safe=False, status=status.HTTP_200_OK)
except AbsenceManagement.DoesNotExist:
return JsonResponse({"error": "Absence not found"}, safe=False, status=status.HTTP_404_NOT_FOUND)
def put(self, request, id):
try:
absence = AbsenceManagement.objects.get(id=id)
serializer = AbsenceManagementSerializer(absence, data=request.data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False, status=status.HTTP_200_OK)
return JsonResponse(serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
except AbsenceManagement.DoesNotExist:
return JsonResponse({"error": "Absence not found"}, safe=False, status=status.HTTP_404_NOT_FOUND)
def delete(self, request, id):
try:
absence = AbsenceManagement.objects.get(id=id)
absence.delete()
return JsonResponse(safe=False, status=status.HTTP_204_NO_CONTENT)
except AbsenceManagement.DoesNotExist:
return JsonResponse({"error": "Absence not found"}, safe=False, status=status.HTTP_404_NOT_FOUND)