mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-04-05 12:41:27 +00:00
feat(backend,frontend): régénération et visualisation inline de la fiche élève PDF
This commit is contained in:
@ -36,7 +36,7 @@ def save_file_replacing_existing(file_field, filename, content, save=True):
|
||||
"""
|
||||
Sauvegarde un fichier en écrasant l'existant s'il porte le même nom.
|
||||
Évite les suffixes automatiques Django (ex: fichier_N5QdZpk.pdf).
|
||||
|
||||
|
||||
Args:
|
||||
file_field: Le FileField Django (ex: registerForm.registration_file)
|
||||
filename: Le nom du fichier à sauvegarder
|
||||
@ -51,7 +51,7 @@ def save_file_replacing_existing(file_field, filename, content, save=True):
|
||||
logger.debug(f"[save_file] Ancien fichier supprimé: {file_field.path}")
|
||||
except Exception as e:
|
||||
logger.error(f"[save_file] Erreur suppression ancien fichier: {e}")
|
||||
|
||||
|
||||
# Sauvegarder le nouveau fichier
|
||||
file_field.save(filename, content, save=save)
|
||||
|
||||
@ -207,19 +207,21 @@ def create_templates_for_registration_form(register_form):
|
||||
logger.error(f"Erreur lors de la génération du PDF pour le template: {e}")
|
||||
file_name = None
|
||||
|
||||
from django.core.files.base import ContentFile
|
||||
upload_rel_path = registration_school_file_upload_to(
|
||||
type("Tmp", (), {
|
||||
"registration_form": register_form,
|
||||
"establishment": getattr(register_form, "establishment", None),
|
||||
"student": getattr(register_form, "student", None)
|
||||
})(),
|
||||
file_name
|
||||
)
|
||||
abs_path = os.path.join(settings.MEDIA_ROOT, upload_rel_path)
|
||||
master_file_path = m.file.path if m.file and hasattr(m.file, 'path') else None
|
||||
|
||||
def _build_upload_path(template_pk):
|
||||
"""Génère le chemin relatif et absolu pour un template avec un pk connu."""
|
||||
rel = registration_school_file_upload_to(
|
||||
type("Tmp", (), {
|
||||
"registration_form": register_form,
|
||||
"pk": template_pk,
|
||||
})(),
|
||||
file_name,
|
||||
)
|
||||
return rel, os.path.join(settings.MEDIA_ROOT, rel)
|
||||
|
||||
if tmpl:
|
||||
upload_rel_path, abs_path = _build_upload_path(tmpl.pk)
|
||||
template_file_name = os.path.basename(tmpl.file.name) if tmpl.file and tmpl.file.name else None
|
||||
master_file_changed = template_file_name != file_name
|
||||
# --- GESTION FORM EXISTANT : suppression ancien template si nom ou contenu master changé ---
|
||||
@ -254,7 +256,7 @@ def create_templates_for_registration_form(register_form):
|
||||
logger.info("util.create_templates_for_registration_form - Mise à jour school template %s from master %s for RF %s", tmpl.pk, m.pk, register_form.pk)
|
||||
continue
|
||||
|
||||
# Sinon, création du template comme avant
|
||||
# Sinon, création du template — sauvegarder d'abord pour obtenir un pk
|
||||
tmpl = RegistrationSchoolFileTemplate(
|
||||
master=m,
|
||||
registration_form=register_form,
|
||||
@ -262,8 +264,10 @@ def create_templates_for_registration_form(register_form):
|
||||
formTemplateData=m.formMasterData or [],
|
||||
slug=slug,
|
||||
)
|
||||
tmpl.save() # pk attribué ici
|
||||
if file_name:
|
||||
# Copier le fichier du master si besoin (form existant)
|
||||
upload_rel_path, abs_path = _build_upload_path(tmpl.pk)
|
||||
# Copier le fichier du master si besoin
|
||||
if master_file_path and not os.path.exists(abs_path):
|
||||
try:
|
||||
import shutil
|
||||
@ -273,7 +277,7 @@ def create_templates_for_registration_form(register_form):
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de la copie du fichier master pour le template: {e}")
|
||||
tmpl.file.name = upload_rel_path
|
||||
tmpl.save()
|
||||
tmpl.save()
|
||||
created.append(tmpl)
|
||||
logger.info("util.create_templates_for_registration_form - Created school template %s from master %s for RF %s", tmpl.pk, m.pk, register_form.pk)
|
||||
|
||||
@ -453,6 +457,8 @@ def rfToPDF(registerForm, filename):
|
||||
'signatureDate': convertToStr(_now(), '%d-%m-%Y'),
|
||||
'signatureTime': convertToStr(_now(), '%H:%M'),
|
||||
'student': registerForm.student,
|
||||
'establishment': registerForm.establishment,
|
||||
'school_year': registerForm.school_year,
|
||||
}
|
||||
|
||||
# Générer le PDF
|
||||
@ -474,6 +480,24 @@ def rfToPDF(registerForm, filename):
|
||||
|
||||
return registerForm.registration_file
|
||||
|
||||
def generateRegistrationPDF(registerForm):
|
||||
"""
|
||||
Génère le PDF d'un dossier d'inscription à la volée et retourne le contenu binaire.
|
||||
Ne sauvegarde pas le fichier sur disque.
|
||||
"""
|
||||
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,
|
||||
'establishment': registerForm.establishment,
|
||||
'school_year': registerForm.school_year,
|
||||
}
|
||||
pdf = renderers.render_to_pdf('pdfs/fiche_eleve.html', data)
|
||||
if not pdf:
|
||||
raise ValueError("Erreur lors de la génération du PDF.")
|
||||
return pdf.content
|
||||
|
||||
def delete_registration_files(registerForm):
|
||||
"""
|
||||
Supprime le fichier et le dossier associés à un RegistrationForm.
|
||||
|
||||
Reference in New Issue
Block a user