forked from ScoDoc/ScoDoc
110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
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
|
|
└── <dept_id>
|
|
└── <etudid/oid>
|
|
└── <archive_id>
|
|
├── [_description.txt]
|
|
└── [<filename.ext>]
|
|
|
|
"""
|
|
|
|
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)
|