feat: Gestion de l'arborescence des documents d'école en fonction des requêtes CRUD [N3WTS-17]

This commit is contained in:
N3WT DE COMPET
2026-01-25 11:01:22 +01:00
parent b4f70e6bad
commit abb4b525b2
2 changed files with 149 additions and 125 deletions

View File

@ -136,7 +136,6 @@ def create_templates_for_registration_form(register_form):
school_masters = RegistrationSchoolFileMaster.objects.filter(groups=current_group).distinct()
parent_masters = RegistrationParentFileMaster.objects.filter(groups=current_group).distinct()
logger.info("util.create_templates_for_registration_form - school_masters récupérés")
school_master_ids = {m.pk for m in school_masters}
parent_master_ids = {m.pk for m in parent_masters}
@ -163,25 +162,20 @@ def create_templates_for_registration_form(register_form):
tmpl.delete()
logger.info("Deleted obsolete parent template %s for RF %s", getattr(tmpl, "pk", None), register_form.pk)
# Créer les school templates manquants
logger.info("util.create_templates_for_registration_form - Créer les school templates manquants")
# Créer les school templates manquants ou mettre à jour les existants si le master a changé
for m in school_masters:
exists = RegistrationSchoolFileTemplate.objects.filter(master=m, registration_form=register_form).exists()
if exists:
continue
tmpl_qs = RegistrationSchoolFileTemplate.objects.filter(master=m, registration_form=register_form)
tmpl = tmpl_qs.first() if tmpl_qs.exists() else None
base_slug = (m.name or "master").strip().replace(" ", "_")[:40]
slug = f"{base_slug}_{register_form.pk}_{m.pk}"
# --- Correction : Générer un nom de fichier unique uniquement si le master n'a pas de fichier ---
file_name = None
if m.file and hasattr(m.file, 'name') and m.file.name:
# Utiliser le nom du fichier tel qu'il est stocké dans le master (pas de suffixe aléatoire ici)
file_name = os.path.basename(m.file.name)
logger.info(f"util.create_templates_for_registration_form - file_name 1 : {file_name}")
elif m.file:
file_name = str(m.file)
else:
# Générer le PDF si besoin (rare ici)
try:
pdf_file = generate_form_json_pdf(register_form, m.formMasterData)
file_name = os.path.basename(pdf_file.name)
@ -189,8 +183,54 @@ 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
logger.info(f"util.create_templates_for_registration_form - file_name : {file_name}")
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
if tmpl:
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é ---
if master_file_changed or (
master_file_path and os.path.exists(master_file_path) and
(not tmpl.file or not os.path.exists(abs_path) or os.path.getmtime(master_file_path) > os.path.getmtime(abs_path))
):
# Supprimer l'ancien fichier du template (même si le nom change)
if tmpl.file and tmpl.file.name:
old_template_path = os.path.join(settings.MEDIA_ROOT, tmpl.file.name)
if os.path.exists(old_template_path):
try:
os.remove(old_template_path)
logger.info(f"util.create_templates_for_registration_form - Suppression ancien fichier template: {old_template_path}")
except Exception as e:
logger.error(f"Erreur suppression ancien fichier template: {e}")
# Copier le nouveau fichier du master (form existant)
if master_file_path and os.path.exists(master_file_path):
try:
os.makedirs(os.path.dirname(abs_path), exist_ok=True)
import shutil
shutil.copy2(master_file_path, abs_path)
logger.info(f"util.create_templates_for_registration_form - Copie du fichier master {master_file_path} -> {abs_path}")
tmpl.file.name = upload_rel_path
tmpl.name = m.name or ""
tmpl.slug = slug
tmpl.formTemplateData = m.formMasterData or []
tmpl.save()
except Exception as e:
logger.error(f"Erreur lors de la copie du fichier master pour mise à jour du template: {e}")
created.append(tmpl)
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
tmpl = RegistrationSchoolFileTemplate(
master=m,
registration_form=register_form,
@ -199,20 +239,7 @@ def create_templates_for_registration_form(register_form):
slug=slug,
)
if file_name:
from django.core.files.base import ContentFile
# Vérifier si le fichier existe déjà dans MEDIA_ROOT (copie du master)
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
# Si le fichier n'existe pas dans le dossier cible, le copier depuis le master
# Copier le fichier du master si besoin (form existant)
if master_file_path and not os.path.exists(abs_path):
try:
import shutil
@ -221,8 +248,6 @@ def create_templates_for_registration_form(register_form):
logger.info(f"util.create_templates_for_registration_form - Copie du fichier master {master_file_path} -> {abs_path}")
except Exception as e:
logger.error(f"Erreur lors de la copie du fichier master pour le template: {e}")
# Associer le fichier existant (ou copié) au template
tmpl.file.name = upload_rel_path
tmpl.save()
created.append(tmpl)