Compare commits

..

7 Commits

Author SHA1 Message Date
root 2c7d55713a ajout de nouveaux tests 2021-06-09 19:27:12 +02:00
root 01820b5a91 ajout des commentaires 2021-06-09 19:21:58 +02:00
root 600016d1e0 ajout de nouveaux tests 2021-05-18 11:31:39 +02:00
root 87f136d6b9 Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc 2021-05-05 11:44:48 +02:00
root 699b482c30 mini test parametre demijournee 2021-05-03 14:57:58 +02:00
root 34e34b188c test basé sur les groupes 2021-05-03 14:29:40 +02:00
root 65221f247c test des fonctions lié aux abs 2021-05-03 13:43:11 +02:00
91 changed files with 6564 additions and 394 deletions

View File

@ -1,14 +1,13 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
SCOVERSION = "7.25m"
SCOVERSION = "7.24"
SCONAME = "ScoDoc"
SCONEWS = """
<h4>Année 2021</h4>
<ul>
<li>Version mobile (en test)</li>
<li>Évaluations de type "deuxième session"</li>
<li>Gestion du genre neutre (pas d'affichage de la civilité)</li>
<li>Diverses corrections (PV de jurys, ...)</li>

View File

@ -720,7 +720,7 @@ class ZAbsences(
+ self.sco_footer(REQUEST)
)
base_url = "SignaleAbsenceGrHebdo?datelundi=%s&%s&destination=%s" % (
base_url = "SignaleAbsenceGrHebdo?datelundi=%s&amp;%s&amp;destination=%s" % (
datelundi,
groups_infos.groups_query_args,
urllib.quote(destination),
@ -904,14 +904,14 @@ class ZAbsences(
etuds = [e for e in etuds if e["etudid"] in mod_inscrits]
if not moduleimpl_id:
moduleimpl_id = None
base_url_noweeks = "SignaleAbsenceGrSemestre?datedebut=%s&datefin=%s&%s&destination=%s" % (
base_url_noweeks = "SignaleAbsenceGrSemestre?datedebut=%s&amp;datefin=%s&amp;%s&amp;destination=%s" % (
datedebut,
datefin,
groups_infos.groups_query_args,
urllib.quote(destination),
)
base_url = (
base_url_noweeks + "&nbweeks=%s" % nbweeks
base_url_noweeks + "&amp;nbweeks=%s" % nbweeks
) # sans le moduleimpl_id
if etuds:
@ -952,9 +952,9 @@ class ZAbsences(
dates = dates[-nbweeks:]
msg = "Montrer toutes les semaines"
nwl = 0
url_link_semaines = base_url_noweeks + "&nbweeks=%s" % nwl
url_link_semaines = base_url_noweeks + "&amp;nbweeks=%s" % nwl
if moduleimpl_id:
url_link_semaines += "&moduleimpl_id=" + moduleimpl_id
url_link_semaines += "&amp;moduleimpl_id=" + moduleimpl_id
#
dates = [x.ISO() for x in dates]
dayname = sco_abs.day_names(self)[jourdebut.weekday]
@ -1027,7 +1027,7 @@ class ZAbsences(
"""<p>
Module concerné par ces absences (%(optionel_txt)s):
<select id="moduleimpl_id" name="moduleimpl_id"
onchange="document.location='%(url)s&moduleimpl_id='+document.getElementById('moduleimpl_id').value">
onchange="document.location='%(url)s&amp;moduleimpl_id='+document.getElementById('moduleimpl_id').value">
<option value="" %(sel)s>non spécifié</option>
%(menu_module)s
</select>
@ -1327,7 +1327,7 @@ class ZAbsences(
for a in absnonjust:
a["justlink"] = "<em>justifier</em>"
a["_justlink_target"] = (
"doJustifAbsence?etudid=%s&datedebut=%s&datefin=%s&demijournee=%s"
"doJustifAbsence?etudid=%s&amp;datedebut=%s&amp;datefin=%s&amp;demijournee=%s"
% (etudid, a["datedmy"], a["datedmy"], a["ampm"])
)
#
@ -1463,7 +1463,7 @@ class ZAbsences(
)
+ "<p>Période du %s au %s (nombre de <b>demi-journées</b>)<br/>"
% (debut, fin),
base_url="%s&formsemestre_id=%s&debut=%s&fin=%s"
base_url="%s&amp;formsemestre_id=%s&amp;debut=%s&amp;fin=%s"
% (groups_infos.base_url, formsemestre_id, debut, fin),
filename="etat_abs_"
+ scu.make_filename(
@ -1700,7 +1700,7 @@ ou entrez une date pour visualiser les absents un jour donné&nbsp;:
"ProcessBilletAbsenceForm?billet_id=%s" % b["billet_id"]
)
if etud:
b["_etat_str_target"] += "&etudid=%s" % etud["etudid"]
b["_etat_str_target"] += "&amp;etudid=%s" % etud["etudid"]
b["_billet_id_target"] = b["_etat_str_target"]
else:
b["etat_str"] = "ok"

View File

@ -554,7 +554,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
)
if redirect:
return REQUEST.RESPONSE.redirect(
"ue_list?formation_id=" + new_id + "&msg=Nouvelle version !"
"ue_list?formation_id=" + new_id + "&amp;msg=Nouvelle version !"
)
else:
return new_id, modules_old2new, ues_old2new
@ -1242,7 +1242,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
]
for ens in M["ens"]:
H.append(
'<li>%s (<a class="stdlink" href="edit_enseignants_form_delete?moduleimpl_id=%s&ens_id=%s">supprimer</a>)</li>'
'<li>%s (<a class="stdlink" href="edit_enseignants_form_delete?moduleimpl_id=%s&amp;ens_id=%s">supprimer</a>)</li>'
% (
login2display.get(ens["ens_id"], ens["ens_id"]),
moduleimpl_id,
@ -1254,7 +1254,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
saisir et modifier toutes les notes des évaluations de ce module.
</p>
<p class="help">Pour changer le responsable du module, passez par la
page "<a class="stdlink" href="formsemestre_editwithmodules?formation_id=%s&formsemestre_id=%s">Modification du semestre</a>", accessible uniquement au responsable de la formation (chef de département)
page "<a class="stdlink" href="formsemestre_editwithmodules?formation_id=%s&amp;formsemestre_id=%s">Modification du semestre</a>", accessible uniquement au responsable de la formation (chef de département)
</p>
""" % (
sem["formation_id"],
@ -1401,7 +1401,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
return REQUEST.RESPONSE.redirect(
"moduleimpl_status?moduleimpl_id="
+ moduleimpl_id
+ "&head_message=responsable%20modifié"
+ "&amp;head_message=responsable%20modifié"
)
_expr_help = """<p class="help">Expérimental: formule de calcul de la moyenne %(target)s</p>
@ -1489,7 +1489,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
return REQUEST.RESPONSE.redirect(
"moduleimpl_status?moduleimpl_id="
+ moduleimpl_id
+ "&head_message=règle%20de%20calcul%20modifiée"
+ "&amp;head_message=règle%20de%20calcul%20modifiée"
)
security.declareProtected(ScoView, "view_module_abs")
@ -1630,7 +1630,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id="
+ formsemestre_id
+ "&head_message=règle%20de%20calcul%20modifiée"
+ "&amp;head_message=règle%20de%20calcul%20modifiée"
)
security.declareProtected(ScoView, "formsemestre_enseignants_list")
@ -1860,7 +1860,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
raise ScoValueError(
"""Désinscription impossible: l'étudiant a une décision de jury
(la supprimer avant si nécessaire:
<a href="formsemestre_validation_suppress_etud?etudid=%s&formsemestre_id=%s">
<a href="formsemestre_validation_suppress_etud?etudid=%s&amp;formsemestre_id=%s">
supprimer décision jury</a>
)
"""
@ -2682,7 +2682,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
if not can_edit_app:
raise AccessDenied("vous n'avez pas le droit d'ajouter une appreciation")
#
bull_url = "formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" % (
bull_url = "formsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s" % (
formsemestre_id,
etudid,
)
@ -3026,7 +3026,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
OK="Supprimer",
dest_url="",
REQUEST=REQUEST,
cancel_url="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s"
cancel_url="formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s"
% (formsemestre_id, etudid),
parameters={"etudid": etudid, "formsemestre_id": formsemestre_id},
)
@ -3036,7 +3036,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
)
return REQUEST.RESPONSE.redirect(
self.ScoURL()
+ "/Notes/formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&head_message=Décision%%20supprimée"
+ "/Notes/formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s&amp;head_message=Décision%%20supprimée"
% (formsemestre_id, etudid)
)

View File

@ -504,11 +504,6 @@ class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp
% REQUEST.BASE0
)
# Lien expérimental temporaire:
H.append(
'<p><a href="/ScoDoc/static/mobile">Version mobile (expérimentale, à vos risques et périls)</a></p>'
)
H.append(
"""
<div id="scodoc_attribution">

View File

@ -261,7 +261,7 @@ class ZScoUsers(
security.declareProtected(ScoUsersAdmin, "user_info")
def user_info(self, user_name=None, user=None, format=None, REQUEST=None):
def user_info(self, user_name=None, user=None):
"""Donne infos sur l'utilisateur (qui peut ne pas etre dans notre base).
Si user_name est specifie, interroge la BD. Sinon, user doit etre un dict.
"""
@ -322,7 +322,7 @@ class ZScoUsers(
# nomnoacc est le nom en minuscules sans accents
info["nomnoacc"] = scu.suppress_accents(scu.strlower(info["nom"]))
return scu.sendResult(REQUEST, info, name="user", format=format)
return info
def _can_handle_passwd(self, authuser, user_name, allow_admindepts=False):
"""true if authuser can see or change passwd of user_name.
@ -523,7 +523,7 @@ class ZScoUsers(
if authuser.has_permission(ScoUsersAdmin, self):
H.append(
"""
<li><a class="stdlink" href="create_user_form?user_name=%(user_name)s&edit=1">modifier/déactiver ce compte</a></li>
<li><a class="stdlink" href="create_user_form?user_name=%(user_name)s&amp;edit=1">modifier/déactiver ce compte</a></li>
<li><a class="stdlink" href="delete_user_form?user_name=%(user_name)s">supprimer cet utilisateur</a> <em>(à n'utiliser qu'en cas d'erreur !)</em></li>
"""
% info[0]

View File

@ -279,7 +279,7 @@ class ZScolar(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Programme DUT TEST</title>
<title>Programme DUT R&amp;T</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="LANG" content="fr" />
@ -679,7 +679,7 @@ REQUEST.URL0=%s<br/>
date = date.next()
FA.append("</select>")
FA.append(
'<a href="Absences/EtatAbsencesGr?group_ids=%%(group_id)s&debut=%(date_debut)s&fin=%(date_fin)s">état</a>'
'<a href="Absences/EtatAbsencesGr?group_ids=%%(group_id)s&amp;debut=%(date_debut)s&amp;fin=%(date_fin)s">état</a>'
% sem
)
FA.append("</form></td>")
@ -715,8 +715,8 @@ REQUEST.URL0=%s<br/>
"""<td>
<a href="%(url)s/groups_view?group_ids=%(group_id)s">%(label)s</a>
</td><td>
(<a href="%(url)s/groups_view?group_ids=%(group_id)s&format=xls">format tableur</a>)
<a href="%(url)s/groups_view?curtab=tab-photos&group_ids=%(group_id)s&etat=I">Photos</a>
(<a href="%(url)s/groups_view?group_ids=%(group_id)s&amp;format=xls">format tableur</a>)
<a href="%(url)s/groups_view?curtab=tab-photos&amp;group_ids=%(group_id)s&amp;etat=I">Photos</a>
</td>"""
% group
)
@ -1174,7 +1174,7 @@ REQUEST.URL0=%s<br/>
scolars.etud_annotations_delete(cnx, annotation_id)
return REQUEST.RESPONSE.redirect(
"ficheEtud?etudid=%s&head_message=Annotation%%20supprimée" % (etudid)
"ficheEtud?etudid=%s&amp;head_message=Annotation%%20supprimée" % (etudid)
)
security.declareProtected(ScoEtudChangeAdr, "formChangeCoordonnees")
@ -2776,7 +2776,7 @@ def _simple_error_page(context, msg, DeptId=None):
H = [context.standard_html_header(context), "<h2>Erreur !</h2>", "<p>", msg, "</p>"]
if DeptId:
H.append(
'<p><a href="delete_dept?DeptId=%s&force=1">Supprimer le dossier %s</a>(très recommandé !)</p>'
'<p><a href="delete_dept?DeptId=%s&amp;force=1">Supprimer le dossier %s</a>(très recommandé !)</p>'
% (DeptId, DeptId)
)
H.append(context.standard_html_footer(context))

View File

@ -45,16 +45,9 @@ def bonus_iutv(notes_sport, coefs, infos=None):
return bonus
def bonus_direct(notes_sport, coefs, infos=None):
"""Un bonus direct et sans chichis: les points sont directement ajoutés à la moyenne générale.
Les coefficients sont ignorés: tous les points de bonus sont sommés.
(rappel: la note est ramenée sur 20 avant application).
"""
return sum(notes_sport)
def bonus_iut_stdenis(notes_sport, coefs, infos=None):
"""Semblable à bonus_iutv mais sans coefficients et total limité à 0.5 points."""
"""Semblable à bonus_iutv mais sans coefficients et total limité à 0.5 points.
"""
points = sum([x - 10 for x in notes_sport if x > 10]) # points au dessus de 10
bonus = points * 0.05 # ou / 20
return min(bonus, 0.5) # bonus limité à 1/2 point
@ -69,7 +62,7 @@ def bonus_colmar(notes_sport, coefs, infos=None):
sur 20 obtenus dans chacune des matières optionnelles sont cumulés
dans la limite de 10 points. 5% de ces points cumulés s'ajoutent à
la moyenne générale du semestre déjà obtenue par l'étudiant.
"""
# les coefs sont ignorés
points = sum([x - 10 for x in notes_sport if x > 10])
@ -80,7 +73,7 @@ def bonus_colmar(notes_sport, coefs, infos=None):
def bonus_iutva(notes_sport, coefs, infos=None):
"""Calcul bonus modules optionels (sport, culture), règle IUT Ville d'Avray
Les étudiants de l'IUT peuvent suivre des enseignements optionnels
de l'Université Paris 10 (C2I) non rattachés à une unité d'enseignement.
Si la note est >= 10 et < 12, bonus de 0.1 point
@ -100,13 +93,42 @@ def bonus_iutva(notes_sport, coefs, infos=None):
return 0
# XXX Inutilisé (mai 2020) ? à confirmer avant suppression XXX
# def bonus_iut1grenoble_v0(notes_sport, coefs, infos=None):
# """Calcul bonus sport IUT Grenoble sur la moyenne générale
#
# La note de sport de nos étudiants va de 0 à 5 points.
# Chaque point correspond à un % qui augmente la moyenne de chaque UE et la moyenne générale.
# Par exemple : note de sport 2/5 : chaque UE sera augmentée de 2%, ainsi que la moyenne générale.
#
# Calcul ici du bonus sur moyenne générale et moyennes d'UE non capitalisées.
# """
# # les coefs sont ignorés
# # notes de 0 à 5
# points = sum([x for x in notes_sport])
# factor = (points / 4.0) / 100.0
# bonus = infos["moy"] * factor
# # Modifie les moyennes de toutes les UE:
# for ue_id in infos["moy_ues"]:
# ue_status = infos["moy_ues"][ue_id]
# if ue_status["sum_coefs"] > 0:
# # modifie moyenne UE ds semestre courant
# ue_status["cur_moy_ue"] = ue_status["cur_moy_ue"] * (1.0 + factor)
# if not ue_status["is_capitalized"]:
# # si non capitalisee, modifie moyenne prise en compte
# ue_status["moy"] = ue_status["cur_moy_ue"]
#
# # open('/tmp/log','a').write( pprint.pformat(ue_status) + '\n\n' )
# return bonus
def bonus_iut1grenoble_2017(notes_sport, coefs, infos=None):
"""Calcul bonus sport IUT Grenoble sur la moyenne générale (version 2017)
La note de sport de nos étudiants va de 0 à 5 points.
La note de sport de nos étudiants va de 0 à 5 points.
Chaque point correspond à un % qui augmente la moyenne de chaque UE et la moyenne générale.
Par exemple : note de sport 2/5 : la moyenne générale sera augmentée de 2%.
Calcul ici du bonus sur moyenne générale
"""
# les coefs sont ignorés
@ -140,14 +162,14 @@ def bonus_lille(notes_sport, coefs, infos=None):
def bonus_iutlh(notes_sport, coefs, infos=None):
"""Calcul bonus sport IUT du Havre sur moyenne générale et UE
La note de sport de nos étudiants va de 0 à 20 points.
m2=m1*(1+0.005*((10-N1)+(10-N2))
m2 : Nouvelle moyenne de l'unité d'enseignement si note de sport et/ou de langue supérieure à 10
m1 : moyenne de l'unité d'enseignement avant bonification
N1 : note de sport si supérieure à 10
N2 : note de seconde langue si supérieure à 10
Par exemple : sport 15/20 et langue 12/20 : chaque UE sera multipliée par 1+0.005*7, ainsi que la moyenne générale.
Calcul ici de la moyenne générale et moyennes d'UE non capitalisées.
La note de sport de nos étudiants va de 0 à 20 points.
m2=m1*(1+0.005*((10-N1)+(10-N2))
m2 : Nouvelle moyenne de l'unité d'enseignement si note de sport et/ou de langue supérieure à 10
m1 : moyenne de l'unité d'enseignement avant bonification
N1 : note de sport si supérieure à 10
N2 : note de seconde langue si supérieure à 10
Par exemple : sport 15/20 et langue 12/20 : chaque UE sera multipliée par 1+0.005*7, ainsi que la moyenne générale.
Calcul ici de la moyenne générale et moyennes d'UE non capitalisées.
"""
# les coefs sont ignorés
points = sum([x - 10 for x in notes_sport if x > 10])
@ -183,8 +205,8 @@ def bonus_tours(notes_sport, coefs, infos=None):
def bonus_iutr(notes_sport, coefs, infos=None):
"""Calcul du bonus , regle de l'IUT de Roanne (contribuée par Raphael C., nov 2012)
Le bonus est compris entre 0 et 0.35 point.
cette procédure modifie la moyenne de chaque UE capitalisable.
Le bonus est compris entre 0 et 0.35 point.
cette procédure modifie la moyenne de chaque UE capitalisable.
"""
# modifie les moyennes de toutes les UE:
@ -238,7 +260,7 @@ def bonus_saint_etienne(notes_sport, coefs, infos=None):
"""IUT de Saint-Etienne (jan 2014)
Nous avons différents types de bonification
bonfication Sport / Associations
coopératives de département / Bureau Des Étudiants
coopératives de département / Bureau Des Étudiants
/ engagement citoyen / Langues optionnelles
Nous ajoutons sur le bulletin une bonification qui varie entre 0,1 et 0,3 ou 0,35 pour chaque item
la bonification totale ne doit pas excéder les 0,6 point.
@ -256,9 +278,9 @@ def bonus_saint_etienne(notes_sport, coefs, infos=None):
def bonus_iutTarbes(notes_sport, coefs, infos=None):
"""Calcul bonus modules optionnels
"""Calcul bonus modules optionnels
(sport, Langues, action sociale, Théâtre), règle IUT Tarbes
Les coefficients ne sont pas pris en compte,
Les coefficients ne sont pas pris en compte,
seule la meilleure note est prise en compte
le 1/30ème des points au-dessus de 10 sur 20 est retenu et s'ajoute à
la moyenne générale du semestre déjà obtenue par l'étudiant.
@ -386,7 +408,7 @@ def bonus_iutbethune(notes_sport, coefs, infos=None):
def bonus_demo(notes_sport, coefs, infos=None):
"""Fausse fonction "bonus" pour afficher les informations disponibles
et aider les développeurs.
Les informations sont placées dans le fichier /tmp/scodoc_bonus.log
Les informations sont placées dans le fichier /tmp/scodoc_bonus.log
qui est ECRASE à chaque appel.
*** Ne pas utiliser en production !!! ***
"""

View File

@ -34,11 +34,9 @@ export POSTGRES_USER=www-data
if [ "${debian_version}" = "10" ]
then
PSQL=/usr/lib/postgresql/11/bin/psql
export POSTGRES_SERVICE="postgresql@11-main.service"
elif [ "${debian_version}" = "9" ]
then
PSQL=/usr/lib/postgresql/9.6/bin/psql
export POSTGRES_SERVICE="postgresql"
elif [ "${debian_version}" = "8" ]
then
PSQL=/usr/lib/postgresql/9.4/bin/psql

View File

@ -8,13 +8,7 @@ source utils.sh
check_uid_root $0
echo 'Installation du demarrage automatique de ScoDoc (systemd)'
# La variable POSTGRES_SERVICE doit être positionnée dans config.sh
# suivant la version de Debian et de postgresql
[ -z "${POSTGRES_SERVICE}" ] && die "incompatible Debian version"
cat "$SCODOC_DIR/config/etc/scodoc.service" | sed 's/{{postgresql}}/'"${POSTGRES_SERVICE}"'/g' > /etc/systemd/system/scodoc.service
cp $SCODOC_DIR/config/etc/scodoc.service /etc/systemd/system
systemctl enable scodoc.service
echo "A partir de maintenant, utiliser"

View File

@ -1,15 +1,13 @@
# ScoDoc7 service
# Zope based
# Depends on {{postgresql}} (replaced by installation script by
# postgresql@11-main.service on Debian 10
# postgresql on Debian <= 9
# => is restarted when {{postgresql}} restarts
# Depends on postgresql
# => is restarted when postgresql restarts
#
[Unit]
Description=ScoDoc 7 service
After=network.target {{postgresql}}
Requires={{postgresql}}
PartOf={{postgresql}}
After=network.target postgresql@11-main.service
Requires=postgresql@11-main.service
PartOf=postgresql@11-main.service
StartLimitIntervalSec=0
[Service]
@ -23,4 +21,4 @@ ExecStop=/opt/scodoc/bin/zopectl stop
ExecReload=/opt/scodoc/bin/zopectl restart
[Install]
WantedBy={{postgresql}}
WantedBy=postgresql@11-main.service

View File

@ -32,13 +32,11 @@ fi
chgrp www-data $SCODOC_DIR $SCODOC_DIR/ZopeProducts/*
chmod g+w $SCODOC_DIR $SCODOC_DIR/ZopeProducts/*
if [ -d "${SCODOC_VAR_DIR}"/photos ]; then
chgrp -R www-data "${SCODOC_VAR_DIR}"/photos
chmod -R g+w "${SCODOC_VAR_DIR}"/photos
fi
chgrp -R www-data "${SCODOC_VAR_DIR}"/photos
chmod -R g+w "${SCODOC_VAR_DIR}"/photos
if [ ! -e "${SCODOC_VERSION_DIR}" ]; then
mkdir -p "${SCODOC_VERSION_DIR}"
mkdir "${SCODOC_VERSION_DIR}"
chown www-data.www-data "${SCODOC_VERSION_DIR}"
fi
@ -220,7 +218,9 @@ read ans
if [ "$(norm_ans "$ans")" != 'N' ]
then
# ScoDoc 7.19+ uses systemd
$SCODOC_DIR/config/configure_systemd.sh
echo 'Installation du demarrage automatique de ScoDoc (systemd)'
cp $SCODOC_DIR/config/etc/scodoc.service /etc/systemd/system
systemctl enable scodoc.service
fi

View File

@ -51,7 +51,7 @@ then
fi
chown root "$DEST"
# Zope DB, ScoDoc archives, configuration, photos, etc.
# Zope DB and ScoDoc archives:
echo "Copying var/ ..."
cp -rp "$INSTANCE_DIR/var" "$DEST"

View File

@ -67,11 +67,7 @@ def go(app, n=0, verbose=True):
def go_dept(app, dept, verbose=True):
objs = app.ScoDoc.objectValues("Folder")
for o in objs:
try:
context = o.Scolarite
except AttributeError:
# ignore other folders, like old "icons"
continue
context = o.Scolarite
if context.DeptId() == dept:
if verbose:
print("context in dept ", context.DeptId())

View File

@ -445,14 +445,14 @@ class GenTable:
if self.base_url:
if self.xls_link:
H.append(
' <a href="%s&format=xls">%s</a>'
' <a href="%s&amp;format=xls">%s</a>'
% (self.base_url, scu.ICON_XLS)
)
if self.xls_link and self.pdf_link:
H.append("&nbsp;&nbsp;")
if self.pdf_link:
H.append(
' <a href="%s&format=pdf">%s</a>'
' <a href="%s&amp;format=pdf">%s</a>'
% (self.base_url, scu.ICON_PDF)
)
H.append("</p>")

View File

@ -733,8 +733,8 @@ def ListeAbsEtud(
etudid, datedebut, with_evals=with_evals, format=format
)
if REQUEST:
base_url_nj = "%s?etudid=%s&absjust_only=0" % (REQUEST.URL0, etudid)
base_url_j = "%s?etudid=%s&absjust_only=1" % (REQUEST.URL0, etudid)
base_url_nj = "%s?etudid=%s&amp;absjust_only=0" % (REQUEST.URL0, etudid)
base_url_j = "%s?etudid=%s&amp;absjust_only=1" % (REQUEST.URL0, etudid)
else:
base_url_nj = base_url_j = ""
tab_absnonjust = GenTable(

View File

@ -484,7 +484,7 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement.
# submitted or cancelled:
return REQUEST.RESPONSE.redirect(
"formsemestre_list_archives?formsemestre_id=%s&head_message=%s"
"formsemestre_list_archives?formsemestre_id=%s&amp;head_message=%s"
% (formsemestre_id, msg)
)
@ -510,7 +510,7 @@ def formsemestre_list_archives(context, REQUEST, formsemestre_id):
for a in L:
archive_name = PVArchive.get_archive_name(a["archive_id"])
H.append(
'<li>%s : <em>%s</em> (<a href="formsemestre_delete_archive?formsemestre_id=%s&archive_name=%s">supprimer</a>)<ul>'
'<li>%s : <em>%s</em> (<a href="formsemestre_delete_archive?formsemestre_id=%s&amp;archive_name=%s">supprimer</a>)<ul>'
% (
a["date"].strftime("%d/%m/%Y %H:%M"),
a["description"],
@ -520,7 +520,7 @@ def formsemestre_list_archives(context, REQUEST, formsemestre_id):
)
for filename in a["content"]:
H.append(
'<li><a href="formsemestre_get_archived_file?formsemestre_id=%s&archive_name=%s&filename=%s">%s</a></li>'
'<li><a href="formsemestre_get_archived_file?formsemestre_id=%s&amp;archive_name=%s&amp;filename=%s">%s</a></li>'
% (formsemestre_id, archive_name, filename, filename)
)
if not a["content"]:
@ -570,4 +570,4 @@ def formsemestre_delete_archive(
)
PVArchive.delete_archive(archive_id)
return REQUEST.RESPONSE.redirect(dest_url + "&head_message=Archive%20supprimée")
return REQUEST.RESPONSE.redirect(dest_url + "&amp;head_message=Archive%20supprimée")

View File

@ -83,14 +83,14 @@ def etud_list_archives_html(context, REQUEST, etudid):
)
for filename in a["content"]:
H.append(
"""<a class="stdlink etudarchive_link" href="etud_get_archived_file?etudid=%s&archive_name=%s&filename=%s">%s</a>"""
"""<a class="stdlink etudarchive_link" href="etud_get_archived_file?etudid=%s&amp;archive_name=%s&amp;filename=%s">%s</a>"""
% (etudid, archive_name, filename, filename)
)
if not a["content"]:
H.append("<em>aucun fichier !</em>")
if can_edit:
H.append(
'<span class="deletudarchive"><a class="smallbutton" href="etud_delete_archive?etudid=%s&archive_name=%s">%s</a></span>'
'<span class="deletudarchive"><a class="smallbutton" href="etud_delete_archive?etudid=%s&amp;archive_name=%s">%s</a></span>'
% (etudid, archive_name, delete_icon)
)
else:
@ -216,7 +216,7 @@ def etud_delete_archive(context, REQUEST, etudid, archive_name, dialog_confirmed
)
EtudsArchive.delete_archive(archive_id)
return REQUEST.RESPONSE.redirect(dest_url + "&head_message=Archive%20supprimée")
return REQUEST.RESPONSE.redirect(dest_url + "&amp;head_message=Archive%20supprimée")
def etud_get_archived_file(context, REQUEST, etudid, archive_name, filename):

View File

@ -329,7 +329,7 @@ def formsemestre_bulletinetud_dict(
)
u[
"ue_descr_html"
] = '<a href="formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" title="%s" class="bull_link">%s</a>' % (
] = '<a href="formsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s" title="%s" class="bull_link">%s</a>' % (
sem_origin["formsemestre_id"],
etudid,
sem_origin["titreannee"],
@ -522,7 +522,7 @@ def _ue_mod_bulletin(context, etudid, formsemestre_id, ue_id, modimpls, nt, vers
else:
e["name"] = e["description"] or "le %s" % e["jour"]
e["target_html"] = (
"evaluation_listenotes?evaluation_id=%s&format=html&tf-submitted=1"
"evaluation_listenotes?evaluation_id=%s&amp;format=html&amp;tf-submitted=1"
% e["evaluation_id"]
)
e["name_html"] = '<a class="bull_link" href="%s">%s</a>' % (
@ -571,7 +571,7 @@ def _ue_mod_bulletin(context, etudid, formsemestre_id, ue_id, modimpls, nt, vers
mod["evaluations_incompletes"].append(e)
e["name"] = (e["description"] or "") + " (%s)" % e["jour"]
e["target_html"] = (
"evaluation_listenotes?evaluation_id=%s&format=html&tf-submitted=1"
"evaluation_listenotes?evaluation_id=%s&amp;format=html&amp;tf-submitted=1"
% e["evaluation_id"]
)
e["name_html"] = '<a class="bull_link" href="%s">%s</a>' % (
@ -816,7 +816,7 @@ def formsemestre_bulletinetud(
if sem["modalite"] == "EXT":
R.append(
"""<p><a
href="formsemestre_ext_edit_ue_validations?formsemestre_id=%s&etudid=%s"
href="formsemestre_ext_edit_ue_validations?formsemestre_id=%s&amp;etudid=%s"
class="stdlink">
Editer les validations d'UE dans ce semestre extérieur
</a></p>"""
@ -1076,7 +1076,7 @@ def _formsemestre_bulletinetud_header_html(
menuBul = [
{
"title": "Réglages bulletins",
"url": "formsemestre_edit_options?formsemestre_id=%s&target_url=%s"
"url": "formsemestre_edit_options?formsemestre_id=%s&amp;target_url=%s"
% (formsemestre_id, qurl),
"enabled": (uid in sem["responsables"])
or authuser.has_permission(ScoImplement, context),
@ -1087,13 +1087,13 @@ def _formsemestre_bulletinetud_header_html(
context, formsemestre_id
),
"url": url
+ "?formsemestre_id=%s&etudid=%s&format=pdf&version=%s"
+ "?formsemestre_id=%s&amp;etudid=%s&amp;format=pdf&amp;version=%s"
% (formsemestre_id, etudid, version),
},
{
"title": "Envoi par mail à %s" % etud["email"],
"url": url
+ "?formsemestre_id=%s&etudid=%s&format=pdfmail&version=%s"
+ "?formsemestre_id=%s&amp;etudid=%s&amp;format=pdfmail&amp;version=%s"
% (formsemestre_id, etudid, version),
"enabled": etud["email"]
and can_send_bulletin_by_mail(
@ -1103,7 +1103,7 @@ def _formsemestre_bulletinetud_header_html(
{
"title": "Envoi par mail à %s (adr. personnelle)" % etud["emailperso"],
"url": url
+ "?formsemestre_id=%s&etudid=%s&format=pdfmail&version=%s&prefer_mail_perso=1"
+ "?formsemestre_id=%s&amp;etudid=%s&amp;format=pdfmail&amp;version=%s&amp;prefer_mail_perso=1"
% (formsemestre_id, etudid, version),
"enabled": etud["emailperso"]
and can_send_bulletin_by_mail(
@ -1113,12 +1113,12 @@ def _formsemestre_bulletinetud_header_html(
{
"title": "Version XML",
"url": url
+ "?formsemestre_id=%s&etudid=%s&format=xml&version=%s"
+ "?formsemestre_id=%s&amp;etudid=%s&amp;format=xml&amp;version=%s"
% (formsemestre_id, etudid, version),
},
{
"title": "Ajouter une appréciation",
"url": "appreciation_add_form?etudid=%s&formsemestre_id=%s"
"url": "appreciation_add_form?etudid=%s&amp;formsemestre_id=%s"
% (etudid, formsemestre_id),
"enabled": (
(authuser in sem["responsables"])
@ -1127,31 +1127,31 @@ def _formsemestre_bulletinetud_header_html(
},
{
"title": "Enregistrer un semestre effectué ailleurs",
"url": "formsemestre_ext_create_form?etudid=%s&formsemestre_id=%s"
"url": "formsemestre_ext_create_form?etudid=%s&amp;formsemestre_id=%s"
% (etudid, formsemestre_id),
"enabled": authuser.has_permission(ScoImplement, context),
},
{
"title": "Enregistrer une validation d'UE antérieure",
"url": "formsemestre_validate_previous_ue?etudid=%s&formsemestre_id=%s"
"url": "formsemestre_validate_previous_ue?etudid=%s&amp;formsemestre_id=%s"
% (etudid, formsemestre_id),
"enabled": context._can_validate_sem(REQUEST, formsemestre_id),
},
{
"title": "Enregistrer note d'une UE externe",
"url": "external_ue_create_form?etudid=%s&formsemestre_id=%s"
"url": "external_ue_create_form?etudid=%s&amp;formsemestre_id=%s"
% (etudid, formsemestre_id),
"enabled": context._can_validate_sem(REQUEST, formsemestre_id),
},
{
"title": "Entrer décisions jury",
"url": "formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s"
"url": "formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s"
% (formsemestre_id, etudid),
"enabled": context._can_validate_sem(REQUEST, formsemestre_id),
},
{
"title": "Editer PV jury",
"url": "formsemestre_pvjury_pdf?formsemestre_id=%s&etudid=%s"
"url": "formsemestre_pvjury_pdf?formsemestre_id=%s&amp;etudid=%s"
% (formsemestre_id, etudid),
"enabled": True,
},
@ -1164,7 +1164,7 @@ def _formsemestre_bulletinetud_header_html(
'<td> <a href="%s">%s</a></td>'
% (
url
+ "?formsemestre_id=%s&etudid=%s&format=pdf&version=%s"
+ "?formsemestre_id=%s&amp;etudid=%s&amp;format=pdf&amp;version=%s"
% (formsemestre_id, etudid, version),
scu.ICON_PDF,
)

View File

@ -324,7 +324,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator):
for app in I["appreciations_list"]:
if can_edit_app:
mlink = (
'<a class="stdlink" href="appreciation_add_form?id=%s">modifier</a> <a class="stdlink" href="appreciation_add_form?id=%s&suppress=1">supprimer</a>'
'<a class="stdlink" href="appreciation_add_form?id=%s">modifier</a> <a class="stdlink" href="appreciation_add_form?id=%s&amp;suppress=1">supprimer</a>'
% (app["id"], app["id"])
)
else:
@ -335,7 +335,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator):
)
if can_edit_app:
H.append(
'<p><a class="stdlink" href="appreciation_add_form?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s">Ajouter une appréciation</a></p>'
'<p><a class="stdlink" href="appreciation_add_form?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s">Ajouter une appréciation</a></p>'
% self.infos
)
H.append("</div>")

View File

@ -159,7 +159,7 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator):
for app in self.infos["appreciations_list"]:
if can_edit_app:
mlink = (
'<a class="stdlink" href="appreciation_add_form?id=%s">modifier</a> <a class="stdlink" href="appreciation_add_form?id=%s&suppress=1">supprimer</a>'
'<a class="stdlink" href="appreciation_add_form?id=%s">modifier</a> <a class="stdlink" href="appreciation_add_form?id=%s&amp;suppress=1">supprimer</a>'
% (app["id"], app["id"])
)
else:
@ -170,7 +170,7 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator):
)
if can_edit_app:
H.append(
'<p><a class="stdlink" href="appreciation_add_form?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s">Ajouter une appréciation</a></p>'
'<p><a class="stdlink" href="appreciation_add_form?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s">Ajouter une appréciation</a></p>'
% self.infos
)
H.append("</div>")

View File

@ -194,7 +194,7 @@ def formsemestre_estim_cost(
)
tab.html_before_table = h
tab.base_url = (
"%s?formsemestre_id=%s&n_group_td=%s&n_group_tp=%s&coef_tp=%s"
"%s?formsemestre_id=%s&amp;n_group_td=%s&amp;n_group_tp=%s&amp;coef_tp=%s"
% (REQUEST.URL0, formsemestre_id, n_group_td, n_group_tp, coef_tp)
)

View File

@ -435,14 +435,14 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
H.append('<li class="notes_ue_list">')
if iue != 0 and editable:
H.append(
'<a href="ue_move?ue_id=%s&after=0" class="aud">%s</a>'
'<a href="ue_move?ue_id=%s&amp;after=0" class="aud">%s</a>'
% (UE["ue_id"], arrow_up)
)
else:
H.append(arrow_none)
if iue < len(ue_list) - 1 and editable:
H.append(
'<a href="ue_move?ue_id=%s&after=1" class="aud">%s</a>'
'<a href="ue_move?ue_id=%s&amp;after=1" class="aud">%s</a>'
% (UE["ue_id"], arrow_down)
)
else:
@ -500,14 +500,14 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
H.append('<span class="notes_module_list_buts">')
if im != 0 and editable:
H.append(
'<a href="module_move?module_id=%s&after=0" class="aud">%s</a>'
'<a href="module_move?module_id=%s&amp;after=0" class="aud">%s</a>'
% (Mod["module_id"], arrow_up)
)
else:
H.append(arrow_none)
if im < len(Modlist) - 1 and editable:
H.append(
'<a href="module_move?module_id=%s&after=1" class="aud">%s</a>'
'<a href="module_move?module_id=%s&amp;after=1" class="aud">%s</a>'
% (Mod["module_id"], arrow_down)
)
else:
@ -620,9 +620,9 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
"""
<li><a class="stdlink" href="formation_table_recap?formation_id=%(formation_id)s">Table récapitulative de la formation</a></li>
<li><a class="stdlink" href="formation_export?formation_id=%(formation_id)s&format=xml">Export XML de la formation</a> (permet de la sauvegarder pour l'échanger avec un autre site)</li>
<li><a class="stdlink" href="formation_export?formation_id=%(formation_id)s&amp;format=xml">Export XML de la formation</a> (permet de la sauvegarder pour l'échanger avec un autre site)</li>
<li><a class="stdlink" href="formation_export?formation_id=%(formation_id)s&format=json">Export JSON de la formation</a></li>
<li><a class="stdlink" href="formation_export?formation_id=%(formation_id)s&amp;format=json">Export JSON de la formation</a></li>
<li><a class="stdlink" href="module_list?formation_id=%(formation_id)s">Liste détaillée des modules de la formation</a> (debug) </li>
</ul>
@ -646,7 +646,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
H.append(" [verrouillé]")
else:
H.append(
' <a class="stdlink" href="formsemestre_editwithmodules?formation_id=%(formation_id)s&formsemestre_id=%(formsemestre_id)s">Modifier</a>'
' <a class="stdlink" href="formsemestre_editwithmodules?formation_id=%(formation_id)s&amp;formsemestre_id=%(formsemestre_id)s">Modifier</a>'
% sem
)
H.append("</li>")
@ -655,7 +655,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
if authuser.has_permission(ScoImplement, context):
H.append(
"""<ul>
<li><a class="stdlink" href="formsemestre_createwithmodules?formation_id=%(formation_id)s&semestre_id=1">Mettre en place un nouveau semestre de formation %(acronyme)s</a>
<li><a class="stdlink" href="formsemestre_createwithmodules?formation_id=%(formation_id)s&amp;semestre_id=1">Mettre en place un nouveau semestre de formation %(acronyme)s</a>
</li>
</ul>"""

View File

@ -177,8 +177,8 @@ def apo_semset_maq_status(
H.append("""<li>Il y a plusieurs années scolaires !</li>""")
if nips_no_sco: # seulement un warning
url_list = (
"view_apo_etuds?semset_id=%s&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&nips=%s"
% (semset_id, "&nips=".join(nips_no_sco))
"view_apo_etuds?semset_id=%s&amp;title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&amp;nips=%s"
% (semset_id, "&amp;nips=".join(nips_no_sco))
)
H.append(
'<li class="apo_csv_warning">Attention: il y a <a href="%s">%d étudiant(s)</a> dans les maquettes Apogée chargées non inscrit(s) dans ce semestre ScoDoc;</li>'
@ -196,8 +196,8 @@ def apo_semset_maq_status(
if nips_no_apo:
url_list = (
"view_scodoc_etuds?semset_id=%s&title=Etudiants%%20ScoDoc%%20non%%20listés%%20dans%%20les%%20maquettes%%20Apogée%%20chargées&nips=%s"
% (semset_id, "&nips=".join(nips_no_apo))
"view_scodoc_etuds?semset_id=%s&amp;title=Etudiants%%20ScoDoc%%20non%%20listés%%20dans%%20les%%20maquettes%%20Apogée%%20chargées&amp;nips=%s"
% (semset_id, "&amp;nips=".join(nips_no_apo))
)
H.append(
'<li><a href="%s">%d étudiants</a> dans ce semestre non présents dans les maquettes Apogée chargées</li>'
@ -206,8 +206,8 @@ def apo_semset_maq_status(
if nips_no_sco: # seulement un warning
url_list = (
"view_apo_etuds?semset_id=%s&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&nips=%s"
% (semset_id, "&nips=".join(nips_no_sco))
"view_apo_etuds?semset_id=%s&amp;title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&amp;nips=%s"
% (semset_id, "&amp;nips=".join(nips_no_sco))
)
H.append(
'<li class="apo_csv_warning">Attention: il reste <a href="%s">%d étudiants</a> dans les maquettes Apogée chargées mais pas inscrits dans ce semestre ScoDoc</li>'
@ -216,8 +216,8 @@ def apo_semset_maq_status(
if apo_dups:
url_list = (
"view_apo_etuds?semset_id=%s&title=Doublons%%20Apogee&nips=%s"
% (semset_id, "&nips=".join(apo_dups))
"view_apo_etuds?semset_id=%s&amp;title=Doublons%%20Apogee&amp;nips=%s"
% (semset_id, "&amp;nips=".join(apo_dups))
)
H.append(
'<li><a href="%s">%d étudiants</a> présents dans les <em>plusieurs</em> maquettes Apogée chargées</li>'
@ -673,7 +673,7 @@ def view_apo_csv_delete(
context, etape_apo, semset["annee_scolaire"], semset["sem_id"]
)
sco_etape_apogee.apo_csv_delete(context, info["archive_id"])
return REQUEST.RESPONSE.redirect(dest_url + "&head_message=Archive%20supprimée")
return REQUEST.RESPONSE.redirect(dest_url + "&amp;head_message=Archive%20supprimée")
def view_apo_csv(context, etape_apo="", semset_id="", format="html", REQUEST=None):

View File

@ -236,11 +236,11 @@ def scodoc_table_results(
tab, semlist = _build_results_table(
context, start_date_iso, end_date_iso, types_parcours
)
tab.base_url = "%s?start_date=%s&end_date=%s&types_parcours=%s" % (
tab.base_url = "%s?start_date=%s&amp;end_date=%s&amp;types_parcours=%s" % (
REQUEST.URL0,
start_date,
end_date,
"&types_parcours=".join([str(x) for x in types_parcours]),
"&amp;types_parcours=".join([str(x) for x in types_parcours]),
)
if format != "html":
return tab.make_page(

View File

@ -141,7 +141,7 @@ def search_etud_in_dept(context, expnom="", REQUEST=None):
if len(etuds) > 0:
# Choix dans la liste des résultats:
for e in etuds:
target = dest_url + "?etudid=%s&" % e["etudid"]
target = dest_url + "?etudid=%s&amp;" % e["etudid"]
e["_nomprenom_target"] = target
e["inscription_target"] = target
e["_nomprenom_td_attrs"] = 'id="%s" class="etudinfo"' % (e["etudid"])

View File

@ -241,7 +241,7 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
for s in f["sems"]
]
+ [
'<a class="stdlink" href="formsemestre_createwithmodules?formation_id=%(formation_id)s&semestre_id=1">ajouter</a>'
'<a class="stdlink" href="formsemestre_createwithmodules?formation_id=%(formation_id)s&amp;semestre_id=1">ajouter</a>'
% f
]
)

View File

@ -711,7 +711,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
}
_ = sco_moduleimpl.do_moduleimpl_create(context, modargs)
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id=%s&head_message=Nouveau%%20semestre%%20créé"
"formsemestre_status?formsemestre_id=%s&amp;head_message=Nouveau%%20semestre%%20créé"
% formsemestre_id
)
else:
@ -811,7 +811,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
return msg_html
else:
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id=%s&head_message=Semestre modifié"
"formsemestre_status?formsemestre_id=%s&amp;head_message=Semestre modifié"
% formsemestre_id
)
@ -965,7 +965,7 @@ def formsemestre_clone(context, formsemestre_id, REQUEST=None):
REQUEST=REQUEST,
)
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id=%s&head_message=Nouveau%%20semestre%%20créé"
"formsemestre_status?formsemestre_id=%s&amp;head_message=Nouveau%%20semestre%%20créé"
% new_formsemestre_id
)
@ -1148,7 +1148,7 @@ def formsemestre_associate_new_version(
context, [formsemestre_id] + other_formsemestre_ids, REQUEST=REQUEST
)
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id=%s&head_message=Formation%%20dupliquée"
"formsemestre_status?formsemestre_id=%s&amp;head_message=Formation%%20dupliquée"
% formsemestre_id
)

View File

@ -86,7 +86,7 @@ def formsemestre_ext_create_form(context, etudid, formsemestre_id, REQUEST=None)
<p class="help">
Notez que si un semestre extérieur similaire a déjà été créé pour un autre étudiant,
il est préférable d'utiliser la fonction
"<a href="formsemestre_inscription_with_modules_form?etudid=%s&only_ext=1">
"<a href="formsemestre_inscription_with_modules_form?etudid=%s&amp;only_ext=1">
inscrire à un autre semestre</a>"
</p>
"""
@ -191,7 +191,7 @@ def formsemestre_ext_create_form(context, etudid, formsemestre_id, REQUEST=None)
return "\n".join(H) + "\n" + tf[1] + F
elif tf[0] == -1:
return REQUEST.RESPONSE.redirect(
"%s/formsemestre_bulletinetud?formsemestre_id==%s&etudid=%s"
"%s/formsemestre_bulletinetud?formsemestre_id==%s&amp;etudid=%s"
% (context.ScoURL(), formsemestre_id, etudid)
)
else:

View File

@ -147,7 +147,7 @@ def formsemestre_inscription_with_modules_form(
if (not only_ext) or (sem["modalite"] == "EXT"):
H.append(
"""
<li><a class="stdlink" href="formsemestre_inscription_with_modules?etudid=%s&formsemestre_id=%s">%s</a>
<li><a class="stdlink" href="formsemestre_inscription_with_modules?etudid=%s&amp;formsemestre_id=%s">%s</a>
"""
% (etudid, sem["formsemestre_id"], sem["titremois"])
)
@ -217,12 +217,12 @@ def formsemestre_inscription_with_modules(
H.append("<ul>")
for s in others:
H.append(
'<li><a href="formsemestre_desinscription?formsemestre_id=%s&etudid=%s">déinscrire de %s</li>'
'<li><a href="formsemestre_desinscription?formsemestre_id=%s&amp;etudid=%s">déinscrire de %s</li>'
% (s["formsemestre_id"], etudid, s["titreannee"])
)
H.append("</ul>")
H.append(
"""<p><a href="formsemestre_inscription_with_modules?etudid=%s&formsemestre_id=%s&multiple_ok=1&%s">Continuer quand même l'inscription</a></p>"""
"""<p><a href="formsemestre_inscription_with_modules?etudid=%s&amp;formsemestre_id=%s&amp;multiple_ok=1&amp;%s">Continuer quand même l'inscription</a></p>"""
% (etudid, formsemestre_id, sco_groups.make_query_groups(group_ids))
)
return "\n".join(H) + F
@ -332,7 +332,7 @@ def formsemestre_inscription_option(context, etudid, formsemestre_id, REQUEST=No
sem_origin = sco_formsemestre.get_formsemestre(
context, ue_status["formsemestre_id"]
)
ue_descr += ' <a class="discretelink" href="formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" title="%s">(capitalisée le %s)' % (
ue_descr += ' <a class="discretelink" href="formsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s" title="%s">(capitalisée le %s)' % (
sem_origin["formsemestre_id"],
etudid,
sem_origin["titreannee"],

View File

@ -154,7 +154,7 @@ def formsemestre_status_menubar(context, sem, REQUEST):
},
{
"title": "Modifier le semestre",
"url": "formsemestre_editwithmodules?formation_id=%(formation_id)s&formsemestre_id=%(formsemestre_id)s"
"url": "formsemestre_editwithmodules?formation_id=%(formation_id)s&amp;formsemestre_id=%(formsemestre_id)s"
% sem,
"enabled": (
authuser.has_permission(ScoImplement, context)
@ -292,7 +292,7 @@ def formsemestre_status_menubar(context, sem, REQUEST):
},
{
"title": "Exporter table des étudiants",
"url": "groups_view?format=allxls&group_ids="
"url": "groups_view?format=allxls&amp;group_ids="
+ sco_groups.get_default_group(
context, formsemestre_id, fix_if_missing=True, REQUEST=REQUEST
),
@ -388,7 +388,7 @@ def formsemestre_status_menubar(context, sem, REQUEST):
},
{
"title": "Saisie des décisions du jury",
"url": "formsemestre_recapcomplet?modejury=1&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id="
"url": "formsemestre_recapcomplet?modejury=1&amp;hidemodules=1&amp;hidebac=1&amp;pref_override=0&amp;formsemestre_id="
+ formsemestre_id,
"enabled": context._can_validate_sem(REQUEST, formsemestre_id),
},
@ -684,7 +684,7 @@ def formsemestre_description_table(
caption=title,
html_caption=title,
html_class="table_leftalign formsemestre_description",
base_url="%s?formsemestre_id=%s&with_evals=%s"
base_url="%s?formsemestre_id=%s&amp;with_evals=%s"
% (REQUEST.URL0, formsemestre_id, with_evals),
page_title=title,
html_title=context.html_sem_header(
@ -917,7 +917,7 @@ def formsemestre_status(context, formsemestre_id=None, REQUEST=None):
if can_edit:
H.append(
' <a href="edit_ue_expr?formsemestre_id=%s&ue_id=%s">'
' <a href="edit_ue_expr?formsemestre_id=%s&amp;ue_id=%s">'
% (formsemestre_id, ue["ue_id"])
)
H.append(

View File

@ -109,13 +109,13 @@ def formsemestre_validation_etud_form(
if etud_index_prev != None:
etud_p = context.getEtudInfo(etudid=T[etud_index_prev][-1], filled=True)[0]
Footer.append(
'<span><a href="formsemestre_validation_etud_form?formsemestre_id=%s&etud_index=%s">Etud. précédent (%s)</a></span>'
'<span><a href="formsemestre_validation_etud_form?formsemestre_id=%s&amp;etud_index=%s">Etud. précédent (%s)</a></span>'
% (formsemestre_id, etud_index_prev, etud_p["nomprenom"])
)
if etud_index_next != None:
etud_n = context.getEtudInfo(etudid=T[etud_index_next][-1], filled=True)[0]
Footer.append(
'<span style="padding-left: 50px;"><a href="formsemestre_validation_etud_form?formsemestre_id=%s&etud_index=%s">Etud. suivant (%s)</a></span>'
'<span style="padding-left: 50px;"><a href="formsemestre_validation_etud_form?formsemestre_id=%s&amp;etud_index=%s">Etud. suivant (%s)</a></span>'
% (formsemestre_id, etud_index_next, etud_n["nomprenom"])
)
Footer.append("</p>")
@ -171,12 +171,12 @@ def formsemestre_validation_etud_form(
if check:
if not desturl:
desturl = (
"formsemestre_recapcomplet?modejury=1&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id="
"formsemestre_recapcomplet?modejury=1&amp;hidemodules=1&amp;hidebac=1&amp;pref_override=0&amp;formsemestre_id="
+ formsemestre_id
)
if sortcol:
desturl += (
"&sortcol=" + sortcol
"&amp;sortcol=" + sortcol
) # pour refaire tri sorttable du tableau de notes
desturl += "#etudid%s" % etudid # va a la bonne ligne
H.append('<ul><li><a href="%s">Continuer</a></li></ul>' % desturl)
@ -205,13 +205,13 @@ def formsemestre_validation_etud_form(
if not Se.prev_decision:
H.append(
tf_error_message(
"""Le jury n\'a pas statué sur le semestre précédent ! (<a href="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s">le faire maintenant</a>)"""
"""Le jury n\'a pas statué sur le semestre précédent ! (<a href="formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s">le faire maintenant</a>)"""
% (Se.prev["formsemestre_id"], etudid)
)
)
if decision_jury:
H.append(
'<a href="formsemestre_validation_suppress_etud?etudid=%s&formsemestre_id=%s" class="stdlink">Supprimer décision existante</a>'
'<a href="formsemestre_validation_suppress_etud?etudid=%s&amp;formsemestre_id=%s" class="stdlink">Supprimer décision existante</a>'
% (etudid, formsemestre_id)
)
H.append(context.sco_footer(REQUEST))
@ -249,7 +249,7 @@ def formsemestre_validation_etud_form(
<input type="submit" value="Statuer sur le semestre précédent"/>
<input type="hidden" name="formsemestre_id" value="%s"/>
<input type="hidden" name="etudid" value="%s"/>
<input type="hidden" name="desturl" value="formsemestre_validation_etud_form?etudid=%s&formsemestre_id=%s"/>
<input type="hidden" name="desturl" value="formsemestre_validation_etud_form?etudid=%s&amp;formsemestre_id=%s"/>
"""
% (Se.prev["formsemestre_id"], etudid, etudid, formsemestre_id)
)
@ -309,7 +309,7 @@ def formsemestre_validation_etud_form(
H.append(form_decision_manuelle(context, Se, formsemestre_id, etudid))
H.append(
"""<div class="link_defaillance">Ou <a class="stdlink" href="formDef?etudid=%s&formsemestre_id=%s">déclarer l'étudiant comme défaillant dans ce semestre</a></div>"""
"""<div class="link_defaillance">Ou <a class="stdlink" href="formDef?etudid=%s&amp;formsemestre_id=%s">déclarer l'étudiant comme défaillant dans ce semestre</a></div>"""
% (etudid, formsemestre_id)
)
@ -402,23 +402,23 @@ def _redirect_valid_choice(
formsemestre_id, etudid, Se, choice, desturl, sortcol, REQUEST
):
adr = (
"formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1"
"formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s&amp;check=1"
% (formsemestre_id, etudid)
)
if sortcol:
adr += "&sortcol=" + sortcol
adr += "&amp;sortcol=" + sortcol
# if desturl:
# desturl += "&desturl=" + desturl
# desturl += "&amp;desturl=" + desturl
return REQUEST.RESPONSE.redirect(adr)
# Si le precedent a été modifié, demande relecture du parcours.
# sinon renvoie au listing general,
# if choice.new_code_prev:
# REQUEST.RESPONSE.redirect( 'formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1&desturl=%s' % (formsemestre_id, etudid, desturl) )
# REQUEST.RESPONSE.redirect( 'formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&amp;check=1&amp;desturl=%s' % (formsemestre_id, etudid, desturl) )
# else:
# if not desturl:
# desturl = 'formsemestre_recapcomplet?modejury=1&hidemodules=1&formsemestre_id=' + formsemestre_id
# desturl = 'formsemestre_recapcomplet?modejury=1&amp;hidemodules=1&amp;formsemestre_id=' + formsemestre_id
# REQUEST.RESPONSE.redirect(desturl)
@ -555,7 +555,7 @@ def formsemestre_recap_parcours_table(
)
H.append('<td class="datedebut">%(mois_debut)s</td>' % sem)
H.append(
'<td class="rcp_titre_sem"><a class="formsemestre_status_link" href="%sformsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" title="Bulletin de notes">%s</a></td>'
'<td class="rcp_titre_sem"><a class="formsemestre_status_link" href="%sformsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s" title="Bulletin de notes">%s</a></td>'
% (a_url, sem["formsemestre_id"], etudid, sem["titreannee"])
)
if decision_sem:
@ -649,7 +649,7 @@ def formsemestre_recap_parcours_table(
H.append("<td></td>")
if with_links:
H.append(
'<td><a href="%sformsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s">modifier</a></td>'
'<td><a href="%sformsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s">modifier</a></td>'
% (a_url, sem["formsemestre_id"], etudid)
)
@ -809,7 +809,7 @@ def form_decision_manuelle(
H.append(
"""</table>
<input type="submit" name="formvalidmanu_submit" value="Valider décision manuelle"/>
<span style="padding-left: 5em;"><a href="formsemestre_validation_suppress_etud?etudid=%s&formsemestre_id=%s" class="stdlink">Supprimer décision existante</a></span>
<span style="padding-left: 5em;"><a href="formsemestre_validation_suppress_etud?etudid=%s&amp;formsemestre_id=%s" class="stdlink">Supprimer décision existante</a></span>
</form>
"""
% (etudid, formsemestre_id)
@ -928,12 +928,12 @@ def do_formsemestre_validation_auto(context, formsemestre_id, REQUEST):
)
for etud in conflicts:
H.append(
'<li><a href="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1">%s</li>'
'<li><a href="formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s&amp;check=1">%s</li>'
% (formsemestre_id, etud["etudid"], etud["nomprenom"])
)
H.append("</ul>")
H.append(
'<a href="formsemestre_recapcomplet?formsemestre_id=%s&modejury=1&hidemodules=1&hidebac=1&pref_override=0">continuer</a>'
'<a href="formsemestre_recapcomplet?formsemestre_id=%s&amp;modejury=1&amp;hidemodules=1&amp;hidebac=1&amp;pref_override=0">continuer</a>'
% formsemestre_id
)
H.append(context.sco_footer(REQUEST))
@ -1184,7 +1184,7 @@ def formsemestre_validate_previous_ue(context, formsemestre_id, etudid, REQUEST=
)
return REQUEST.RESPONSE.redirect(
context.ScoURL()
+ "/Notes/formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s&head_message=Validation%%20d'UE%%20enregistree"
+ "/Notes/formsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s&amp;head_message=Validation%%20d'UE%%20enregistree"
% (formsemestre_id, etudid)
)
@ -1289,7 +1289,7 @@ def get_etud_ue_cap_html(context, etudid, formsemestre_id, ue_id, REQUEST=None):
valid["s"] += " (<b>S%d</b>)" % valid["semestre_id"]
valid["ds"] = formsemestre_id
H.append(
'<li>%(code)s%(m)s%(s)s, le %(event_date)s <a class="stdlink" href="etud_ue_suppress_validation?etudid=%(etudid)s&ue_id=%(ue_id)s&formsemestre_id=%(ds)s" title="supprime cette validation">effacer</a></li>'
'<li>%(code)s%(m)s%(s)s, le %(event_date)s <a class="stdlink" href="etud_ue_suppress_validation?etudid=%(etudid)s&amp;ue_id=%(ue_id)s&amp;formsemestre_id=%(ds)s" title="supprime cette validation">effacer</a></li>'
% valid
)
H.append("</ul></div>")
@ -1311,7 +1311,7 @@ def etud_ue_suppress_validation(context, etudid, formsemestre_id, ue_id, REQUEST
return REQUEST.RESPONSE.redirect(
context.NotesURL()
+ "/formsemestre_validate_previous_ue?etudid=%s&formsemestre_id=%s"
+ "/formsemestre_validate_previous_ue?etudid=%s&amp;formsemestre_id=%s"
% (etudid, formsemestre_id)
)

View File

@ -847,13 +847,13 @@ def editPartitionForm(context, formsemestre_id=None, REQUEST=None):
)
if i != 0:
H.append(
'<a href="partition_move?partition_id=%s&after=0">%s</a>'
'<a href="partition_move?partition_id=%s&amp;after=0">%s</a>'
% (p["partition_id"], arrow_up)
)
H.append('</td><td class="epnav">')
if i < len(partitions) - 2:
H.append(
'<a href="partition_move?partition_id=%s&after=1">%s</a>'
'<a href="partition_move?partition_id=%s&amp;after=1">%s</a>'
% (p["partition_id"], arrow_down)
)
i += 1
@ -1494,7 +1494,7 @@ def form_group_choice(
def make_query_groups(group_ids):
if group_ids:
return "&".join(["group_ids%3Alist=" + group_id for group_id in group_ids])
return "&amp;".join(["group_ids%3Alist=" + group_id for group_id in group_ids])
else:
return ""

View File

@ -343,7 +343,7 @@ class DisplayedGroupsInfos:
gq = []
for group_id in group_ids:
gq.append("group_ids=" + group_id)
self.groups_query_args = "&".join(gq)
self.groups_query_args = "&amp;".join(gq)
self.base_url = REQUEST.URL0 + "?" + self.groups_query_args
self.group_ids = group_ids
self.groups = []
@ -457,10 +457,10 @@ def groups_table(
with_archives = int(with_archives)
with_annotations = int(with_annotations)
base_url_np = groups_infos.base_url + "&with_codes=%s" % with_codes
base_url_np = groups_infos.base_url + "&amp;with_codes=%s" % with_codes
base_url = (
base_url_np
+ "&with_paiement=%s&with_archives=%s&with_annotations=%s"
+ "&amp;with_paiement=%s&amp;with_archives=%s&amp;with_annotations=%s"
% (with_paiement, with_archives, with_annotations)
)
#
@ -668,11 +668,11 @@ def groups_table(
[
tab.html(),
"<ul>",
'<li><a class="stdlink" href="%s&format=xlsappel">Feuille d\'appel Excel</a></li>'
'<li><a class="stdlink" href="%s&amp;format=xlsappel">Feuille d\'appel Excel</a></li>'
% (tab.base_url,),
'<li><a class="stdlink" href="%s&format=xls">Table Excel</a></li>'
'<li><a class="stdlink" href="%s&amp;format=xls">Table Excel</a></li>'
% (tab.base_url,),
'<li><a class="stdlink" href="%s&format=moodlecsv">Fichier CSV pour Moodle (groupe sélectionné)</a></li>'
'<li><a class="stdlink" href="%s&amp;format=moodlecsv">Fichier CSV pour Moodle (groupe sélectionné)</a></li>'
% (tab.base_url,),
"""<li>
<a class="stdlink" href="export_groups_as_moodle_csv?formsemestre_id=%s">Fichier CSV pour Moodle (tous les groupes)</a>
@ -824,7 +824,7 @@ def tab_absences_html(context, groups_infos, etat=None, REQUEST=None):
"<li>",
form_choix_jour_saisie_hebdo(context, groups_infos, REQUEST=REQUEST),
"</li>",
"""<li><a class="stdlink" href="Absences/EtatAbsencesGr?%s&debut=%s&fin=%s">Etat des absences du groupe</a></li>"""
"""<li><a class="stdlink" href="Absences/EtatAbsencesGr?%s&amp;debut=%s&amp;fin=%s">Etat des absences du groupe</a></li>"""
% (
groups_infos.groups_query_args,
groups_infos.formsemestre["date_debut"],
@ -833,15 +833,15 @@ def tab_absences_html(context, groups_infos, etat=None, REQUEST=None):
"</ul>",
"<h3>Feuilles</h3>",
'<ul class="ul_feuilles">',
"""<li><a class="stdlink" href="%s&format=xlsappel">Feuille d'émargement %s (Excel)</a></li>"""
"""<li><a class="stdlink" href="%s&amp;format=xlsappel">Feuille d'émargement %s (Excel)</a></li>"""
% (groups_infos.base_url, groups_infos.groups_titles),
"""<li><a class="stdlink" href="trombino?%s&format=pdf">Trombinoscope en PDF</a></li>"""
"""<li><a class="stdlink" href="trombino?%s&amp;format=pdf">Trombinoscope en PDF</a></li>"""
% groups_infos.groups_query_args,
"""<li><a class="stdlink" href="pdf_trombino_tours?%s&format=pdf">Trombinoscope en PDF (format "IUT de Tours", beta)</a></li>"""
"""<li><a class="stdlink" href="pdf_trombino_tours?%s&amp;format=pdf">Trombinoscope en PDF (format "IUT de Tours", beta)</a></li>"""
% groups_infos.groups_query_args,
"""<li><a class="stdlink" href="pdf_feuille_releve_absences?%s&format=pdf">Feuille relevé absences hebdomadaire (beta)</a></li>"""
"""<li><a class="stdlink" href="pdf_feuille_releve_absences?%s&amp;format=pdf">Feuille relevé absences hebdomadaire (beta)</a></li>"""
% groups_infos.groups_query_args,
"""<li><a class="stdlink" href="trombino?%s&format=pdflist">Liste d'appel avec photos</a></li>"""
"""<li><a class="stdlink" href="trombino?%s&amp;format=pdflist">Liste d'appel avec photos</a></li>"""
% groups_infos.groups_query_args,
"</ul>",
]
@ -853,7 +853,7 @@ def tab_absences_html(context, groups_infos, etat=None, REQUEST=None):
group_id = sco_groups.get_default_group(context, groups_infos.formsemestre_id)
if authuser.has_permission(ScoEtudInscrit, context):
H.append(
'<li><a class="stdlink" href="check_group_apogee?group_id=%s&etat=%s">Vérifier codes Apogée</a> (de tous les groupes)</li>'
'<li><a class="stdlink" href="check_group_apogee?group_id=%s&amp;etat=%s">Vérifier codes Apogée</a> (de tous les groupes)</li>'
% (group_id, etat or "")
)
# Lien pour ajout fichiers étudiants

View File

@ -552,7 +552,7 @@ def etuds_select_boxes(
H.append(")")
if base_url and etuds:
H.append(
'<a href="%s&export_cat_xls=%s">%s</a>&nbsp;'
'<a href="%s&amp;export_cat_xls=%s">%s</a>&nbsp;'
% (base_url, src_cat, scu.ICON_XLS)
)
H.append("</div>")

View File

@ -314,7 +314,7 @@ def _make_table_notes(
"_code_td_attrs": 'style="padding-left: 1em; padding-right: 2em;"',
"etudid": etudid,
"nom": scu.strupper(etud["nom"]),
"_nomprenom_target": "formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s"
"_nomprenom_target": "formsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s"
% (M["formsemestre_id"], etudid),
"_nomprenom_td_attrs": 'id="%s" class="etudinfo"' % (etud["etudid"]),
"prenom": scu.strcapitalize(scu.strlower(etud["prenom"])),
@ -420,15 +420,15 @@ def _make_table_notes(
columns_ids.append("comment")
# titres divers:
gl = "".join(["&group_ids%3Alist=" + g for g in group_ids])
gl = "".join(["&amp;group_ids%3Alist=" + g for g in group_ids])
if note_sur_20:
gl = "&note_sur_20%3Alist=yes" + gl
gl = "&amp;note_sur_20%3Alist=yes" + gl
if anonymous_listing:
gl = "&anonymous_listing%3Alist=yes" + gl
gl = "&amp;anonymous_listing%3Alist=yes" + gl
if hide_groups:
gl = "&hide_groups%3Alist=yes" + gl
gl = "&amp;hide_groups%3Alist=yes" + gl
if with_emails:
gl = "&with_emails%3Alist=yes" + gl
gl = "&amp;with_emails%3Alist=yes" + gl
if len(evals) == 1:
evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"]))
hh = "%s, %s (%d étudiants)" % (E["description"], gr_title, len(etudids))
@ -808,7 +808,7 @@ def evaluation_check_absences_html(
)
if linkabs:
H.append(
'<a class="stdlink" href="Absences/doSignaleAbsence?etudid=%s&datedebut=%s&datefin=%s&demijournee=%s&moduleimpl_id=%s">signaler cette absence</a>'
'<a class="stdlink" href="Absences/doSignaleAbsence?etudid=%s&amp;datedebut=%s&amp;datefin=%s&amp;demijournee=%s&amp;moduleimpl_id=%s">signaler cette absence</a>'
% (
etud["etudid"],
urllib.quote(E["jour"]),

View File

@ -182,9 +182,9 @@ def formsemestre_etuds_lycees(
)
tab.base_url = "%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id)
if only_primo:
tab.base_url += "&only_primo=1"
tab.base_url += "&amp;only_primo=1"
if no_grouping:
tab.base_url += "&no_grouping=1"
tab.base_url += "&amp;no_grouping=1"
t = tab.make_page(context, format=format, with_html_headers=False, REQUEST=REQUEST)
if format != "html":
return t

View File

@ -367,14 +367,14 @@ def moduleimpl_inscriptions_stats(context, formsemestre_id, REQUEST=None):
)
if can_change:
H.append(
'<div><a class="stdlink" href="etud_desinscrit_ue?etudid=%s&formsemestre_id=%s&ue_id=%s">désinscrire des modules de cette UE</a></div>'
'<div><a class="stdlink" href="etud_desinscrit_ue?etudid=%s&amp;formsemestre_id=%s&amp;ue_id=%s">désinscrire des modules de cette UE</a></div>'
% (etud["etudid"], formsemestre_id, ue["ue_id"])
)
else:
H.append("(non réinscrit dans cette UE)")
if can_change:
H.append(
'<div><a class="stdlink" href="etud_inscrit_ue?etudid=%s&formsemestre_id=%s&ue_id=%s">inscrire à tous les modules de cette UE</a></div>'
'<div><a class="stdlink" href="etud_inscrit_ue?etudid=%s&amp;formsemestre_id=%s&amp;ue_id=%s">inscrire à tous les modules de cette UE</a></div>'
% (etud["etudid"], formsemestre_id, ue["ue_id"])
)
H.append("</li>")

View File

@ -122,7 +122,7 @@ def moduleimpl_evaluation_menu(context, evaluation_id, nbnotes=0, REQUEST=None):
},
{
"title": "Absences ce jour",
"url": "Absences/EtatAbsencesDate?date=%s&group_ids=%s"
"url": "Absences/EtatAbsencesDate?date=%s&amp;group_ids=%s"
% (urllib.quote(E["jour"], safe=""), group_id),
"enabled": E["jour"],
},
@ -322,7 +322,7 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
if sem["etat"] == "1": # non verrouillé
top_table_links = (
"""<a class="stdlink" href="evaluation_create?moduleimpl_id=%(moduleimpl_id)s">Créer nouvelle évaluation</a>
<a class="stdlink" style="margin-left:2em;" href="module_evaluation_renumber?moduleimpl_id=%(moduleimpl_id)s&redirect=1">Trier par date</a>
<a class="stdlink" style="margin-left:2em;" href="module_evaluation_renumber?moduleimpl_id=%(moduleimpl_id)s&amp;redirect=1">Trier par date</a>
"""
% M
)
@ -384,14 +384,14 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
H.append('<span class="eval_arrows_chld">')
if eval_index != (len(ModEvals) - 1) and caneditevals:
H.append(
'<a href="module_evaluation_move?evaluation_id=%s&after=0" class="aud">%s</a>'
'<a href="module_evaluation_move?evaluation_id=%s&amp;after=0" class="aud">%s</a>'
% (eval["evaluation_id"], arrow_up)
)
else:
H.append(arrow_none)
if (eval_index > 0) and caneditevals:
H.append(
'<a href="module_evaluation_move?evaluation_id=%s&after=1" class="aud">%s</a>'
'<a href="module_evaluation_move?evaluation_id=%s&amp;after=1" class="aud">%s</a>'
% (eval["evaluation_id"], arrow_down)
)
else:
@ -546,7 +546,7 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
if gr_moyenne["gr_nb_notes"] > 0:
H.append("%(gr_moy)s" % gr_moyenne)
H.append(
"""&nbsp; (<a href="evaluation_listenotes?tf-submitted=1&evaluation_id=%s&group_ids%%3Alist=%s">%s notes</a>"""
"""&nbsp; (<a href="evaluation_listenotes?tf-submitted=1&amp;evaluation_id=%s&amp;group_ids%%3Alist=%s">%s notes</a>"""
% (
eval["evaluation_id"],
gr_moyenne["group_id"],
@ -563,7 +563,7 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
H.append("""[<font color="red">""")
if caneditnotes:
H.append(
"""<a class="redlink" href="saisie_notes?evaluation_id=%s&group_ids:list=%s">incomplet</a></font>]"""
"""<a class="redlink" href="saisie_notes?evaluation_id=%s&amp;group_ids:list=%s">incomplet</a></font>]"""
% (eval["evaluation_id"], gr_moyenne["group_id"])
)
else:
@ -572,7 +572,7 @@ def moduleimpl_status(context, moduleimpl_id=None, partition_id=None, REQUEST=No
H.append("""<span class="redboldtext">&nbsp; """)
if caneditnotes:
H.append(
"""<a class="redlink" href="saisie_notes?evaluation_id=%s&group_ids:list=%s">"""
"""<a class="redlink" href="saisie_notes?evaluation_id=%s&amp;group_ids:list=%s">"""
% (eval["evaluation_id"], gr_moyenne["group_id"])
)
H.append("pas de notes")

View File

@ -75,12 +75,12 @@ def _menuScolarite(context, authuser, sem, etudid):
if ins["etat"] != "D":
dem_title = "Démission"
dem_url = (
"formDem?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s" % args
"formDem?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s" % args
)
else:
dem_title = "Annuler la démission"
dem_url = (
"doCancelDem?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s"
"doCancelDem?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s"
% args
)
@ -88,12 +88,12 @@ def _menuScolarite(context, authuser, sem, etudid):
if ins["etat"] != sco_codes_parcours.DEF:
def_title = "Déclarer défaillance"
def_url = (
"formDef?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s" % args
"formDef?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s" % args
)
elif ins["etat"] == sco_codes_parcours.DEF:
def_title = "Annuler la défaillance"
def_url = (
"doCancelDef?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s"
"doCancelDef?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s"
% args
)
def_enabled = (
@ -103,7 +103,7 @@ def _menuScolarite(context, authuser, sem, etudid):
)
items = [
# { 'title' : 'Changer de groupe',
# 'url' : 'formChangeGroup?etudid=%s&formsemestre_id=%s' % (etudid,ins['formsemestre_id']),
# 'url' : 'formChangeGroup?etudid=%s&amp;formsemestre_id=%s' % (etudid,ins['formsemestre_id']),
# 'enabled' : authuser.has_permission(ScoEtudChangeGroups,context) and not locked,
# },
{
@ -113,20 +113,20 @@ def _menuScolarite(context, authuser, sem, etudid):
},
{
"title": "Validation du semestre (jury)",
"url": "Notes/formsemestre_validation_etud_form?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s"
"url": "Notes/formsemestre_validation_etud_form?etudid=%(etudid)s&amp;formsemestre_id=%(formsemestre_id)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
{"title": def_title, "url": def_url, "enabled": def_enabled},
{
"title": "Inscrire à un module optionnel (ou au sport)",
"url": "Notes/formsemestre_inscription_option?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s"
"url": "Notes/formsemestre_inscription_option?formsemestre_id=%(formsemestre_id)s&amp;etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
{
"title": "Désinscrire (en cas d'erreur)",
"url": "Notes/formsemestre_desinscription?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s"
"url": "Notes/formsemestre_desinscription?formsemestre_id=%(formsemestre_id)s&amp;etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
@ -138,7 +138,7 @@ def _menuScolarite(context, authuser, sem, etudid):
},
{
"title": "Enregistrer un semestre effectué ailleurs",
"url": "Notes/formsemestre_ext_create_form?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s"
"url": "Notes/formsemestre_ext_create_form?formsemestre_id=%(formsemestre_id)s&amp;etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoImplement, context),
},
@ -290,7 +290,7 @@ def ficheEtud(context, etudid=None, REQUEST=None):
else:
a[
"dellink"
] = '<td class="annodel"><a href="doSuppressAnnotation?etudid=%s&annotation_id=%s">%s</a></td>' % (
] = '<td class="annodel"><a href="doSuppressAnnotation?etudid=%s&amp;annotation_id=%s">%s</a></td>' % (
etudid,
a["id"],
scu.icontag(
@ -394,7 +394,7 @@ def ficheEtud(context, etudid=None, REQUEST=None):
# Inscriptions
if info["sems"]: # XXX rcl unused ? à voir
rcl = (
"""(<a href="%(ScoURL)s/Notes/formsemestre_validation_etud_form?check=1&etudid=%(etudid)s&formsemestre_id=%(last_formsemestre_id)s&desturl=ficheEtud?etudid=%(etudid)s">récapitulatif parcours</a>)"""
"""(<a href="%(ScoURL)s/Notes/formsemestre_validation_etud_form?check=1&amp;etudid=%(etudid)s&amp;formsemestre_id=%(last_formsemestre_id)s&amp;desturl=ficheEtud?etudid=%(etudid)s">récapitulatif parcours</a>)"""
% info
)
else:

View File

@ -205,7 +205,7 @@ def do_placement_selectetuds(context, REQUEST):
if columns in ("3", "4", "5", "6", "7", "8"):
gs = [("group_ids%3Alist=" + urllib.quote_plus(x)) for x in group_ids]
query = (
"evaluation_id=%s&placement_method=%s&teachers=%s&building=%s&room=%s&columns=%s&numbering=%s&"
"evaluation_id=%s&amp;placement_method=%s&amp;teachers=%s&amp;building=%s&amp;room=%s&amp;columns=%s&amp;numbering=%s&amp;"
% (
evaluation_id,
placement_method,
@ -215,7 +215,7 @@ def do_placement_selectetuds(context, REQUEST):
columns,
numbering,
)
+ "&".join(gs)
+ "&amp;".join(gs)
)
return REQUEST.RESPONSE.redirect(
context.NotesURL() + "/do_placement?" + query

View File

@ -867,7 +867,7 @@ def formsemestre_lettres_individuelles(
PDFLOCK.release()
if not pdfdoc:
return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id={}&head_message=Aucun%20%C3%A9tudiant%20n%27a%20de%20d%C3%A9cision%20de%20jury".format(
"formsemestre_status?formsemestre_id={}&amp;head_message=Aucun%20%C3%A9tudiant%20n%27a%20de%20d%C3%A9cision%20de%20jury".format(
formsemestre_id
)
)

View File

@ -173,7 +173,7 @@ def formsemestre_recapcomplet(
)
else:
H.append(
"""<a class="stdlink" href="formsemestre_recapcomplet?formsemestre_id=%s&modejury=1&hidemodules=1">Saisie des décisions du jury</a>"""
"""<a class="stdlink" href="formsemestre_recapcomplet?formsemestre_id=%s&amp;modejury=1&amp;hidemodules=1">Saisie des décisions du jury</a>"""
% formsemestre_id
)
H.append("</p>")
@ -556,9 +556,9 @@ def make_formsemestre_recapcomplet(
"""
<script type="text/javascript">
function va_saisir(formsemestre_id, etudid) {
loc = 'formsemestre_validation_etud_form?formsemestre_id='+formsemestre_id+'&etudid='+etudid;
loc = 'formsemestre_validation_etud_form?formsemestre_id='+formsemestre_id+'&amp;etudid='+etudid;
if (SORT_COLUMN_INDEX) {
loc += '&sortcol=' + SORT_COLUMN_INDEX;
loc += '&amp;sortcol=' + SORT_COLUMN_INDEX;
}
loc += '#etudid' + etudid;
document.location=loc;
@ -620,7 +620,7 @@ def make_formsemestre_recapcomplet(
if disable_etudlink:
etudlink = "%(name)s"
else:
etudlink = '<a href="formsemestre_bulletinetud?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s&version=selectedevals" id="%(etudid)s" class="etudinfo">%(name)s</a>'
etudlink = '<a href="formsemestre_bulletinetud?formsemestre_id=%(formsemestre_id)s&amp;etudid=%(etudid)s&amp;version=selectedevals" id="%(etudid)s" class="etudinfo">%(name)s</a>'
ir = 0
nblines = len(F) - 1
for l in F[1:]:
@ -716,7 +716,7 @@ def make_formsemestre_recapcomplet(
act = "saisir"
cells += '<td class="decision">%s' % code
if act:
# cells += ' <a href="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s">%s</a>' % (formsemestre_id, etudid, act)
# cells += ' <a href="formsemestre_validation_etud_form?formsemestre_id=%s&amp;etudid=%s">%s</a>' % (formsemestre_id, etudid, act)
cells += (
""" <a href="#" onclick="va_saisir('%s', '%s')">%s</a>"""
% (formsemestre_id, etudid, act)

View File

@ -228,7 +228,7 @@ def formsemestre_report(
tab.html_caption = "Répartition des résultats par %s." % category_name
tab.base_url = "%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id)
if only_primo:
tab.base_url += "&only_primo=on"
tab.base_url += "&amp;only_primo=on"
return tab
@ -698,27 +698,27 @@ def formsemestre_suivi_cohorte(
only_primo=only_primo,
)
tab.base_url = (
"%s?formsemestre_id=%s&percent=%s&bac=%s&bacspecialite=%s&civilite=%s"
"%s?formsemestre_id=%s&amp;percent=%s&amp;bac=%s&amp;bacspecialite=%s&amp;civilite=%s"
% (REQUEST.URL0, formsemestre_id, percent, bac, bacspecialite, civilite)
)
if only_primo:
tab.base_url += "&only_primo=on"
tab.base_url += "&amp;only_primo=on"
t = tab.make_page(context, format=format, with_html_headers=False, REQUEST=REQUEST)
if format != "html":
return t
base_url = REQUEST.URL0
burl = (
"%s?formsemestre_id=%s&bac=%s&bacspecialite=%s&civilite=%s&statut=%s"
"%s?formsemestre_id=%s&amp;bac=%s&amp;bacspecialite=%s&amp;civilite=%s&amp;statut=%s"
% (base_url, formsemestre_id, bac, bacspecialite, civilite, statut)
)
if percent:
pplink = (
'<p><a href="%s&percent=0">Afficher les résultats bruts</a></p>' % burl
'<p><a href="%s&amp;percent=0">Afficher les résultats bruts</a></p>' % burl
)
else:
pplink = (
'<p><a href="%s&percent=1">Afficher les résultats en pourcentages</a></p>'
'<p><a href="%s&amp;percent=1">Afficher les résultats en pourcentages</a></p>'
% burl
)
help = (
@ -1191,9 +1191,9 @@ def formsemestre_suivi_parcours(
)
tab.base_url = "%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id)
if only_primo:
tab.base_url += "&only_primo=1"
tab.base_url += "&amp;only_primo=1"
if no_grouping:
tab.base_url += "&no_grouping=1"
tab.base_url += "&amp;no_grouping=1"
t = tab.make_page(context, format=format, with_html_headers=False, REQUEST=REQUEST)
if format != "html":
return t
@ -1503,11 +1503,11 @@ def formsemestre_graph_parcours(
return doc
elif format == "html":
if only_primo:
op = "only_primo=on&"
op = "only_primo=on&amp;"
else:
op = ""
url = urllib.quote(
"formsemestre_graph_parcours?formsemestre_id=%s&%sbac=%s&bacspecialite=%s&civilite=%s&statut=%s&format="
"formsemestre_graph_parcours?formsemestre_id=%s&amp;%sbac=%s&amp;bacspecialite=%s&amp;civilite=%s&amp;statut=%s&amp;format="
% (formsemestre_id, op, bac, bacspecialite, civilite, statut)
)
(

View File

@ -101,7 +101,7 @@ def formsemestre_synchro_etuds(
if not sem["etapes"]:
raise ScoValueError(
"""opération impossible: ce semestre n'a pas de code étape
(voir "<a href="formsemestre_editwithmodules?formation_id=%(formation_id)s&formsemestre_id=%(formsemestre_id)s">Modifier ce semestre</a>")
(voir "<a href="formsemestre_editwithmodules?formation_id=%(formation_id)s&amp;formsemestre_id=%(formsemestre_id)s">Modifier ce semestre</a>")
"""
% sem
)
@ -109,7 +109,7 @@ def formsemestre_synchro_etuds(
footer = context.sco_footer(REQUEST)
base_url = "%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id)
if anneeapogee:
base_url += "&anneeapogee=%s" % anneeapogee
base_url += "&amp;anneeapogee=%s" % anneeapogee
if anneeapogee == None: # année d'inscription par défaut
anneeapogee = str(
@ -310,7 +310,7 @@ def build_page(
"""
% sem,
"""
Année Apogée: <select id="anneeapogee" name="anneeapogee" onchange="document.location='formsemestre_synchro_etuds?formsemestre_id=%s&anneeapogee='+document.getElementById('anneeapogee').value">"""
Année Apogée: <select id="anneeapogee" name="anneeapogee" onchange="document.location='formsemestre_synchro_etuds?formsemestre_id=%s&amp;anneeapogee='+document.getElementById('anneeapogee').value">"""
% (sem["formsemestre_id"]),
"\n".join(options),
"""

View File

@ -109,7 +109,7 @@ def trombino_html(context, groups_infos, REQUEST=None):
{"title": "Charger des photos...", "url": "photos_import_files_form?%s" % args},
{
"title": "Obtenir archive Zip des photos",
"url": "trombino?%s&format=zip" % args,
"url": "trombino?%s&amp;format=zip" % args,
},
{
"title": "Recopier les photos depuis le portail",
@ -162,7 +162,7 @@ def trombino_html(context, groups_infos, REQUEST=None):
H.append("</div>")
H.append(
'<div style="margin-bottom:15px;"><a class="stdlink" href="trombino?format=pdf&%s">Version PDF</a></div>'
'<div style="margin-bottom:15px;"><a class="stdlink" href="trombino?format=pdf&amp;%s">Version PDF</a></div>'
% args
)
return "\n".join(H)
@ -190,11 +190,11 @@ def check_local_photos_availability(context, groups_infos, REQUEST, format=""):
% (
nb_missing,
groups_infos.base_url
+ "&dialog_confirmed=1&format=%s" % format,
+ "&amp;dialog_confirmed=1&amp;format=%s" % format,
),
dest_url="trombino",
OK="Exporter seulement les photos existantes",
cancel_url="groups_view?curtab=tab-photos&"
cancel_url="groups_view?curtab=tab-photos&amp;"
+ groups_infos.groups_query_args,
REQUEST=REQUEST,
parameters=parameters,
@ -239,7 +239,7 @@ def trombino_copy_photos(context, group_ids=[], REQUEST=None, dialog_confirmed=F
groups_infos = sco_groups_view.DisplayedGroupsInfos(
context, group_ids, REQUEST=REQUEST
)
back_url = "groups_view?%s&curtab=tab-photos" % groups_infos.groups_query_args
back_url = "groups_view?%s&amp;curtab=tab-photos" % groups_infos.groups_query_args
portal_url = sco_portal_apogee.get_portal_url(context)
header = context.sco_header(REQUEST, page_title="Chargement des photos")
@ -486,7 +486,7 @@ def photos_import_files_form(context, group_ids=[], REQUEST=None):
groups_infos = sco_groups_view.DisplayedGroupsInfos(
context, group_ids, REQUEST=REQUEST
)
back_url = "groups_view?%s&curtab=tab-photos" % groups_infos.groups_query_args
back_url = "groups_view?%s&amp;curtab=tab-photos" % groups_infos.groups_query_args
H = [
context.sco_header(REQUEST, page_title="Import des photos des étudiants"),
@ -550,7 +550,7 @@ def photos_import_files(
zip_excel_import_files(
context, xlsfile, zipfile, REQUEST, callback, filename_title, page_title
)
return REQUEST.RESPONSE.redirect(back_url + "&head_message=photos%20 importees")
return REQUEST.RESPONSE.redirect(back_url + "&amp;head_message=photos%20 importees")
def zip_excel_import_files(

View File

@ -320,7 +320,7 @@ def external_ue_create_form(context, formsemestre_id, etudid, REQUEST=None):
cancelbutton="Annuler",
)
bull_url = "formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" % (
bull_url = "formsemestre_bulletinetud?formsemestre_id=%s&amp;etudid=%s" % (
formsemestre_id,
etudid,
)

205
scotests/export_formation1.xml Executable file
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>

1352
scotests/formation_export.json Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
# -*- mode: python -*-
# -*- coding: utf-8 -
""" Création d'une absence et utilisation de AnnuleAbsenceDatesNoJust """
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_abs_views
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Création d'un étudiant
etud = G.create_etud(code_nip=None)
G.inscrit_etudiant(sem, etud)
etudid=etud["etudid"]
# --- Création d'une absence
sco_abs_views.doSignaleAbsence(context.Absences, datedebut="22/01/2021", datefin="22/01/2021", demijournee=2, etudid=etudid, REQUEST=REQUEST)
# --- Annulation d'absence
context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021", REQUEST=REQUEST)
""" Erreur : File "/opt/scodoc/Products/ScoDoc/ZAbsences.py", line 323, in AnnuleAbsencesDatesNoJust
vars(),
psycopg2.DataError: invalid input syntax for type date: "2"
LINE 1: ...es where etudid='EID1' and (not estjust) and jour='2' and mo... """

108
scotests/test_CountAbs.py Executable file
View File

@ -0,0 +1,108 @@
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_abs
import sco_abs_views
import sco_abs_notification
import ZAbsences
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etud = G.create_etud(code_nip=None)
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud)
# --- Saisie absences
etudid = etud["etudid"]
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2),
("22/01/2021", "22/01/2021", 1)
] :
sco_abs_views.doSignaleAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etudid, REQUEST=REQUEST)
# --- Justification de certaines absences
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2)
] :
sco_abs_views.doJustifAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etudid, REQUEST=REQUEST)
# --- Utilisation de CountAbs() de sco_abs
a = sco_abs.getAbsSemEtud(context.Absences, sem, etudid)
nb_abs = a.CountAbs()
nb_absj = a.CountAbsJust()
# --- Utilisation de CountAbs() de ZAbsences
nb_abs2 = context.Absences.CountAbs(etudid=etudid, debut="01/01/2021", fin="06/30/2021")
nb_absj2 = context.Absences.CountAbsJust(etudid=etudid, debut="01/01/2021", fin="06/30/2021")
assert nb_abs == nb_abs2 == 5
assert nb_absj == nb_absj2 == 4
# --- Supression d'absence
_ = sco_abs_views.doAnnuleAbsence(context.Absences, "19/01/2021", "19/01/2021", 2, etudid=etudid, REQUEST=REQUEST)
b = sco_abs.getAbsSemEtud(context.Absences, sem, etudid)
# --- Vérification
new_nbabs = b.CountAbs()
new_nbabs2 = context.Absences.CountAbs(etudid=etudid, debut="01/01/2021", fin="06/30/2021")
print(new_nbabs)
print(new_nbabs2)
assert new_nbabs == new_nbabs2
"""
Commentaire :
CountAbs de ZAbsence ----> OK
CountAbs de sco_abs_view ----> bug
Peut être du au fait que la fonction getAbsSemEtud ne se met pas à jour par rapport aux absences supprimés.
"""

117
scotests/test_abs_demijournee.py Executable file
View File

@ -0,0 +1,117 @@
""" Parametre demijournee ne fonctionne pas lorsque demijournee = 2
Créer et justifier des absences en utilisant le parametre demijournee
"""
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_abs
import sco_abs_views
import sco_abs_notification
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etud = G.create_etud(code_nip=None)
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud)
# --- Saisie absences
etudid = etud["etudid"]
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"15/01/2021",
"15/01/2021",
demijournee=2,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"18/01/2021",
"18/01/2021",
demijournee=1,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"19/01/2021",
"19/01/2021",
demijournee=0,
etudid=etudid,
REQUEST=REQUEST,
)
# --- Justification de certaines absences
_ = sco_abs_views.doJustifAbsence(
context.Absences,
"18/01/2021",
"18/01/2021",
demijournee=1,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doJustifAbsence(
context.Absences,
"19/01/2021",
"19/01/2021",
demijournee=2,
etudid=etudid,
REQUEST=REQUEST,
)
# NE JUSTIFIE QUE LE MATIN MALGRES LE PARAMETRE demijournee = 2
# --- Test
a = sco_abs.getAbsSemEtud(context.Absences, sem, etudid)
assert a.CountAbs() == 4 #l'étudiant a été absent le 15 journée compléte (2 abs : 1 matin, 1 apres midi) et le 18 (1 matin), et le 19 (1 apres midi).
assert a.CountAbsJust() == 2 # Justifie abs du matin + abs après midi
"""
Commentaire :
Pb : le 2 ne peut pas être pris en tant que int car string dans la fonction
-----> Pb regler
"""

266
scotests/test_absence.py Executable file
View File

@ -0,0 +1,266 @@
""" creation de 10 étudiants, formation, semestre, ue, module, absences le matin, l'apres midi, la journée compléte
et justification d'absences, supression d'absences, création d'une liste etat absences, creation d'un groupe afin
de tester la fonction EtatAbsencesGroupes
Fonctions de l'API utilisé :
- doSignaleAbsence
- doAnnuleAbsence
- doJustifAbsence
- getAbsSemEtud
- get_partition_groups
- get_partitions_list
- CountAbs
- CountAbsJust
- ListeAbsEtud
- partition_create
- createGroup
- set_group
- EtatAbsenceGr
- AddBilletAbsence
- listeBilletsEtud
"""
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_abs
import sco_abs_views
import sco_abs_notification
import ZAbsences
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
for etud in etuds:
G.inscrit_etudiant(sem, etud)
#--- Création d'une évaluation
e = G.create_evaluation(
moduleimpl_id=mi["moduleimpl_id"],
jour="22/01/2021",
description="evaluation test",
coefficient=1.0,
)
# --- Saisie absences
etudid = etuds[0]["etudid"]
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"15/01/2021",
"15/01/2021",
demijournee=1,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"18/01/2021",
"18/01/2021",
demijournee=0,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"19/01/2021",
"19/01/2021",
demijournee=2,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"22/01/2021",
"22/01/2021",
demijournee=1,
etudid=etudid,
REQUEST=REQUEST,
)
# --- Justification de certaines absences
_ = sco_abs_views.doJustifAbsence(
context.Absences,
"15/01/2021",
"15/01/2021",
demijournee=1,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doJustifAbsence(
context.Absences,
"18/01/2021",
"18/01/2021",
demijournee=0,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doJustifAbsence(
context.Absences,
"19/01/2021",
"19/01/2021",
demijournee=2,
etudid=etudid,
REQUEST=REQUEST,
)
# --- Test
b = sco_abs.is_work_saturday(context.Absences)
assert b == 0 #samedi ne sont pas compris
a = sco_abs.getAbsSemEtud(context.Absences, sem, etudid)
assert a.CountAbs() == 5 #l'étudiant a été absent le 15 (apres midi) , (16 et 17 we), 18 (matin) et 19 janvier (matin et apres midi), et 22 (matin)
assert a.CountAbsJust() == 4 #l'étudiant justifie ses abs du 15, 18 et 19
# + vérification à l'aide de ScoDoc WEB : ok!
# --- Supression d'une absence et d'une justification
_ = sco_abs_views.doAnnuleAbsence(context.Absences, "19/01/2021", "19/01/2021", 2, etudid=etudid, REQUEST=REQUEST)
a = sco_abs.getAbsSemEtud(context.Absences, sem, etudid)
print(a.CountAbs()) #lors du print cela affiche 5 or cela devrait afficher 3
#assert a.CountAbs() == 3
# + vérification à l'aide de ScoDoc WEB : il y a bien plus que 3 abs, 2 justifiés et 1 non justifié.
# --- supression d'une justification pas encore disponible à l'aide de python.
# --- Création d'une liste d'abs
liste_abs = sco_abs_views.ListeAbsEtud(context.Absences, etudid, format='json', absjust_only=1, REQUEST=REQUEST)
liste_abs2 = sco_abs_views.ListeAbsEtud(context.Absences, etudid, format='json', REQUEST=REQUEST)
load_liste_abs = json.loads(liste_abs)
load_liste_abs2 = json.loads(liste_abs2)
assert len(load_liste_abs2) == 1
assert len(load_liste_abs) == 2
assert load_liste_abs2[0]["ampm"] == "1"
assert load_liste_abs2[0]["datedmy"] == "22/01/2021"
assert load_liste_abs2[0]["exams"] == mod["code"]
# absjust_only -> seulement les abs justifiés
# --- Création d'un groupe
_ = sco_groups.partition_create(context.Scolarite, formsemestre_id=sem["formsemestre_id"], partition_name="Eleve", REQUEST=REQUEST)
li1 = sco_groups.get_partitions_list(context.Scolarite, sem["formsemestre_id"])
_ = sco_groups.createGroup(context.Scolarite, li1[0]["partition_id"], "Groupe 1", REQUEST=REQUEST)
# --- Affectation des élèves dans des groupes
li_grp1 = sco_groups.get_partition_groups(context.Scolarite, li1[0])
for etud in etuds :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp1[0]["group_id"])
# --- Test de EtatAbsencesGroupes
grp1_abs = context.Absences.EtatAbsencesGr(group_ids=[li_grp1[0]["group_id"]], debut="01/01/2021", fin ="30/06/2021", format="json", REQUEST=REQUEST)
load_grp1_abs = json.loads(grp1_abs)
assert len(load_grp1_abs) == 10
tab_id=[] #tab des id present dans load_grp1_abs
for un_etud in load_grp1_abs :
tab_id.append(un_etud["etudid"])
for etud in etuds : #verification si tous les etudiants sont present dans la liste du groupe d'absence
assert etud["etudid"] in tab_id
for un_etud in load_grp1_abs :
if un_etud["etudid"] == etudid :
assert un_etud["nbabs"] == "3"
assert un_etud["nbjustifs_noabs"] == "2"
assert un_etud["nbabsjust"] == "2"
assert un_etud["nbabsnonjust"] == "1"
assert un_etud["nomprenom"] == etuds[0]["nomprenom"]
# --- Création de billets
b1 = context.Absences.AddBilletAbsence(
begin="2021-01-22 00:00",
end="2021-01-22 23:59",
etudid=etudid,
description = "abs du 22",
justified=False,
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
REQUEST=REQUEST,
)
b2 = context.Absences.AddBilletAbsence(
begin="2021-01-15 00:00",
end="2021-01-15 23:59",
etudid=etudid,
description = "abs du 15",
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
REQUEST=REQUEST,
)
li_bi = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi = json.loads(li_bi)
assert len(load_li_bi) == 2
assert load_li_bi[1]["description"] == "abs du 22"
"""
Commentaire :
Parametre demijournee ne prend pas en compte les strings ---> pb régler.
La suppression de justification ne peut pas se faire directement en interractif à l'aide de python.
La fonction CountAbs ne met pas à jour le nombre après supression des absences. ---> (cf : test_CountAbs.py)
"""

267
scotests/test_absence2.py Executable file
View File

@ -0,0 +1,267 @@
# -*- mode: python -*-
# -*- coding: utf-8 -
""""
Creation de 10 étudiants, formation, semestre, ue, module, absences le matin, l'apres midi, la journée compléte
et justification d'absences, supression d'absences, création de listes d'absences, création de billet
et creation d'un groupe.
Fonction de l'API utilisé :
- doSignaleAbsence
- doJustifAbsence
- AddBilletAbs
- XMLgetBilletAbsence
- listeBilletEtud
- ListeAbsJust
- CountAbsJust
- ListAbsNonJust
- ListJustifs
- ListeAbsJour
- ListAbsInRange
Fonction renvoyant du code HTML :
- EtatAbsences
- SignaleAbsenceGrSemestre
- SignaleAbsenceGrHebdo
- EtatAbsenceDate
- AddBilletAbsenceForm
- AnnuleAbsenceEtud
- ProcessBilletAbsenceForm
- JustifAbsenceEtud
- doAnnuleJustif
"""
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_abs
import sco_abs_views
import sco_abs_notification
import ZAbsences
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
for etud in etuds:
G.inscrit_etudiant(sem, etud)
# --- Création d'un groupe
_ = sco_groups.partition_create(context.Scolarite, formsemestre_id=sem["formsemestre_id"], partition_name="Eleve", REQUEST=REQUEST)
li1 = sco_groups.get_partitions_list(context.Scolarite, sem["formsemestre_id"])
_ = sco_groups.createGroup(context.Scolarite, li1[0]["partition_id"], "Groupe 1", REQUEST=REQUEST)
# --- Affectation des élèves dans des groupes
li_grp1 = sco_groups.get_partition_groups(context.Scolarite, li1[0])
for etud in etuds :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp1[0]["group_id"])
# --- Saisie absences
etudid = etuds[0]["etudid"]
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2),
("22/01/2021", "22/01/2021", 1)
] :
sco_abs_views.doSignaleAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etudid, REQUEST=REQUEST)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"22/01/2021",
"22/01/2021",
demijournee=1,
etudid=etuds[1]["etudid"],
REQUEST=REQUEST,
)
# --- Justification de certaines absences
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2)
] :
sco_abs_views.doJustifAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etudid, REQUEST=REQUEST)
# --- Test
_ = context.Absences.doSignaleAbsenceGrSemestre(
dates="2021-01-13,2021-01-25",
etudids= etuds[5]["etudid"]+","+etuds[6]["etudid"],
destination="",
REQUEST=REQUEST
) # <----- rien ne se passe (pb parametre ?)
# --- Création de billets
b1 = context.Absences.AddBilletAbsence(
begin="2021-01-22 00:00",
end="2021-01-22 23:59",
etudid=etudid,
description = "abs du 22",
justified=False,
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
REQUEST=REQUEST,
)
b2 = context.Absences.AddBilletAbsence(
begin="2021-01-15 00:00",
end="2021-01-15 23:59",
etudid=etudid,
description = "abs du 15",
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
REQUEST=REQUEST,
)
# --- XMLgetBilletEtud
xml_bi = context.Absences.XMLgetBilletsEtud(etudid=etudid, REQUEST=REQUEST)
print(1)
print(xml_bi)
print(1)
# --- Supression de billet
li_bi = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi = json.loads(li_bi)
#_ = context.Absences.deleteBilletAbsence(load_li_bi[1]["billet_id"], REQUEST=REQUEST)
li_bi2 = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi2 = json.loads(li_bi)
#assert len(load_li_bi2) == 1
#assert load_li_bi2[0]["description"] == "abs du 22"
# --- Créaton de listes
li_abs_just = context.Absences.ListeAbsJust(etudid = etudid, datedebut="01/01/2021")
nb_abs_just = context.Absences.CountAbsJust(etudid, debut="01/01/2021", fin="06/30/2021")
assert len(li_abs_just) == nb_abs_just
assert li_abs_just[0]["etudid"] == etudid
assert li_abs_just[0]["matin"] == True
assert li_abs_just[0]["jour"] == datetime.date(2021, 1, 15)
assert li_abs_just[2]["jour"] == datetime.date(2021, 1, 19)
assert li_abs_just[2]["matin"] == False
li_abs_njust = context.Absences.ListeAbsNonJust(etudid=etudid, datedebut="01/01/2021")
nb_abs = context.Absences.CountAbs(etudid, debut="01/01/2021", fin="06/30/2021")
assert len(li_abs_njust) == nb_abs - nb_abs_just
assert li_abs_njust[0]["matin"] == True
assert li_abs_njust[0]["etudid"] == etudid
assert li_abs_njust[0]["jour"] == datetime.date(2021, 1, 22)
li_just = context.Absences.ListeJustifs(etudid=etudid, datedebut="01/01/2021")
assert len(li_just) == 4
li_just2 = context.Absences.ListeJustifs(etudid=etudid, datedebut="01/01/2021", datefin="01/18/2021")
assert len(li_just2) == 2
li_jour = context.Absences.ListeAbsJour(date="01/22/2021")
assert len(li_jour) == 2
li_jour2 = context.Absences.ListeAbsJour(date="01/18/2021")
assert len(li_jour2) == 1
li_range = context.Absences.ListAbsInRange(etudid, debut="01/01/2021", fin="06/01/2021")
assert len(li_range) == 5
#li_xml = context.Absences.XMLgetAbsEtud(beg_date="01/01/2021", end_date="01/06/2021", REQUEST=REQUEST)
#print(li_xml) need etudid
# --- Annulation d'absence
#context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021", REQUEST=REQUEST)
# --- Fonction renvoyant du code HTML
etat_abs = context.Absences.EtatAbsences(REQUEST=REQUEST)
#cal_abs = sco_abs_views.CalAbs(context.Absences, REQUEST=REQUEST) #<--- retourne html + need etudid : how?
sag = context.Absences.SignaleAbsenceGrSemestre(
datedebut="15/01/2021",
datefin="22/01/2021",
group_ids=[li_grp1[0]["group_id"]],
REQUEST=REQUEST,
)
sagh = context.Absences.SignaleAbsenceGrHebdo(
datelundi="18/01/2021", group_ids=[li_grp1[0]["group_id"]], destination="", REQUEST=REQUEST
)
grp_abs_d = context.Absences.EtatAbsencesDate(group_ids=[li_grp1[0]["group_id"]], date="22/01/2021", REQUEST=REQUEST)
billet_form = context.Absences.AddBilletAbsenceForm(etudid=etudid, REQUEST=REQUEST)
#an_abs = AnnuleAbsenceEtud(context.Absences, REQUEST=REQUEST) #<- retourne html + need etudid : how?
#proc = context.Absences.ProcessBilletAbsenceForm(billet_id=load_li_bi[0]["billet_id"], REQUEST=REQUEST) #error
#just_form = sco_abs_views.JustifAbsenceEtud(context.Absences, REQUEST=REQUEST)
#delete_just = sco_abs_views.doAnnuleJustif(context.Absences, datedebut0="22/01/2021", datefin0="22/01/2021", demijournee=2, REQUEST=REQUEST)
"""
Commentaire :
Certaines fonctions ont besoin de l'id de l'étudiant mais n'ont pas ce parametre comment le récupérer ?
(CalAbs, SignaleAbsenceEtud, AnnuleAbsenceEtud, JustifAbsenceEtud, doAnnuleJustif, XMLgetAbsEtud)
D'autres fonctions renvoient du HTML -> comment les tester en python?
doSignaleAbsenceGrSemestre -> ne fonctionne pas (pb au niveau de l'écriture des parametres au lancement
de la fonction?)
XMLgetBilletsEtud, deleteBilletAbsence -> fonction get ne retourne rien et delete ne supprime rien
(lancer fichier test_billet)
AnnuleAbsencesDatesNoJust -> error line 323, jour='2' (2 doit être un int et non un string?)
"""

261
scotests/test_api7doc.py Executable file
View File

@ -0,0 +1,261 @@
import sco_formations
import json
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
import sco_groups_view
import sco_abs_views
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(REQUEST=REQUEST, 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)
# --- Création des étudiants
etuds=[]
for nom, prenom in [
("Semestre11", "EtudiantNumero1"),
("Semestre12", "EtudiantNumero2"),
("Semestre23", "EtudiantNumero3"),
("Semestre24", "EtudiantNumero4"),
("Semestre35", "EtudiantNumero5"),
("Semestre36", "EtudiantNumero6"),
("Semestre47", "EtudiantNumero7"),
("Semestre48", "EtudiantNumero8")
] :
etud = G.create_etud(
nom=nom,
prenom=prenom,
)
etuds.append(etud)
# --- Inscription des étudiants
for etud in etuds[0:2]:
G.inscrit_etudiant(sem1, etud)
for etud in etuds[2:4]:
G.inscrit_etudiant(sem2, etud)
for etud in etuds[4:6]:
G.inscrit_etudiant(sem3, etud)
for etud in etuds[6:]:
G.inscrit_etudiant(sem4, etud)
# --- Création d'une évaluation pour chaque UE
lim_sem1 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem1["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem1 = json.loads(lim_sem1)
lim_sem2 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem2 = json.loads(lim_sem2)
lim_sem3 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem3["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem3 = json.loads(lim_sem3)
lim_sem4 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem4["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem4 = json.loads(lim_sem4)
for moduleimpl_id, jour, description, coefficient in [
(load_lim_sem1[1]["moduleimpl_id"], "02/09/2020", "InterroTestSemestre1", 1.0),
(load_lim_sem1[2]["moduleimpl_id"], "03/09/2020", "InterroTestSemestre1", 1.0),
(load_lim_sem2[1]["moduleimpl_id"], "03/02/2021", "InterroTestSemestre2", 1.0),
(load_lim_sem2[8]["moduleimpl_id"], "04/02/2021", "InterroTestSemestre2", 1.0),
(load_lim_sem3[3]["moduleimpl_id"], "02/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem3[9]["moduleimpl_id"], "03/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem3[15]["moduleimpl_id"], "04/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem4[3]["moduleimpl_id"], "03/02/2021", "InterroTestSemestre4", 1.0),
(load_lim_sem4[9]["moduleimpl_id"], "04/02/2021", "InterroTestSemestre4", 1.0),
(load_lim_sem4[13]["moduleimpl_id"], "05/02/2021", "InterroTestSemestre4", 1.0),
] :
e = G.create_evaluation(moduleimpl_id=moduleimpl_id, jour=jour, description=description, coefficient=coefficient)
# --- Saisie des notes des étudiants (un élève a 12, un autre a 7 pour chaque semestre)
lie1 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem1["formsemestre_id"])
lie2 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem2["formsemestre_id"])
lie3 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem3["formsemestre_id"])
lie4 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem4["formsemestre_id"])
for eval in lie1 :
for etud in etuds[:2] :
if etud == etuds[0] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
for eval in lie2 :
for etud in etuds[2:4] :
if etud == etuds[2] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
for eval in lie3 :
for etud in etuds[4:6] :
if etud == etuds[4] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
for eval in lie4 :
for etud in etuds[6:] :
if etud == etuds[6] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
# --- Département
li_dep = context.ScoDoc.list_depts(format="json", REQUEST=REQUEST)
print(li_dep)
# --- Formation
lif = context.Notes.formation_list(format="json", REQUEST=REQUEST, formation_id=f[0])
load_lif = json.loads(lif)
assert len(load_lif) == 1
assert load_lif[0]["formation_id"] == f[0]
exp = sco_formations.formation_export(context.Notes, formation_id=f[0], format="json", REQUEST=REQUEST)
load_exp = json.loads(exp)
assert load_exp["acronyme"] == "DUT Info"
assert load_exp["titre_officiel"] == "DUT Informatique"
assert load_exp["formation_code"] == "FCOD2"
# --- Semestre
li_sem = context.Notes.formsemestre_list(formation_id=f[0], format = "json", REQUEST=REQUEST)
load_li_sem = json.loads(li_sem)
assert len(load_li_sem) == 4
# --- Création des groupes
_ = sco_groups.partition_create(context.Scolarite, formsemestre_id=sem1["formsemestre_id"], partition_name="Eleve 1ere annee", REQUEST=REQUEST)
li1 = sco_groups.get_partitions_list(context.Scolarite, sem1["formsemestre_id"])
_ = sco_groups.createGroup(context.Scolarite, li1[0]["partition_id"], "Groupe S1A", REQUEST=REQUEST)
li_grp1 = sco_groups.get_partition_groups(context.Scolarite, li1[0])
for etud in etuds[0:2] :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp1[0]["group_id"])
# --- Groupes
li_part = sco_groups.formsemestre_partition_list(context.Scolarite, formsemestre_id=sem1["formsemestre_id"], format = "json", REQUEST=REQUEST)
load_li_part = json.loads(li_part)
assert len(load_li_part) == 2 # 2 partition (defaut et eleve 1ere annee)
assert load_li_part[0]["formsemestre_id"] == sem1["formsemestre_id"]
assert len(load_li_part[0]["group"]) == 1 # 2 groupes S1A
assert load_li_part[0]["group"][0]["group_name"] == "Groupe S1A"
assert load_li_part[0]["group"][0]["group_id"] == li_grp1[0]["group_id"]
assert load_li_part[0]["partition_id"] == load_li_part[0]["group"][0]["partition_id"] == li1[0]["partition_id"]
assert load_li_part[0]["partition_name"] == "Eleve 1ere annee"
vue_g1 = sco_groups_view.groups_view(context.Scolarite, group_ids = [li_grp1[0]["group_id"]], format = "json", REQUEST=REQUEST)
load_vue_g1 = json.loads(vue_g1)
assert len(load_vue_g1) == 2
assert load_vue_g1[0][li1[0]["partition_id"]] == li_grp1[0]["group_name"]
# --- Etudiant
etudi = context.Scolarite.etud_info(etudid=etuds[0]["etudid"], format="json", REQUEST=REQUEST)
load_etudi = json.loads(etudi)
assert load_etudi["prenom"] == "Etudiantnumero1"
assert load_etudi["nom"] == "SEMESTRE11"
assert load_etudi["etudid"] == etuds[0]["etudid"]
# --- Absences
for debut, fin, demijournee in [
("18/01/2021", "18/01/2021", 1),
("19/01/2021", "19/01/2021", 0),
] :
sco_abs_views.doSignaleAbsence(context.Absences, datedebut=debut, datefin=fin, demijournee=demijournee, etudid=etuds[0]["etudid"], REQUEST=REQUEST)
nb_abs = context.Absences.CountAbs(etuds[0]["etudid"], debut="09/01/2020", fin="02/01/2021")
assert nb_abs == 2
liste_abs = sco_abs_views.ListeAbsEtud(context.Absences, etuds[0]["etudid"], format='json', REQUEST=REQUEST)
load_liste_abs = json.loads(liste_abs)
assert len(load_liste_abs) == 2
_ = sco_abs_views.doAnnuleAbsence(context.Absences, "15/01/2021", "15/01/2021", 1, etudid=etuds[0]["etudid"], REQUEST=REQUEST)
# --- Module
#Voir test dans test_formation.

96
scotests/test_billet.py Executable file
View File

@ -0,0 +1,96 @@
# -*- mode: python -*-
# -*- coding: utf-8 -
""" Création de billet, utilisation de XMLgetBilletsEtud et suppression de billet """
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_abs_views
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Création d'un étudiant
etud = G.create_etud(code_nip=None)
G.inscrit_etudiant(sem, etud)
etudid=etud["etudid"]
# --- Création d'une absence
sco_abs_views.doSignaleAbsence(context.Absences, datedebut="22/01/2021", datefin="22/01/2021", demijournee=2, etudid=etudid, REQUEST=REQUEST)
# --- Création d'un billet
b1 = context.Absences.AddBilletAbsence(
begin="2021-01-22 00:00",
end="2021-01-22 23:59",
etudid=etudid,
description = "abs du 22",
justified=False,
code_nip=etud["code_nip"],
code_ine=etud["code_ine"],
REQUEST=REQUEST,
)
# --- XMLgetBilletEtud
xml_bi = context.Absences.XMLgetBilletsEtud(etudid=etudid, REQUEST=REQUEST)
print(1)
print(xml_bi)
print(1)
# --- Suppression d'un billet
li_bi = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi = json.loads(li_bi)
_ = context.Absences.deleteBilletAbsence(load_li_bi[0]["billet_id"], REQUEST=REQUEST)
li_bi2 = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi2 = json.loads(li_bi)
assert len(load_li_bi2) == 0
"""
Commentaire :
XMLgetBilletsEtud retourne une chaine vide
deleteBilletsEtud : erreur
File "/opt/scodoc/Products/ScoDoc/ZAbsences.py", line 1809, in deleteBilletAbsence
parameters={"billet_id": billet_id},
File "/opt/scodoc/Products/ScoDoc/ZScolar.py", line 2664, in confirmDialog
return self.sco_header(REQUEST) + "\n".join(H) + self.sco_footer(REQUEST)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 223: ordinal not in range(128)
"""

47
scotests/test_create_etud.py Executable file
View File

@ -0,0 +1,47 @@
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
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'un étudiant
etud = G.create_etud(
code_nip="",
nom="Poire",
prenom="Kevin",
code_ine="",
civilite="M",
etape="TST1",
email="test1@localhost",
emailperso="perso1@localhost",
date_naissance="01/05/2001",
lieu_naissance="Stains",
dept_naissance="93",
domicile="11, rue du test",
codepostaldomicile="93430",
villedomicile="Villetaneuse",
paysdomicile="France",
telephone="0102030405",
typeadresse="domicile",
boursier=None,
description="etudiant test",
)
print(etud)
print(" ")
info = context.Scolarite.etud_info(etud["etudid"], format = "json", REQUEST=REQUEST)
load_info = json.loads(info)
print(load_info)
#malgrè l'entrée de donnée dans les paramètres la fonction ne les prend pas en compte. Sauf pour date_naissance,
#dept_naissance, nom et prenom, lieu_naissance et civilite la fonction crée aussi un code nip et ine donc pas de pb
#pour ca.
print(" ")
print(etud["telephone"])
print(etud["domicile"])
print(etud["emailperso"])

View File

@ -0,0 +1,69 @@
# -*- mode: python -*-
# -*- coding: utf-8 -
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_abs_views
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Création d'un étudiant
etud = G.create_etud(code_nip=None)
G.inscrit_etudiant(sem, etud)
etudid=etud["etudid"]
# --- Création d'une absence
sco_abs_views.doSignaleAbsence(context.Absences, datedebut="22/01/2021", datefin="22/01/2021", demijournee=2, etudid=etudid, REQUEST=REQUEST)
# --- Création d'un billet
b1 = context.Absences.AddBilletAbsence(
begin="2021-01-22 00:00",
end="2021-01-22 23:59",
etudid=etudid,
description = "abs du 22",
justified=False,
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
REQUEST=REQUEST,
)
# --- Suppression d'un billet
_ = context.Absences.deleteBilletAbsence(load_li_bi[1]["billet_id"], REQUEST=REQUEST)
li_bi = context.Absences.listeBilletsEtud(etudid=etudid, REQUEST=REQUEST, format="json")
load_li_bi = json.loads(li_bi)
assert len(load_li_bi) == 0

46
scotests/test_edit.py Executable file
View File

@ -0,0 +1,46 @@
# -*- mode: python -*-
# -*- coding: utf-8 -
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
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Modification d'un module
context.Notes.do_module_edit({"module_id":mod["module_id"], "code": "MOD1", "titre" : "module modifie"})
print(mod)

135
scotests/test_etudiant.py Executable file
View File

@ -0,0 +1,135 @@
""" Création de 2 étudiants, un qui demissionne, un autre defaillant + annuler demission et annuler défaillance
Fonctions de lAPI utilisé :
- doDemEtudiant
- doDefEtudiant
- doCancelDem
- doCancelDef
- etud_info
- search_etud_in_dept
- fillEtudsInfo
"""
import random
# La variable context est définie par le script de lancement
# l'affecte ainsi pour éviter 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 scolars
import sco_find_etud
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etud1 = G.create_etud(
code_nip="",
nom="Poire",
prenom="Kevin",
code_ine="",
civilite="M",
etape="TST1",
email="test1@localhost",
emailperso="perso1@localhost",
date_naissance="01/05/2001",
lieu_naissance="Stains",
dept_naissance="93",
domicile="11, rue du test",
codepostaldomicile="93430",
villedomicile="Villetaneuse",
paysdomicile="France",
telephone="0102030405",
typeadresse="domicile",
boursier=None,
description="etudiant test",
)
etud2 = G.create_etud()
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2020",
date_fin="30/06/2020",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud1)
G.inscrit_etudiant(sem, etud2)
# --- Etud_info
info = context.Scolarite.etud_info(etud1["etudid"], format = "json", REQUEST=REQUEST)
load_info = json.loads(info)
# --- Démission étudiant
context.doDemEtudiant(etud1["etudid"], sem["formsemestre_id"], event_date="01/01/2021")
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
assert bul["moy_gen"] == "NA"
assert bul["ins"][0]["etat"] == "D"
# --- Défaillance d'un étudiant
context.doDefEtudiant(etud2["etudid"], sem["formsemestre_id"], event_date="01/01/2021")
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
assert bul["moy_gen"] == "NA"
assert bul["ins"][0]["etat"] == "D"
# --- Annuler démission
context.Scolarite.doCancelDem(etud1["etudid"], sem["formsemestre_id"], REQUEST=REQUEST)
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
print(bul["ins"][0]["etat"])
#assert bul["ins"][0]["etat"] == "I"
# --- Annuler défaillance
context.Scolarite.doCancelDef(etud2["etudid"], sem["formsemestre_id"], REQUEST=REQUEST)
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
print(bul["ins"][0]["etat"])
#assert bul["ins"][0]["etat"] == "I"
# --- Fonctions retournant HTML
find = sco_find_etud.search_etud_in_dept(context.Scolarite, expnom="Poire", REQUEST=REQUEST)
_ = context.Scolarite.fillEtudsInfo(etuds=[etud1])
"""
Commentaire :
L'etat ne se met pas à jour après l'annulation de la démission ou de la défaillance.
etud_info ne donne pas toutes les infos de l'étudiant voir mini test create_etud.
"""

135
scotests/test_etudiant1.py Executable file
View File

@ -0,0 +1,135 @@
""" Création de 2 étudiants, un qui demissionne, un autre defaillant + annuler demission et annuler défaillance
Fonctions de lAPI utilisé :
- doDemEtudiant
- doDefEtudiant
- doCancelDem
- doCancelDef
- etud_info
- search_etud_in_dept
- fillEtudsInfo
"""
import random
# La variable context est définie par le script de lancement
# l'affecte ainsi pour éviter 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 scolars
import sco_find_etud
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etud1 = G.create_etud(
code_nip="",
nom="Poire",
prenom="Kevin",
code_ine="",
civilite="M",
etape="TST1",
email="test1@localhost",
emailperso="perso1@localhost",
date_naissance="01/05/2001",
lieu_naissance="Stains",
dept_naissance="93",
domicile="11, rue du test",
codepostaldomicile="93430",
villedomicile="Villetaneuse",
paysdomicile="France",
telephone="0102030405",
typeadresse="domicile",
boursier=None,
description="etudiant test",
)
etud2 = G.create_etud()
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2020",
date_fin="30/06/2020",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud1)
G.inscrit_etudiant(sem, etud2)
# --- Etud_info
info = context.Scolarite.etud_info(etud1["etudid"], format = "json", REQUEST=REQUEST)
load_info = json.loads(info)
# --- Démission étudiant
context.doDemEtudiant(etud1["etudid"], sem["formsemestre_id"], event_date="01/01/2021")
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
assert bul["moy_gen"] == "NA"
assert bul["ins"][0]["etat"] == "D"
# --- Défaillance d'un étudiant
context.doDefEtudiant(etud2["etudid"], sem["formsemestre_id"], event_date="01/01/2021")
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
assert bul["moy_gen"] == "NA"
assert bul["ins"][0]["etat"] == "D"
# --- Annuler démission
context.Scolarite.doCancelDem(etud1["etudid"], sem["formsemestre_id"], REQUEST=REQUEST)
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
print(bul["ins"][0]["etat"])
#assert bul["ins"][0]["etat"] == "I"
# --- Annuler défaillance
context.Scolarite.doCancelDef(etud2["etudid"], sem["formsemestre_id"], REQUEST=REQUEST)
bul = sco_bulletins.formsemestre_bulletinetud_dict(context.Notes, sem["formsemestre_id"], etud1["etudid"])
print(bul["ins"][0]["etat"])
#assert bul["ins"][0]["etat"] == "I"
# --- Fonctions retournant HTML
find = sco_find_etud.search_etud_in_dept(context.Scolarite, expnom="Poire", REQUEST=REQUEST)
_ = context.Scolarite.fillEtudsInfo(etuds=[etud1])
"""
Commentaire :
L'etat ne se met pas à jour après l'annulation de la démission ou de la défaillance.
etud_info ne donne pas toutes les infos de l'étudiant voir mini test create_etud.
"""

257
scotests/test_evaluation.py Executable file
View File

@ -0,0 +1,257 @@
""" Création d'une formation, d'élève de 2 ue dans un semestre et de 6 évaluations par 3 fonction différentes :
create_eval, evaluation_create et do_evaluation_create. Saisir les notes des évaluations, lister ces evaluations,
supprimer et modifier une evaluation
Fonction de l'API utilisé :
- create_evaluation
- evaluation_create
- do_evaluation_create
- do_evaluation_list_in_formsemestre
- do_evaluation_list
- create_note
- check_absences
- do_evaluation_etat
- evaluation_supress_alln
- do_evaluation_edit
- do_evaluation_delete
"""
import sys
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
import sco_liste_notes
import sco_evaluations
import sco_undo_notes
import sco_abs_views
import sco_saisie_notes
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]
# --- Création d'une formation et de deux UE
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
ue2 = G.create_ue(formation_id=f["formation_id"], acronyme="TST2", titre="ue test2")
mat2 = G.create_matiere(ue_id=ue2["ue_id"], titre="matière test2")
mod2 = G.create_module(
matiere_id=mat2["matiere_id"],
code="TSM2",
coefficient=1.0,
titre="module test2",
ue_id=ue2["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
mi2 = G.create_moduleimpl(
module_id=mod2["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
for etud in etuds:
G.inscrit_etudiant(sem, etud)
# --- Création des évaluations
#création d'éval avec create_evaluation
e = G.create_evaluation(
moduleimpl_id=mi["moduleimpl_id"],
jour="7/01/2021",
description="evaluation test 1",
coefficient=1.0,
)
e2 = G.create_evaluation(
moduleimpl_id=mi2["moduleimpl_id"],
jour="11/01/2021",
description="evaluation test 2",
coefficient=1.0,
)
#création d'éval avec evaluation_create
#e3 = context.Notes.evaluation_create(mi["moduleimpl_id"], REQUEST)
#e4 = context.Notes.evaluation_create(mi2["moduleimpl_id"], REQUEST) # rien ne se passe
#création d'éval avec do_evaluation_create ! WARNING : retourne l'id de l'éval !
e5 = context.Notes.do_evaluation_create(
moduleimpl_id=mi["moduleimpl_id"],
jour="01/02/2021",
heure_debut="9h0",
heure_fin="11h0",
description="evaluation test 5",
note_max="20.0",
coefficient="1",
REQUEST=REQUEST
)
e6 = context.Notes.do_evaluation_create(
moduleimpl_id=mi2["moduleimpl_id"],
jour="01/02/2021",
heure_debut="13h0",
heure_fin="15h0",
description="evaluation test 6",
note_max="20.0",
coefficient="1",
REQUEST=REQUEST
)
# --- Liste des évaluations dans le semestre
lie = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem["formsemestre_id"])
assert len(lie) == 4
""" print(lie[0])
print(" ")
print(lie[1])
print(" ")
print(lie[2])
print(" ")
print(lie[3]) """
eval5 = context.Notes.do_evaluation_list({"evaluation_id" : e5})[0]
eval6 = context.Notes.do_evaluation_list({"evaluation_id" : e6})[0]
# --- Saisie des absences aux évaluations
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"7/01/2021",
"7/01/2021",
demijournee=1,
etudid=etuds[0]["etudid"],
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence(
context.Absences,
"01/02/2021",
"01/02/2021",
demijournee=1,
etudid=etuds[1]["etudid"],
REQUEST=REQUEST,
)
_ = sco_abs_views.doJustifAbsence(
context.Absences,
"01/02/2021",
"01/02/2021",
demijournee=1,
etudid=etuds[1]["etudid"],
REQUEST=REQUEST,
)
# --- Saisie des notes
evals = [e,e2,eval5,eval6]
for eval in evals :
for etud in etuds:
nb_changed, nb_suppress, existing_decisions = G.create_note(
evaluation=eval, etud=etud, note=float(random.randint(0, 20))
)
# --- Check abs
check = sco_liste_notes.evaluation_check_absences(context.Notes, evaluation_id=e["evaluation_id"])
check2 = sco_liste_notes.evaluation_check_absences(context.Notes, evaluation_id=e2["evaluation_id"])
# --- Liste de note d'une évaluation
#lien = sco_liste_notes.do_evaluation_listenotes(context=context.Notes, REQUEST=REQUEST)
cal = sco_evaluations.formsemestre_evaluations_cal(context.Notes, formsemestre_id=sem["formsemestre_id"], REQUEST=REQUEST)
#html
delai = sco_evaluations.formsemestre_evaluations_delai_correction(context.Notes, formsemestre_id=sem["formsemestre_id"], format="json", REQUEST=REQUEST)
#html
lio = sco_undo_notes.evaluation_list_operations(context.Notes, evaluation_id=e["evaluation_id"], REQUEST=REQUEST)
#html
# --- Supression de toutes les notes d'une évaluations
etat = sco_evaluations.do_evaluation_etat(context.Notes, e2["evaluation_id"])
assert etat["evalcomplete"]
sco_saisie_notes.evaluation_suppress_alln(context.Notes, e2["evaluation_id"], REQUEST=REQUEST)
etat2 = sco_evaluations.do_evaluation_etat(context.Notes, e2["evaluation_id"])
#assert not etat2["evalcomplete"] rien ne se passe...
# --- Modification d'une évaluation
context.Notes.do_evaluation_edit(REQUEST=REQUEST, args={"evaluation_id" : e5, "coefficient": 2.0 ,
"description" : "modification", "note_max" : 20,
"heure_debut" : "8h0", "heure_fin" : "10h0", "jour" : "03/02/2021"})
new_eval5 = context.Notes.do_evaluation_list({"evaluation_id" : e5})[0]
assert new_eval5["description"] == "modification"
assert new_eval5["jour"] == "03/02/2021"
assert new_eval5["heure_debut"] == "08h00"
assert new_eval5["heure_fin"] == "10h00"
assert new_eval5["coefficient"] == 2.0
# --- Supression d'une évaluation
e7 = G.create_evaluation(
moduleimpl_id=mi["moduleimpl_id"],
jour="7/01/2021",
description="evaluation test 7",
coefficient=1.0,
)
lie = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem["formsemestre_id"])
assert len(lie) == 5
#context.Notes.evaluation_delete(REQUEST=REQUEST, evaluation_id=e7) rien ne se passe
sco_evaluations.do_evaluation_delete(context.Notes, REQUEST=REQUEST, evaluation_id=e7["evaluation_id"])
lie2 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem["formsemestre_id"])
assert len(lie2) == 4
"""
Commentaire :
Plusieurs fonction retourne de l'HTML, les notes ne se suppriment pas malgre l'utilisation de la fonction
evaluation_supress_alln (voir mini test). evaluation_delete ---> rien ne se passe.
"""

View File

@ -0,0 +1,75 @@
""" Création d'une évaluation, saisie des notes et supressions de toutes les notes """
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_saisie_notes
import sco_evaluations
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]
# --- Création d'une formation et de deux UE
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
for etud in etuds:
G.inscrit_etudiant(sem, etud)
# --- Création d'une évaluation
e = G.create_evaluation(
moduleimpl_id=mi["moduleimpl_id"],
jour="7/01/2021",
description="evaluation test 1",
coefficient=1.0,
)
# --- Saisie des notes
for etud in etuds:
nb_changed, nb_suppress, existing_decisions = G.create_note(
evaluation=e, etud=etud, note=float(random.randint(0, 20))
)
etat = sco_evaluations.do_evaluation_etat(context.Notes, e["evaluation_id"])
assert etat["evalcomplete"]
# --- Suppression des notes
sco_saisie_notes.evaluation_suppress_alln(context.Notes, e["evaluation_id"], REQUEST=REQUEST)
etat = sco_evaluations.do_evaluation_etat(context.Notes, e["evaluation_id"])
assert not etat["evalcomplete"]
"""
Commentaire : Les notes ne se suppriment pas et l'etat ne change donc pas
"""

View File

@ -0,0 +1,79 @@
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()
print(doc)
print("\n \n \n")
# --- Création de la formation
f = sco_formations.formation_import_xml(REQUEST=REQUEST, 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)
# --- Test de export_formation format xml
form_exp = context.Notes.formation_export(formation_id=f[0], format="xml", REQUEST=REQUEST)
print(form_exp[39:])

319
scotests/test_formations.py Executable file
View File

@ -0,0 +1,319 @@
""" Créer 2 formations, une test et une normale. Créer 2 semestres dans la formation normale et un
dans la formation test, créer 2 semestres dans la formation normale (un test et un normal),
2 ue (un test et un normal), 2 modules (un test et un normal) et 2 matieres (test et normal).
Et dans la formations test, un semestre, un module, un ue et une matiere.
Afficher la liste de tout ca puis supprimer les ue, mod, mat et sem test ainsi
que la formation test. Afficher la liste des UE, formations et modules restante.
Vérification :
- Les listes initiales comprennent bien tout les éléments créés avec les bon noms etc
- La supression s'est bien effectué au niveau de scodoc web et en python
- Vérifier que les fonctions listes font bien la mise à jour après supression
Fonction de l'API utilisé :
- create_formation
- create_ue
- create_matiere
- create_module
- create_formsemestre
- create_moduleimpl
- formation_list
- formation_export
- formsemestre_list
- do_moduleimpl_list
- do_module_impl_with_module_list
- do_formsemestre_delete
- do_module_list
- do_module_delete
- do_matiere_list
- do_matiere_delete
- do_ue_list
- do_ue_delete
- do_formation_delete
"""
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_formsemestre_status
import ZNotes
import sco_formations
import sco_moduleimpl
import sco_edit_ue
import sco_edit_matiere
import sco_edit_module
import sco_formsemestre_edit
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création de formations
f = G.create_formation(acronyme="F1", titre="Formation 1", titre_officiel="Titre officiel 1")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
ue2 = G.create_ue(formation_id=f["formation_id"], acronyme="TST2", titre="ue test2")
mat2 = G.create_matiere(ue_id=ue2["ue_id"], titre="matière test2")
mod2 = G.create_module(
matiere_id=mat2["matiere_id"],
code="TSM2",
coefficient=1.0,
titre="module test",
ue_id=ue2["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
uet = G.create_ue(formation_id=f["formation_id"], acronyme="TSTt", titre="ue testt")
matt = G.create_matiere(ue_id=uet["ue_id"], titre="matière testt")
modt = G.create_module(
matiere_id=matt["matiere_id"],
code="TSMt",
coefficient=1.0,
titre="module test",
ue_id=uet["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
f2 = G.create_formation(acronyme="", titre="Formation test")
ue3 = G.create_ue(formation_id=f2["formation_id"], acronyme="TST3", titre="ue test3")
mat3 = G.create_matiere(ue_id=ue3["ue_id"], titre="matière test3")
mod3 = G.create_module(
matiere_id=mat3["matiere_id"],
code="TSM3",
coefficient=1.0,
titre="module test3",
ue_id=ue3["ue_id"], # faiblesse de l'API
formation_id=f2["formation_id"], # faiblesse de l'API
)
# --- Création et implémentation des semestres
sem1 = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
sem2 = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=2,
date_debut="01/09/2020",
date_fin="31/12/2020",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem1["formsemestre_id"],
responsable_id="bach",
)
mi2 = G.create_moduleimpl(
module_id=mod2["module_id"],
formsemestre_id=sem1["formsemestre_id"],
responsable_id="bach",
)
mit = G.create_moduleimpl(
module_id=modt["module_id"],
formsemestre_id=sem2["formsemestre_id"],
responsable_id="bach",
)
semt = G.create_formsemestre(
formation_id=f2["formation_id"],
semestre_id=3,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi3 = G.create_moduleimpl(
module_id=mod3["module_id"],
formsemestre_id=semt["formsemestre_id"],
responsable_id="bach",
)
# --- Affichier la liste des formations
lif = context.Notes.formation_list(format="json", REQUEST=REQUEST, formation_id=f["formation_id"])
load_lif = json.loads(lif)
assert len(load_lif) == 1
assert load_lif[0]["acronyme"] == f["acronyme"]
assert load_lif[0]["titre_officiel"] == f["titre_officiel"]
assert load_lif[0]["formation_id"] == f["formation_id"]
assert load_lif[0]["titre"] == f["titre"]
lif2 = context.Notes.formation_list(format = 'json', REQUEST=REQUEST)
load_lif2 = json.loads(lif2)
assert len(load_lif2) == 2
assert load_lif2[0] == load_lif[0]
assert load_lif2[1]["titre"] == f2["titre"]
# --- Export de formation_id
exp = sco_formations.formation_export(context.Notes, formation_id=f["formation_id"], format="json", REQUEST=REQUEST)
load_exp = json.loads(exp)
assert load_exp["acronyme"] == "F1"
assert load_exp["titre_officiel"] == "Titre officiel 1"
assert load_exp["titre"] == "Formation 1"
assert load_exp["formation_code"] == f["formation_code"]
assert len(load_exp["ue"]) == 3
assert load_exp["ue"][0]["acronyme"] == "TST1"
assert load_exp["ue"][0]["titre"] == "ue test"
assert load_exp["formation_id"] == f["formation_id"]
assert load_exp["formation_code"] == f["formation_code"]
# --- Liste des semestres
li_sem1 = context.Notes.formsemestre_list(formsemestre_id=sem1["formsemestre_id"], format = "json", REQUEST=REQUEST)
load_li_sem1 = json.loads(li_sem1) #uniquement le semestre 1 dans la liste
assert len(load_li_sem1) == 1
assert load_li_sem1[0]["date_fin"] == sem1["date_fin"]
assert load_li_sem1[0]["semestre_id"] == sem1["semestre_id"]
assert load_li_sem1[0]["formation_id"] ==sem1["formation_id"]
li_semf = context.Notes.formsemestre_list(formation_id=f["formation_id"], format = "json", REQUEST=REQUEST)
load_li_semf = json.loads(li_semf)
assert load_li_sem1[0] in load_li_semf
assert len(load_li_semf) == 2
assert load_li_semf[1]["semestre_id"] == sem2["semestre_id"]
li_sem = context.Notes.formsemestre_list(format = "json", REQUEST=REQUEST)
load_li_sem = json.loads(li_sem)
assert len(load_li_sem) == 3
assert load_li_semf[0] and load_li_semf[1] in load_li_sem
assert load_li_sem[0]["semestre_id"] == semt["semestre_id"]
# --- Liste des modules
lim_sem1 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem1["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem1 = json.loads(lim_sem1)
assert len(load_lim_sem1) == 2
assert mod["module_id"] == load_lim_sem1[0]["module_id"] or load_lim_sem1[1]["module_id"]
assert mod2["module_id"] == load_lim_sem1[0]["module_id"] or load_lim_sem1[1]["module_id"]
lim_modid = sco_moduleimpl.do_moduleimpl_list(context.Notes, module_id=mod["module_id"], REQUEST=REQUEST)
load_lim_modid = json.loads(lim_modid) #Liste avec seulement mod
assert len(load_lim_modid) == 1
lim_modimpl_id = sco_moduleimpl.do_moduleimpl_list(context.Notes, moduleimpl_id=mi["moduleimpl_id"], REQUEST=REQUEST)
print(lim_modimpl_id)
# ---- Test de do_moduleimpl_withmodule_list
assert lim_modid == lim_modimpl_id #doit etre le meme resultat
liimp_sem1 = sco_moduleimpl.do_moduleimpl_withmodule_list(context.Notes, formsemestre_id=sem1["formsemestre_id"], REQUEST=REQUEST)
load_liimp_sem1 = json.loads(liimp_sem1)
assert len(load_liimp_sem1) == 2
assert mod["module_id"] == load_liimp_sem1[0]["module_id"] or load_liimp_sem1[1]["module_id"] or load_liim_sem1[2]["module_id"]
assert mod2["module_id"] == load_liimp_sem1[0]["module_id"] or load_liimp_sem1[1]["module_id"] or load_liim_sem1[2]["module_id"]
assert modt["module_id"] == load_liimp_sem1[0]["module_id"] or load_liimp_sem1[1]["module_id"] or load_liim_sem1[2]["module_id"]
liimp_modid = sco_moduleimpl.do_moduleimpl_withmodule_list(context.Notes, module_id=mod["module_id"], REQUEST=REQUEST)
load_liimp_modid = json.loads(liimp_modid)
assert len(load_liimp_modid) == 1
liimp_modimplid = sco_moduleimpl.do_moduleimpl_withmodule_list(context.Notes, moduleimpl_id=mi["moduleimpl_id"], REQUEST=REQUEST)
assert liimp_modid == liimp_modimplid
# --- Suppression du module, matiere et ue test du semestre 2
#on doit d'abbord supprimer le semestre
#sco_formsemestre_edit.formsemestre_delete(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
#sco_formsemestre_edit.formsemestre_delete2(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
# RIEN NE SE PASSE AVEC CES FONCTIONS
sco_formsemestre_edit.do_formsemestre_delete(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
#sco_edit_module.module_delete(context.Notes, module_id=modt["module_id"], REQUEST=REQUEST)
#sco_edit_matiere.matiere_delete(context.Notes, matiere_id=matt["matiere_id"], REQUEST=REQUEST)
#sco_edit_ue.ue_delete(context.Notes, ue_id=uet["ue_id"], REQUEST=REQUEST)
# RIEN NE SE PASSE AVEC CES FONCTIONS
li_module = context.Notes.do_module_list()
assert len(li_module) == 4
context.Notes.do_module_delete(oid=modt["module_id"], REQUEST=REQUEST) #on supprime le semestre
#sco_formsemestre_edit.formsemestre_delete_moduleimpls(context.Notes, formsemestre_id=sem2["formsemestre_id"], module_ids_to_del=[modt["module_id"]])
#deuxieme methode de supression d'un module
li_module2 = context.Notes.do_module_list()
assert len(li_module2) == 3 #verification de la suppression du module
lim_sem2 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem2 = json.loads(lim_sem2)
assert len(load_lim_sem2) == 0 #deuxieme vérification si le module s'est bien sup
li_mat = context.Notes.do_matiere_list()
assert len(li_mat) == 4
context.Notes.do_matiere_delete(oid=matt["matiere_id"], REQUEST=REQUEST) #on supprime la matiere
li_mat2 = context.Notes.do_matiere_list()
assert len(li_mat2) == 3 #verification de la suppression de la matiere
li_ue = context.Notes.do_ue_list()
assert len(li_ue) == 4
sco_edit_ue.ue_delete(context.Notes, ue_id=uet["ue_id"], REQUEST=REQUEST)
li_ue2 = context.Notes.do_ue_list()
#assert len(li_ue) == 3 #verification de la suppression de l'UE #comment supprimer un ue?
# --- Suppression d'une formation
#Il faut d'abbord supprimer le semestre aussi.
sco_formsemestre_edit.do_formsemestre_delete(context.Notes, formsemestre_id=semt["formsemestre_id"], REQUEST=REQUEST)
context.Notes.do_formation_delete(oid=f2["formation_id"], REQUEST=REQUEST)
lif3 = context.Notes.formation_list(format = 'json', REQUEST=REQUEST)
load_lif3 = json.loads(lif3)
assert len(load_lif3) == 1

395
scotests/test_groupes.py Executable file
View File

@ -0,0 +1,395 @@
""" 1) Création de 20 étudiants, création dune formation, inscription de 10 étudiants dans un semestre (1ere année),
10 dans un autre (2eme année), création de module, ue,
matière et affectation des étudiants dans deux groupes : A et B pour chaque semestre.
créer 2 évaluations,
affecter des notes dans chaque évaluation et donner la liste des étudiants inscrits à lévaluation pour chaque groupe.
Donner la liste des groupes auxquels des étudiants inscrits appartiennent à cette évaluation.
Pour une raison quelquonque un élève souhaite changer de groupe.
Changer le nom d'un groupe et d'une partition (à l'aide de fonction)
- Vérification du bon nombres détudiants dans chaque chaque groupe (5)
- Vérification des noms de la formations (acro = DUTI, titre = DUT Info, titre_officiel = DUT Informatique),
UE (acr = UE11/UE31, titre = UE1S1/UE1S3), modules (code = M1S1/M1S3, titre = mod1/mod2), matières (ue_id=ue1/2[ue_id], titre = mat1/mat2)
- Vérification des listes de groupes et de partitions
- Vérification du changement de groupe des étudiants
- Teste d'autres fonctions de l'API correspondant aux groupes
Fonctions de lAPI utilisé :
- create_formation
- create_ue
- create_module
- create_matiere
- create_formsemestre
- create_moduleimpl
- inscrit_etudiant
- partition_create
- get_default_partition
- createGroupe
- partition_create
- get_partitions_list
- get_partition_groups
- set_group
- get_etud_groups
- change_etud_group_in_partition
- get_group
- group_delete
- get_partition
- get_default_group
- get_default_partition
- get_sem_groups
- get_group_members
- do_evaluation_listeetuds_groups
- do_evaluation_listegroupes
- formsemestre_partition_list
"""
import random
# La variable context est définie par le script de lancement
# l'affecte ainsi pour éviter 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_groups
import sco_groups_view
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(20)]
assert len(etuds) == 20
# --- Création d'une formation
f = G.create_formation(
acronyme="DUTI",
titre="DUT Info",
titre_officiel="DUT Informatique",
)
assert f["acronyme"]=="DUTI"
assert f["titre"]=="DUT Info"
assert f["titre_officiel"]=="DUT Informatique"
# --- Création d'UE, matière, module pour les premieres années
ue1 = G.create_ue(formation_id=f["formation_id"], acronyme="UE11", titre="UE1S1")
mat1 = G.create_matiere(ue_id=ue1["ue_id"], titre="mat1")
mod1 = G.create_module(
matiere_id=mat1["matiere_id"],
code="M1S1",
coefficient=1.0,
titre="mod1",
ue_id=ue1["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
assert ue1["formation_id"] == f["formation_id"]
assert ue1["acronyme"]=="UE11"
assert ue1["titre"]=="UE1S1"
assert mod1["matiere_id"]==mat1["matiere_id"]
assert mod1["code"]=="M1S1"
assert mod1["titre"]=="mod1"
assert mod1["ue_id"]==ue1["ue_id"]
assert mod1["formation_id"]==f["formation_id"]
# --- Création d'UE, matière, module pour les deuxieme années
ue2 = G.create_ue(formation_id=f["formation_id"], acronyme="UE31", titre="UE1S1")
mat2 = G.create_matiere(ue_id=ue2["ue_id"], titre="mat2")
mod2 = G.create_module(
matiere_id=mat2["matiere_id"],
code="M1S3",
coefficient=1.0,
titre="mod2",
ue_id=ue2["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place des semestres
sem1 = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/09/2020",
date_fin="01/02/2021",
)
assert sem1["formation_id"]==f["formation_id"]
assert sem1["semestre_id"]==1
assert sem1["date_debut"]=="01/09/2020"
assert sem1["date_fin"]=="01/02/2021"
sem2 = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=2,
date_debut="01/09/2020",
date_fin="01/02/2021",
)
mi1 = G.create_moduleimpl(
module_id=mod1["module_id"],
formsemestre_id=sem1["formsemestre_id"],
responsable_id="bach",
)
assert mi1["module_id" ]==mod1["module_id"]
assert mi1["formsemestre_id"]==sem1["formsemestre_id"]
assert mi1["responsable_id"]=="bach"
mi2 = G.create_moduleimpl(
module_id=mod2["module_id"],
formsemestre_id=sem2["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
for etud in etuds[:10] :
G.inscrit_etudiant(sem1, etud)
for etud in etuds [10:] :
G.inscrit_etudiant(sem2, etud)
# --- Création de 2 partitions
_ = sco_groups.partition_create(context.Scolarite, formsemestre_id=sem1["formsemestre_id"], partition_name="Eleve 1ere annee", REQUEST=REQUEST)
_ = sco_groups.partition_create(context.Scolarite, formsemestre_id=sem2["formsemestre_id"], partition_name="Eleve 2eme annee", REQUEST=REQUEST)
li1 = sco_groups.get_partitions_list(context.Scolarite, sem1["formsemestre_id"])
li2 = sco_groups.get_partitions_list(context.Scolarite, sem2["formsemestre_id"])
# --- Création des groupes
_ = sco_groups.createGroup(context.Scolarite, li1[0]["partition_id"], "Groupe S1A", REQUEST=REQUEST)
_ = sco_groups.createGroup(context.Scolarite, li1[0]["partition_id"], "Groupe S1B", REQUEST=REQUEST)
_ = sco_groups.createGroup(context.Scolarite, li2[0]["partition_id"], "Groupe S3A", REQUEST=REQUEST)
_ = sco_groups.createGroup(context.Scolarite, li2[0]["partition_id"], "Groupe S3B", REQUEST=REQUEST)
_ = sco_groups.createGroup(context.Scolarite, li2[0]["partition_id"], "Groupe TEST", REQUEST=REQUEST)
li_grp1 = sco_groups.get_partition_groups(context.Scolarite, li1[0])
li_grp2 = sco_groups.get_partition_groups(context.Scolarite, li2[0])
li_grp3 = sco_groups.get_partition_groups(context.Scolarite, li1[1]) #liste groupe defaut
assert len(li_grp1) == 2 #test de get_partition_groups # 2
assert len(li_grp2) == 3 #test de get_partition_groups # 3
assert li_grp1[0]["group_name"] == "Groupe S1A"
# --- Affectation des élèves dans les groupes
for etud in etuds[:5] :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp1[0]["group_id"])
for etud in etuds[5:10] :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp1[1]["group_id"])
for etud in etuds[10:15] :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp2[0]["group_id"])
for etud in etuds[15:] :
sco_groups.set_group(context.Scolarite, etud["etudid"], li_grp2[1]["group_id"])
# --- Vérification si les élèves sont bien dans les bons groupes
for etud in etuds[:5] :
grp = sco_groups.get_etud_groups(context.Scolarite, etud["etudid"], sem1, exclude_default=True)
assert grp[0]["group_name"] == "Groupe S1A"
for etud in etuds[5:10] :
grp = sco_groups.get_etud_groups(context.Scolarite, etud["etudid"], sem1, exclude_default=True)
assert grp[0]["group_name"] == "Groupe S1B"
for etud in etuds[10:15] :
grp = sco_groups.get_etud_groups(context.Scolarite, etud["etudid"], sem2, exclude_default=True)
assert grp[0]["group_name"] == "Groupe S3A"
for etud in etuds[15:] :
grp = sco_groups.get_etud_groups(context.Scolarite, etud["etudid"], sem2, exclude_default=True)
assert grp[0]["group_name"] == "Groupe S3B"
# --- Création d'une évaluation
e1 = G.create_evaluation(
moduleimpl_id=mi1["moduleimpl_id"],
jour="01/10/2020",
description="evaluation test",
coefficient=1.0,
)
e2 = G.create_evaluation(
moduleimpl_id=mi2["moduleimpl_id"],
jour="01/11/2020",
description="evaluation test2",
coefficient=1.0,
)
# --- Saisie des notes
for etud in etuds[10:] :
nb_changed, nb_suppress, existing_decisions = G.create_note(
evaluation=e1, etud=etud, note=float(random.randint(0, 20))
)
for etud in etuds[:10] :
nb_changed, nb_suppress, existing_decisions = G.create_note(
evaluation=e2, etud=etud, note=float(random.randint(0, 20))
)
# --- Liste des étudiants inscrits aux evaluations
lie1 = sco_groups.do_evaluation_listeetuds_groups(context.Scolarite, e1["evaluation_id"], groups = li_grp1)
lie2 = sco_groups.do_evaluation_listeetuds_groups(context.Scolarite, e2["evaluation_id"], groups = li_grp2)
for etud in etuds[:10] :
assert etud["etudid"] in lie1 # test de do_evaluation_listeetuds_groups
for etud in etuds[10:] :
assert etud["etudid"] in lie2 # test de do_evaluation_listeetuds_groups
# --- Liste des groupes présents aux évaluation
lig1 = sco_groups.do_evaluation_listegroupes(context.Scolarite, e1["evaluation_id"], include_default=False)
lig2 = sco_groups.do_evaluation_listegroupes(context.Scolarite, e2["evaluation_id"], include_default=False)
assert len(lig1) == 2
assert len(lig2) == 2
assert li_grp1[0] and li_grp1[1] in lig1 # test do_evaluation_listegroupes
assert li_grp2[0] and li_grp2[1] in lig2 # test do_evaluation_listegroupes
# --- Changement de groupe d'un élève
grp1 = sco_groups.get_etud_groups(context.Scolarite, etuds[0]["etudid"], sem1, exclude_default = True)
sco_groups.change_etud_group_in_partition(context.Scolarite, etuds[0]["etudid"], li_grp1[1]["group_id"], li1[0], REQUEST=REQUEST)
grp2 = sco_groups.get_etud_groups(context.Scolarite, etuds[0]["etudid"], sem1, exclude_default = True)
assert grp1 != grp2
assert grp1[0] == li_grp1[0] # test get_etud_groups
assert grp2[0]["group_name"] == "Groupe S1B" #test du changement de groupe
# --- Liste des partitions en format json
lijson_s1 = sco_groups.formsemestre_partition_list(context.Scolarite, formsemestre_id=sem1["formsemestre_id"], format = "json", REQUEST=REQUEST)
load_lijson_s1 = json.loads(lijson_s1)
assert len(load_lijson_s1) == 2 # 2 partition (defaut et eleve 1ere annee)
assert load_lijson_s1[0]["formsemestre_id"] == sem1["formsemestre_id"]
assert len(load_lijson_s1[0]["group"]) == 2 # 2 groupes S1A et S1B
assert load_lijson_s1[0]["group"][0]["group_name"] == "Groupe S1A"
assert load_lijson_s1[0]["group"][0]["group_id"] == li_grp1[0]["group_id"]
assert load_lijson_s1[0]["partition_id"] == load_lijson_s1[0]["group"][0]["partition_id"] == li1[0]["partition_id"]
assert load_lijson_s1[0]["partition_name"] == "Eleve 1ere annee"
# --- Vue d'un groupes (liste d'élève en format json)
vue_g1 = sco_groups_view.groups_view(context.Scolarite, group_ids = [li_grp1[0]["group_id"]], format = "json", REQUEST=REQUEST)
load_vue_g1 = json.loads(vue_g1)
assert len(load_vue_g1) == 4
assert load_vue_g1[0][li1[0]["partition_id"]] == li_grp1[0]["group_name"]
vue_sem = sco_groups_view.groups_view(context.Scolarite, formsemestre_id=sem1["formsemestre_id"], format = "json", REQUEST=REQUEST)
load_vue_sem = json.loads(vue_sem)
assert len(load_vue_sem) == 10
tab=[]
val=False
for etud in etuds[:10] :
for i in range(len(load_vue_sem)) :
if etud["prenom"] == load_vue_sem[i]["prenom"] and etud["nom_disp"]==load_vue_sem[i]["nom_disp"] :
val = True
tab.append(val)
assert not False in tab #tout mes etudiants sont present dans vue_sem.
# --- Test des fonctions dans sco_groups
assert li_grp1[0] == sco_groups.get_group(context.Scolarite, li_grp1[0]["group_id"]) #test get_group
assert len(li_grp2) == 3
sco_groups.group_delete(context.Scolarite, li_grp2[2])
#assert len(li_grp2) == 2 #TEST DE group_delete, aucun changement sur la console mais se supprime sur scodoc web
# mais pas dans la console comme pour countAbs()
assert sco_groups.get_partition(context.Scolarite, li1[0]["partition_id"])== li1[0] # test de get_partition
assert sco_groups.get_partition(context.Scolarite, li2[0]["partition_id"])== li2[0] # test de get_partition
li1 = sco_groups.get_partitions_list(context.Scolarite, sem1["formsemestre_id"])
#assert p1 in li1 #test de get_partitions_list
assert len(li1) == 2 #eleve de 1ere annee + la partition defaut
li2 = sco_groups.get_partitions_list(context.Scolarite, sem2["formsemestre_id"])
#assert p2 in li2 #test de get_partitions_list
assert len(li2) == 2 #eleve de 2eme annee + la partition defaut
dp1 = sco_groups.get_default_partition(context.Scolarite, sem1["formsemestre_id"])
dp2 = sco_groups.get_default_partition(context.Scolarite, sem2["formsemestre_id"])
assert dp1 in li1 # test si dp1 est bien dans li1 et par consequent teste la fonction get_default_partition
assert dp2 in li2 # test si dp2 est bien dans li1 et par consequent teste la fonction get_default_partition
dg1 = sco_groups.get_default_group(context.Scolarite, sem1["formsemestre_id"], REQUEST=REQUEST)
assert li_grp3[0]["group_id"] == dg1 #test de get_default_group
sg = sco_groups.get_sem_groups(context.Scolarite, sem1["formsemestre_id"])
assert len(sg) == 3 #test de get_sem_groups
assert li_grp1[0] and li_grp1[1] in sg
assert li_grp3[0] in sg # test de get_sem_groups
limembre = sco_groups.get_group_members(context.Scolarite, li_grp1[0]["group_id"])
assert len(limembre) == 4 # car on a changé de groupe un etudiant de ce groupe donc 5-1=4
"""
Commentaire :
Meme probleme que pour les groupes, lorsque l'on supprime un groupe il est toujours présent dans la liste de groupe
mais pas dans scodoc web.
"""

117
scotests/test_scenario1_app.py Executable file
View File

@ -0,0 +1,117 @@
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
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]
# --- Création de l'utilisateur responsable du semestres, des modules etc....
arg = {"passwd": "scodocpass", "user_name" : "unutil", "roles" :"Ens,RespPe"}
user = context.Users.create_user(args=arg, REQUEST=REQUEST)
print(user)
# --- Création formation et de deux UE
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat11 = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod11 = G.create_module(
matiere_id=mat11["matiere_id"],
code="TSM11",
coefficient=1.0,
titre="module test11",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
mat12 = G.create_matiere(ue_id=ue["ue_id"], titre="matière test12")
mod12 = G.create_module(
matiere_id=mat12["matiere_id"],
code="TSM12",
coefficient=1.0,
titre="module test12",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
ue2 = G.create_ue(formation_id=f["formation_id"], acronyme="TST2", titre="ue test2")
mat21 = G.create_matiere(ue_id=ue2["ue_id"], titre="matière test21")
mod21 = G.create_module(
matiere_id=mat21["matiere_id"],
code="TSM21",
coefficient=1.0,
titre="module test21",
ue_id=ue2["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
mat22 = G.create_matiere(ue_id=ue2["ue_id"], titre="matière test22")
mod22 = G.create_module(
matiere_id=mat22["matiere_id"],
code="TSM22",
coefficient=1.0,
titre="module test22",
ue_id=ue2["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mods = []
for module_id, formsemestre_id, responsable_id in [
(mod11["module_id"], sem["formsemestre_id"], "bach"),
(mod12["module_id"], sem["formsemestre_id"], "bach"),
(mod21["module_id"], sem["formsemestre_id"], "bach"),
(mod22["module_id"], sem["formsemestre_id"], "bach")
] :
mi = G.create_moduleimpl(module_id=module_id, formsemestre_id=formsemestre_id, responsable_id=responsable_id)
mods.append(mi)
# --- Inscription des étudiants
for etud in etuds:
G.inscrit_etudiant(sem, etud)
# --- Création d'évaluations (2 par modules)
evals=[]
for moduleimpl_id, jour, description, coefficient in [
(mods[0]["moduleimpl_id"], "01/02/2021", "e1", 1.0),
(mods[0]["moduleimpl_id"], "02/02/2021", "e2", 1.0),
(mods[1]["moduleimpl_id"], "03/02/2021", "e3", 1.0),
(mods[1]["moduleimpl_id"], "04/02/2021", "e4", 1.0),
(mods[2]["moduleimpl_id"], "05/02/2021", "e5", 1.0),
(mods[2]["moduleimpl_id"], "06/02/2021", "e6", 1.0),
(mods[3]["moduleimpl_id"], "07/02/2021", "e7", 1.0),
(mods[3]["moduleimpl_id"], "08/02/2021", "e8", 1.0),
] :
e = G.create_evaluation(moduleimpl_id=moduleimpl_id, jour=jour, description=description, coefficient=coefficient)
evals.append(e)
# --- Saisie des notes aléatoires
for eval in evals :
for etud in etuds:
nb_changed, nb_suppress, existing_decisions = G.create_note(
evaluation=eval, etud=etud, note=float(random.randint(0, 20))
)

View File

@ -0,0 +1,72 @@
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(REQUEST=REQUEST, 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

@ -0,0 +1,105 @@
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(REQUEST=REQUEST, 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)
# --- Création des étudiants
etuds=[]
for nom, prenom in [
("Semestre1", "EtudiantNumero1"),
("Semestre1", "EtudiantNumero2"),
("Semestre2", "EtudiantNumero3"),
("Semestre2", "EtudiantNumero4"),
("Semestre3", "EtudiantNumero5"),
("Semestre3", "EtudiantNumero6"),
("Semestre4", "EtudiantNumero7"),
("Semestre4", "EtudiantNumero8")
] :
etud = G.create_etud(
nom=nom,
prenom=prenom,
)
etuds.append(etud)
# --- Inscription des étudiants
for etud in etuds[0:2]:
G.inscrit_etudiant(sem1, etud)
for etud in etuds[2:4]:
G.inscrit_etudiant(sem2, etud)
for etud in etuds[4:6]:
G.inscrit_etudiant(sem3, etud)
for etud in etuds[6:]:
G.inscrit_etudiant(sem4, etud)

View File

@ -0,0 +1,135 @@
import sco_formations
import json
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(REQUEST=REQUEST, 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)
# --- Création des étudiants
etuds=[]
for nom, prenom in [
("Semestre1", "EtudiantNumero1"),
("Semestre1", "EtudiantNumero2"),
("Semestre2", "EtudiantNumero3"),
("Semestre2", "EtudiantNumero4"),
("Semestre3", "EtudiantNumero5"),
("Semestre3", "EtudiantNumero6"),
("Semestre4", "EtudiantNumero7"),
("Semestre4", "EtudiantNumero8")
] :
etud = G.create_etud(
nom=nom,
prenom=prenom,
)
etuds.append(etud)
# --- Inscription des étudiants
for etud in etuds[0:2]:
G.inscrit_etudiant(sem1, etud)
for etud in etuds[2:4]:
G.inscrit_etudiant(sem2, etud)
for etud in etuds[4:6]:
G.inscrit_etudiant(sem3, etud)
for etud in etuds[6:]:
G.inscrit_etudiant(sem4, etud)
# --- Création d'une évaluation pour chaque UE
lim_sem1 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem1["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem1 = json.loads(lim_sem1)
lim_sem2 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem2 = json.loads(lim_sem2)
lim_sem3 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem3["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem3 = json.loads(lim_sem3)
lim_sem4 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem4["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem4 = json.loads(lim_sem4)
for moduleimpl_id, jour, description, coefficient in [
(load_lim_sem1[1]["moduleimpl_id"], "02/09/2020", "InterroTestSemestre1", 1.0),
(load_lim_sem1[2]["moduleimpl_id"], "03/09/2020", "InterroTestSemestre1", 1.0),
(load_lim_sem2[1]["moduleimpl_id"], "03/02/2021", "InterroTestSemestre2", 1.0),
(load_lim_sem2[8]["moduleimpl_id"], "04/02/2021", "InterroTestSemestre2", 1.0),
(load_lim_sem3[3]["moduleimpl_id"], "02/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem3[9]["moduleimpl_id"], "03/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem3[15]["moduleimpl_id"], "04/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem4[3]["moduleimpl_id"], "03/02/2021", "InterroTestSemestre4", 1.0),
(load_lim_sem4[9]["moduleimpl_id"], "04/02/2021", "InterroTestSemestre4", 1.0),
(load_lim_sem4[13]["moduleimpl_id"], "05/02/2021", "InterroTestSemestre4", 1.0),
] :
e = G.create_evaluation(moduleimpl_id=moduleimpl_id, jour=jour, description=description, coefficient=coefficient)

View File

@ -0,0 +1,173 @@
import sco_formations
import json
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(REQUEST=REQUEST, 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)
# --- Création des étudiants
etuds=[]
for nom, prenom in [
("Semestre1", "EtudiantNumero1"),
("Semestre1", "EtudiantNumero2"),
("Semestre2", "EtudiantNumero3"),
("Semestre2", "EtudiantNumero4"),
("Semestre3", "EtudiantNumero5"),
("Semestre3", "EtudiantNumero6"),
("Semestre4", "EtudiantNumero7"),
("Semestre4", "EtudiantNumero8")
] :
etud = G.create_etud(
nom=nom,
prenom=prenom,
)
etuds.append(etud)
# --- Inscription des étudiants
for etud in etuds[0:2]:
G.inscrit_etudiant(sem1, etud)
for etud in etuds[2:4]:
G.inscrit_etudiant(sem2, etud)
for etud in etuds[4:6]:
G.inscrit_etudiant(sem3, etud)
for etud in etuds[6:]:
G.inscrit_etudiant(sem4, etud)
# --- Création d'une évaluation pour chaque UE
lim_sem1 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem1["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem1 = json.loads(lim_sem1)
lim_sem2 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem2["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem2 = json.loads(lim_sem2)
lim_sem3 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem3["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem3 = json.loads(lim_sem3)
lim_sem4 = sco_moduleimpl.do_moduleimpl_list(context.Notes, formsemestre_id=sem4["formsemestre_id"], REQUEST=REQUEST)
load_lim_sem4 = json.loads(lim_sem4)
for moduleimpl_id, jour, description, coefficient in [
(load_lim_sem1[1]["moduleimpl_id"], "02/09/2020", "InterroTestSemestre1", 1.0),
(load_lim_sem1[2]["moduleimpl_id"], "03/09/2020", "InterroTestSemestre1", 1.0),
(load_lim_sem2[1]["moduleimpl_id"], "03/02/2021", "InterroTestSemestre2", 1.0),
(load_lim_sem2[8]["moduleimpl_id"], "04/02/2021", "InterroTestSemestre2", 1.0),
(load_lim_sem3[3]["moduleimpl_id"], "02/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem3[9]["moduleimpl_id"], "03/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem3[15]["moduleimpl_id"], "04/09/2020", "InterroTestSemestre3", 1.0),
(load_lim_sem4[3]["moduleimpl_id"], "03/02/2021", "InterroTestSemestre4", 1.0),
(load_lim_sem4[9]["moduleimpl_id"], "04/02/2021", "InterroTestSemestre4", 1.0),
(load_lim_sem4[13]["moduleimpl_id"], "05/02/2021", "InterroTestSemestre4", 1.0),
] :
e = G.create_evaluation(moduleimpl_id=moduleimpl_id, jour=jour, description=description, coefficient=coefficient)
# --- Saisie des notes des étudiants (un élève a 12, un autre a 7 pour chaque semestre)
lie1 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem1["formsemestre_id"])
lie2 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem2["formsemestre_id"])
lie3 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem3["formsemestre_id"])
lie4 = context.Notes.do_evaluation_list_in_formsemestre(formsemestre_id=sem4["formsemestre_id"])
for eval in lie1 :
for etud in etuds[:2] :
if etud == etuds[0] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
for eval in lie2 :
for etud in etuds[2:4] :
if etud == etuds[2] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
for eval in lie3 :
for etud in etuds[4:6] :
if etud == etuds[4] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)
for eval in lie4 :
for etud in etuds[6:] :
if etud == etuds[6] :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=12.0)
else :
nb_changed, nb_suppress, existing_decisions = G.create_note(evaluation=eval, etud=etud, note=7.0)

64
scotests/test_user.py Executable file
View File

@ -0,0 +1,64 @@
""" Créer un utilisateur, recupérer ses infos, changer son mdp, le supprimer """
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 ZScoUsers
import ZScoDoc
import ZScolar
nomdept = raw_input("Quel est le nom de votre département test? ATTENTION A NE PAS VOUS TROMPER : ")
# --- Création d'un utilisateur
arg = {"passwd": "scodocpass", "user_name" : "unutil", "nom" : "unnom", "prenom":"unprenom",
"email": "unemail@mail.fr", "roles" :"Ens"+nomdept+",RespPe"+nomdept}
#user1 = context.Users.create_user(args=arg, REQUEST=REQUEST)
user_info1 = context.Users.user_info(user_name="unutil")
assert user_info1["email"] == arg["email"]
assert user_info1["user_name"] == arg["user_name"]
assert user_info1["nom"] == "unnom"
assert user_info1["prenom"] == "unprenom"
assert user_info1["roles"] == arg["roles"]
# --- Récupération de la liste des Users
liste_xml = context.Users.get_userlist_xml(REQUEST=REQUEST)
print(liste_xml)
liste_user = context.Users.get_userlist()
len_liu1 = len(liste_user)
assert user_info1 in liste_user #le nouvel utilisateur est bien dans la liste !
# --- Récupérer user_name à partir de nomplogin
user_name1 = context.Users.get_user_name_from_nomplogin(nomplogin=user_info1["nomplogin"])
assert user_name1 == "unutil"
# --- Changement du mot de passe de l'utilisateur
context.Users.do_change_password(user_name="unutil", password="scodocpass2")
#vérification du mdp changé directement sur scodoc web car je ne trouve pas comment récupérer le mdp en python
#Vérification : ok!
# --- Supression d'un utilisateur
#context.Users.delete_user_form(REQUEST=REQUEST, user_name="unutil")
# --- Test de la récupération de l'URL
url = context.Users.UsersURL()
assert url == "ScoDoc/"+nomdept+"/Scolarite/Users"
"""
Commentaire :
La supression d'un utilisateur ne fonctionne pas car nécessite l'envoie d'un formulaire.
"""

1352
static/formation_export.json Executable file

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
{
"files": {
"main.css": "./static/css/main.6be5a531.chunk.css",
"main.js": "./static/js/main.81258512.chunk.js",
"main.js.map": "./static/js/main.81258512.chunk.js.map",
"runtime-main.js": "./static/js/runtime-main.ca83272f.js",
"runtime-main.js.map": "./static/js/runtime-main.ca83272f.js.map",
"static/css/2.4c97ca4f.chunk.css": "./static/css/2.4c97ca4f.chunk.css",
"static/js/2.64a47d60.chunk.js": "./static/js/2.64a47d60.chunk.js",
"static/js/2.64a47d60.chunk.js.map": "./static/js/2.64a47d60.chunk.js.map",
"static/js/3.92b28fed.chunk.js": "./static/js/3.92b28fed.chunk.js",
"static/js/3.92b28fed.chunk.js.map": "./static/js/3.92b28fed.chunk.js.map",
"index.html": "./index.html",
"static/css/2.4c97ca4f.chunk.css.map": "./static/css/2.4c97ca4f.chunk.css.map",
"static/css/main.6be5a531.chunk.css.map": "./static/css/main.6be5a531.chunk.css.map",
"static/js/2.64a47d60.chunk.js.LICENSE.txt": "./static/js/2.64a47d60.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.ca83272f.js",
"static/css/2.4c97ca4f.chunk.css",
"static/js/2.64a47d60.chunk.js",
"static/css/main.6be5a531.chunk.css",
"static/js/main.81258512.chunk.js"
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1 +0,0 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Scodoc Mobile"/><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"><link rel="apple-touch-icon" href="./scologo.png"/><link rel="manifest" href="./manifest.json"/><title>Scodoc Mobile</title><link href="./static/css/2.4c97ca4f.chunk.css" rel="stylesheet"><link href="./static/css/main.6be5a531.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,i,a=r[0],c=r[1],l=r[2],s=0,p=[];s<a.length;s++)i=a[s],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&p.push(o[i][0]),o[i]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var c=t[a];0!==o[c]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var u,a=document.createElement("script");a.charset="utf-8",a.timeout=120,i.nc&&a.setAttribute("nonce",i.nc),a.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"92b28fed"}[e]+".chunk.js"}(e);var c=new Error;u=function(r){a.onerror=a.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,t[1](c)}o[e]=void 0}};var l=setTimeout((function(){u({type:"timeout",target:a})}),12e4);a.onerror=a.onload=u,document.head.appendChild(a)}return Promise.all(r)},i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./",i.oe=function(e){throw console.error(e),e};var a=this.webpackJsonpscodocmobile=this.webpackJsonpscodocmobile||[],c=a.push.bind(a);a.push=r,a=a.slice();for(var l=0;l<a.length;l++)r(a[l]);var f=c;t()}([])</script><script src="./static/js/2.64a47d60.chunk.js"></script><script src="./static/js/main.81258512.chunk.js"></script></body></html>

View File

@ -1,20 +0,0 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "scologo.png",
"type": "image/png",
"sizes": "84x126"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View File

@ -1,3 +0,0 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
body{font-family:"Poppins",sans-serif;height:100vh}a{color:#92badd;display:inline-block;text-decoration:none;font-weight:400}#pageTitle{font-size:25px;color:#aaa}#loginTitle,#pageTitle{text-align:center;font-weight:600}#loginTitle{font-size:20px;text-transform:uppercase;display:inline-block;margin:40px 8px 10px;color:#ccc}.wrapper{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;width:100%;min-height:100%;padding:10px}#formContent{padding:0}#errorMsg,#formContent{border-radius:10px 10px 10px 10px;background:#fff;width:90%;max-width:450px;position:relative;box-shadow:0 30px 60px 0 rgba(0,0,0,.3);text-align:center}#errorMsg{margin-bottom:10px;padding:0 0 20px}#wrapDept{border-radius:10px 10px 10px 10px;background:#fff;width:90%;max-width:450px;position:relative;box-shadow:0 10px 20px 0 rgba(0,0,0,.3);text-align:center;margin:10px;padding:10px}#formFooter{background-color:#f6f6f6;border-top:1px solid #dce8f1;padding:25px;text-align:center;border-radius:0 0 10px 10px}button[type=submit],input[type=button],input[type=reset]{background-color:#56baed;border:none;color:#fff;padding:15px 80px;text-align:center;text-decoration:none;display:inline-block;text-transform:uppercase;font-size:13px;box-shadow:0 10px 30px 0 rgba(95,186,233,.4);border-radius:5px 5px 5px 5px;margin:5px 20px 40px;transition:all .3s ease-in-out}button[type=submit]:hover,input[type=button]:hover,input[type=reset]:hover{background-color:#39ace7}button[type=submit]:active,input[type=button]:active,input[type=reset]:active{-webkit-transform:scale(.95);transform:scale(.95)}input[type=password],input[type=text]{background-color:#f6f6f6;color:#0d0d0d;padding:15px 32px;text-decoration:none;display:inline-block;font-size:16px;margin:5px;width:85%;border:2px solid #f6f6f6;transition:all .5s ease-in-out;border-radius:5px 5px 5px 5px}input[type=password]:focus,input[type=text]:focus{background-color:#fff;border-bottom:2px solid #5fbae9}input[type=password]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder{color:#ccc}input[type=password]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder{color:#ccc}input[type=password]::placeholder,input[type=text]::placeholder{color:#ccc}.underlineHover:hover{color:#0d0d0d}.underlineHover:hover:after{width:100%}:focus{outline:none}#icon{width:60%}.mySelect{min-width:200px}.smallRow{line-height:60%;font-size:70%}.ueRow{background:#5bc0de;color:#fff;font-weight:700}thead{background:#d3d3d3}
/*# sourceMappingURL=main.6be5a531.chunk.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,65 +0,0 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!@license
* UAParser.js v0.7.28
* Lightweight JavaScript-based User-Agent string parser
* https://github.com/faisalman/ua-parser-js
*
* Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
* Licensed under MIT License
*/
/** @license React v0.20.2
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
(this.webpackJsonpscodocmobile=this.webpackJsonpscodocmobile||[]).push([[3],{118:function(t,e,n){"use strict";n.r(e),n.d(e,"getCLS",(function(){return p})),n.d(e,"getFCP",(function(){return g})),n.d(e,"getFID",(function(){return F})),n.d(e,"getLCP",(function(){return k})),n.d(e,"getTTFB",(function(){return C}));var i,a,r,o,c=function(t,e){return{name:t,value:void 0===e?-1:e,delta:0,entries:[],id:"v1-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},u=function(t,e){try{if(PerformanceObserver.supportedEntryTypes.includes(t)){var n=new PerformanceObserver((function(t){return t.getEntries().map(e)}));return n.observe({type:t,buffered:!0}),n}}catch(t){}},s=function(t,e){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(t(i),e&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},f=function(t){addEventListener("pageshow",(function(e){e.persisted&&t(e)}),!0)},d="function"==typeof WeakSet?new WeakSet:new Set,m=function(t,e,n){var i;return function(){e.value>=0&&(n||d.has(e)||"hidden"===document.visibilityState)&&(e.delta=e.value-(i||0),(e.delta||void 0===i)&&(i=e.value,t(e)))}},p=function(t,e){var n,i=c("CLS",0),a=function(t){t.hadRecentInput||(i.value+=t.value,i.entries.push(t),n())},r=u("layout-shift",a);r&&(n=m(t,i,e),s((function(){r.takeRecords().map(a),n()})),f((function(){i=c("CLS",0),n=m(t,i,e)})))},v=-1,l=function(){return"hidden"===document.visibilityState?0:1/0},h=function(){s((function(t){var e=t.timeStamp;v=e}),!0)},S=function(){return v<0&&(v=l(),h(),f((function(){setTimeout((function(){v=l(),h()}),0)}))),{get timeStamp(){return v}}},g=function(t,e){var n,i=S(),a=c("FCP"),r=u("paint",(function(t){"first-contentful-paint"===t.name&&(r&&r.disconnect(),t.startTime<i.timeStamp&&(a.value=t.startTime,a.entries.push(t),d.add(a),n()))}));r&&(n=m(t,a,e),f((function(i){a=c("FCP"),n=m(t,a,e),requestAnimationFrame((function(){requestAnimationFrame((function(){a.value=performance.now()-i.timeStamp,d.add(a),n()}))}))})))},y={passive:!0,capture:!0},w=new Date,E=function(t,e){i||(i=e,a=t,r=new Date,b(removeEventListener),L())},L=function(){if(a>=0&&a<r-w){var t={entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+a};o.forEach((function(e){e(t)})),o=[]}},T=function(t){if(t.cancelable){var e=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,e){var n=function(){E(t,e),a()},i=function(){a()},a=function(){removeEventListener("pointerup",n,y),removeEventListener("pointercancel",i,y)};addEventListener("pointerup",n,y),addEventListener("pointercancel",i,y)}(e,t):E(e,t)}},b=function(t){["mousedown","keydown","touchstart","pointerdown"].forEach((function(e){return t(e,T,y)}))},F=function(t,e){var n,r=S(),p=c("FID"),v=function(t){t.startTime<r.timeStamp&&(p.value=t.processingStart-t.startTime,p.entries.push(t),d.add(p),n())},l=u("first-input",v);n=m(t,p,e),l&&s((function(){l.takeRecords().map(v),l.disconnect()}),!0),l&&f((function(){var r;p=c("FID"),n=m(t,p,e),o=[],a=-1,i=null,b(addEventListener),r=v,o.push(r),L()}))},k=function(t,e){var n,i=S(),a=c("LCP"),r=function(t){var e=t.startTime;e<i.timeStamp&&(a.value=e,a.entries.push(t)),n()},o=u("largest-contentful-paint",r);if(o){n=m(t,a,e);var p=function(){d.has(a)||(o.takeRecords().map(r),o.disconnect(),d.add(a),n())};["keydown","click"].forEach((function(t){addEventListener(t,p,{once:!0,capture:!0})})),s(p,!0),f((function(i){a=c("LCP"),n=m(t,a,e),requestAnimationFrame((function(){requestAnimationFrame((function(){a.value=performance.now()-i.timeStamp,d.add(a),n()}))}))}))}},C=function(t){var e,n=c("TTFB");e=function(){try{var e=performance.getEntriesByType("navigation")[0]||function(){var t=performance.timing,e={entryType:"navigation",startTime:0};for(var n in t)"navigationStart"!==n&&"toJSON"!==n&&(e[n]=Math.max(t[n]-t.navigationStart,0));return e}();n.value=n.delta=e.responseStart,n.entries=[e],t(n)}catch(t){}},"complete"===document.readyState?setTimeout(e,0):addEventListener("pageshow",e)}}}]);
//# sourceMappingURL=3.92b28fed.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
!function(e){function r(r){for(var n,i,a=r[0],c=r[1],l=r[2],s=0,p=[];s<a.length;s++)i=a[s],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&p.push(o[i][0]),o[i]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var c=t[a];0!==o[c]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var u,a=document.createElement("script");a.charset="utf-8",a.timeout=120,i.nc&&a.setAttribute("nonce",i.nc),a.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"92b28fed"}[e]+".chunk.js"}(e);var c=new Error;u=function(r){a.onerror=a.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,t[1](c)}o[e]=void 0}};var l=setTimeout((function(){u({type:"timeout",target:a})}),12e4);a.onerror=a.onload=u,document.head.appendChild(a)}return Promise.all(r)},i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./",i.oe=function(e){throw console.error(e),e};var a=this.webpackJsonpscodocmobile=this.webpackJsonpscodocmobile||[],c=a.push.bind(a);a.push=r,a=a.slice();for(var l=0;l<a.length;l++)r(a[l]);var f=c;t()}([]);
//# sourceMappingURL=runtime-main.ca83272f.js.map

File diff suppressed because one or more lines are too long