gestionnaire_specialites.py — v2 (doublons, archivage)

Bienvenue sur CFTPfr.fr Forums gestionnaire_specialites.py — v2 (doublons, archivage)

  • Ce sujet est vide.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Messages
  • #264
    Mario Da Conceicao
    Maître des clés

    Version corrigée du 01/08/2026, après relecture critique. Améliorations retenues : vérification des doublons, archivage au lieu de suppression définitive. Refusé : versioning complexe et tags — ajoutés seulement si un vrai besoin se présente, pour ne pas complexifier sans raison.

    import json
    import os
    import shutil
    from pathlib import Path
    from datetime import datetime
    
    BASE_DIR = Path(__file__).resolve().parent
    SPECIALITES_DIR = BASE_DIR / "specialites"
    TELECHARGEMENTS_DIR = BASE_DIR / "telechargements"
    ARCHIVES_DIR = BASE_DIR / "archives"
    REGISTRE_FILE = SPECIALITES_DIR / "manifest.json"
    
    class GestionnaireSpecialites:
        def __init__(self):
            SPECIALITES_DIR.mkdir(parents=True, exist_ok=True)
            TELECHARGEMENTS_DIR.mkdir(parents=True, exist_ok=True)
            ARCHIVES_DIR.mkdir(parents=True, exist_ok=True)
            if not REGISTRE_FILE.exists():
                self._sauvegarder_registre({"specialites": []})
    
        def _charger_registre(self):
            with open(REGISTRE_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
    
        def _sauvegarder_registre(self, data):
            with open(REGISTRE_FILE, "w", encoding="utf-8") as f:
                json.dump(data, f, indent=4, ensure_ascii=False)
    
        def proposer_nouvelle_specialite(self, nom, description, documents_sources=None):
            """NOUVEAU : vérifie qu'une spécialité du même nom n'existe pas déjà
            (active ou en attente) avant de la proposer."""
            noms_existants = [s["nom"] for s in self.lister_actives()] + \
                              [s["nom"] for s in self.lister_en_attente()]
            if nom in noms_existants:
                return f"Une spécialité nommée '{nom}' existe déjà (active ou en attente)."
    
            dossier_attente = TELECHARGEMENTS_DIR / nom
            dossier_attente.mkdir(parents=True, exist_ok=True)
    
            fiche = {
                "nom": nom,
                "type": "specialite_logiciel",
                "version": "1.0",
                "description": description,
                "source_documents": documents_sources or [],
                "date_creation": datetime.now().isoformat(timespec="seconds"),
                "valide_par_utilisateur": False
            }
    
            with open(dossier_attente / "manifest.json", "w", encoding="utf-8") as f:
                json.dump(fiche, f, indent=4, ensure_ascii=False)
    
            return f"Nouvelle spécialité '{nom}' préparée dans telechargements/. En attente de ta validation."
    
        def lister_en_attente(self):
            en_attente = []
            for dossier in TELECHARGEMENTS_DIR.iterdir():
                manifest_path = dossier / "manifest.json"
                if manifest_path.exists():
                    with open(manifest_path, "r", encoding="utf-8") as f:
                        en_attente.append(json.load(f))
            return en_attente
    
        def valider_specialite(self, nom):
            dossier_attente = TELECHARGEMENTS_DIR / nom
            manifest_path = dossier_attente / "manifest.json"
            if not manifest_path.exists():
                return f"Aucune spécialité en attente nommée '{nom}'."
    
            with open(manifest_path, "r", encoding="utf-8") as f:
                fiche = json.load(f)
            fiche["valide_par_utilisateur"] = True
            fiche["date_validation"] = datetime.now().isoformat(timespec="seconds")
    
            dossier_final = SPECIALITES_DIR / nom
            shutil.move(str(dossier_attente), str(dossier_final))
    
            with open(dossier_final / "manifest.json", "w", encoding="utf-8") as f:
                json.dump(fiche, f, indent=4, ensure_ascii=False)
    
            registre = self._charger_registre()
            registre["specialites"].append({"nom": nom, "description": fiche["description"]})
            self._sauvegarder_registre(registre)
    
            return f"Spécialité '{nom}' validée et activée."
    
        def rejeter_specialite(self, nom):
            """MODIFIÉ : archive au lieu de supprimer définitivement — plus prudent,
            rien ne se perd si c'était une erreur."""
            dossier_attente = TELECHARGEMENTS_DIR / nom
            if dossier_attente.exists():
                dossier_archive = ARCHIVES_DIR / nom
                shutil.move(str(dossier_attente), str(dossier_archive))
                return f"Spécialité '{nom}' rejetée et archivée (récupérable dans archives/)."
            return f"Aucune spécialité en attente nommée '{nom}'."
    
        def lister_actives(self):
            return self._charger_registre()["specialites"]
    
        def consulter_specialite(self, nom, mot_cle=None):
            dossier = SPECIALITES_DIR / nom / "documents"
            if not dossier.exists():
                return None
            resultats = []
            for fichier in dossier.glob("*.txt"):
                contenu = fichier.read_text(encoding="utf-8", errors="replace")
                if not mot_cle or mot_cle.lower() in contenu.lower():
                    resultats.append({"fichier": fichier.name, "extrait": contenu[:500]})
            return resultats
Affichage de 1 message (sur 1 au total)
  • Vous devez être connecté pour répondre à ce sujet.
Retour en haut