from app.scodoc.sco_archives import BaseArchiver from app.scodoc.sco_exceptions import ScoValueError from app.models import Identite, Departement from flask import g 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] └── [] """ def __init__(self): BaseArchiver.__init__(self, archive_type="justificatifs") def save_justificatif( self, etudid: int, filename: str, data: bytes or str, archive_name: str = None, description: str = "", ) -> str: """ Ajoute un fichier dans une archive "justificatif" pour l'etudid donné Retourne l'archive_name utilisé TODO: renvoie archive_name + filename """ self._set_dept(etudid) if archive_name is None: archive_id: str = self.create_obj_archive( oid=etudid, description=description ) else: archive_id: str = self.get_id_from_name(etudid, archive_name) self.store(archive_id, filename, data) return self.get_archive_name(archive_id) def delete_justificatif(self, etudid: int, archive_name: str, filename: str = None): """ Supprime une archive ou un fichier particulier de l'archivage de l'étudiant donné """ self._set_dept(etudid) if str(etudid) not in self.list_oids(): raise ValueError(f"Aucune archive pour etudid[{etudid}]") archive_id = self.get_id_from_name(etudid, archive_name) if filename is not None: if filename not in self.list_archive(archive_id): raise ValueError( f"filename {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 list_justificatifs(self, archive_name: str, etudid: int) -> list[str]: """ Retourne la liste des noms de fichiers dans l'archive donnée """ self._set_dept(etudid) filenames: list[str] = [] archive_id = self.get_id_from_name(etudid, archive_name) filenames = self.list_archive(archive_id) return filenames def get_justificatif_file(self, archive_name: str, etudid: int, filename: str): """ Retourne une réponse de téléchargement de fichier si le fichier existe """ self._set_dept(etudid) archive_id: str = self.get_id_from_name(etudid, archive_name) if filename in self.list_archive(archive_id): return self.get_archived_file(etudid, archive_name, filename) raise ScoValueError( f"Fichier {filename} introuvable dans l'archive {archive_name}" ) def _set_dept(self, etudid: int): """ Mets à jour le dept_id de l'archiver en fonction du département de l'étudiant """ etud: Identite = Identite.query.filter_by(id=etudid).first() self.set_dept_id(etud.dept_id)