forked from ScoDoc/ScoDoc
tests basiques pour ScoDoc8
This commit is contained in:
parent
7c1263060e
commit
70f97c8501
@ -29,7 +29,7 @@ class ZUser(object):
|
||||
def __str__(self):
|
||||
return self.username
|
||||
|
||||
def has_permission(self, perm, context):
|
||||
def has_permission(self, perm, dept=None):
|
||||
"""check if this user as the permission `perm`
|
||||
in departement given by `g.scodoc_dept`.
|
||||
"""
|
||||
@ -42,7 +42,7 @@ class ZRequest(object):
|
||||
def __init__(self):
|
||||
self.URL = request.base_url.encode(
|
||||
"utf-8"
|
||||
) # necessaire pour ScoDoc 8 en Python 2
|
||||
) # necessaire pour ScoDoc 8 en Python 2 #sco8
|
||||
self.URL0 = self.URL
|
||||
self.BASE0 = request.url_root.encode("utf-8")
|
||||
self.QUERY_STRING = request.query_string.encode("utf-8")
|
||||
|
@ -98,7 +98,7 @@ class FakeUser:
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def has_permission(self, op, dept):
|
||||
def has_permission(self, op, dept=None):
|
||||
return True
|
||||
|
||||
def has_role(self, role):
|
||||
|
48
scodoc.py
48
scodoc.py
@ -9,13 +9,15 @@
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
from pprint import pprint as pp
|
||||
import sys
|
||||
|
||||
import click
|
||||
import flask
|
||||
|
||||
from flask.cli import with_appcontext
|
||||
from app import create_app, cli, db
|
||||
|
||||
from app.auth.models import User, Role, UserRole
|
||||
from app.views import notes, scolar, absences
|
||||
|
||||
@ -120,3 +122,47 @@ def user_password(username, password=None):
|
||||
db.session.add(u)
|
||||
db.session.commit()
|
||||
click.echo("changed password for user {}".format(u))
|
||||
|
||||
|
||||
@app.cli.command()
|
||||
@click.argument("dept")
|
||||
def sco_delete_dept(dept):
|
||||
"Delete existing departement"
|
||||
if os.getuid() != 0:
|
||||
sys.stderr.write("sco_delete_dept: must be run by root\n")
|
||||
return 1
|
||||
if os.system('cd config; ./delete_dept.sh -n "{}"'.format(dept)):
|
||||
sys.stderr.write("error deleting dept " + dept)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@app.cli.command()
|
||||
@click.argument("dept")
|
||||
def sco_create_dept(dept):
|
||||
"Create new departement"
|
||||
if os.getuid() != 0:
|
||||
sys.stderr.write("sco_create_dept: must be run by root\n")
|
||||
return 1
|
||||
if os.system('cd config; ./create_dept.sh -n "{}"'.format(dept)):
|
||||
sys.stderr.write("error deleting dept " + dept)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@app.cli.command()
|
||||
@click.argument("filename")
|
||||
@with_appcontext
|
||||
def test_interactive(filename=None):
|
||||
"Run interactive test"
|
||||
import flask_login
|
||||
from app import decorators
|
||||
|
||||
click.echo("Executing {}".format(filename))
|
||||
with app.test_request_context(""):
|
||||
u = User.query.first()
|
||||
flask_login.login_user(u)
|
||||
REQUEST = decorators.ZRequest()
|
||||
exec(open(filename).read())
|
||||
|
||||
click.echo("Done.")
|
||||
|
@ -16,29 +16,36 @@ import collections
|
||||
import pprint
|
||||
import random
|
||||
|
||||
import scodoc_manager
|
||||
from app.scodoc import notesdb as ndb
|
||||
from app.scodoc import sco_codes_parcours
|
||||
from app.scodoc import sco_edit_formation
|
||||
from app.scodoc import sco_edit_matiere
|
||||
from app.scodoc import sco_edit_module
|
||||
from app.scodoc import sco_edit_ue
|
||||
from app.scodoc import sco_etud
|
||||
from app.scodoc import sco_evaluations
|
||||
from app.scodoc import sco_formations
|
||||
from app.scodoc import sco_formsemestre
|
||||
from app.scodoc import sco_formsemestre_inscriptions
|
||||
from app.scodoc import sco_formsemestre_validation
|
||||
from app.scodoc import sco_moduleimpl
|
||||
from app.scodoc import sco_saisie_notes
|
||||
from app.scodoc import sco_synchro_etuds
|
||||
from app.scodoc import sco_utils as scu
|
||||
from app.scodoc.debug import REQUEST
|
||||
from app.scodoc.notes_log import log
|
||||
from app.scodoc.sco_exceptions import ScoValueError
|
||||
|
||||
random.seed(12345) # tests reproductibles
|
||||
|
||||
from debug import REQUEST
|
||||
|
||||
import sco_utils
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from sco_exceptions import ScoValueError
|
||||
import scolars
|
||||
import sco_formsemestre
|
||||
import sco_formsemestre_inscriptions
|
||||
import sco_formsemestre_validation
|
||||
import sco_moduleimpl
|
||||
import sco_synchro_etuds
|
||||
import sco_edit_formation
|
||||
import sco_edit_ue
|
||||
import sco_codes_parcours
|
||||
import sco_saisie_notes
|
||||
|
||||
DEMO_DIR = sco_utils.SCO_SRC_DIR + "/scotests/demo/"
|
||||
DEMO_DIR = scu.SCO_SRC_DIR + "/scotests/demo/"
|
||||
NOMS = [x.strip() for x in open(DEMO_DIR + "/noms.txt").readlines()]
|
||||
PRENOMS_H = [x.strip() for x in open(DEMO_DIR + "/prenoms-h.txt").readlines()]
|
||||
PRENOMS_F = [x.strip() for x in open(DEMO_DIR + "/prenoms-f.txt").readlines()]
|
||||
PRENOMS_X = [x.strip() for x in open(DEMO_DIR + "/prenoms-x.txt").readlines()]
|
||||
|
||||
# nb: en python2, les chaines ci-dessus sont en utf8
|
||||
|
||||
|
||||
@ -119,7 +126,7 @@ class ScoFake:
|
||||
nom = r_nom
|
||||
if not prenom:
|
||||
prenom = r_prenom
|
||||
etud = scolars.create_etud(self.context, cnx, args=locals(), REQUEST=REQUEST)
|
||||
etud = sco_etud.create_etud(self.context, cnx, args=locals(), REQUEST=REQUEST)
|
||||
inscription = "2020" # pylint: disable=unused-variable
|
||||
sco_synchro_etuds.do_import_etud_admission(
|
||||
self.context, cnx, etud["etudid"], locals()
|
||||
@ -139,8 +146,10 @@ class ScoFake:
|
||||
"""Crée une formation"""
|
||||
if not acronyme:
|
||||
acronyme = "TEST" + str(random.randint(100000, 999999))
|
||||
oid = self.context.do_formation_create(locals(), REQUEST=REQUEST)
|
||||
oids = self.context.formation_list(args={"formation_id": oid})
|
||||
oid = sco_edit_formation.do_formation_create(
|
||||
self.context, locals(), REQUEST=REQUEST
|
||||
)
|
||||
oids = sco_formations.formation_list(self.context, formation_id=oid)
|
||||
if not oids:
|
||||
raise ScoValueError("formation not created !")
|
||||
return oids[0]
|
||||
@ -162,16 +171,16 @@ class ScoFake:
|
||||
"""Crée une UE"""
|
||||
if numero is None:
|
||||
numero = sco_edit_ue.next_ue_numero(self.context, formation_id, 0)
|
||||
oid = self.context.do_ue_create(locals(), REQUEST)
|
||||
oids = self.context.do_ue_list(args={"ue_id": oid})
|
||||
oid = sco_edit_ue.do_ue_create(self.context, locals(), REQUEST)
|
||||
oids = sco_edit_ue.do_ue_list(self.context, args={"ue_id": oid})
|
||||
if not oids:
|
||||
raise ScoValueError("ue not created !")
|
||||
return oids[0]
|
||||
|
||||
@logging_meth
|
||||
def create_matiere(self, ue_id=None, titre=None, numero=None):
|
||||
oid = self.context.do_matiere_create(locals(), REQUEST)
|
||||
oids = self.context.do_matiere_list(args={"matiere_id": oid})
|
||||
oid = sco_edit_matiere.do_matiere_create(self.context, locals(), REQUEST)
|
||||
oids = sco_edit_matiere.do_matiere_list(self.context, args={"matiere_id": oid})
|
||||
if not oids:
|
||||
raise ScoValueError("matiere not created !")
|
||||
return oids[0]
|
||||
@ -195,8 +204,8 @@ class ScoFake:
|
||||
code_apogee=None,
|
||||
module_type=None,
|
||||
):
|
||||
oid = self.context.do_module_create(locals(), REQUEST)
|
||||
oids = self.context.do_module_list(args={"module_id": oid})
|
||||
oid = sco_edit_module.do_module_create(self.context, locals(), REQUEST)
|
||||
oids = sco_edit_module.do_module_list(self.context, args={"module_id": oid})
|
||||
if not oids:
|
||||
raise ScoValueError("module not created ! (oid=%s)" % oid)
|
||||
return oids[0]
|
||||
@ -223,7 +232,7 @@ class ScoFake:
|
||||
etapes=None,
|
||||
responsables=["bach"],
|
||||
):
|
||||
oid = self.context.do_formsemestre_create(locals(), REQUEST)
|
||||
oid = sco_formsemestre.do_formsemestre_create(self.context, locals(), REQUEST)
|
||||
# oids = self.context.do_formsemestre_list(args={"formsemestre_id": oid})
|
||||
oids = sco_formsemestre.do_formsemestre_list(
|
||||
self.context, args={"formsemestre_id": oid}
|
||||
@ -277,8 +286,10 @@ class ScoFake:
|
||||
):
|
||||
args = locals()
|
||||
del args["self"]
|
||||
oid = self.context.do_evaluation_create(**args)
|
||||
oids = self.context.do_evaluation_list(args={"evaluation_id": oid})
|
||||
oid = sco_evaluations.do_evaluation_create(self.context, **args)
|
||||
oids = sco_evaluations.do_evaluation_list(
|
||||
self.context, args={"evaluation_id": oid}
|
||||
)
|
||||
if not oids:
|
||||
raise ScoValueError("evaluation not created !")
|
||||
return oids[0]
|
||||
@ -418,3 +429,8 @@ class ScoFake:
|
||||
assidu=assidu,
|
||||
REQUEST=REQUEST,
|
||||
)
|
||||
|
||||
|
||||
# band aid for #sco8 dev (temporaire en attendant Users)
|
||||
class Sco8Context(object):
|
||||
Users = scodoc_manager.FakeUsers()
|
||||
|
@ -6,26 +6,29 @@
|
||||
Création 10 étudiants, formation, semestre, inscription etudiant, creation 1 evaluation, saisie 10 notes.
|
||||
|
||||
Utiliser comme:
|
||||
scotests/scointeractive.sh -r TEST00 scotests/test_basic.py
|
||||
flask test-interactive scotests/test_basic.py
|
||||
|
||||
"""
|
||||
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_utils
|
||||
import sco_abs
|
||||
import sco_abs_views
|
||||
import sco_bulletins
|
||||
import sco_evaluations
|
||||
import sco_codes_parcours
|
||||
import sco_parcours_dut
|
||||
import sco_formsemestre_validation
|
||||
from flask import g
|
||||
|
||||
G = sco_fake_gen.ScoFake(context.Notes)
|
||||
from app import decorators
|
||||
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
||||
from app.scodoc import sco_utils as scu
|
||||
from app.scodoc import sco_abs
|
||||
from app.scodoc import sco_abs_views
|
||||
from app.scodoc import sco_bulletins
|
||||
from app.scodoc import sco_evaluations
|
||||
from app.scodoc import sco_codes_parcours
|
||||
from app.scodoc import sco_parcours_dut
|
||||
from app.scodoc import sco_formsemestre_validation
|
||||
|
||||
|
||||
context = sco_fake_gen.Sco8Context()
|
||||
g.scodoc_dept = "TEST00"
|
||||
|
||||
G = sco_fake_gen.ScoFake(context)
|
||||
G.verbose = False
|
||||
|
||||
# --- Création d'étudiants
|
||||
@ -78,10 +81,10 @@ for etud in etuds:
|
||||
|
||||
# --- Vérifie que les notes sont prises en compte:
|
||||
b = sco_bulletins.formsemestre_bulletinetud_dict(
|
||||
context.Notes, sem["formsemestre_id"], etud["etudid"], REQUEST=REQUEST
|
||||
context, sem["formsemestre_id"], etud["etudid"], REQUEST=REQUEST
|
||||
)
|
||||
# Toute les notes sont saisies, donc eval complète
|
||||
etat = sco_evaluations.do_evaluation_etat(context.Notes, e["evaluation_id"])
|
||||
etat = sco_evaluations.do_evaluation_etat(context, e["evaluation_id"])
|
||||
assert etat["evalcomplete"]
|
||||
# Un seul module, donc moy gen == note module
|
||||
assert b["ues"][0]["cur_moy_ue_txt"] == b["ues"][0]["modules"][0]["mod_moy_txt"]
|
||||
@ -91,7 +94,6 @@ assert (
|
||||
== b["ues"][0]["modules"][0]["evaluations"][0]["note_txt"]
|
||||
)
|
||||
|
||||
|
||||
# --- Une autre évaluation
|
||||
e2 = G.create_evaluation(
|
||||
moduleimpl_id=mi["moduleimpl_id"],
|
||||
@ -105,16 +107,16 @@ for etud in etuds[:5]:
|
||||
evaluation=e2, etud=etud, note=float(random.randint(0, 20))
|
||||
)
|
||||
# Cette éval n'est pas complète
|
||||
etat = sco_evaluations.do_evaluation_etat(context.Notes, e2["evaluation_id"])
|
||||
etat = sco_evaluations.do_evaluation_etat(context, e2["evaluation_id"])
|
||||
assert etat["evalcomplete"] == False
|
||||
# la première éval est toujours complète:
|
||||
etat = sco_evaluations.do_evaluation_etat(context.Notes, e["evaluation_id"])
|
||||
etat = sco_evaluations.do_evaluation_etat(context, e["evaluation_id"])
|
||||
assert etat["evalcomplete"]
|
||||
|
||||
# Modifie l'évaluation 2 pour "prise en compte immédiate"
|
||||
e2["publish_incomplete"] = "1"
|
||||
sco_evaluations.do_evaluation_edit(context, REQUEST, e2)
|
||||
etat = sco_evaluations.do_evaluation_etat(context.Notes, e2["evaluation_id"])
|
||||
etat = sco_evaluations.do_evaluation_etat(context, e2["evaluation_id"])
|
||||
assert etat["evalcomplete"] == False
|
||||
assert etat["nb_att"] == 0 # il n'y a pas de notes (explicitement) en attente
|
||||
assert etat["evalattente"] # mais l'eval est en attente (prise en compte immédiate)
|
||||
@ -124,7 +126,7 @@ for etud in etuds[5:]:
|
||||
nb_changed, nb_suppress, existing_decisions = G.create_note(
|
||||
evaluation=e2, etud=etud, note=float(random.randint(0, 20))
|
||||
)
|
||||
etat = sco_evaluations.do_evaluation_etat(context.Notes, e2["evaluation_id"])
|
||||
etat = sco_evaluations.do_evaluation_etat(context, e2["evaluation_id"])
|
||||
assert etat["evalcomplete"]
|
||||
assert etat["nb_att"] == 0
|
||||
assert not etat["evalattente"] # toutes les notes sont présentes
|
||||
@ -133,7 +135,7 @@ assert not etat["evalattente"] # toutes les notes sont présentes
|
||||
etudid = etuds[0]["etudid"]
|
||||
|
||||
_ = sco_abs_views.doSignaleAbsence(
|
||||
context.Absences,
|
||||
context,
|
||||
"15/01/2020",
|
||||
"18/01/2020",
|
||||
demijournee=2,
|
||||
@ -142,7 +144,7 @@ _ = sco_abs_views.doSignaleAbsence(
|
||||
)
|
||||
|
||||
_ = sco_abs_views.doJustifAbsence(
|
||||
context.Absences,
|
||||
context,
|
||||
"17/01/2020",
|
||||
"18/01/2020",
|
||||
demijournee=2,
|
||||
@ -150,9 +152,9 @@ _ = sco_abs_views.doJustifAbsence(
|
||||
REQUEST=REQUEST,
|
||||
)
|
||||
|
||||
a = sco_abs.getAbsSemEtud(context.Absences, sem, etudid)
|
||||
assert a.CountAbs() == 3
|
||||
assert a.CountAbsJust() == 1
|
||||
a = sco_abs.getAbsSemEtud(context, sem, etudid)
|
||||
assert a.CountAbs() == 6, "incorrect CountAbs (%d)" % a.CountAbs()
|
||||
assert a.CountAbsJust() == 2, "incorrect CountAbsJust (%s)" % a.CountAbsJust()
|
||||
|
||||
# --- Permission saisie notes et décisions de jury, avec ou sans démission ou défaillance
|
||||
# on n'a pas encore saisi de décisions
|
||||
@ -160,7 +162,7 @@ assert not sco_parcours_dut.formsemestre_has_decisions(context, sem["formsemestr
|
||||
# Saisie d'un décision AJ, non assidu
|
||||
etudid = etuds[-1]["etudid"]
|
||||
sco_parcours_dut.formsemestre_validate_ues(
|
||||
context.Notes,
|
||||
context,
|
||||
sem["formsemestre_id"],
|
||||
etudid,
|
||||
sco_codes_parcours.AJ,
|
||||
@ -168,12 +170,12 @@ sco_parcours_dut.formsemestre_validate_ues(
|
||||
REQUEST=REQUEST,
|
||||
)
|
||||
assert sco_parcours_dut.formsemestre_has_decisions(
|
||||
context.Notes, sem["formsemestre_id"]
|
||||
)
|
||||
context, sem["formsemestre_id"]
|
||||
), "décisions manquantes"
|
||||
# Suppression de la décision
|
||||
sco_formsemestre_validation.formsemestre_validation_suppress_etud(
|
||||
context.Notes, sem["formsemestre_id"], etudid
|
||||
context, sem["formsemestre_id"], etudid
|
||||
)
|
||||
assert not sco_parcours_dut.formsemestre_has_decisions(
|
||||
context.Notes, sem["formsemestre_id"]
|
||||
)
|
||||
context, sem["formsemestre_id"]
|
||||
), "décisions non effacées"
|
||||
|
Loading…
Reference in New Issue
Block a user