from django.shortcuts import render,get_object_or_404,get_list_or_404 from .models import RegistrationForm, Student, Guardian, Sibling import time from datetime import date, datetime, timedelta from zoneinfo import ZoneInfo from django.conf import settings from N3wtSchool import renderers from N3wtSchool import bdd from io import BytesIO from django.core.files import File from pathlib import Path import os from enum import Enum import random import string from rest_framework.parsers import JSONParser from PyPDF2 import PdfMerger import shutil import logging logger = logging.getLogger(__name__) def recupereListeFichesInscription(): """ Retourne la liste complète des fiches d’inscription. """ context = { "ficheInscriptions_list": bdd.getAllObjects(RegistrationForm), } return context def recupereListeFichesInscriptionEnAttenteSEPA(): """ Retourne les fiches d’inscription avec paiement SEPA en attente. """ ficheInscriptionsSEPA_list = RegistrationForm.objects.filter(modePaiement="Prélèvement SEPA").filter(etat=RegistrationForm.RegistrationFormStatus['SEPA_ENVOYE']) return ficheInscriptionsSEPA_list def _now(): """ Retourne la date et l’heure en cours, avec fuseau. """ return datetime.now(ZoneInfo(settings.TZ_APPLI)) def convertToStr(dateValue, dateFormat): """ Convertit un objet datetime en chaîne selon un format donné. """ return dateValue.strftime(dateFormat) def convertToDate(date_time): """ Convertit une chaîne en objet datetime selon le format '%d-%m-%Y %H:%M'. """ format = '%d-%m-%Y %H:%M' datetime_str = datetime.strptime(date_time, format) return datetime_str def convertTelephone(telephoneValue, separator='-'): """ Reformate un numéro de téléphone en y insérant un séparateur donné. """ return f"{telephoneValue[:2]}{separator}{telephoneValue[2:4]}{separator}{telephoneValue[4:6]}{separator}{telephoneValue[6:8]}{separator}{telephoneValue[8:10]}" def genereRandomCode(length): """ Génère un code aléatoire de longueur spécifiée. """ return ''.join(random.choice(string.ascii_letters) for i in range(length)) def calculeDatePeremption(_start, nbDays): """ Calcule la date de fin à partir d’un point de départ et d’un nombre de jours. """ return convertToStr(_start + timedelta(days=nbDays), settings.DATE_FORMAT) # Fonction permettant de retourner la valeur du QueryDict # QueryDict [ index ] -> Dernière valeur d'une liste # dict (QueryDict [ index ]) -> Toutes les valeurs de la liste def _(liste): """ Retourne la première valeur d’une liste extraite d’un QueryDict. """ return liste[0] def getArgFromRequest(_argument, _request): """ Extrait la valeur d’un argument depuis la requête (JSON). """ resultat = None data=JSONParser().parse(_request) resultat = data[_argument] return resultat from io import BytesIO from PyPDF2 import PdfMerger def merge_files_pdf(file_paths): """ Fusionne plusieurs fichiers PDF et retourne le contenu fusionné en mémoire. """ merger = PdfMerger() # Ajouter les fichiers valides au merger for file_path in file_paths: merger.append(file_path) # Sauvegarder le fichier fusionné en mémoire merged_pdf = BytesIO() merger.write(merged_pdf) merger.close() # Revenir au début du fichier en mémoire merged_pdf.seek(0) return merged_pdf def rfToPDF(registerForm, filename): """ Génère le PDF d'un dossier d'inscription et l'associe au RegistrationForm. """ filename = filename.replace(" ", "_") data = { 'pdf_title': f"Dossier d'inscription de {registerForm.student.first_name}", 'signatureDate': convertToStr(_now(), '%d-%m-%Y'), 'signatureTime': convertToStr(_now(), '%H:%M'), 'student': registerForm.student, } # Générer le PDF pdf = renderers.render_to_pdf('pdfs/fiche_eleve.html', data) if not pdf: raise ValueError("Erreur lors de la génération du PDF.") # Vérifier si un fichier avec le même nom existe déjà et le supprimer if registerForm.registration_file and registerForm.registration_file.name: # Vérifiez si le chemin est déjà absolu ou relatif if os.path.isabs(registerForm.registration_file.name): existing_file_path = registerForm.registration_file.name else: existing_file_path = os.path.join(settings.MEDIA_ROOT, registerForm.registration_file.name.lstrip('/')) # Vérifier si le fichier existe et le supprimer if os.path.exists(existing_file_path): os.remove(existing_file_path) registerForm.registration_file.delete(save=False) else: print(f'File does not exist: {existing_file_path}') # Enregistrer directement le fichier dans le champ registration_file try: registerForm.registration_file.save( os.path.basename(filename), # Utiliser uniquement le nom de fichier File(BytesIO(pdf.content)), save=True ) except Exception as e: logger.error(f"Erreur lors de la sauvegarde du fichier PDF : {e}") raise return registerForm.registration_file def delete_registration_files(registerForm): """ Supprime le fichier et le dossier associés à un RegistrationForm. """ base_dir = f"registration_files/dossier_rf_{registerForm.pk}" if registerForm.registration_file and os.path.exists(registerForm.registration_file.path): os.remove(registerForm.registration_file.path) registerForm.registration_file.delete(save=False) if os.path.exists(base_dir): shutil.rmtree(base_dir)