forked from ScoDoc/ScoDoc
Commande init-test-database pour générer base de test (pour l'API)
This commit is contained in:
parent
d2fe27b67c
commit
10230d20ef
15
scodoc.py
15
scodoc.py
@ -33,6 +33,7 @@ from app.models.evaluations import Evaluation
|
|||||||
from app.scodoc.sco_permissions import Permission
|
from app.scodoc.sco_permissions import Permission
|
||||||
from app.views import notes, scolar
|
from app.views import notes, scolar
|
||||||
import tools
|
import tools
|
||||||
|
from tools.fakedatabase import create_test_api_database
|
||||||
|
|
||||||
from config import RunningConfig
|
from config import RunningConfig
|
||||||
|
|
||||||
@ -84,6 +85,7 @@ def make_shell_context():
|
|||||||
|
|
||||||
|
|
||||||
# ctx.push()
|
# ctx.push()
|
||||||
|
# admin = User.query.filter_by(user_name="admin").first()
|
||||||
# login_user(admin)
|
# login_user(admin)
|
||||||
|
|
||||||
|
|
||||||
@ -492,6 +494,19 @@ def clear_cache(sanitize): # clear-cache
|
|||||||
formation.sanitize_old_formation()
|
formation.sanitize_old_formation()
|
||||||
|
|
||||||
|
|
||||||
|
@app.cli.command()
|
||||||
|
def init_test_database():
|
||||||
|
"""Initialise les objets en base pour les tests API
|
||||||
|
(à appliquer sur SCODOC_TEST ou SCODOC_DEV)
|
||||||
|
"""
|
||||||
|
click.echo("Initialisation base de test API...")
|
||||||
|
# import app as mapp # le package app
|
||||||
|
|
||||||
|
ctx = app.test_request_context()
|
||||||
|
ctx.push()
|
||||||
|
create_test_api_database.init_test_database()
|
||||||
|
|
||||||
|
|
||||||
def recursive_help(cmd, parent=None):
|
def recursive_help(cmd, parent=None):
|
||||||
ctx = click.core.Context(cmd, info_name=cmd.name, parent=parent)
|
ctx = click.core.Context(cmd, info_name=cmd.name, parent=parent)
|
||||||
print(cmd.get_help(ctx))
|
print(cmd.get_help(ctx))
|
||||||
|
@ -0,0 +1,90 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<formation id="220" titre="BUT R&amp;T" version="1" formation_code="V1RET" dept_id="5" acronyme="BUT R&amp;T" titre_officiel="Bachelor technologique réseaux et télécommunications" type_parcours="700" formation_id="220">
|
||||||
|
<ue acronyme="RT1.1" numero="1" titre="Administrer les réseaux et l’Internet" type="0" ue_code="UCOD11" ects="12.0" is_external="0" code_apogee="" coefficient="0.0" semestre_idx="1" color="#B80004" reference="1896">
|
||||||
|
<matiere titre="Administrer les réseaux et l’Internet" numero="1">
|
||||||
|
<module titre="Initiation aux réseaux informatiques" abbrev="Init aux réseaux informatiques" code="R101" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="10" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="12.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="4.0"/>
|
||||||
|
<coefficients ue_reference="1898" coef="4.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Se sensibiliser à l&apos;hygiène informatique et à la cybersécurité" abbrev="Hygiène informatique" code="SAE11" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="10" code_apogee="" module_type="3">
|
||||||
|
<coefficients ue_reference="1896" coef="16.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Principe et architecture des réseaux" abbrev="" code="R102" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="20" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="12.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Réseaux locaux et équipements actifs" abbrev="Réseaux locaux" code="R103" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="30" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="8.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="4.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Fondamentaux des systèmes électroniques" abbrev="" code="R104" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="40" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="8.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="5.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Architecture des systèmes numériques et informatiques" abbrev="" code="R106" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="60" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="10.0"/>
|
||||||
|
</module>
|
||||||
|
</matiere>
|
||||||
|
</ue>
|
||||||
|
<ue acronyme="RT2.1" numero="2" titre="Connecter les entreprises et les usagers" type="0" ue_code="UCOD12" ects="8.0" is_external="0" code_apogee="" coefficient="0.0" semestre_idx="1" color="#F97B3D" reference="1897">
|
||||||
|
<matiere titre="Connecter les entreprises et les usagers" numero="1">
|
||||||
|
<module titre="S&apos;initier aux réseaux informatiques" abbrev="" code="SAE12" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="20" code_apogee="" module_type="3">
|
||||||
|
<coefficients ue_reference="1896" coef="33.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Découvrir un dispositif de tranmission" abbrev="" code="SAE13" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="30" code_apogee="" module_type="3">
|
||||||
|
<coefficients ue_reference="1897" coef="33.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Support de transmission pour les réseaux locaux" abbrev="Support de transmission" code="R105" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="50" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1897" coef="5.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Anglais général et init vocabulaire technique" abbrev="" code="R110" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="100" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="3.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="5.0"/>
|
||||||
|
<coefficients ue_reference="1898" coef="5.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Expression-culture-Communication Pro." abbrev="" code="R111" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="110" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="3.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="5.0"/>
|
||||||
|
<coefficients ue_reference="1898" coef="4.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Mathématiques du signal" abbrev="" code="R113" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="130" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="5.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="8.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Mathématiques des transmissions" abbrev="" code="R114" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="140" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="4.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="8.0"/>
|
||||||
|
</module>
|
||||||
|
</matiere>
|
||||||
|
</ue>
|
||||||
|
<ue acronyme="RT3.1" numero="3" titre="Créer des outils et applications informatiques pour les R&amp;T" type="0" ue_code="UCOD13" ects="10.0" is_external="0" code_apogee="" coefficient="0.0" semestre_idx="1" color="#FEB40B" reference="1898">
|
||||||
|
<matiere titre="Créer des outils et applications informatiques pour les R&amp;T" numero="1">
|
||||||
|
<module titre="Se présenter sur Internet" abbrev="" code="SAE14" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="40" code_apogee="" module_type="3">
|
||||||
|
<coefficients ue_reference="1898" coef="16.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Traiter des données" abbrev="" code="SAE15" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="50" code_apogee="" module_type="3">
|
||||||
|
<coefficients ue_reference="1898" coef="26.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Portofolio" abbrev="" code="SAE16" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="60" code_apogee="" module_type="3"/>
|
||||||
|
<module titre="Fondamentaux de la programmation" abbrev="" code="R107" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="70" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1898" coef="22.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Base des systèmes d&apos;exploitation" abbrev="" code="R108" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="80" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="6.0"/>
|
||||||
|
<coefficients ue_reference="1898" coef="7.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Introduction aux technologies Web" abbrev="" code="R109" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="90" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1898" coef="4.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="PPP" abbrev="" code="R112" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="120" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1896" coef="2.0"/>
|
||||||
|
<coefficients ue_reference="1897" coef="3.0"/>
|
||||||
|
<coefficients ue_reference="1898" coef="4.0"/>
|
||||||
|
</module>
|
||||||
|
<module titre="Gestion de projets" abbrev="" code="R115" heures_cours="0.0" heures_td="0.0" heures_tp="0.0" coefficient="1.0" ects="" semestre_id="1" numero="150" code_apogee="" module_type="2">
|
||||||
|
<coefficients ue_reference="1897" coef="2.0"/>
|
||||||
|
<coefficients ue_reference="1898" coef="4.0"/>
|
||||||
|
</module>
|
||||||
|
</matiere>
|
||||||
|
</ue>
|
||||||
|
</formation>
|
@ -1,6 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""XXX OBSOLETE
|
||||||
|
|
||||||
Scenario: préparation base de données pour tests Selenium
|
Scenario: préparation base de données pour tests Selenium
|
||||||
|
|
||||||
S'utilise comme un test avec pytest, mais n'est pas un test !
|
S'utilise comme un test avec pytest, mais n'est pas un test !
|
||||||
|
139
tools/fakedatabase/create_test_api_database.py
Normal file
139
tools/fakedatabase/create_test_api_database.py
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
# -*- 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
|
||||||
|
|
||||||
|
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
|
||||||
|
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():
|
||||||
|
"""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)
|
||||||
|
db.session.add(etud)
|
||||||
|
db.session.commit()
|
||||||
|
return etud
|
||||||
|
|
||||||
|
|
||||||
|
def create_etuds(nb=16):
|
||||||
|
"create nb etuds"
|
||||||
|
return [create_fake_etud() 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, 1, 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()
|
||||||
|
return formsemestre
|
||||||
|
|
||||||
|
|
||||||
|
def inscrit_etudiants(etuds, formsemestre):
|
||||||
|
"""Inscrit les etudiants aux semestres et à tous ses modules"""
|
||||||
|
for etud in etuds:
|
||||||
|
ins = models.FormSemestreInscription(
|
||||||
|
etudid=etud.id, formsemestre_id=formsemestre.id, etat="I"
|
||||||
|
)
|
||||||
|
db.session.add(ins)
|
||||||
|
for modimpl in formsemestre.modimpls:
|
||||||
|
insmod = models.ModuleImplInscription(
|
||||||
|
etudid=etud.id, moduleimpl_id=modimpl.id
|
||||||
|
)
|
||||||
|
db.session.add(insmod)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
|
def init_test_database():
|
||||||
|
dept = init_departement("TAPI")
|
||||||
|
user = create_user(dept)
|
||||||
|
login_user(user)
|
||||||
|
|
||||||
|
etuds = create_etuds()
|
||||||
|
formation = import_formation()
|
||||||
|
formsemestre = create_formsemestre(formation, user)
|
||||||
|
inscrit_etudiants(etuds, formsemestre)
|
||||||
|
# à compléter
|
||||||
|
# - groupes
|
||||||
|
# - absences
|
||||||
|
# - notes
|
||||||
|
# - décisions de jury
|
||||||
|
# ...
|
Loading…
Reference in New Issue
Block a user