ScoDoc/app/scodoc/sco_archives_justificatifs.py
2023-02-01 15:08:06 +01:00

91 lines
2.7 KiB
Python

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
└── <dept_id>
└── <etudid/oid>
└── <archive_id>
├── [_description.txt]
└── [<filename.ext>]
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]