diff --git a/Back-End/School/management/commands/init_mock_datas.py b/Back-End/School/management/commands/init_mock_datas.py index 0ca75d1..fe69619 100644 --- a/Back-End/School/management/commands/init_mock_datas.py +++ b/Back-End/School/management/commands/init_mock_datas.py @@ -6,8 +6,8 @@ from Subscriptions.models import ( Fee, Discount, RegistrationFileGroup, - RegistrationTemplateMaster, - RegistrationTemplate + RegistrationSchoolFileMaster, + RegistrationSchoolFileTemplate ) from Auth.models import Profile, ProfileRole from School.models import ( diff --git a/Back-End/Subscriptions/models.py b/Back-End/Subscriptions/models.py index 60e3135..a670af8 100644 --- a/Back-End/Subscriptions/models.py +++ b/Back-End/Subscriptions/models.py @@ -83,7 +83,7 @@ class Student(models.Model): siblings = models.ManyToManyField(Sibling, blank=True) # Many-to-Many Relationship - registration_files = models.ManyToManyField('RegistrationTemplate', blank=True, related_name='students') + registration_files = models.ManyToManyField('RegistrationSchoolFileTemplate', blank=True, related_name='students') # Many-to-Many Relationship spoken_languages = models.ManyToManyField(Language, blank=True) @@ -170,15 +170,6 @@ def registration_file_path(instance, filename): # Génère le chemin : registration_files/dossier_rf_{student_id}/filename return f'registration_files/dossier_rf_{instance.student_id}/{filename}' -class RegistrationTemplateMaster(models.Model): - groups = models.ManyToManyField(RegistrationFileGroup, related_name='template_masters', blank=True) - id = models.IntegerField(primary_key=True) - name = models.CharField(max_length=255, default="") - is_required = models.BooleanField(default=False) - - def __str__(self): - return f'{self.group.name} - {self.id}' - class RegistrationForm(models.Model): class RegistrationFormStatus(models.IntegerChoices): RF_IDLE = 0, _('Pas de dossier d\'inscription') @@ -243,12 +234,37 @@ class RegistrationForm(models.Model): def registration_file_upload_to(instance, filename): return f"registration_files/dossier_rf_{instance.registration_form.pk}/{filename}" -class RegistrationTemplate(models.Model): - master = models.ForeignKey(RegistrationTemplateMaster, on_delete=models.CASCADE, related_name='templates', blank=True) +############################################################# +####################### MASTER FILES ######################## +############################################################# + +####### DocuSeal masters (documents école, à signer ou pas) ####### +class RegistrationSchoolFileMaster(models.Model): + groups = models.ManyToManyField(RegistrationFileGroup, related_name='school_file_masters', blank=True) + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255, default="") + is_required = models.BooleanField(default=False) + + def __str__(self): + return f'{self.group.name} - {self.id}' + +####### Parent files masters (documents à fournir par les parents) ####### +class RegistrationParentFileMaster(models.Model): + groups = models.ManyToManyField(RegistrationFileGroup, related_name='parent_file_masters', blank=True) + name = models.CharField(max_length=255, default="") + description = models.CharField(blank=True, null=True) + +############################################################ +####################### CLONE FILES ######################## +############################################################ + +####### DocuSeal templates (par dossier d'inscription) ####### +class RegistrationSchoolFileTemplate(models.Model): + master = models.ForeignKey(RegistrationSchoolFileMaster, on_delete=models.CASCADE, related_name='school_file_templates', blank=True) id = models.IntegerField(primary_key=True) slug = models.CharField(max_length=255, default="") name = models.CharField(max_length=255, default="") - registration_form = models.ForeignKey(RegistrationForm, on_delete=models.CASCADE, related_name='templates', blank=True) + registration_form = models.ForeignKey(RegistrationForm, on_delete=models.CASCADE, related_name='school_file_templates', blank=True) file = models.FileField(null=True,blank=True, upload_to=registration_file_upload_to) def __str__(self): @@ -259,14 +275,29 @@ class RegistrationTemplate(models.Model): """ Récupère tous les fichiers liés à un dossier d’inscription donné. """ - registration_files = RegistrationTemplate.objects.filter(registration_form=register_form_id) + registration_files = RegistrationSchoolFileTemplate.objects.filter(registration_form=register_form_id) filenames = [] for reg_file in registration_files: filenames.append(reg_file.file.path) return filenames -class RegistrationParentFile(models.Model): - groups = models.ManyToManyField(RegistrationFileGroup, related_name='parent_files', blank=True) +####### Parent files templates (par dossier d'inscription) ####### +class RegistrationParentFileTemplate(models.Model): + master = models.ForeignKey(RegistrationSchoolFileMaster, on_delete=models.CASCADE, related_name='parent_file_templates', blank=True) name = models.CharField(max_length=255, default="") - description = models.CharField(blank=True, null=True) - file = models.FileField(null=True,blank=True, upload_to=registration_file_upload_to) \ No newline at end of file + registration_form = models.ForeignKey(RegistrationForm, on_delete=models.CASCADE, related_name='parent_file_templates', blank=True) + file = models.FileField(null=True,blank=True, upload_to=registration_file_upload_to) + + def __str__(self): + return self.name + + @staticmethod + def get_files_from_rf(register_form_id): + """ + Récupère tous les fichiers liés à un dossier d’inscription donné. + """ + registration_files = RegistrationSchoolFileTemplate.objects.filter(registration_form=register_form_id) + filenames = [] + for reg_file in registration_files: + filenames.append(reg_file.file.path) + return filenames diff --git a/Back-End/Subscriptions/serializers.py b/Back-End/Subscriptions/serializers.py index 764a1e1..78bf8f4 100644 --- a/Back-End/Subscriptions/serializers.py +++ b/Back-End/Subscriptions/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import RegistrationFileGroup, RegistrationForm, Student, Guardian, Sibling, Language, RegistrationTemplateMaster, RegistrationTemplate, RegistrationParentFile +from .models import RegistrationFileGroup, RegistrationForm, Student, Guardian, Sibling, Language, RegistrationSchoolFileMaster, RegistrationSchoolFileTemplate, RegistrationParentFileMaster from School.models import SchoolClass, Fee, Discount, FeeType from School.serializers import FeeSerializer, DiscountSerializer from Auth.models import ProfileRole, Profile @@ -12,24 +12,40 @@ import pytz from datetime import datetime import Subscriptions.util as util -class RegistrationTemplateMasterSerializer(serializers.ModelSerializer): +class RegistrationSchoolFileMasterSerializer(serializers.ModelSerializer): id = serializers.IntegerField(required=False) class Meta: - model = RegistrationTemplateMaster + model = RegistrationSchoolFileMaster fields = '__all__' -class RegistrationTemplateSerializer(serializers.ModelSerializer): +class RegistrationParentFileMasterSerializer(serializers.ModelSerializer): id = serializers.IntegerField(required=False) class Meta: - model = RegistrationTemplate + model = RegistrationParentFileMaster fields = '__all__' -class RegistrationParentFileSerializer(serializers.ModelSerializer): +class RegistrationSchoolFileTemplateSerializer(serializers.ModelSerializer): id = serializers.IntegerField(required=False) + file_url = serializers.SerializerMethodField() class Meta: - model = RegistrationParentFile + model = RegistrationSchoolFileTemplate fields = '__all__' + def get_file_url(self, obj): + # Retourne l'URL complète du fichier si disponible + return obj.file.url if obj.file else None + +class RegistrationParentFileTemplateSerializer(serializers.ModelSerializer): + id = serializers.IntegerField(required=False) + file = serializers.SerializerMethodField() + class Meta: + model = RegistrationParentFileMaster + fields = '__all__' + + def get_file(self, obj): + # Retourne l'URL complète du fichier si disponible + return obj.file.url if obj.file else None + class GuardianSimpleSerializer(serializers.ModelSerializer): associated_profile_email = serializers.SerializerMethodField() @@ -205,7 +221,7 @@ class RegistrationFormSerializer(serializers.ModelSerializer): sepa_file = serializers.FileField(required=False) status_label = serializers.SerializerMethodField() formatted_last_update = serializers.SerializerMethodField() - registration_files = RegistrationTemplateSerializer(many=True, required=False) + registration_files = RegistrationSchoolFileTemplateSerializer(many=True, required=False) fees = serializers.PrimaryKeyRelatedField(queryset=Fee.objects.all(), many=True, required=False) discounts = serializers.PrimaryKeyRelatedField(queryset=Discount.objects.all(), many=True, required=False) totalRegistrationFees = serializers.SerializerMethodField() diff --git a/Back-End/Subscriptions/urls.py b/Back-End/Subscriptions/urls.py index 7f664f9..eb5bb4b 100644 --- a/Back-End/Subscriptions/urls.py +++ b/Back-End/Subscriptions/urls.py @@ -7,16 +7,17 @@ from .views import RegisterFormView, RegisterFormWithIdView, send, resend, archi # SubClasses from .views import StudentView, GuardianView, ChildrenListView, StudentListView, DissociateGuardianView # Files -from .views import RegistrationTemplateMasterView, RegistrationTemplateMasterSimpleView, RegistrationTemplateView, RegistrationTemplateSimpleView, RegistrationParentFileSimpleView, RegistrationParentFileView +from .views import RegistrationSchoolFileMasterView, RegistrationSchoolFileMasterSimpleView, RegistrationSchoolFileTemplateView, RegistrationSchoolFileTemplateSimpleView, RegistrationParentFileMasterSimpleView, RegistrationParentFileMasterView from .views import RegistrationFileGroupView, RegistrationFileGroupSimpleView, get_registration_files_by_group -from .views import registration_file_views, get_templates_by_rf +from .views import registration_file_views, get_school_file_templates_by_rf, get_parent_file_templates_by_rf urlpatterns = [ re_path(r'^registerForms/(?P[0-9]+)/archive$', archive, name="archive"), re_path(r'^registerForms/(?P[0-9]+)/resend$', resend, name="resend"), re_path(r'^registerForms/(?P[0-9]+)/send$', send, name="send"), re_path(r'^registerForms/(?P[0-9]+)$', RegisterFormWithIdView.as_view(), name="registerForm"), - re_path(r'^registerForms/(?P[0-9]+)/templates$', get_templates_by_rf, name="get_templates_by_rf"), + re_path(r'^registerForms/(?P[0-9]+)/school_file_templates$', get_school_file_templates_by_rf, name="get_school_file_templates_by_rf"), + re_path(r'^registerForms/(?P[0-9]+)/parent_file_templatess$', get_parent_file_templates_by_rf, name="get_parent_file_templates_by_rf"), re_path(r'^registerForms$', RegisterFormView.as_view(), name="registerForms"), # Page INSCRIPTION - Liste des élèves @@ -33,14 +34,14 @@ urlpatterns = [ re_path(r'^registrationFileGroups/(?P[0-9]+)/templates$', get_registration_files_by_group, name="get_registration_files_by_group"), re_path(r'^registrationFileGroups$', RegistrationFileGroupView.as_view(), name='registrationFileGroups'), - re_path(r'^registrationTemplateMasters/(?P[0-9]+)$', RegistrationTemplateMasterSimpleView.as_view(), name='registrationTemplateMasters'), - re_path(r'^registrationTemplateMasters$', RegistrationTemplateMasterView.as_view(), name='registrationTemplateMasters'), + re_path(r'^registrationSchoolFileMasters/(?P[0-9]+)$', RegistrationSchoolFileMasterSimpleView.as_view(), name='registrationSchoolFileMasters'), + re_path(r'^registrationSchoolFileMasters$', RegistrationSchoolFileMasterView.as_view(), name='registrationSchoolFileMasters'), - re_path(r'^registrationTemplates/(?P[0-9]+)$', RegistrationTemplateSimpleView.as_view(), name='registrationTemplates'), - re_path(r'^registrationTemplates$', RegistrationTemplateView.as_view(), name="registrationTemplates"), + re_path(r'^registrationParentFileMasters/(?P[0-9]+)$', RegistrationParentFileMasterSimpleView.as_view(), name='registrationParentFileMasters'), + re_path(r'^registrationParentFileMasters$', RegistrationParentFileMasterView.as_view(), name="registrationParentFileMasters"), - re_path(r'^registrationParentFiles/(?P[0-9]+)$', RegistrationParentFileSimpleView.as_view(), name='registrationParentFiles'), - re_path(r'^registrationParentFiles$', RegistrationParentFileView.as_view(), name="registrationParentFiles"), + re_path(r'^registrationSchoolFileTemplates/(?P[0-9]+)$', RegistrationSchoolFileTemplateSimpleView.as_view(), name='registrationSchoolFileTemplates'), + re_path(r'^registrationSchoolFileTemplates$', RegistrationSchoolFileTemplateView.as_view(), name="registrationSchoolFileTemplates"), re_path(r'^students/(?P[0-9]+)/guardians/(?P[0-9]+)/dissociate', DissociateGuardianView.as_view(), name='dissociate-guardian'), diff --git a/Back-End/Subscriptions/views/__init__.py b/Back-End/Subscriptions/views/__init__.py index 41be263..c505486 100644 --- a/Back-End/Subscriptions/views/__init__.py +++ b/Back-End/Subscriptions/views/__init__.py @@ -1,5 +1,5 @@ -from .register_form_views import RegisterFormView, RegisterFormWithIdView, send, resend, archive, get_templates_by_rf -from .registration_file_views import RegistrationTemplateMasterView, RegistrationTemplateMasterSimpleView, RegistrationTemplateView, RegistrationTemplateSimpleView, RegistrationParentFileView, RegistrationParentFileSimpleView +from .register_form_views import RegisterFormView, RegisterFormWithIdView, send, resend, archive, get_school_file_templates_by_rf, get_parent_file_templates_by_rf +from .registration_file_views import RegistrationSchoolFileMasterView, RegistrationSchoolFileMasterSimpleView, RegistrationSchoolFileTemplateView, RegistrationSchoolFileTemplateSimpleView, RegistrationParentFileMasterView, RegistrationParentFileMasterSimpleView from .registration_file_group_views import RegistrationFileGroupView, RegistrationFileGroupSimpleView, get_registration_files_by_group from .student_views import StudentView, StudentListView, ChildrenListView from .guardian_views import GuardianView, DissociateGuardianView @@ -10,16 +10,17 @@ __all__ = [ 'send', 'resend', 'archive', - 'RegistrationTemplateView', - 'RegistrationTemplateSimpleView', - 'RegistrationParentFileSimpleView', - 'RegistrationParentFileView', - 'RegistrationTemplateMasterView', - 'RegistrationTemplateMasterSimpleView', + 'RegistrationSchoolFileTemplateView', + 'RegistrationSchoolFileTemplateSimpleView', + 'RegistrationParentFileMasterSimpleView', + 'RegistrationParentFileMasterView', + 'RegistrationSchoolFileMasterView', + 'RegistrationSchoolFileMasterSimpleView', 'RegistrationFileGroupView', 'RegistrationFileGroupSimpleView', 'get_registration_files_by_group', - 'get_templates_by_rf', + 'get_school_file_templates_by_rf', + 'get_parent_file_templates_by_rf' 'StudentView', 'StudentListView', 'ChildrenListView', diff --git a/Back-End/Subscriptions/views/register_form_views.py b/Back-End/Subscriptions/views/register_form_views.py index b803cde..1d07885 100644 --- a/Back-End/Subscriptions/views/register_form_views.py +++ b/Back-End/Subscriptions/views/register_form_views.py @@ -14,9 +14,9 @@ from django.core.files import File import Subscriptions.mailManager as mailer import Subscriptions.util as util -from Subscriptions.serializers import RegistrationFormSerializer +from Subscriptions.serializers import RegistrationFormSerializer, RegistrationSchoolFileTemplateSerializer, RegistrationParentFileMasterSerializer from Subscriptions.pagination import CustomPagination -from Subscriptions.models import Student, Guardian, RegistrationForm, RegistrationTemplate, RegistrationFileGroup +from Subscriptions.models import Student, Guardian, RegistrationForm, RegistrationSchoolFileTemplate, RegistrationFileGroup, RegistrationParentFileMaster from Subscriptions.automate import updateStateMachine from N3wtSchool import settings, bdd @@ -263,7 +263,7 @@ class RegisterFormWithIdView(APIView): registerForm.save() # Récupération des fichiers d'inscription - fileNames = RegistrationTemplate.get_files_from_rf(registerForm.pk) + fileNames = RegistrationSchoolFileTemplate.get_files_from_rf(registerForm.pk) if registerForm.registration_file: fileNames.insert(0, registerForm.registration_file.path) @@ -413,10 +413,40 @@ def resend(request,id): operation_summary="Récupérer les fichiers à signer d'un dossier d'inscription donné" ) @api_view(['GET']) -def get_templates_by_rf(request, id): +def get_school_file_templates_by_rf(request, id): try: - templates = RegistrationTemplate.objects.filter(registration_form=id) - templates_data = list(templates.values()) - return JsonResponse(templates_data, safe=False) - except RegistrationFileGroup.DoesNotExist: - return JsonResponse({'error': 'Le groupe de fichiers n\'a pas été trouvé'}, status=404) \ No newline at end of file + # Récupérer les templates associés au RegistrationForm donné + templates = RegistrationSchoolFileTemplate.objects.filter(registration_form=id) + + # Sérialiser les données + serializer = RegistrationSchoolFileTemplateSerializer(templates, many=True) + + # Retourner les données sérialisées + return JsonResponse(serializer.data, safe=False) + except RegistrationSchoolFileTemplate.DoesNotExist: + return JsonResponse({'error': 'Aucun template trouvé pour ce dossier d\'inscription'}, status=status.HTTP_404_NOT_FOUND) + +@swagger_auto_schema( + method='get', + responses={200: openapi.Response('Success', schema=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'message': openapi.Schema(type=openapi.TYPE_STRING) + } + ))}, + operation_description="Récupère les pièces à fournir d'un dossier d'inscription donné", + operation_summary="Récupérer les pièces à fournir d'un dossier d'inscription donné" +) +@api_view(['GET']) +def get_parent_file_templates_by_rf(request, id): + try: + # Récupérer les pièces à fournir associés au RegistrationForm donné + parent_files = RegistrationParentFileMaster.objects.filter(registration_form=id) + + # Sérialiser les données + serializer = RegistrationParentFileMasterSerializer(parent_files, many=True) + + # Retourner les données sérialisées + return JsonResponse(serializer.data, safe=False) + except RegistrationSchoolFileTemplate.DoesNotExist: + return JsonResponse({'error': 'Aucune pièce à fournir trouvée pour ce dossier d\'inscription'}, status=status.HTTP_404_NOT_FOUND) \ No newline at end of file diff --git a/Back-End/Subscriptions/views/registration_file_group_views.py b/Back-End/Subscriptions/views/registration_file_group_views.py index cce88e9..c9c42d5 100644 --- a/Back-End/Subscriptions/views/registration_file_group_views.py +++ b/Back-End/Subscriptions/views/registration_file_group_views.py @@ -8,7 +8,7 @@ from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi from Subscriptions.serializers import RegistrationFileGroupSerializer -from Subscriptions.models import RegistrationFileGroup, RegistrationTemplateMaster +from Subscriptions.models import RegistrationFileGroup, RegistrationSchoolFileMaster from N3wtSchool import bdd class RegistrationFileGroupView(APIView): @@ -124,7 +124,7 @@ class RegistrationFileGroupSimpleView(APIView): def get_registration_files_by_group(request, id): try: group = RegistrationFileGroup.objects.get(id=id) - templateMasters = RegistrationTemplateMaster.objects.filter(groups=group) + templateMasters = RegistrationSchoolFileMaster.objects.filter(groups=group) templates_data = list(templateMasters.values()) return JsonResponse(templates_data, safe=False) except RegistrationFileGroup.DoesNotExist: diff --git a/Back-End/Subscriptions/views/registration_file_views copy.py b/Back-End/Subscriptions/views/registration_file_views copy.py deleted file mode 100644 index 7df225a..0000000 --- a/Back-End/Subscriptions/views/registration_file_views copy.py +++ /dev/null @@ -1,159 +0,0 @@ -from django.http.response import JsonResponse -from drf_yasg.utils import swagger_auto_schema -from drf_yasg import openapi -from rest_framework.parsers import MultiPartParser, FormParser -from rest_framework.response import Response -from rest_framework.views import APIView -from rest_framework import status - -from Subscriptions.serializers import RegistrationTemplateMasterSerializer, RegistrationTemplateSerializer -from Subscriptions.models import RegistrationTemplateMaster, RegistrationTemplate -from N3wtSchool import bdd - -class RegistrationTemplateMasterView(APIView): - @swagger_auto_schema( - operation_description="Récupère tous les masters de templates d'inscription", - responses={200: RegistrationTemplateMasterSerializer(many=True)} - ) - def get(self, request): - masters = RegistrationTemplateMaster.objects.all() - serializer = RegistrationTemplateMasterSerializer(masters, many=True) - return Response(serializer.data) - - @swagger_auto_schema( - operation_description="Crée un nouveau master de template d'inscription", - request_body=RegistrationTemplateMasterSerializer, - responses={ - 201: RegistrationTemplateMasterSerializer, - 400: "Données invalides" - } - ) - def post(self, request): - serializer = RegistrationTemplateMasterSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -class RegistrationTemplateMasterSimpleView(APIView): - @swagger_auto_schema( - operation_description="Récupère un master de template d'inscription spécifique", - responses={ - 200: RegistrationTemplateMasterSerializer, - 404: "Master non trouvé" - } - ) - def get(self, request, id): - master = bdd.getObject(_objectName=RegistrationTemplateMaster, _columnName='id', _value=id) - if master is None: - return JsonResponse({"errorMessage":'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateMasterSerializer(master) - return JsonResponse(serializer.data, safe=False) - - @swagger_auto_schema( - operation_description="Met à jour un master de template d'inscription existant", - request_body=RegistrationTemplateMasterSerializer, - responses={ - 200: RegistrationTemplateMasterSerializer, - 400: "Données invalides", - 404: "Master non trouvé" - } - ) - def put(self, request, id): - master = bdd.getObject(_objectName=RegistrationTemplateMaster, _columnName='id', _value=id) - if master is None: - return JsonResponse({'erreur': 'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateMasterSerializer(master, data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - @swagger_auto_schema( - operation_description="Supprime un master de template d'inscription", - responses={ - 204: "Suppression réussie", - 404: "Master non trouvé" - } - ) - def delete(self, request, id): - master = bdd.getObject(_objectName=RegistrationTemplateMaster, _columnName='id', _value=id) - if master is not None: - master.delete() - return JsonResponse({'message': 'La suppression du master de template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) - else: - return JsonResponse({'erreur': 'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - -class RegistrationTemplateView(APIView): - @swagger_auto_schema( - operation_description="Récupère tous les templates d'inscription", - responses={200: RegistrationTemplateSerializer(many=True)} - ) - def get(self, request): - templates = RegistrationTemplate.objects.all() - serializer = RegistrationTemplateSerializer(templates, many=True) - return Response(serializer.data) - - @swagger_auto_schema( - operation_description="Crée un nouveau template d'inscription", - request_body=RegistrationTemplateSerializer, - responses={ - 201: RegistrationTemplateSerializer, - 400: "Données invalides" - } - ) - def post(self, request): - serializer = RegistrationTemplateSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -class RegistrationTemplateSimpleView(APIView): - @swagger_auto_schema( - operation_description="Récupère un template d'inscription spécifique", - responses={ - 200: RegistrationTemplateSerializer, - 404: "Template non trouvé" - } - ) - def get(self, request, id): - template = bdd.getObject(_objectName=RegistrationTemplate, _columnName='id', _value=id) - if template is None: - return JsonResponse({"errorMessage":'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateSerializer(template) - return JsonResponse(serializer.data, safe=False) - - @swagger_auto_schema( - operation_description="Met à jour un template d'inscription existant", - request_body=RegistrationTemplateSerializer, - responses={ - 200: RegistrationTemplateSerializer, - 400: "Données invalides", - 404: "Template non trouvé" - } - ) - def put(self, request, id): - template = bdd.getObject(_objectName=RegistrationTemplate, _columnName='id', _value=id) - if template is None: - return JsonResponse({'erreur': 'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateSerializer(template, data=request.data) - if serializer.is_valid(): - serializer.save() - return Response({'message': 'Template mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - @swagger_auto_schema( - operation_description="Supprime un template d'inscription", - responses={ - 204: "Suppression réussie", - 404: "Template non trouvé" - } - ) - def delete(self, request, id): - template = bdd.getObject(_objectName=RegistrationTemplate, _columnName='id', _value=id) - if template is not None: - template.delete() - return JsonResponse({'message': 'La suppression du template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) - else: - return JsonResponse({'erreur': 'Le template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) diff --git a/Back-End/Subscriptions/views/registration_file_views.py b/Back-End/Subscriptions/views/registration_file_views.py index e3e9be3..dd1e93c 100644 --- a/Back-End/Subscriptions/views/registration_file_views.py +++ b/Back-End/Subscriptions/views/registration_file_views.py @@ -6,64 +6,64 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status -from Subscriptions.serializers import RegistrationTemplateMasterSerializer, RegistrationTemplateSerializer, RegistrationParentFileSerializer -from Subscriptions.models import RegistrationTemplateMaster, RegistrationTemplate, RegistrationParentFile +from Subscriptions.serializers import RegistrationSchoolFileMasterSerializer, RegistrationSchoolFileTemplateSerializer, RegistrationParentFileMasterSerializer +from Subscriptions.models import RegistrationSchoolFileMaster, RegistrationSchoolFileTemplate, RegistrationParentFileMaster from N3wtSchool import bdd -class RegistrationTemplateMasterView(APIView): +class RegistrationSchoolFileMasterView(APIView): @swagger_auto_schema( operation_description="Récupère tous les masters de templates d'inscription", - responses={200: RegistrationTemplateMasterSerializer(many=True)} + responses={200: RegistrationSchoolFileMasterSerializer(many=True)} ) def get(self, request): - masters = RegistrationTemplateMaster.objects.all() - serializer = RegistrationTemplateMasterSerializer(masters, many=True) + masters = RegistrationSchoolFileMaster.objects.all() + serializer = RegistrationSchoolFileMasterSerializer(masters, many=True) return Response(serializer.data) @swagger_auto_schema( operation_description="Crée un nouveau master de template d'inscription", - request_body=RegistrationTemplateMasterSerializer, + request_body=RegistrationSchoolFileMasterSerializer, responses={ - 201: RegistrationTemplateMasterSerializer, + 201: RegistrationSchoolFileMasterSerializer, 400: "Données invalides" } ) def post(self, request): - serializer = RegistrationTemplateMasterSerializer(data=request.data) + serializer = RegistrationSchoolFileMasterSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -class RegistrationTemplateMasterSimpleView(APIView): +class RegistrationSchoolFileMasterSimpleView(APIView): @swagger_auto_schema( operation_description="Récupère un master de template d'inscription spécifique", responses={ - 200: RegistrationTemplateMasterSerializer, + 200: RegistrationSchoolFileMasterSerializer, 404: "Master non trouvé" } ) def get(self, request, id): - master = bdd.getObject(_objectName=RegistrationTemplateMaster, _columnName='id', _value=id) + master = bdd.getObject(_objectName=RegistrationSchoolFileMaster, _columnName='id', _value=id) if master is None: return JsonResponse({"errorMessage":'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateMasterSerializer(master) + serializer = RegistrationSchoolFileMasterSerializer(master) return JsonResponse(serializer.data, safe=False) @swagger_auto_schema( operation_description="Met à jour un master de template d'inscription existant", - request_body=RegistrationTemplateMasterSerializer, + request_body=RegistrationSchoolFileMasterSerializer, responses={ - 200: RegistrationTemplateMasterSerializer, + 200: RegistrationSchoolFileMasterSerializer, 400: "Données invalides", 404: "Master non trouvé" } ) def put(self, request, id): - master = bdd.getObject(_objectName=RegistrationTemplateMaster, _columnName='id', _value=id) + master = bdd.getObject(_objectName=RegistrationSchoolFileMaster, _columnName='id', _value=id) if master is None: return JsonResponse({'erreur': 'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateMasterSerializer(master, data=request.data) + serializer = RegistrationSchoolFileMasterSerializer(master, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) @@ -77,67 +77,67 @@ class RegistrationTemplateMasterSimpleView(APIView): } ) def delete(self, request, id): - master = bdd.getObject(_objectName=RegistrationTemplateMaster, _columnName='id', _value=id) + master = bdd.getObject(_objectName=RegistrationSchoolFileMaster, _columnName='id', _value=id) if master is not None: master.delete() return JsonResponse({'message': 'La suppression du master de template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) else: return JsonResponse({'erreur': 'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) -class RegistrationTemplateView(APIView): +class RegistrationSchoolFileTemplateView(APIView): @swagger_auto_schema( operation_description="Récupère tous les templates d'inscription", - responses={200: RegistrationTemplateSerializer(many=True)} + responses={200: RegistrationSchoolFileTemplateSerializer(many=True)} ) def get(self, request): - templates = RegistrationTemplate.objects.all() - serializer = RegistrationTemplateSerializer(templates, many=True) + templates = RegistrationSchoolFileTemplate.objects.all() + serializer = RegistrationSchoolFileTemplateSerializer(templates, many=True) return Response(serializer.data) @swagger_auto_schema( operation_description="Crée un nouveau template d'inscription", - request_body=RegistrationTemplateSerializer, + request_body=RegistrationSchoolFileTemplateSerializer, responses={ - 201: RegistrationTemplateSerializer, + 201: RegistrationSchoolFileTemplateSerializer, 400: "Données invalides" } ) def post(self, request): - serializer = RegistrationTemplateSerializer(data=request.data) + serializer = RegistrationSchoolFileTemplateSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -class RegistrationTemplateSimpleView(APIView): +class RegistrationSchoolFileTemplateSimpleView(APIView): @swagger_auto_schema( operation_description="Récupère un template d'inscription spécifique", responses={ - 200: RegistrationTemplateSerializer, + 200: RegistrationSchoolFileTemplateSerializer, 404: "Template non trouvé" } ) def get(self, request, id): - template = bdd.getObject(_objectName=RegistrationTemplate, _columnName='id', _value=id) + template = bdd.getObject(_objectName=RegistrationSchoolFileTemplate, _columnName='id', _value=id) if template is None: return JsonResponse({"errorMessage":'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateSerializer(template) + serializer = RegistrationSchoolFileTemplateSerializer(template) return JsonResponse(serializer.data, safe=False) @swagger_auto_schema( operation_description="Met à jour un template d'inscription existant", - request_body=RegistrationTemplateSerializer, + request_body=RegistrationSchoolFileTemplateSerializer, responses={ - 200: RegistrationTemplateSerializer, + 200: RegistrationSchoolFileTemplateSerializer, 400: "Données invalides", 404: "Template non trouvé" } ) def put(self, request, id): - template = bdd.getObject(_objectName=RegistrationTemplate, _columnName='id', _value=id) + template = bdd.getObject(_objectName=RegistrationSchoolFileTemplate, _columnName='id', _value=id) if template is None: return JsonResponse({'erreur': 'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationTemplateSerializer(template, data=request.data) + serializer = RegistrationSchoolFileTemplateSerializer(template, data=request.data) if serializer.is_valid(): serializer.save() return Response({'message': 'Template mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) @@ -151,68 +151,68 @@ class RegistrationTemplateSimpleView(APIView): } ) def delete(self, request, id): - template = bdd.getObject(_objectName=RegistrationTemplate, _columnName='id', _value=id) + template = bdd.getObject(_objectName=RegistrationSchoolFileTemplate, _columnName='id', _value=id) if template is not None: template.delete() return JsonResponse({'message': 'La suppression du template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) else: return JsonResponse({'erreur': 'Le template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) -class RegistrationParentFileView(APIView): +class RegistrationParentFileMasterView(APIView): @swagger_auto_schema( operation_description="Récupère tous les fichiers parents", - responses={200: RegistrationParentFileSerializer(many=True)} + responses={200: RegistrationParentFileMasterSerializer(many=True)} ) def get(self, request): - templates = RegistrationParentFile.objects.all() - serializer = RegistrationParentFileSerializer(templates, many=True) + templates = RegistrationParentFileMaster.objects.all() + serializer = RegistrationParentFileMasterSerializer(templates, many=True) return Response(serializer.data) @swagger_auto_schema( operation_description="Crée un nouveau fichier parent", - request_body=RegistrationParentFileSerializer, + request_body=RegistrationParentFileMasterSerializer, responses={ - 201: RegistrationParentFileSerializer, + 201: RegistrationParentFileMasterSerializer, 400: "Données invalides" } ) def post(self, request): - serializer = RegistrationParentFileSerializer(data=request.data) + serializer = RegistrationParentFileMasterSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -class RegistrationParentFileSimpleView(APIView): +class RegistrationParentFileMasterSimpleView(APIView): @swagger_auto_schema( operation_description="Récupère un fichier parent spécifique", responses={ - 200: RegistrationParentFileSerializer, + 200: RegistrationParentFileMasterSerializer, 404: "Fichier parent non trouvé" } ) def get(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFile, _columnName='id', _value=id) + template = bdd.getObject(_objectName=RegistrationParentFileMaster, _columnName='id', _value=id) if template is None: return JsonResponse({"errorMessage":'Le fichier parent n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationParentFileSerializer(template) + serializer = RegistrationParentFileMasterSerializer(template) return JsonResponse(serializer.data, safe=False) @swagger_auto_schema( operation_description="Met à jour un fichier parent existant", - request_body=RegistrationParentFileSerializer, + request_body=RegistrationParentFileMasterSerializer, responses={ - 200: RegistrationParentFileSerializer, + 200: RegistrationParentFileMasterSerializer, 400: "Données invalides", 404: "Fichier parent non trouvé" } ) def put(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFile, _columnName='id', _value=id) + template = bdd.getObject(_objectName=RegistrationParentFileMaster, _columnName='id', _value=id) if template is None: return JsonResponse({'erreur': 'Le fichier parent n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationParentFileSerializer(template, data=request.data) + serializer = RegistrationParentFileMasterSerializer(template, data=request.data) if serializer.is_valid(): serializer.save() return Response({'message': 'Fichier parent mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) @@ -226,7 +226,7 @@ class RegistrationParentFileSimpleView(APIView): } ) def delete(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFile, _columnName='id', _value=id) + template = bdd.getObject(_objectName=RegistrationParentFileMaster, _columnName='id', _value=id) if template is not None: template.delete() return JsonResponse({'message': 'La suppression du fichier parent a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) diff --git a/Front-End/src/app/[locale]/admin/structure/page.js b/Front-End/src/app/[locale]/admin/structure/page.js index 4943f6b..aa72c8e 100644 --- a/Front-End/src/app/[locale]/admin/structure/page.js +++ b/Front-End/src/app/[locale]/admin/structure/page.js @@ -25,7 +25,7 @@ import { import { fetchProfileRoles, fetchProfiles } from '@/app/actions/authAction'; import SidebarTabs from '@/components/SidebarTabs'; import FilesGroupsManagement from '@/components/Structure/Files/FilesGroupsManagement'; -import { fetchRegistrationTemplateMaster } from "@/app/actions/registerFileGroupAction"; +import { fetchRegistrationSchoolFileMasters } from "@/app/actions/registerFileGroupAction"; import logger from '@/utils/logger'; import { useEstablishment } from '@/context/EstablishmentContext'; @@ -74,8 +74,8 @@ export default function Page() { // Fetch data for tuition fees handleTuitionFees(); - // Fetch data for registration file templates - fetchRegistrationTemplateMaster() + // Fetch data for registration file schoolFileTemplates + fetchRegistrationSchoolFileMasters() .then((data)=> { setFichiers(data) }) diff --git a/Front-End/src/app/[locale]/admin/subscriptions/page.js b/Front-End/src/app/[locale]/admin/subscriptions/page.js index 680c723..312fac6 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/page.js @@ -28,7 +28,7 @@ import { editRegisterForm } from "@/app/actions/subscriptionAction" import { - fetchRegistrationTemplateMaster, + fetchRegistrationSchoolFileMasters, createRegistrationTemplates, fetchRegistrationFileGroups, cloneTemplate @@ -72,7 +72,7 @@ export default function Page({ params: { locale } }) { const [totalArchives, setTotalArchives] = useState(0); const [itemsPerPage, setItemsPerPage] = useState(10); // Définir le nombre d'éléments par page - const [templateMasters, setTemplateMasters] = useState([]); + const [schoolFileMasters, setSchoolFileMasters] = useState([]); const [isOpen, setIsOpen] = useState(false); const [isOpenAffectationClasse, setIsOpenAffectationClasse] = useState(false); const [student, setStudent] = useState(''); @@ -213,9 +213,9 @@ useEffect(() => { fetchRegisterForms(selectedEstablishmentId, ARCHIVED) .then(registerFormArchivedDataHandler) .catch(requestErrorHandler), - fetchRegistrationTemplateMaster() + fetchRegistrationSchoolFileMasters() .then(data => { - setTemplateMasters(data); + setSchoolFileMasters(data); }) .catch(err => { logger.debug(err.message); @@ -284,8 +284,8 @@ useEffect(() => { fetchRegisterForms(selectedEstablishmentId, ARCHIVED) .then(registerFormArchivedDataHandler) .catch(requestErrorHandler) - fetchRegistrationTemplateMaster() - .then((data)=> {setTemplateMasters(data)}) + fetchRegistrationSchoolFileMasters() + .then((data)=> {setSchoolFileMasters(data)}) .catch((err)=>{ err = err.message; logger.debug(err);}); setIsLoading(false); @@ -460,12 +460,12 @@ useEffect(()=>{ createRegisterForm(data, csrfToken) .then(data => { - // Cloner les templates pour chaque templateMaster du fileGroup - const masters = templateMasters.filter(file => file.groups.includes(selectedFileGroup)); + // Cloner les schoolFileTemplates pour chaque templateMaster du fileGroup + const masters = schoolFileMasters.filter(file => file.groups.includes(selectedFileGroup)); const clonePromises = masters.map((templateMaster, index) => { return cloneTemplate(templateMaster.id, updatedData.guardianEmail, templateMaster.is_required) .then(clonedDocument => { - // Sauvegarde des templates clonés dans la base de données + // Sauvegarde des schoolFileTemplates clonés dans la base de données const cloneData = { name: `${templateMaster.name}_${updatedData.guardianFirstName}_${updatedData.guardianLastName}`, slug: clonedDocument.slug, diff --git a/Front-End/src/app/actions/registerFileGroupAction.js b/Front-End/src/app/actions/registerFileGroupAction.js index 2937c0a..4253303 100644 --- a/Front-End/src/app/actions/registerFileGroupAction.js +++ b/Front-End/src/app/actions/registerFileGroupAction.js @@ -1,7 +1,7 @@ import { BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL, - BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL, - BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL, - BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL, + BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL, + BE_SUBSCRIPTION_REGISTRATIONSCHOOL_FILE_MASTERS_URL, + BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL, FE_API_DOCUSEAL_CLONE_URL, FE_API_DOCUSEAL_DOWNLOAD_URL, FE_API_DOCUSEAL_GENERATE_TOKEN @@ -80,7 +80,7 @@ export const editRegistrationFileGroup = async (groupId, groupData, csrfToken) = }; export const fetchRegistrationFileFromGroup = async (groupId) => { - const response = await fetch(`${BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL}/${groupId}/templates`, { + const response = await fetch(`${BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL}/${groupId}/schoolFileTemplates`, { credentials: 'include', headers: { 'Accept': 'application/json', @@ -92,10 +92,10 @@ export const fetchRegistrationFileFromGroup = async (groupId) => { return response.json(); } -export const fetchRegistrationParentFiles = (id = null) => { - let url = `${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}` +export const fetchRegistrationParentFileMasters = (id = null) => { + let url = `${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL}` if (id) { - url = `${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}/${id}`; + url = `${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL}/${id}`; } const request = new Request( `${url}`, @@ -109,9 +109,9 @@ export const fetchRegistrationParentFiles = (id = null) => { return fetch(request).then(requestResponseHandler) }; -export const createRegistrationParentFiles = (data,csrfToken) => { +export const createRegistrationParentFileMaster = (data,csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}`, { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL}`, { method: 'POST', body: JSON.stringify(data), headers: { @@ -123,8 +123,8 @@ export const createRegistrationParentFiles = (data,csrfToken) => { .then(requestResponseHandler) } -export const editRegistrationParentFiles = (id, data, csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}/${id}`, { +export const editRegistrationParentFileMaster = (id, data, csrfToken) => { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL}/${id}`, { method: 'PUT', body: JSON.stringify(data), headers: { @@ -136,8 +136,8 @@ export const editRegistrationParentFiles = (id, data, csrfToken) => { .then(requestResponseHandler) } -export const deleteRegistrationParentFiles = (id, csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}/${id}`, { +export const deleteRegistrationParentFileMaster = (id, csrfToken) => { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILE_MASTERS_URL}/${id}`, { method: 'DELETE', headers: { 'X-CSRFToken': csrfToken, @@ -146,10 +146,10 @@ export const deleteRegistrationParentFiles = (id, csrfToken) => { }) } -export const fetchRegistrationTemplates = (id = null) => { - let url = `${BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL}` +export const fetchRegistrationSchoolFileTemplates = (id = null) => { + let url = `${BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL}` if (id) { - url = `${BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL}/${id}`; + url = `${BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL}/${id}`; } const request = new Request( `${url}`, @@ -164,7 +164,7 @@ export const fetchRegistrationTemplates = (id = null) => { }; export const editRegistrationTemplates = (fileId, data, csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL}/${fileId}`, { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL}/${fileId}`, { method: 'PUT', body: data, headers: { @@ -177,7 +177,7 @@ export const editRegistrationTemplates = (fileId, data, csrfToken) => { export const createRegistrationTemplates = (data,csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL}`, { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL}`, { method: 'POST', body: JSON.stringify(data), headers: { @@ -190,7 +190,7 @@ export const createRegistrationTemplates = (data,csrfToken) => { } export const deleteRegistrationTemplates = (fileId,csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL}/${fileId}`, { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_SCHOOL_FILE_TEMPLATES_URL}/${fileId}`, { method: 'DELETE', headers: { 'X-CSRFToken': csrfToken, @@ -199,10 +199,10 @@ export const deleteRegistrationTemplates = (fileId,csrfToken) => { }) } -export const fetchRegistrationTemplateMaster = (id = null) => { - let url = `${BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL}`; +export const fetchRegistrationSchoolFileMasters = (id = null) => { + let url = `${BE_SUBSCRIPTION_REGISTRATIONSCHOOL_FILE_MASTERS_URL}`; if(id){ - url = `${BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL}/${id}`; + url = `${BE_SUBSCRIPTION_REGISTRATIONSCHOOL_FILE_MASTERS_URL}/${id}`; } const request = new Request( `${url}`, @@ -216,9 +216,9 @@ export const fetchRegistrationTemplateMaster = (id = null) => { return fetch(request).then(requestResponseHandler) }; -export const createRegistrationTemplateMaster = (data,csrfToken) => { +export const createRegistrationSchoolFileMaster = (data,csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL}`, { + return fetch(`${BE_SUBSCRIPTION_REGISTRATIONSCHOOL_FILE_MASTERS_URL}`, { method: 'POST', body: JSON.stringify(data), headers: { @@ -230,8 +230,8 @@ export const createRegistrationTemplateMaster = (data,csrfToken) => { .then(requestResponseHandler) } -export const deleteRegistrationTemplateMaster = (fileId,csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL}/${fileId}`, { +export const deleteRegistrationSchoolFileMaster = (fileId,csrfToken) => { + return fetch(`${BE_SUBSCRIPTION_REGISTRATIONSCHOOL_FILE_MASTERS_URL}/${fileId}`, { method: 'DELETE', headers: { 'X-CSRFToken': csrfToken, @@ -240,8 +240,8 @@ export const deleteRegistrationTemplateMaster = (fileId,csrfToken) => { }) } -export const editRegistrationTemplateMaster = (fileId, data, csrfToken) => { - return fetch(`${BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL}/${fileId}`, { +export const editRegistrationSchoolFileMaster = (fileId, data, csrfToken) => { + return fetch(`${BE_SUBSCRIPTION_REGISTRATIONSCHOOL_FILE_MASTERS_URL}/${fileId}`, { method: 'PUT', body: JSON.stringify(data), headers: { diff --git a/Front-End/src/app/actions/subscriptionAction.js b/Front-End/src/app/actions/subscriptionAction.js index 7309b38..b8fc993 100644 --- a/Front-End/src/app/actions/subscriptionAction.js +++ b/Front-End/src/app/actions/subscriptionAction.js @@ -151,8 +151,8 @@ export async function getRegisterFormFileTemplate(fileId) { return response.json(); } -export const fetchTemplatesFromRegistrationFiles = async (id) => { - const response = await fetch(`${BE_SUBSCRIPTION_REGISTERFORMS_URL}/${id}/templates`, { +export const fetchSchoolFileTemplatesFromRegistrationFiles = async (id) => { + const response = await fetch(`${BE_SUBSCRIPTION_REGISTERFORMS_URL}/${id}/school_file_templates`, { credentials: 'include', headers: { 'Accept': 'application/json', diff --git a/Front-End/src/components/Inscription/InscriptionFormShared.js b/Front-End/src/components/Inscription/InscriptionFormShared.js index 5a87adf..923518d 100644 --- a/Front-End/src/components/Inscription/InscriptionFormShared.js +++ b/Front-End/src/components/Inscription/InscriptionFormShared.js @@ -3,7 +3,7 @@ import React, { useState, useEffect } from 'react'; import Loader from '@/components/Loader'; import Button from '@/components/Button'; import DjangoCSRFToken from '@/components/DjangoCSRFToken'; -import { fetchRegisterForm, fetchTemplatesFromRegistrationFiles } from '@/app/actions/subscriptionAction'; +import { fetchRegisterForm, fetchSchoolFileTemplatesFromRegistrationFiles } from '@/app/actions/subscriptionAction'; import { downloadTemplate, createRegistrationTemplates, editRegistrationTemplates, @@ -112,7 +112,7 @@ export default function InscriptionFormShared({ }, [studentId]); useEffect(() => { - fetchTemplatesFromRegistrationFiles(studentId).then((data) => { + fetchSchoolFileTemplatesFromRegistrationFiles(studentId).then((data) => { setFileTemplates(data); }) }, []); @@ -341,7 +341,7 @@ export default function InscriptionFormShared({ {/* Affichage du formulaire ou du document */} - {requiredFileTemplates[currentPage - 2].file === "" ? ( + {requiredFileTemplates[currentPage - 2].file === null ? ( fetch(data)) .then((response) => response.blob()) - .then((blob) => { + .then((blob) => { const file = new File([blob], `${requiredFileTemplates[currentPage - 2].name}.pdf`, { type: blob.type }); const updateData = new FormData(); updateData.append('file', file); diff --git a/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js b/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js index d087f3d..cd13c08 100644 --- a/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js +++ b/Front-End/src/components/Structure/Files/FileUploadDocuSeal.js @@ -102,7 +102,7 @@ export default function FileUploadDocuSeal({ handleCreateTemplateMaster, handleE logger.debug('creation du clone avec required : ', is_required) cloneTemplate(templateMaster?.id, guardian.email, is_required) .then(clonedDocument => { - // Sauvegarde des templates clonés dans la base de données + // Sauvegarde des schoolFileTemplates clonés dans la base de données const data = { name: `${uploadedFileName}_${guardian.first_name}_${guardian.last_name}`, slug: clonedDocument.slug, diff --git a/Front-End/src/components/Structure/Files/FilesGroupsManagement.js b/Front-End/src/components/Structure/Files/FilesGroupsManagement.js index 65008ff..8bd8044 100644 --- a/Front-End/src/components/Structure/Files/FilesGroupsManagement.js +++ b/Front-End/src/components/Structure/Files/FilesGroupsManagement.js @@ -5,27 +5,32 @@ import Table from '@/components/Table'; import FileUploadDocuSeal from '@/components/Structure/Files/FileUploadDocuSeal'; import { BASE_URL } from '@/utils/Url'; import { + // GET fetchRegistrationFileGroups, + fetchRegistrationSchoolFileMasters, + fetchRegistrationSchoolFileTemplates, + fetchRegistrationParentFileMasters, + // POST createRegistrationFileGroup, - deleteRegistrationFileGroup, + createRegistrationSchoolFileMaster, + createRegistrationParentFileMaster, + // PUT editRegistrationFileGroup, - fetchRegistrationTemplateMaster, - createRegistrationTemplateMaster, - editRegistrationTemplateMaster, - deleteRegistrationTemplateMaster, - fetchRegistrationTemplates, - fetchRegistrationParentFiles, - createRegistrationParentFiles, - editRegistrationParentFiles, - deleteRegistrationParentFiles + editRegistrationSchoolFileMaster, + editRegistrationParentFileMaster, + // DELETE + deleteRegistrationFileGroup, + deleteRegistrationSchoolFileMaster, + deleteRegistrationParentFileMaster, } from '@/app/actions/registerFileGroupAction'; import RegistrationFileGroupForm from '@/components/Structure/Files/RegistrationFileGroupForm'; import logger from '@/utils/logger'; import ParentFilesSection from '@/components/Structure/Files/ParentFilesSection'; export default function FilesGroupsManagement({ csrfToken, selectedEstablishmentId }) { - const [templateMasters, setTemplateMasters] = useState([]); - const [templates, setTemplates] = useState([]); + const [schoolFileMasters, setSchoolFileMasters] = useState([]); + const [schoolFileTemplates, setSchoolFileTemplates] = useState([]); + const [parentFiles, setParentFileMasters] = useState([]); const [groups, setGroups] = useState([]); const [selectedGroup, setSelectedGroup] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); @@ -37,8 +42,6 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment const [editingDocumentId, setEditingDocumentId] = useState(null); const [formData, setFormData] = useState({}); - const [parentFiles, setParentFiles] = useState([]); - const handleReloadTemplates = () => { setReloadTemplates(true); } @@ -54,17 +57,17 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment useEffect(() => { if (selectedEstablishmentId) { Promise.all([ - fetchRegistrationTemplateMaster(), + fetchRegistrationSchoolFileMasters(), fetchRegistrationFileGroups(selectedEstablishmentId), - fetchRegistrationTemplates(), - fetchRegistrationParentFiles() - ]).then(([filesTemplateMasters, groupsData, filesTemplates, filesParentFiles]) => { + fetchRegistrationSchoolFileTemplates(), + fetchRegistrationParentFileMasters() + ]).then(([dataSchoolFileMasters, groupsData, dataSchoolFileTemplates, dataParentFileMasters]) => { setGroups(groupsData); - setTemplates(filesTemplates); - setParentFiles(filesParentFiles); + setSchoolFileTemplates(dataSchoolFileTemplates); + setParentFileMasters(dataParentFileMasters); // Transformer chaque fichier pour inclure les informations complètes du groupe - const transformedFiles = filesTemplateMasters.map(file => transformFileData(file, groupsData)); - setTemplateMasters(transformedFiles); + const transformedFiles = dataSchoolFileMasters.map(file => transformFileData(file, groupsData)); + setSchoolFileMasters(transformedFiles); }).catch(err => { console.log(err.message); }).finally(() => { @@ -75,7 +78,7 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment const deleteTemplateMaster = (templateMaster) => { // Supprimer les clones associés via l'API DocuSeal - const removeClonesPromises = templates + const removeClonesPromises = schoolFileTemplates .filter(template => template.master === templateMaster.id) .map(template => removeTemplate(template.id)); @@ -90,10 +93,10 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment logger.debug('Master et clones supprimés avec succès de DocuSeal.'); // Supprimer le template master de la base de données - deleteRegistrationTemplateMaster(templateMaster.id, csrfToken) + deleteRegistrationSchoolFileMaster(templateMaster.id, csrfToken) .then(response => { if (response.ok) { - setTemplateMasters(templateMasters.filter(fichier => fichier.id !== templateMaster.id)); + setSchoolFileMasters(schoolFileMasters.filter(fichier => fichier.id !== templateMaster.id)); alert('Fichier supprimé avec succès.'); } else { alert('Erreur lors de la suppression du fichier dans la base de données.'); @@ -151,11 +154,11 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }; logger.debug(data); - createRegistrationTemplateMaster(data, csrfToken) + createRegistrationSchoolFileMaster(data, csrfToken) .then(data => { // Transformer le nouveau fichier avec les informations du groupe const transformedFile = transformFileData(data, groups); - setTemplateMasters(prevFiles => [...prevFiles, transformedFile]); + setSchoolFileMasters(prevFiles => [...prevFiles, transformedFile]); setIsModalOpen(false); }) .catch(error => { @@ -172,11 +175,11 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }; logger.debug(data); - editRegistrationTemplateMaster(id, data, csrfToken) + editRegistrationSchoolFileMaster(id, data, csrfToken) .then(data => { // Transformer le fichier mis à jour avec les informations du groupe const transformedFile = transformFileData(data, groups); - setTemplateMasters(prevFichiers => + setSchoolFileMasters(prevFichiers => prevFichiers.map(f => f.id === id ? transformedFile : f) ); setIsModalOpen(false); @@ -224,10 +227,10 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }; const handleGroupDelete = (groupId) => { - // Vérifier si des templateMasters utilisent ce groupe - const filesInGroup = templateMasters.filter(file => file.group && file.group.id === groupId); + // Vérifier si des schoolFileMasters utilisent ce groupe + const filesInGroup = schoolFileMasters.filter(file => file.group && file.group.id === groupId); if (filesInGroup.length > 0) { - alert('Impossible de supprimer ce groupe car il contient des templateMasters. Veuillez d\'abord retirer tous les templateMasters de ce groupe.'); + alert('Impossible de supprimer ce groupe car il contient des schoolFileMasters. Veuillez d\'abord retirer tous les schoolFileMasters de ce groupe.'); return; } @@ -329,10 +332,10 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }; const handleCreate = (newParentFile) => { - return createRegistrationParentFiles(newParentFile, csrfToken) + return createRegistrationParentFileMaster(newParentFile, csrfToken) .then((createdFile) => { // Ajouter le nouveau fichier parent à la liste existante - setParentFiles((prevFiles) => [...prevFiles, createdFile]); + setParentFileMasters((prevFiles) => [...prevFiles, createdFile]); logger.debug('Document parent créé avec succès:', createdFile); }) .catch((error) => { @@ -342,11 +345,11 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }; const handleEdit = (id, updatedFile) => { - return editRegistrationParentFiles(id, updatedFile, csrfToken) + return editRegistrationParentFileMaster(id, updatedFile, csrfToken) .then((response) => { const modifiedFile = response.data; // Extraire les données mises à jour // Mettre à jour la liste des fichiers parents - setParentFiles((prevFiles) => + setParentFileMasters((prevFiles) => prevFiles.map((file) => (file.id === id ? modifiedFile : file)) ); logger.debug('Document parent mis à jour avec succès:', modifiedFile); @@ -360,10 +363,10 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }; const handleDelete = (id) => { - return deleteRegistrationParentFiles(id, csrfToken) + return deleteRegistrationParentFileMaster(id, csrfToken) .then(() => { // Mettre à jour la liste des fichiers parents en supprimant l'élément correspondant - setParentFiles((prevFiles) => prevFiles.filter((file) => file.id !== id)); + setParentFileMasters((prevFiles) => prevFiles.filter((file) => file.id !== id)); logger.debug('Document parent supprimé avec succès:', id); }) .catch((error) => { @@ -371,7 +374,7 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment }); }; - const filteredFiles = templateMasters.filter(file => { + const filteredFiles = schoolFileMasters.filter(file => { if (!selectedGroup) return true; return file.groups && file.groups.some(group => group.id === parseInt(selectedGroup)); }); @@ -444,7 +447,7 @@ export default function FilesGroupsManagement({ csrfToken, selectedEstablishment (