exclude .idea files from git

refactoring setinngs variables

in progress: import xml files

ajout creation user "bach" pour certains tests

pseudo-test pour initalisation Selenium

typo

Ajout/suppression de département en tant qu'utilisateur scodoc (non root)

complement scodoc.py pour import xml files

--amend

scodoc is able to perform database operation

move export..xml to tests/scenario dir
This commit is contained in:
Jean-Marie Place 2021-08-07 08:42:57 +02:00
parent 383fdb0e53
commit 3d9f362daf
15 changed files with 339 additions and 124 deletions

3
.gitignore vendored
View File

@ -169,4 +169,5 @@ Thumbs.db
.vscode/ .vscode/
*.code-workspace *.code-workspace
# PyCharm projects
.idea/

View File

@ -168,7 +168,7 @@ de votre installation ScoDoc 7 pour passer à ScoDoc 8 (*ne pas utiliser en prod
## Création d'un département ## Création d'un département
sudo su su scodoc # si besoin
cd /opt/scodoc cd /opt/scodoc
source venv/bin/activate source venv/bin/activate
flask sco-create-dept DEPT flask sco-create-dept DEPT
@ -177,7 +177,7 @@ où `DEPT` est le nom du département (un acronyme en majuscule, comme "RT", "GE
### Suppression d'un département ### Suppression d'un département
sudo su su scodoc # si besoin
cd /opt/scodoc cd /opt/scodoc
source venv/bin/activate source venv/bin/activate
flask sco-delete-dept DEPT flask sco-delete-dept DEPT

View File

@ -757,6 +757,6 @@ def tf_error_message(msg):
if isinstance(msg, str): if isinstance(msg, str):
msg = [msg] msg = [msg]
return ( return (
'<ul class="tf-msg"><li class="tf-msg">%s</li></ul>' '<ul class="tf-msg"><li class="tf-msg error-message">%s</li></ul>'
% '</li><li class="tf-msg">'.join(msg) % '</li><li class="tf-msg tf-msg error-message">'.join(msg)
) )

View File

@ -111,7 +111,7 @@ def index_html(context, REQUEST=None, showcodes=0, showsemtable=0):
# aucun semestre courant: affiche aide # aucun semestre courant: affiche aide
H.append( H.append(
"""<h2 class="listesems">Aucune session en cours !</h2> """<h2 class="listesems">Aucune session en cours !</h2>
<p>Pour ajouter une session, aller dans <a href="Notes">Programmes</a>, <p>Pour ajouter une session, aller dans <a href="Notes" id="link-programmes">Programmes</a>,
choisissez une formation, puis suivez le lien "<em>UE, modules, semestres</em>". choisissez une formation, puis suivez le lien "<em>UE, modules, semestres</em>".
</p><p> </p><p>
, en bas de page, suivez le lien , en bas de page, suivez le lien

View File

@ -259,6 +259,7 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
f["parcours_name"] = "" f["parcours_name"] = ""
f["_titre_target"] = "ue_list?formation_id=%(formation_id)s" % f f["_titre_target"] = "ue_list?formation_id=%(formation_id)s" % f
f["_titre_link_class"] = "stdlink" f["_titre_link_class"] = "stdlink"
f["_titre_id"] = "titre-%s" % f["acronyme"].lower().replace(" ", "-")
# Ajoute les semestres associés à chaque formation: # Ajoute les semestres associés à chaque formation:
f["sems"] = sco_formsemestre.do_formsemestre_list( f["sems"] = sco_formsemestre.do_formsemestre_list(
context, args={"formation_id": f["formation_id"]} context, args={"formation_id": f["formation_id"]}
@ -266,13 +267,14 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
f["sems_list_txt"] = ", ".join([s["session_id"] for s in f["sems"]]) f["sems_list_txt"] = ", ".join([s["session_id"] for s in f["sems"]])
f["_sems_list_txt_html"] = ", ".join( f["_sems_list_txt_html"] = ", ".join(
[ [
'<a class="discretelink" href="formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(session_id)s<a>' '<a class="discretelink" href="formsemestre_status?formsemestre_id=%(formsemestre_id)s">%('
% s "session_id)s<a> " % s
for s in f["sems"] for s in f["sems"]
] ]
+ [ + [
'<a class="stdlink" href="formsemestre_createwithmodules?formation_id=%(formation_id)s&semestre_id=1">ajouter</a>' '<a class="stdlink" id="add-semestre-%s" '
% f 'href="formsemestre_createwithmodules?formation_id=%s&semestre_id=1">ajouter</a> '
% (f["acronyme"].lower().replace(" ", "-"), f["formation_id"])
] ]
) )
if f["sems"]: if f["sems"]:
@ -288,16 +290,17 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
else: else:
but_locked = '<span class="but_placeholder"></span>' but_locked = '<span class="but_placeholder"></span>'
if editable and not locked: if editable and not locked:
but_suppr = ( but_suppr = '<a class="stdlink" href="formation_delete?formation_id=%s" id="delete-formation-%s">%s</a>' % (
'<a class="stdlink" href="formation_delete?formation_id=%s">%s</a>' f["formation_id"],
% (f["formation_id"], suppricon) f["acronyme"].lower().replace(" ", "-"),
suppricon,
) )
else: else:
but_suppr = '<span class="but_placeholder"></span>' but_suppr = '<span class="but_placeholder"></span>'
if editable: if editable:
but_edit = ( but_edit = (
'<a class="stdlink" href="formation_edit?formation_id=%s">%s</a>' '<a class="stdlink" href="formation_edit?formation_id=%s" id="edit-formation-%s">%s</a>'
% (f["formation_id"], editicon) % (f["formation_id"], f["acronyme"].lower().replace(" ", "-"), editicon)
) )
else: else:
but_edit = '<span class="but_placeholder"></span>' but_edit = '<span class="but_placeholder"></span>'
@ -365,4 +368,4 @@ def formation_create_new_version(context, formation_id, redirect=True, REQUEST=N
"ue_list?formation_id=" + new_id + "&msg=Nouvelle version !" "ue_list?formation_id=" + new_id + "&msg=Nouvelle version !"
) )
else: else:
return new_id, modules_old2new, ues_old2new return new_id, modules_old2new, ues_old2new

View File

@ -391,7 +391,7 @@ def index_html(context, REQUEST=None):
if editable: if editable:
H.append( H.append(
"""<p><a class="stdlink" href="formation_create">Créer une formation</a></p> """<p><a class="stdlink" href="formation_create" id="link-create-formation">Créer une formation</a></p>
<p><a class="stdlink" href="formation_import_xml_form">Importer une formation (xml)</a></p> <p><a class="stdlink" href="formation_import_xml_form">Importer une formation (xml)</a></p>
<p class="help">Une "formation" est un programme pédagogique structuré en UE, matières et modules. Chaque semestre se réfère à une formation. La modification d'une formation affecte tous les semestres qui s'y réfèrent.</p> <p class="help">Une "formation" est un programme pédagogique structuré en UE, matières et modules. Chaque semestre se réfère à une formation. La modification d'une formation affecte tous les semestres qui s'y réfèrent.</p>
""" """
@ -1968,7 +1968,7 @@ def formsemestre_validation_etud_manu(
def formsemestre_validate_previous_ue( def formsemestre_validate_previous_ue(
context, formsemestre_id, etudid=None, REQUEST=None context, formsemestre_id, etudid=None, REQUEST=None
): ):
"Form. saisie UE validée hors ScoDoc " "Form. saisie UE validée hors ScoDoc"
if not sco_permissions_check.can_validate_sem(formsemestre_id): if not sco_permissions_check.can_validate_sem(formsemestre_id):
return scu.confirm_dialog( return scu.confirm_dialog(
message="<p>Opération non autorisée pour %s</h2>" message="<p>Opération non autorisée pour %s</h2>"

View File

@ -6,7 +6,6 @@
""" """
from __future__ import print_function from __future__ import print_function
import os import os
@ -19,6 +18,7 @@ from flask.cli import with_appcontext
from app import create_app, cli, db from app import create_app, cli, db
from app.auth.models import User, Role, UserRole from app.auth.models import User, Role, UserRole
from app.scodoc.notesdb import set_sco_dept
from app.views import notes, scolar, absences from app.views import notes, scolar, absences
import app.utils as utils import app.utils as utils
@ -152,10 +152,7 @@ def user_password(username, password=None): # user-password
@click.argument("dept") @click.argument("dept")
def sco_delete_dept(dept): # sco-delete-dept def sco_delete_dept(dept): # sco-delete-dept
"Delete existing departement" "Delete existing departement"
if os.getuid() != 0: if os.system('tools/delete_dept.sh -n "{}"'.format(dept)):
sys.stderr.write("sco_delete_dept: must be run by root\n")
return 1
if os.system('cd tools && ./delete_dept.sh -n "{}"'.format(dept)):
sys.stderr.write("error deleting dept " + dept) sys.stderr.write("error deleting dept " + dept)
return 1 return 1
return 0 return 0
@ -165,10 +162,7 @@ def sco_delete_dept(dept): # sco-delete-dept
@click.argument("dept") @click.argument("dept")
def sco_create_dept(dept): # sco-create-dept def sco_create_dept(dept): # sco-create-dept
"Create new departement" "Create new departement"
if os.getuid() != 0: if os.system(f'tools/create_dept.sh -n "{dept}"'):
sys.stderr.write("sco_create_dept: must be run by root\n")
return 1
if os.system(f'cd tools && ./create_dept.sh -n "{dept}"'):
sys.stderr.write(f"error creating dept {dept}\n") sys.stderr.write(f"error creating dept {dept}\n")
return 1 return 1
return 0 return 0
@ -216,3 +210,22 @@ def clear_cache(): # clear-cache
r = redis.Redis() r = redis.Redis()
r.flushall() r.flushall()
click.echo("Redis caches flushed.") click.echo("Redis caches flushed.")
@app.cli.command()
@click.argument("xml_file")
@click.argument("dept")
def import_xml(xml_file, dept):
import flask_login
from flask_login import login_user, logout_user, current_user
from app.scodoc.notesdb import close_dept_connection, open_dept_connection
from app.scodoc.sco_formations import formation_import_xml
with app.test_request_context():
u = User.query.first()
flask_login.login_user(u)
click.echo("Importing {}".format(xml_file))
set_sco_dept(dept)
doc = open(xml_file).read()
formation_import_xml(None, doc)
click.echo("Done")

View File

@ -1,73 +0,0 @@
import sco_formations
import random
# La variable context est définie par le script de lancement
# l'affecte ainsi pour évietr les warnins pylint:
context = context # pylint: disable=undefined-variable
REQUEST = REQUEST # pylint: disable=undefined-variable
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
import sco_moduleimpl
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
file = open("scotests/export_formation1.xml")
doc = file.read()
file.close()
# --- Création de la formation
f = sco_formations.formation_import_xml(doc=doc, context=context.Notes)
# --- Création des semestres
sem1 = G.create_formsemestre(
formation_id=f[0],
semestre_id=1,
date_debut="01/09/2020",
date_fin="01/02/2021",
)
sem3 = G.create_formsemestre(
formation_id=f[0],
semestre_id=3,
date_debut="01/09/2020",
date_fin="01/02/2021",
)
sem2 = G.create_formsemestre(
formation_id=f[0],
semestre_id=2,
date_debut="02/02/2021",
date_fin="01/06/2021",
)
sem4 = G.create_formsemestre(
formation_id=f[0],
semestre_id=4,
date_debut="02/02/2021",
date_fin="01/06/2021",
)
# --- Implémentation des modules
li_module = context.Notes.do_module_list()
mods_imp = []
for mod in li_module:
if mod["semestre_id"] == 1:
formsemestre_id = sem1["formsemestre_id"]
elif mod["semestre_id"] == 2:
formsemestre_id = sem2["formsemestre_id"]
elif mod["semestre_id"] == 3:
formsemestre_id = sem3["formsemestre_id"]
else:
formsemestre_id = sem4["formsemestre_id"]
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=formsemestre_id,
responsable_id="bach",
)
mods_imp.append(mi)

View File

@ -30,11 +30,18 @@ def test_client():
db.create_all() db.create_all()
Role.insert_roles() Role.insert_roles()
u = User(user_name="admin") u = User(user_name="admin")
admin_role = Role.query.filter_by(name="SuperAdmin").first() super_admin_role = Role.query.filter_by(name="SuperAdmin").first()
u.add_role(admin_role, "TEST00") u.add_role(super_admin_role, "TEST00")
# u.set_password("admin") # u.set_password("admin")
login_user(u) login_user(u)
# db.session.add(u) # Vérifie que l'utilisateur bach existe
u = User.query.filter_by(user_name="bach").first()
if u is None:
u = User(user_name="bach")
if not "Admin" in {r.name for r in u.roles}:
admin_role = Role.query.filter_by(name="Admin").first()
u.add_role(admin_role, "TEST00")
db.session.add(u)
ndb.set_sco_dept("TEST00") # set db connection ndb.set_sco_dept("TEST00") # set db connection
truncate_database() # erase tables truncate_database() # erase tables
yield client yield client

View File

@ -0,0 +1,205 @@
<formation acronyme="DUT Info" code_specialite="" type_parcours="100" titre_officiel="DUT Informatique" formation_code="FCOD2" version="1" titre="DUT Informatique" formation_id="FORM234">
<ue acronyme="UE11" coefficient="0.0" is_external="0" code_apogee="" ue_code="UE11" numero="1" titre="Base de l'informatique" type="0">
<matiere titre="Architecture matérielle - Systèmes dexploitation - Réseaux" numero="1">
<module coefficient="2.0" code="M1101" code_apogee="" ects="" heures_tp="30.0" numero="1" abbrev="" heures_cours="10.0" module_type="0" titre="Introduction aux systèmes informatiques" semestre_id="1" heures_td="20.0" />
</matiere>
<matiere titre="Algorithmique - Programmation - Langages" numero="2">
<module coefficient="2.0" code="M1102" code_apogee="" ects="" heures_tp="30.0" numero="10" abbrev="Algorithmique" heures_cours="10.0" module_type="0" titre="Introduction à lalgorithmique et à la programmation" semestre_id="1" heures_td="20.0" />
</matiere>
<matiere titre="Algorithmique - Programmation - Langages Avancé" numero="3">
<module coefficient="2.0" code="M1103" code_apogee="" ects="" heures_tp="20.0" numero="3" abbrev="Structure de données" heures_cours="10.0" module_type="0" titre="Structure de données et algorithmes fondamentaux" semestre_id="1" heures_td="15.0" />
</matiere>
<matiere titre="Systèmes de gestion de bases de données" numero="4">
<module coefficient="3.0" code="M1104" code_apogee="" ects="" heures_tp="25.0" numero="4" abbrev="BDD" heures_cours="10.0" module_type="0" titre="Introduction aux bases de données" semestre_id="1" heures_td="25.0" />
</matiere>
<matiere titre="Web - Internet - Mobilité Expression - Communication" numero="5">
<module coefficient="2.0" code="M1105" code_apogee="" ects="" heures_tp="25.0" numero="5" abbrev="CDIN" heures_cours="0.0" module_type="0" titre="Conception de documents et dinterfaces numériques" semestre_id="1" heures_td="20.0" />
</matiere>
<matiere titre="Projets tutorés" numero="6">
<module coefficient="3.0" code="M1106" code_apogee="" ects="" heures_tp="0.0" numero="6" abbrev="Projet" heures_cours="0.0" module_type="0" titre="Projet tutoré : découverte" semestre_id="1" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE21" coefficient="0.0" is_external="0" code_apogee="" ue_code="UE21" numero="1" titre="Informatique approfondie" type="0">
<matiere titre="Architecture matérielle - Systèmes dexploitation - Réseaux" numero="1">
<module coefficient="2.0" code="M2101" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Architecture et Programmation des mécanismes de base dun système informatique" semestre_id="2" heures_td="10.0" />
</matiere>
<matiere titre="Architecture matérielle - Systèmes dexploitation - Réseaux avancé" numero="2">
<module coefficient="2.0" code="M2102" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Architecture des réseaux" semestre_id="2" heures_td="10.0" />
</matiere>
<matiere titre="Algorithmique - Programmation - Langages Analyse, conception et développement dapplications" numero="3">
<module coefficient="2.0" code="M2103" code_apogee="" ects="" heures_tp="30.0" numero="10" abbrev="" heures_cours="10.0" module_type="0" titre="Bases de la programmation orientée objet" semestre_id="2" heures_td="20.0" />
</matiere>
<matiere titre="Analyse, conception et développement dapplications" numero="4">
<module coefficient="2.0" code="M2104" code_apogee="" ects="" heures_tp="20.0" numero="10" abbrev="COO" heures_cours="10.0" module_type="0" titre="Bases de la conception orientée objet" semestre_id="2" heures_td="15.0" />
</matiere>
<matiere titre="Interface homme-machine" numero="5">
<module coefficient="2.0" code="M2105" code_apogee="" ects="" heures_tp="20.0" numero="10" abbrev="" heures_cours="10.0" module_type="0" titre="Introduction aux interfaces homme-machine" semestre_id="2" heures_td="15.0" />
</matiere>
<matiere titre="Systèmes de gestion de bases de données" numero="6">
<module coefficient="2.0" code="M2106" code_apogee="" ects="" heures_tp="20.0" numero="10" abbrev="" heures_cours="10.0" module_type="0" titre="Programmation et administration des bases de données" semestre_id="2" heures_td="15.0" />
</matiere>
<matiere titre="Projets tutorés" numero="7">
<module coefficient="3.0" code="M2107" code_apogee="" ects="" heures_tp="0.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Projet tutoré : Description et planification de projet" semestre_id="2" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE31" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD5" numero="1" titre="Informatique avancée" type="0">
<matiere titre="Architectures matérielles - Systèmes dexploitation - Réseaux" numero="1">
<module coefficient="2.0" code="M3101" code_apogee="" ects="" heures_tp="16.0" numero="10" abbrev="" heures_cours="15.0" module_type="0" titre="Principes des systèmes dexploitation" semestre_id="3" heures_td="14.0" />
</matiere>
<matiere titre="Architectures matérielles - Systèmes dexploitation, Réseaux" numero="2">
<module coefficient="2.0" code="M3102" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Services réseaux" semestre_id="3" heures_td="10.0" />
</matiere>
<matiere titre="Algorithmique - Programmation - Langages avancé" numero="3">
<module coefficient="2.0" code="M3103" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Algorithmique avancée" semestre_id="3" heures_td="10.0" />
</matiere>
<matiere titre="Web - Internet - Mobilité" numero="4">
<module coefficient="2.0" code="M3104" code_apogee="" ects="" heures_tp="16.0" numero="10" abbrev="" heures_cours="15.0" module_type="0" titre="Programmation Web côté serveur" semestre_id="3" heures_td="14.0" />
</matiere>
<matiere titre="Analyse, conception et développement dapplications" numero="5">
<module coefficient="16.0" code="M3105" code_apogee="" ects="" heures_tp="14.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Conception et programmation objet avancées" semestre_id="3" heures_td="15.0" />
</matiere>
<matiere titre="Systèmes de gestion de bases de données" numero="6">
<module coefficient="2.0" code="M3106C" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Bases de données avancées" semestre_id="3" heures_td="10.0" />
</matiere>
<matiere titre="Malus" numero="16">
<module coefficient="0.0" code="MALUS1" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="3" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE41" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD8" numero="1" titre="Compléments en informatique" type="0">
<matiere titre="Architectures matérielles - Systèmes dexploitation - Réseaux" numero="1">
<module coefficient="2.0" code="M4101C" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Administration système et réseau" semestre_id="4" heures_td="10.0" />
</matiere>
<matiere titre="Architectures matérielles - Systèmes dexploitation Réseaux Analyse, conception et développement dapplications" numero="2">
<module coefficient="2.0" code="M4102C" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Programmation répartie" semestre_id="4" heures_td="10.0" />
</matiere>
<matiere titre="Web Internet - Mobilité" numero="3">
<module coefficient="2.0" code="M4103C" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Programmation Web client riche" semestre_id="4" heures_td="10.0" />
</matiere>
<matiere titre="Web - Internet - Mobilité - Mobile" numero="4">
<module coefficient="3.0" code="M4104C" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Conception et développement dapplications mobiles" semestre_id="4" heures_td="10.0" />
</matiere>
<matiere titre="Analyse, conception et développement dapplications" numero="5">
<module coefficient="2.0" code="M4105C" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Compléments dinformatique en vue dune insertion immédiate" semestre_id="4" heures_td="10.0" />
</matiere>
<matiere titre="Projets tutorés" numero="6">
<module coefficient="3.0" code="M4106" code_apogee="" ects="" heures_tp="0.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Projet tutoré Compléments" semestre_id="4" heures_td="0.0" />
</matiere>
<matiere titre="Malus" numero="16">
<module coefficient="0.0" code="MALUS1" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="4" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE12" coefficient="0.0" is_external="0" code_apogee="" ue_code="UE12" numero="2" titre="Bases de culture scientifique, sociale et humaine" type="0">
<matiere titre="Mathématiques" numero="1">
<module coefficient="2.0" code="M1201" code_apogee="" ects="" heures_tp="17.0" numero="1" abbrev="" heures_cours="10.0" module_type="0" titre="Mathématiques discrètes" semestre_id="1" heures_td="18.0" />
</matiere>
<matiere titre="Mathématiques avancées" numero="2">
<module coefficient="2.0" code="M1202" code_apogee="" ects="" heures_tp="12.0" numero="10" abbrev="" heures_cours="6.0" module_type="0" titre="Algèbre linéaire" semestre_id="1" heures_td="12.0" />
</matiere>
<matiere titre="Économie - Gestion - Organisation - Droit" numero="3">
<module coefficient="2.0" code="M1203" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="10.0" module_type="0" titre="Environnement économique" semestre_id="1" heures_td="10.0" />
</matiere>
<matiere titre="Organisation" numero="4">
<module coefficient="1.0" code="M1204" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="10.0" module_type="0" titre="Fonctionnement des organisations" semestre_id="1" heures_td="20.0" />
</matiere>
<matiere titre="Expression - Communication" numero="5">
<module coefficient="2.0" code="M1205" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Fondamentaux de la communication" semestre_id="1" heures_td="15.0" />
</matiere>
<matiere titre="Anglais" numero="6">
<module coefficient="2.0" code="M1206" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Anglais et Informatique" semestre_id="1" heures_td="15.0" />
</matiere>
<matiere titre="PPP Expression - Communication" numero="7">
<module coefficient="1.0" code="M1207" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Connaître le monde professionnel" semestre_id="1" heures_td="10.0" />
</matiere>
<matiere titre="Malus" numero="17">
<module coefficient="0.0" code="MALUS2" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="1" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE22" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD4" numero="2" titre="Approfondissements en culture scientifique, sociale et humaine" type="0">
<matiere titre="Mathématiques" numero="1">
<module coefficient="2.0" code="M2201" code_apogee="" ects="" heures_tp="18.0" numero="10" abbrev="" heures_cours="11.0" module_type="0" titre="Graphes et langages" semestre_id="2" heures_td="16.0" />
</matiere>
<matiere titre="Mathématiques avancées" numero="2">
<module coefficient="2.0" code="M2202" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Analyse et méthodes numériques" semestre_id="2" heures_td="12.0" />
</matiere>
<matiere titre="Économie - Gestion - Droit - Organisation" numero="3">
<module coefficient="2.0" code="M2203" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="12.0" module_type="0" titre="Environnement comptable, financier, juridique et social" semestre_id="2" heures_td="18.0" />
</matiere>
<matiere titre="Économie - Gestion - Organisation - Droit Analyse, conception et développement dapplications" numero="4">
<module coefficient="2.0" code="M2204" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Gestion de projet informatique" semestre_id="2" heures_td="12.0" />
</matiere>
<matiere titre="Expression - Communication" numero="5">
<module coefficient="1.0" code="M2205" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Communication, information et argumentation" semestre_id="2" heures_td="15.0" />
</matiere>
<matiere titre="Anglais" numero="6">
<module coefficient="2.0" code="M2206" code_apogee="" ects="" heures_tp="22.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Communiquer en anglais" semestre_id="2" heures_td="23.0" />
</matiere>
<matiere titre="PPP" numero="7">
<module coefficient="1.0" code="M2207" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="PPP - Identifier ses compétences" semestre_id="2" heures_td="10.0" />
</matiere>
<matiere titre="Malus" numero="17">
<module coefficient="0.0" code="MALUS2" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="2" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE32" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD6" numero="2" titre="Culture scientifique, sociale et humaine avancées" type="0">
<matiere titre="Mathématiques" numero="1">
<module coefficient="2.0" code="M3201" code_apogee="" ects="" heures_tp="14.0" numero="10" abbrev="" heures_cours="15.0" module_type="0" titre="Probabilités et statistique" semestre_id="3" heures_td="16.0" />
</matiere>
<matiere titre="Mathématiques avancées" numero="2">
<module coefficient="2.0" code="M3202C" code_apogee="" ects="" heures_tp="14.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Modélisations mathématiques" semestre_id="3" heures_td="16.0" />
</matiere>
<matiere titre="Économie - Gestion - Organisation - Droit" numero="3">
<module coefficient="2.0" code="M3203" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="10.0" module_type="0" titre="Droit des technologies de linformation et de la communication" semestre_id="3" heures_td="10.0" />
</matiere>
<matiere titre="Gestion" numero="4">
<module coefficient="2.0" code="M3204" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="15.0" module_type="0" titre="Gestion des systèmes dinformation" semestre_id="3" heures_td="15.0" />
</matiere>
<matiere titre="Expression - Communication" numero="5">
<module coefficient="2.0" code="M3205" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Communication professionnelle" semestre_id="3" heures_td="15.0" />
</matiere>
<matiere titre="Anglais" numero="6">
<module coefficient="2.0" code="M3206" code_apogee="" ects="" heures_tp="22.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Collaborer en anglais" semestre_id="3" heures_td="23.0" />
</matiere>
<matiere titre="Malus" numero="16">
<module coefficient="0.0" code="MALUS2" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="3" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE33" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD7" numero="2" titre="Méthodologie et projets" type="0">
<matiere titre="Analyse, conception et développement dapplications Économie - gestion - Organisation - Droit" numero="1">
<module coefficient="2.0" code="M3301" code_apogee="" ects="" heures_tp="24.0" numero="10" abbrev="" heures_cours="14.0" module_type="0" titre="Méthodologie de la production dapplications" semestre_id="3" heures_td="22.0" />
</matiere>
<matiere titre="Projets tutorés" numero="2">
<module coefficient="3.0" code="M3302" code_apogee="" ects="" heures_tp="0.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Projet tutoré - Mise en situation professionnelle" semestre_id="3" heures_td="0.0" />
</matiere>
<matiere titre="PPP" numero="3">
<module coefficient="2.0" code="M3303" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="PPP - Préciser son projet" semestre_id="3" heures_td="10.0" />
</matiere>
<matiere titre="Malus" numero="13">
<module coefficient="0.0" code="MALUS2" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="3" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE42" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD9" numero="2" titre="Compléments de culture scientifique, sociale et humaine" type="0">
<matiere titre="Économie - Gestion - Organisation - Droit" numero="1">
<module coefficient="2.0" code="M4201C" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Ateliers de création dentreprise" semestre_id="4" heures_td="12.0" />
</matiere>
<matiere titre="Mathématiques" numero="2">
<module coefficient="2.0" code="M4202C" code_apogee="" ects="" heures_tp="10.0" numero="10" abbrev="" heures_cours="8.0" module_type="0" titre="Introduction à la recherche opérationnelle et aide à la décision" semestre_id="4" heures_td="12.0" />
</matiere>
<matiere titre="Expression Communication" numero="3">
<module coefficient="2.0" code="M4203" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Communication dans les organisations" semestre_id="4" heures_td="15.0" />
</matiere>
<matiere titre="Anglais" numero="4">
<module coefficient="2.0" code="M4204" code_apogee="" ects="" heures_tp="15.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Travailler en anglais" semestre_id="4" heures_td="15.0" />
</matiere>
<matiere titre="Malus" numero="14">
<module coefficient="0.0" code="MALUS2" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="4" heures_td="0.0" />
</matiere>
</ue>
<ue acronyme="UE43" coefficient="0.0" is_external="0" code_apogee="" ue_code="UCOD10" numero="3" titre="Mise en situation professionnelle" type="0">
<matiere titre="STAGE" numero="1">
<module coefficient="12.0" code="M4301" code_apogee="" ects="" heures_tp="0.0" numero="10" abbrev="" heures_cours="0.0" module_type="0" titre="Stage professionnel" semestre_id="4" heures_td="0.0" />
</matiere>
<matiere titre="Malus" numero="11">
<module coefficient="0.0" code="MALUS3" code_apogee="" ects="" heures_tp="0.0" numero="0" abbrev="" heures_cours="0.0" module_type="1" titre="" semestre_id="4" heures_td="0.0" />
</matiere>
</ue>
</formation>

View File

@ -0,0 +1,61 @@
# -*- coding: utf-8 -*-
"""
Scenario: préparation base de données pour tests Selenium
S'utilise comme un test avec pytest, mais n'est pas un test !
Modifie la base de données du département TEST00
Usage: pytest tests/scenarios/test_scenario1_formation.py
"""
# code écrit par Fares Amer, mai 2021 et porté sur ScoDoc 8 en août 2021
import random
from tests.unit import sco_fake_gen
from app.scodoc import sco_edit_module
from app.scodoc import sco_formations
from app.scodoc import sco_moduleimpl
context = None # #context
def test_scenario1(test_client):
"""Applique "scenario 1"""
G = sco_fake_gen.ScoFake(verbose=False)
# Lecture fichier XML local:
with open("tests/unit/formation-exemple-1.xml") as f:
doc = f.read()
# --- Création de la formation
f = sco_formations.formation_import_xml(doc=doc, context=context)
# --- Création des semestres
formation_id = f[0]
# --- Mise en place de 4 semestres
sems = [
G.create_formsemestre(
formation_id=formation_id,
semestre_id=x[0],
date_debut=x[1],
date_fin=x[2],
)
for x in (
(1, "01/09/2020", "01/02/2021"),
(2, "02/02/2021", "01/06/2021"),
(3, "01/09/2020", "01/02/2021"),
(4, "02/02/2021", "01/06/2021"),
)
]
# --- Implémentation des modules
modules = sco_edit_module.do_module_list(context, {"formation_id": formation_id})
mods_imp = []
for mod in modules:
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sems[mod["semestre_id"] - 1]["formsemestre_id"],
responsable_id="bach",
)
mods_imp.append(mi)

View File

@ -66,7 +66,7 @@ def logging_meth(func):
class ScoFake(object): class ScoFake(object):
"""Helper for ScoSoc tests""" """Helper for ScoDoc tests"""
def __init__(self, verbose=True): def __init__(self, verbose=True):
self.verbose = verbose self.verbose = verbose

View File

@ -17,7 +17,7 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
source "$SCRIPT_DIR/config.sh" source "$SCRIPT_DIR/config.sh"
source "$SCRIPT_DIR/utils.sh" source "$SCRIPT_DIR/utils.sh"
check_uid_root "$0" [ "$USER" = "$SCODOC_USER" ] || die "$0 must run as user $SCODOC_USER"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
@ -61,19 +61,17 @@ then
exit 1 exit 1
fi fi
# --- Ensure postgres user "scodoc" ($POSTGRES_USER) exists
init_postgres_user
# ----------------------- Create Dept database # ----------------------- Create Dept database
su -c ./create_database.sh "$POSTGRES_SUPERUSER" # (créée en tant qu'utilisateur scodoc)
./create_database.sh
# ----------------------- Initialize table database # ----------------------- Initialize table database
# POSTGRES_USER == regular unix user (scodoc) # POSTGRES_USER == regular unix user (scodoc)
if [ "$interactive" = 1 ] if [ "$interactive" = 1 ]
then then
su -c ./initialize_database.sh "$POSTGRES_USER" ./initialize_database.sh
else else
su -c ./initialize_database.sh "$POSTGRES_USER" > /dev/null 2>&1 ./initialize_database.sh > /dev/null 2>&1
fi fi
@ -84,17 +82,10 @@ echo "dbname=${db_name}" > "$cfg_pathname"
if [ "$interactive" = 1 ] if [ "$interactive" = 1 ]
then then
# ----------------------- Force mise à jour
echo -n "Voulez vous mettre a jour ScoDoc (tres recommande) ? (y/n) [y] "
read -r ans
if [ "$(norm_ans "$ans")" != 'N' ]
then
(cd "$SCODOC_DIR/tools" || terminate "no config directory"; ./upgrade.sh)
fi
# ----------------------- # -----------------------
echo echo
echo " Departement $DEPT cree" echo " Departement $DEPT cree"
echo echo
echo " Attention: la base de donnees n'a pas de copies de sauvegarde" echo " Attention: la base de donnees n'a pas de copies de sauvegarde"
echo echo "(XXX section à revoir en ScoDoc 8.1)" # #sco8
fi fi

View File

@ -19,7 +19,9 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
source "$SCRIPT_DIR/config.sh" source "$SCRIPT_DIR/config.sh"
source "$SCRIPT_DIR/utils.sh" source "$SCRIPT_DIR/utils.sh"
check_uid_root "$0" # scodoc may now manage departments TODO To be fixed
# check_uid_root "$0"
usage() { usage() {
echo "$0 [-n DEPT]" echo "$0 [-n DEPT]"
echo "(default to interactive mode)" echo "(default to interactive mode)"
@ -57,15 +59,15 @@ cfg_pathname="${SCODOC_VAR_DIR}/config/depts/$DEPT".cfg
if [ -e "$cfg_pathname" ] if [ -e "$cfg_pathname" ]
then then
# arret de ScoDoc # arret de ScoDoc (need root permissions so disabled for the moment TODO to be fixed)
scodocctl stop # scodocctl stop
# suppression de la base postgres # suppression de la base postgres
db_name=$(sed '/^dbname=*/!d; s///;q' < "$cfg_pathname") db_name=$(sed '/^dbname=*/!d; s///;q' < "$cfg_pathname")
if su -c "psql -lt" "$POSTGRES_SUPERUSER" | cut -d \| -f 1 | grep -wq "$db_name" if psql -lt | cut -d \| -f 1 | grep -wq "$db_name"
then then
echo "Suppression de la base postgres $db_name ..." echo "Suppression de la base postgres $db_name ..."
su -c "dropdb $db_name" "$POSTGRES_SUPERUSER" || terminate "ne peux supprimer base de donnees $db_name" dropdb $db_name || terminate "ne peux supprimer base de donnees $db_name"
else else
echo "la base postgres $db_name n'existe pas." echo "la base postgres $db_name n'existe pas."
fi fi

View File

@ -105,6 +105,11 @@ then
yes | ufw enable yes | ufw enable
fi fi
# --- POSTGRESQL
# --- Ensure postgres user "scodoc" ($POSTGRES_USER) exists
init_postgres_user
# --- XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX --- # --- XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX ---
echo echo
echo "WARNING: version ScoDoc8 expérimentale" echo "WARNING: version ScoDoc8 expérimentale"