161 lines
4.4 KiB
Python
161 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""Initialise une base pour les tests de l'API ScoDoc 9
|
|
|
|
Création des départements, formations, semestres, étudiants, groupes...
|
|
|
|
utilisation:
|
|
1) modifier le .env pour indiquer
|
|
SCODOC_DATABASE_URI="postgresql:///SCO_TEST_API"
|
|
|
|
2) En tant qu'utilisateur scodoc, lancer:
|
|
tools/create_database.sh SCO_TEST_API
|
|
flask db upgrade
|
|
flask sco-db-init --erase
|
|
flask init-test-database
|
|
flask user-role -a Admin -d TAPI test
|
|
flask user-password test
|
|
flask create-role APIUserViewer
|
|
flask edit-role APIUserViewer -a APIView
|
|
flask user-role test -a APIUserViewer
|
|
|
|
3) relancer ScoDoc:
|
|
flask run --host 0.0.0.0
|
|
|
|
4) lancer client de test (ou vérifier dans le navigateur)
|
|
|
|
"""
|
|
import datetime
|
|
import random
|
|
|
|
random.seed(12345678) # tests reproductibles
|
|
|
|
from flask_login import login_user
|
|
|
|
from app import auth
|
|
from app import models
|
|
from app import db
|
|
from app.scodoc import (
|
|
sco_formations,
|
|
sco_formsemestre,
|
|
sco_formsemestre_inscriptions,
|
|
sco_groups,
|
|
)
|
|
from tools.fakeportal.gen_nomprenoms import nomprenom
|
|
|
|
# La formation à utiliser:
|
|
FORMATION_XML_FILENAME = "tests/ressources/formations/scodoc_formation_RT_BUT_RT_v1.xml"
|
|
|
|
|
|
def init_departement(acronym):
|
|
"Create dept, and switch context into it."
|
|
import app as mapp
|
|
|
|
dept = models.Departement(acronym=acronym)
|
|
db.session.add(dept)
|
|
mapp.set_sco_dept(acronym)
|
|
db.session.commit()
|
|
return dept
|
|
|
|
|
|
def import_formation() -> models.Formation:
|
|
"""Import formation from XML.
|
|
Returns formation_id
|
|
"""
|
|
with open(FORMATION_XML_FILENAME) as f:
|
|
doc = f.read()
|
|
# --- Création de la formation
|
|
f = sco_formations.formation_import_xml(doc)
|
|
return models.Formation.query.get(f[0])
|
|
|
|
|
|
def create_user(dept):
|
|
"""créé les utilisaterurs nécessaires aux tests"""
|
|
user = auth.models.User(
|
|
user_name="test", nom="Doe", prenom="John", dept=dept.acronym
|
|
)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
return user
|
|
|
|
|
|
def create_fake_etud(dept):
|
|
"""Créé un faux étudiant et l'insère dans la base"""
|
|
civilite = random.choice(("M", "F", "X"))
|
|
nom, prenom = nomprenom(civilite)
|
|
etud = models.Identite(civilite=civilite, nom=nom, prenom=prenom, dept_id=dept.id)
|
|
db.session.add(etud)
|
|
db.session.commit()
|
|
etud.code_nip = etud.id
|
|
etud.code_ine = etud.id
|
|
db.session.add(etud)
|
|
db.session.commit()
|
|
adresse = models.Adresse(
|
|
etudid=etud.id, email=f"{etud.prenom}.{etud.nom}@example.com"
|
|
)
|
|
db.session.add(adresse)
|
|
admission = models.Admission(etudid=etud.id)
|
|
db.session.add(admission)
|
|
db.session.commit()
|
|
return etud
|
|
|
|
|
|
def create_etuds(dept, nb=16):
|
|
"create nb etuds"
|
|
return [create_fake_etud(dept) for _ in range(nb)]
|
|
|
|
|
|
def create_formsemestre(formation, user, semestre_idx=1):
|
|
"""Create formsemestre and moduleimpls"""
|
|
formsemestre = models.FormSemestre(
|
|
dept_id=formation.dept_id,
|
|
semestre_id=semestre_idx,
|
|
titre="Semestre test",
|
|
date_debut=datetime.datetime(2021, 9, 1),
|
|
date_fin=datetime.datetime(2022, 8, 31),
|
|
modalite="FI",
|
|
formation=formation,
|
|
)
|
|
db.session.add(formsemestre)
|
|
db.session.commit()
|
|
# Crée un modulimpl par module de ce semestre:
|
|
for module in formation.modules.filter_by(semestre_id=semestre_idx):
|
|
modimpl = models.ModuleImpl(
|
|
module_id=module.id, formsemestre_id=formsemestre.id, responsable_id=user.id
|
|
)
|
|
db.session.add(modimpl)
|
|
db.session.commit()
|
|
partition_id = sco_groups.partition_create(
|
|
formsemestre.id, default=True, redirect=False
|
|
)
|
|
_group_id = sco_groups.create_group(partition_id, default=True)
|
|
return formsemestre
|
|
|
|
|
|
def inscrit_etudiants(etuds, formsemestre):
|
|
"""Inscrit les etudiants aux semestres et à tous ses modules"""
|
|
for etud in etuds:
|
|
sco_formsemestre_inscriptions.do_formsemestre_inscription_with_modules(
|
|
formsemestre.id,
|
|
etud.id,
|
|
group_ids=[],
|
|
etat="I",
|
|
method="init db test",
|
|
)
|
|
|
|
|
|
def init_test_database():
|
|
|
|
dept = init_departement("TAPI")
|
|
user = create_user(dept)
|
|
etuds = create_etuds(dept)
|
|
formation = import_formation()
|
|
formsemestre = create_formsemestre(formation, user)
|
|
inscrit_etudiants(etuds, formsemestre)
|
|
# à compléter
|
|
# - groupes
|
|
# - absences
|
|
# - notes
|
|
# - décisions de jury
|
|
# ...
|