Archives: utilise dept_id et non acronyme

This commit is contained in:
Emmanuel Viennet 2021-09-17 10:02:27 +02:00
parent 45352d9248
commit bd2e0ccde5
4 changed files with 42 additions and 14 deletions

View File

@ -29,19 +29,19 @@
Archives are plain files, stored in Archives are plain files, stored in
<SCODOC_VAR_DIR>/archives/<deptid> <SCODOC_VAR_DIR>/archives/<dept_id>
(where <SCODOC_VAR_DIR> is usually /opt/scodoc-data, and <deptid> a departement id) (where <SCODOC_VAR_DIR> is usually /opt/scodoc-data, and <dept_id> a departement id (int))
Les PV de jurys et documents associés sont stockées dans un sous-repertoire de la forme Les PV de jurys et documents associés sont stockées dans un sous-repertoire de la forme
<archivedir>/<dept>/<formsemestre_id>/<YYYY-MM-DD-HH-MM-SS> <archivedir>/<dept>/<formsemestre_id>/<YYYY-MM-DD-HH-MM-SS>
(formsemestre_id est ici FormSemestre.id) (formsemestre_id est ici FormSemestre.id)
Les documents liés à l'étudiant sont dans Les documents liés à l'étudiant sont dans
<archivedir>/docetuds/<dept>/<etudid>/<YYYY-MM-DD-HH-MM-SS> <archivedir>/docetuds/<dept_id>/<etudid>/<YYYY-MM-DD-HH-MM-SS>
(etudid est ici Identite.id) (etudid est ici Identite.id)
Les maquettes Apogée pour l'export des notes sont dans Les maquettes Apogée pour l'export des notes sont dans
<archivedir>/apo_csv/<dept>/<annee_scolaire>-<sem_id>/<YYYY-MM-DD-HH-MM-SS>/<code_etape>.csv <archivedir>/apo_csv/<dept_id>/<annee_scolaire>-<sem_id>/<YYYY-MM-DD-HH-MM-SS>/<code_etape>.csv
Un répertoire d'archive contient des fichiers quelconques, et un fichier texte nommé _description.txt Un répertoire d'archive contient des fichiers quelconques, et un fichier texte nommé _description.txt
qui est une description (humaine, format libre) de l'archive. qui est une description (humaine, format libre) de l'archive.
@ -61,6 +61,7 @@ from flask import g
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from config import Config from config import Config
from app import log from app import log
from app.models import Departement
from app.scodoc.TrivialFormulator import TrivialFormulator from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc.sco_exceptions import ( from app.scodoc.sco_exceptions import (
AccessDenied, AccessDenied,
@ -109,7 +110,8 @@ class BaseArchiver(object):
If directory does not yet exist, create it. If directory does not yet exist, create it.
""" """
self.initialize() self.initialize()
dept_dir = os.path.join(self.root, g.scodoc_dept) dept = Departement.query.filter_by(acronym=g.scodoc_dept).first()
dept_dir = os.path.join(self.root, str(dept.id))
try: try:
scu.GSL.acquire() scu.GSL.acquire()
if not os.path.isdir(dept_dir): if not os.path.isdir(dept_dir):
@ -128,7 +130,8 @@ class BaseArchiver(object):
:return: list of archive oids :return: list of archive oids
""" """
self.initialize() self.initialize()
base = os.path.join(self.root, g.scodoc_dept) + os.path.sep dept = Departement.query.filter_by(acronym=g.scodoc_dept).first()
base = os.path.join(self.root, str(dept.id)) + os.path.sep
dirs = glob.glob(base + "*") dirs = glob.glob(base + "*")
return [os.path.split(x)[1] for x in dirs] return [os.path.split(x)[1] for x in dirs]

View File

@ -32,11 +32,11 @@
Voir sco_apogee_csv.py pour la structure du fichier Apogée. Voir sco_apogee_csv.py pour la structure du fichier Apogée.
Stockage: utilise sco_archive.py Stockage: utilise sco_archive.py
=> /opt/scodoc/var/scodoc/archives/apo_csv/RT/2016-1/2016-07-03-16-12-19/V3ASR.csv => /opt/scodoc/var/scodoc/archives/apo_csv/<dept_id>/2016-1/2016-07-03-16-12-19/V3ASR.csv
pour une maquette de l'année scolaire 2016, semestre 1, etape V3ASR pour une maquette de l'année scolaire 2016, semestre 1, etape V3ASR
ou bien (à partir de ScoDoc 1678) : ou bien (à partir de ScoDoc 1678) :
/opt/scodoc/var/scodoc/archives/apo_csv/RT/2016-1/2016-07-03-16-12-19/V3ASR!111.csv /opt/scodoc/var/scodoc/archives/apo_csv/<dept_id>/2016-1/2016-07-03-16-12-19/V3ASR!111.csv
pour une maquette de l'étape V3ASR version VDI 111. pour une maquette de l'étape V3ASR version VDI 111.
La version VDI sera ignorée sauf si elle est indiquée dans l'étape du semestre. La version VDI sera ignorée sauf si elle est indiquée dans l'étape du semestre.

View File

@ -341,7 +341,7 @@ def find_new_dir():
def copy_portal_photo_to_fs(etud): def copy_portal_photo_to_fs(etud):
"""Copy the photo from portal (distant website) to local fs. """Copy the photo from portal (distant website) to local fs.
Returns rel. path or None if copy failed, with a diagnotic message Returns rel. path or None if copy failed, with a diagnostic message
""" """
sco_etud.format_etud_ident(etud) sco_etud.format_etud_ident(etud)
url = photo_portal_url(etud) url = photo_portal_url(etud)
@ -353,8 +353,9 @@ def copy_portal_photo_to_fs(etud):
log("copy_portal_photo_to_fs: getting %s" % url) log("copy_portal_photo_to_fs: getting %s" % url)
r = requests.get(url, timeout=portal_timeout) r = requests.get(url, timeout=portal_timeout)
except: except:
log("download failed: exception:\n%s" % traceback.format_exc()) # log("download failed: exception:\n%s" % traceback.format_exc())
log("called from:\n" + "".join(traceback.format_stack())) # log("called from:\n" + "".join(traceback.format_stack()))
log("copy_portal_photo_to_fs: error.")
return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url) return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url)
if r.status_code != 200: if r.status_code != 200:
log("download failed") log("download failed")

View File

@ -4,6 +4,7 @@
import glob import glob
import os import os
import shutil import shutil
import sys
from app.models import Departement from app.models import Departement
from app.models.formsemestre import FormSemestre from app.models.formsemestre import FormSemestre
@ -25,7 +26,8 @@ def migrate_scodoc7_dept_archive(dept_name=""):
migrate_docetuds(dept) migrate_docetuds(dept)
# ApoCSVArchiver: # ApoCSVArchiver:
# /opt/scodoc-data/archives/apo_csv/<dept>/ ne bouge pas # /opt/scodoc-data/archives/apo_csv/<dept>/ -> apo_csv/<dept_id>/
migrate_apo_csv(dept)
def migrate_sem_archives(dept): def migrate_sem_archives(dept):
@ -35,7 +37,7 @@ def migrate_sem_archives(dept):
for sem in FormSemestre.query.filter_by(dept_id=dept.id): for sem in FormSemestre.query.filter_by(dept_id=dept.id):
n += 1 n += 1
arch_dir7 = f"/opt/scodoc-data/archives/{dept.acronym}/{sem.scodoc7_id}" arch_dir7 = f"/opt/scodoc-data/archives/{dept.acronym}/{sem.scodoc7_id}"
arch_dir9 = f"/opt/scodoc-data/archives/{dept.acronym}/{sem.id}" arch_dir9 = f"/opt/scodoc-data/archives/{dept.id}/{sem.id}"
if os.path.exists(arch_dir7): if os.path.exists(arch_dir7):
n_moves += 1 n_moves += 1
if not os.path.exists(arch_dir9): if not os.path.exists(arch_dir9):
@ -58,7 +60,7 @@ def migrate_docetuds(dept):
arch_dir7 = ( arch_dir7 = (
f"/opt/scodoc-data/archives/docetuds/{dept.acronym}/{etud.scodoc7_id}" f"/opt/scodoc-data/archives/docetuds/{dept.acronym}/{etud.scodoc7_id}"
) )
arch_dir9 = f"/opt/scodoc-data/archives/docetuds/{dept.acronym}/{etud.id}" arch_dir9 = f"/opt/scodoc-data/archives/docetuds/{dept.id}/{etud.id}"
if os.path.exists(arch_dir7): if os.path.exists(arch_dir7):
n_moves += 1 n_moves += 1
if not os.path.exists(arch_dir9): if not os.path.exists(arch_dir9):
@ -70,3 +72,25 @@ def migrate_docetuds(dept):
# print(f"\tmoving {arch}") # print(f"\tmoving {arch}")
shutil.move(arch, arch_dir9) shutil.move(arch, arch_dir9)
# print(f"moved {n_moves}/{n} etuds") # print(f"moved {n_moves}/{n} etuds")
def migrate_apo_csv(dept):
"/opt/scodoc-data/archives/apo_csv/<dept>/ -> .../apo_csv/<dept_id>/"
arch_dir7 = f"/opt/scodoc-data/archives/apo_csv/{dept.acronym}"
arch_dir7_upper = f"/opt/scodoc-data/archives/apo_csv/{dept.acronym.upper()}"
arch_dir9 = f"/opt/scodoc-data/archives/apo_csv/{dept.id}"
if os.path.exists(arch_dir7):
if os.path.exists(arch_dir9):
print(
f"Warning: {arch_dir9} exist ! not moving {arch_dir7}", file=sys.stderr
)
else:
shutil.move(arch_dir7, arch_dir9)
elif os.path.exists(arch_dir7_upper):
if os.path.exists(arch_dir9):
print(
f"Warning: {arch_dir9} exist ! not moving {arch_dir7_upper}",
file=sys.stderr,
)
else:
shutil.move(arch_dir7_upper, arch_dir9)