from app.scodoc.sco_archives import BaseArchiver import os class JustificatifArchiver(BaseArchiver): """ TOTALK: - oid -> etudid - archive_id -> date de création de l'archive (une archive par dépot de document) justificatif └── └── └── ├── [_description.txt] └── [] TODO: - Faire fonction suppression fichier unique dans archive """ def __init__(self): BaseArchiver.__init__(self, archive_type="justificatifs") def save_justificatif( self, etudid: int, filename: str, data: bytes or str, archive_id: str = None, description: str = "", ): """ Ajoute un fichier dans une archive "justificatif" pour l'etudid donné """ if archive_id is None: archive_id: str = self.create_obj_archive( oid=etudid, description=description ) else: archive_id = self._true_archive_id(archive_id, etudid) self.store(archive_id, filename, data) def delete_justificatif(self, etudid: int, archive_id: str, filename: str = None): """ Supprime une archive ou un fichier particulier de l'archivage de l'étudiant donné """ if str(etudid) not in self.list_oids(): raise ValueError(f"Aucune archive pour etudid[{etudid}]") archive_id = self._true_archive_id(archive_id, etudid) if filename is not None: if filename not in self.list_archive(archive_id): raise ValueError( f"filename inconnu dans l'archive archive_id[{archive_id}] -> etudid[{etudid}]" ) path: str = os.path.join(self.get_obj_dir(etudid), archive_id, filename) if os.path.isfile(path): os.remove(path) else: self.delete_archive( os.path.join( self.get_obj_dir(etudid), archive_id, ) ) def _true_archive_id(self, archive_id: str, etudid: int): """ Test si l'archive_id est bien dans le dossier d'archive Retourne le chemin complet de l'id """ archives: list[str] = [ arc for arc in self.list_obj_archives(etudid) if archive_id in arc ] if len(archives) == 0: raise ValueError( f"archive_id[{archive_id}] inconnu pour etudid[{etudid}]", self.list_obj_archives(etudid), ) return archives[0]