forked from ScoDoc/ScoDoc
Compare commits
5 Commits
master
...
moodle-not
Author | SHA1 | Date | |
---|---|---|---|
06d83cc691 | |||
e943e7f283 | |||
be30cf66fa | |||
2c5e59120c | |||
e52ffb8357 |
@ -1,13 +1,14 @@
|
||||
# -*- mode: python -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
SCOVERSION = "7.24"
|
||||
SCOVERSION = "7.25m"
|
||||
|
||||
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>
|
||||
|
18
ZAbsences.py
18
ZAbsences.py
@ -720,7 +720,7 @@ class ZAbsences(
|
||||
+ self.sco_footer(REQUEST)
|
||||
)
|
||||
|
||||
base_url = "SignaleAbsenceGrHebdo?datelundi=%s&%s&destination=%s" % (
|
||||
base_url = "SignaleAbsenceGrHebdo?datelundi=%s&%s&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&datefin=%s&%s&destination=%s" % (
|
||||
datedebut,
|
||||
datefin,
|
||||
groups_infos.groups_query_args,
|
||||
urllib.quote(destination),
|
||||
)
|
||||
base_url = (
|
||||
base_url_noweeks + "&nbweeks=%s" % nbweeks
|
||||
base_url_noweeks + "&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 + "&nbweeks=%s" % nwl
|
||||
if moduleimpl_id:
|
||||
url_link_semaines += "&moduleimpl_id=" + moduleimpl_id
|
||||
url_link_semaines += "&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&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&datedebut=%s&datefin=%s&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&formsemestre_id=%s&debut=%s&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é :
|
||||
"ProcessBilletAbsenceForm?billet_id=%s" % b["billet_id"]
|
||||
)
|
||||
if etud:
|
||||
b["_etat_str_target"] += "&etudid=%s" % etud["etudid"]
|
||||
b["_etat_str_target"] += "&etudid=%s" % etud["etudid"]
|
||||
b["_billet_id_target"] = b["_etat_str_target"]
|
||||
else:
|
||||
b["etat_str"] = "ok"
|
||||
|
24
ZNotes.py
Normal file → Executable file
24
ZNotes.py
Normal file → Executable file
@ -90,6 +90,7 @@ import sco_compute_moy
|
||||
import sco_recapcomplet
|
||||
import sco_liste_notes
|
||||
import sco_saisie_notes
|
||||
import sco_saisie_notes_moodle
|
||||
import sco_placement
|
||||
import sco_undo_notes
|
||||
import sco_formations
|
||||
@ -554,7 +555,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 + "&msg=Nouvelle version !"
|
||||
)
|
||||
else:
|
||||
return new_id, modules_old2new, ues_old2new
|
||||
@ -1242,7 +1243,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&ens_id=%s">supprimer</a>)</li>'
|
||||
% (
|
||||
login2display.get(ens["ens_id"], ens["ens_id"]),
|
||||
moduleimpl_id,
|
||||
@ -1254,7 +1255,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&formsemestre_id=%s">Modification du semestre</a>", accessible uniquement au responsable de la formation (chef de département)
|
||||
</p>
|
||||
""" % (
|
||||
sem["formation_id"],
|
||||
@ -1401,7 +1402,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
|
||||
return REQUEST.RESPONSE.redirect(
|
||||
"moduleimpl_status?moduleimpl_id="
|
||||
+ moduleimpl_id
|
||||
+ "&head_message=responsable%20modifié"
|
||||
+ "&head_message=responsable%20modifié"
|
||||
)
|
||||
|
||||
_expr_help = """<p class="help">Expérimental: formule de calcul de la moyenne %(target)s</p>
|
||||
@ -1489,7 +1490,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"
|
||||
+ "&head_message=règle%20de%20calcul%20modifiée"
|
||||
)
|
||||
|
||||
security.declareProtected(ScoView, "view_module_abs")
|
||||
@ -1630,7 +1631,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"
|
||||
+ "&head_message=règle%20de%20calcul%20modifiée"
|
||||
)
|
||||
|
||||
security.declareProtected(ScoView, "formsemestre_enseignants_list")
|
||||
@ -1860,7 +1861,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&formsemestre_id=%s">
|
||||
supprimer décision jury</a>
|
||||
)
|
||||
"""
|
||||
@ -2460,6 +2461,9 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
|
||||
security.declareProtected(ScoEnsView, "saisie_notes_tableur")
|
||||
saisie_notes_tableur = sco_saisie_notes.saisie_notes_tableur
|
||||
|
||||
security.declareProtected(ScoEnsView, "import_eval_notes_from_moodle")
|
||||
import_eval_notes_from_moodle = sco_saisie_notes_moodle.import_from_moodle
|
||||
|
||||
security.declareProtected(ScoEnsView, "feuille_saisie_notes")
|
||||
feuille_saisie_notes = sco_saisie_notes.feuille_saisie_notes
|
||||
|
||||
@ -2682,7 +2686,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&etudid=%s" % (
|
||||
formsemestre_id,
|
||||
etudid,
|
||||
)
|
||||
@ -3026,7 +3030,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&etudid=%s"
|
||||
% (formsemestre_id, etudid),
|
||||
parameters={"etudid": etudid, "formsemestre_id": formsemestre_id},
|
||||
)
|
||||
@ -3036,7 +3040,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&etudid=%s&head_message=Décision%%20supprimée"
|
||||
% (formsemestre_id, etudid)
|
||||
)
|
||||
|
||||
|
@ -504,6 +504,11 @@ 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">
|
||||
|
@ -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&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]
|
||||
|
12
ZScolar.py
12
ZScolar.py
@ -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 R&T</title>
|
||||
<title>Programme DUT TEST</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&debut=%(date_debut)s&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&format=xls">format tableur</a>)
|
||||
<a href="%(url)s/groups_view?curtab=tab-photos&group_ids=%(group_id)s&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&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&force=1">Supprimer le dossier %s</a>(très recommandé !)</p>'
|
||||
% (DeptId, DeptId)
|
||||
)
|
||||
H.append(context.standard_html_footer(context))
|
||||
|
@ -5,9 +5,9 @@
|
||||
#
|
||||
[Unit]
|
||||
Description=ScoDoc 7 service
|
||||
After=network.target postgresql@11-main.service
|
||||
Requires=postgresql@11-main.service
|
||||
PartOf=postgresql@11-main.service
|
||||
After=network.target postgresql
|
||||
Requires=postgresql
|
||||
PartOf=postgresql
|
||||
StartLimitIntervalSec=0
|
||||
|
||||
[Service]
|
||||
@ -21,4 +21,4 @@ ExecStop=/opt/scodoc/bin/zopectl stop
|
||||
ExecReload=/opt/scodoc/bin/zopectl restart
|
||||
|
||||
[Install]
|
||||
WantedBy=postgresql@11-main.service
|
||||
WantedBy=postgresql
|
||||
|
@ -32,11 +32,13 @@ fi
|
||||
chgrp www-data $SCODOC_DIR $SCODOC_DIR/ZopeProducts/*
|
||||
chmod g+w $SCODOC_DIR $SCODOC_DIR/ZopeProducts/*
|
||||
|
||||
chgrp -R www-data "${SCODOC_VAR_DIR}"/photos
|
||||
chmod -R g+w "${SCODOC_VAR_DIR}"/photos
|
||||
if [ -d "${SCODOC_VAR_DIR}"/photos ]; then
|
||||
chgrp -R www-data "${SCODOC_VAR_DIR}"/photos
|
||||
chmod -R g+w "${SCODOC_VAR_DIR}"/photos
|
||||
fi
|
||||
|
||||
if [ ! -e "${SCODOC_VERSION_DIR}" ]; then
|
||||
mkdir "${SCODOC_VERSION_DIR}"
|
||||
mkdir -p "${SCODOC_VERSION_DIR}"
|
||||
chown www-data.www-data "${SCODOC_VERSION_DIR}"
|
||||
fi
|
||||
|
||||
|
@ -51,7 +51,7 @@ then
|
||||
fi
|
||||
chown root "$DEST"
|
||||
|
||||
# Zope DB and ScoDoc archives:
|
||||
# Zope DB, ScoDoc archives, configuration, photos, etc.
|
||||
echo "Copying var/ ..."
|
||||
cp -rp "$INSTANCE_DIR/var" "$DEST"
|
||||
|
||||
|
@ -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&format=xls">%s</a>'
|
||||
% (self.base_url, scu.ICON_XLS)
|
||||
)
|
||||
if self.xls_link and self.pdf_link:
|
||||
H.append(" ")
|
||||
if self.pdf_link:
|
||||
H.append(
|
||||
' <a href="%s&format=pdf">%s</a>'
|
||||
' <a href="%s&format=pdf">%s</a>'
|
||||
% (self.base_url, scu.ICON_PDF)
|
||||
)
|
||||
H.append("</p>")
|
||||
|
@ -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&absjust_only=0" % (REQUEST.URL0, etudid)
|
||||
base_url_j = "%s?etudid=%s&absjust_only=1" % (REQUEST.URL0, etudid)
|
||||
else:
|
||||
base_url_nj = base_url_j = ""
|
||||
tab_absnonjust = GenTable(
|
||||
|
@ -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&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&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&archive_name=%s&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 + "&head_message=Archive%20supprimée")
|
||||
|
@ -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&archive_name=%s&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&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 + "&head_message=Archive%20supprimée")
|
||||
|
||||
|
||||
def etud_get_archived_file(context, REQUEST, etudid, archive_name, filename):
|
||||
|
@ -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&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&format=html&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&format=html&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&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&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&etudid=%s&format=pdf&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&etudid=%s&format=pdfmail&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&etudid=%s&format=pdfmail&version=%s&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&etudid=%s&format=xml&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&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&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&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&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&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&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&etudid=%s&format=pdf&version=%s"
|
||||
% (formsemestre_id, etudid, version),
|
||||
scu.ICON_PDF,
|
||||
)
|
||||
|
@ -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&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&formsemestre_id=%(formsemestre_id)s">Ajouter une appréciation</a></p>'
|
||||
% self.infos
|
||||
)
|
||||
H.append("</div>")
|
||||
|
@ -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&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&formsemestre_id=%(formsemestre_id)s">Ajouter une appréciation</a></p>'
|
||||
% self.infos
|
||||
)
|
||||
H.append("</div>")
|
||||
|
@ -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&n_group_td=%s&n_group_tp=%s&coef_tp=%s"
|
||||
% (REQUEST.URL0, formsemestre_id, n_group_td, n_group_tp, coef_tp)
|
||||
)
|
||||
|
||||
|
@ -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&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&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&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&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&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&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&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&semestre_id=1">Mettre en place un nouveau semestre de formation %(acronyme)s</a>
|
||||
</li>
|
||||
|
||||
</ul>"""
|
||||
|
@ -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&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&nips=%s"
|
||||
% (semset_id, "&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&title=Etudiants%%20ScoDoc%%20non%%20listés%%20dans%%20les%%20maquettes%%20Apogée%%20chargées&nips=%s"
|
||||
% (semset_id, "&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&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&nips=%s"
|
||||
% (semset_id, "&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&title=Doublons%%20Apogee&nips=%s"
|
||||
% (semset_id, "&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 + "&head_message=Archive%20supprimée")
|
||||
|
||||
|
||||
def view_apo_csv(context, etape_apo="", semset_id="", format="html", REQUEST=None):
|
||||
|
@ -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&end_date=%s&types_parcours=%s" % (
|
||||
REQUEST.URL0,
|
||||
start_date,
|
||||
end_date,
|
||||
"&types_parcours=".join([str(x) for x in types_parcours]),
|
||||
"&types_parcours=".join([str(x) for x in types_parcours]),
|
||||
)
|
||||
if format != "html":
|
||||
return tab.make_page(
|
||||
|
@ -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&" % e["etudid"]
|
||||
e["_nomprenom_target"] = target
|
||||
e["inscription_target"] = target
|
||||
e["_nomprenom_td_attrs"] = 'id="%s" class="etudinfo"' % (e["etudid"])
|
||||
|
@ -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&semestre_id=1">ajouter</a>'
|
||||
% f
|
||||
]
|
||||
)
|
||||
|
@ -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&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&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&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&head_message=Formation%%20dupliquée"
|
||||
% formsemestre_id
|
||||
)
|
||||
|
||||
|
@ -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&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&etudid=%s"
|
||||
% (context.ScoURL(), formsemestre_id, etudid)
|
||||
)
|
||||
else:
|
||||
|
@ -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&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&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&formsemestre_id=%s&multiple_ok=1&%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&etudid=%s" title="%s">(capitalisée le %s)' % (
|
||||
sem_origin["formsemestre_id"],
|
||||
etudid,
|
||||
sem_origin["titreannee"],
|
||||
|
@ -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&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&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&hidemodules=1&hidebac=1&pref_override=0&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&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&ue_id=%s">'
|
||||
% (formsemestre_id, ue["ue_id"])
|
||||
)
|
||||
H.append(
|
||||
|
@ -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&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&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&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id="
|
||||
+ formsemestre_id
|
||||
)
|
||||
if sortcol:
|
||||
desturl += (
|
||||
"&sortcol=" + sortcol
|
||||
"&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&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&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&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&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&etudid=%s&check=1"
|
||||
% (formsemestre_id, etudid)
|
||||
)
|
||||
if sortcol:
|
||||
adr += "&sortcol=" + sortcol
|
||||
adr += "&sortcol=" + sortcol
|
||||
# if desturl:
|
||||
# desturl += "&desturl=" + desturl
|
||||
# desturl += "&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&check=1&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&hidemodules=1&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&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&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&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&etudid=%s&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&modejury=1&hidemodules=1&hidebac=1&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&etudid=%s&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&ue_id=%(ue_id)s&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&formsemestre_id=%s"
|
||||
% (etudid, formsemestre_id)
|
||||
)
|
||||
|
||||
|
@ -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&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&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 "&".join(["group_ids%3Alist=" + group_id for group_id in group_ids])
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
@ -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 = "&".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 + "&with_codes=%s" % with_codes
|
||||
base_url = (
|
||||
base_url_np
|
||||
+ "&with_paiement=%s&with_archives=%s&with_annotations=%s"
|
||||
+ "&with_paiement=%s&with_archives=%s&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&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&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&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&debut=%s&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&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&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&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&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&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&etat=%s">Vérifier codes Apogée</a> (de tous les groupes)</li>'
|
||||
% (group_id, etat or "")
|
||||
)
|
||||
# Lien pour ajout fichiers étudiants
|
||||
|
@ -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> '
|
||||
'<a href="%s&export_cat_xls=%s">%s</a> '
|
||||
% (base_url, src_cat, scu.ICON_XLS)
|
||||
)
|
||||
H.append("</div>")
|
||||
|
@ -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&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(["&group_ids%3Alist=" + g for g in group_ids])
|
||||
if note_sur_20:
|
||||
gl = "&note_sur_20%3Alist=yes" + gl
|
||||
gl = "¬e_sur_20%3Alist=yes" + gl
|
||||
if anonymous_listing:
|
||||
gl = "&anonymous_listing%3Alist=yes" + gl
|
||||
gl = "&anonymous_listing%3Alist=yes" + gl
|
||||
if hide_groups:
|
||||
gl = "&hide_groups%3Alist=yes" + gl
|
||||
gl = "&hide_groups%3Alist=yes" + gl
|
||||
if with_emails:
|
||||
gl = "&with_emails%3Alist=yes" + gl
|
||||
gl = "&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&datedebut=%s&datefin=%s&demijournee=%s&moduleimpl_id=%s">signaler cette absence</a>'
|
||||
% (
|
||||
etud["etudid"],
|
||||
urllib.quote(E["jour"]),
|
||||
|
@ -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 += "&only_primo=1"
|
||||
if no_grouping:
|
||||
tab.base_url += "&no_grouping=1"
|
||||
tab.base_url += "&no_grouping=1"
|
||||
t = tab.make_page(context, format=format, with_html_headers=False, REQUEST=REQUEST)
|
||||
if format != "html":
|
||||
return t
|
||||
|
@ -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&formsemestre_id=%s&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&formsemestre_id=%s&ue_id=%s">inscrire à tous les modules de cette UE</a></div>'
|
||||
% (etud["etudid"], formsemestre_id, ue["ue_id"])
|
||||
)
|
||||
H.append("</li>")
|
||||
|
@ -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&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&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&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&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(
|
||||
""" (<a href="evaluation_listenotes?tf-submitted=1&evaluation_id=%s&group_ids%%3Alist=%s">%s notes</a>"""
|
||||
""" (<a href="evaluation_listenotes?tf-submitted=1&evaluation_id=%s&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&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"> """)
|
||||
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&group_ids:list=%s">"""
|
||||
% (eval["evaluation_id"], gr_moyenne["group_id"])
|
||||
)
|
||||
H.append("pas de notes")
|
||||
|
@ -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&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&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&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&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&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&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&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&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&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&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&etudid=%(etudid)s&formsemestre_id=%(last_formsemestre_id)s&desturl=ficheEtud?etudid=%(etudid)s">récapitulatif parcours</a>)"""
|
||||
% info
|
||||
)
|
||||
else:
|
||||
|
@ -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&placement_method=%s&teachers=%s&building=%s&room=%s&columns=%s&numbering=%s&"
|
||||
% (
|
||||
evaluation_id,
|
||||
placement_method,
|
||||
@ -215,7 +215,7 @@ def do_placement_selectetuds(context, REQUEST):
|
||||
columns,
|
||||
numbering,
|
||||
)
|
||||
+ "&".join(gs)
|
||||
+ "&".join(gs)
|
||||
)
|
||||
return REQUEST.RESPONSE.redirect(
|
||||
context.NotesURL() + "/do_placement?" + query
|
||||
|
20
sco_preferences.py
Normal file → Executable file
20
sco_preferences.py
Normal file → Executable file
@ -1744,6 +1744,26 @@ Année scolaire: %(anneescolaire)s
|
||||
"category": "edt",
|
||||
},
|
||||
),
|
||||
(
|
||||
"moodle_server_url",
|
||||
{
|
||||
"title": "URL pour accéder au service web de Moodle",
|
||||
"initvalue": "",
|
||||
"explanation": "cette URL est du type https://nom_du_serveur/moodle/webservice/rest/server.php",
|
||||
"size": 50,
|
||||
"category": "portal",
|
||||
},
|
||||
),
|
||||
(
|
||||
"moodle_ws_token",
|
||||
{
|
||||
"title": "jeton d'identification pour le service web de Moodle",
|
||||
"initvalue": "",
|
||||
"explanation": "ce jeton est créé par moodle dans la gestion du plugin service web: consultez l'administrateur de Moodle",
|
||||
"size": 30,
|
||||
"category": "portal",
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
PREFS_NAMES = set([x[0] for x in PREFS])
|
||||
|
@ -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={}&head_message=Aucun%20%C3%A9tudiant%20n%27a%20de%20d%C3%A9cision%20de%20jury".format(
|
||||
formsemestre_id
|
||||
)
|
||||
)
|
||||
|
@ -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&modejury=1&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+'&etudid='+etudid;
|
||||
if (SORT_COLUMN_INDEX) {
|
||||
loc += '&sortcol=' + SORT_COLUMN_INDEX;
|
||||
loc += '&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&etudid=%(etudid)s&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&etudid=%s">%s</a>' % (formsemestre_id, etudid, act)
|
||||
cells += (
|
||||
""" <a href="#" onclick="va_saisir('%s', '%s')">%s</a>"""
|
||||
% (formsemestre_id, etudid, act)
|
||||
|
@ -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 += "&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&percent=%s&bac=%s&bacspecialite=%s&civilite=%s"
|
||||
% (REQUEST.URL0, formsemestre_id, percent, bac, bacspecialite, civilite)
|
||||
)
|
||||
if only_primo:
|
||||
tab.base_url += "&only_primo=on"
|
||||
tab.base_url += "&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&bac=%s&bacspecialite=%s&civilite=%s&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&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&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 += "&only_primo=1"
|
||||
if no_grouping:
|
||||
tab.base_url += "&no_grouping=1"
|
||||
tab.base_url += "&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&"
|
||||
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&%sbac=%s&bacspecialite=%s&civilite=%s&statut=%s&format="
|
||||
% (formsemestre_id, op, bac, bacspecialite, civilite, statut)
|
||||
)
|
||||
(
|
||||
|
@ -921,27 +921,37 @@ def saisie_notes(context, evaluation_id, group_ids=[], REQUEST=None):
|
||||
H.append("""<div id="group-tabs"><table><tr><td>""")
|
||||
H.append(sco_groups_view.form_groups_choice(context, groups_infos))
|
||||
H.append('</td><td style="padding-left: 35px;">')
|
||||
|
||||
# Pour savoir si l'interface Moodle est configurée:
|
||||
moodle_token = context.get_preference("moodle_ws_token", formsemestre_id)
|
||||
moodle_serveur = context.get_preference("moodle_server_url", formsemestre_id)
|
||||
menu_items = [
|
||||
{
|
||||
"title": "Saisie par fichier tableur",
|
||||
"id": "menu_saisie_tableur",
|
||||
"url": "/saisie_notes_tableur?evaluation_id=%s&%s"
|
||||
% (E["evaluation_id"], groups_infos.groups_query_args),
|
||||
},
|
||||
{
|
||||
"id": "import_moodle",
|
||||
"title": "Importer les notes depuis Moodle",
|
||||
"url": "/import_from_moodle?evaluation_id=%s" % (E["evaluation_id"],),
|
||||
"enabled": moodle_serveur and moodle_token,
|
||||
},
|
||||
{
|
||||
"title": "Voir toutes les notes du module",
|
||||
"url": "/evaluation_listenotes?moduleimpl_id=%s" % E["moduleimpl_id"],
|
||||
},
|
||||
{
|
||||
"title": "Effacer toutes les notes de cette évaluation",
|
||||
"url": "/evaluation_suppress_alln?evaluation_id=%s" % (E["evaluation_id"],),
|
||||
},
|
||||
]
|
||||
|
||||
H.append(
|
||||
htmlutils.make_menu(
|
||||
"Autres opérations",
|
||||
[
|
||||
{
|
||||
"title": "Saisie par fichier tableur",
|
||||
"id": "menu_saisie_tableur",
|
||||
"url": "/saisie_notes_tableur?evaluation_id=%s&%s"
|
||||
% (E["evaluation_id"], groups_infos.groups_query_args),
|
||||
},
|
||||
{
|
||||
"title": "Voir toutes les notes du module",
|
||||
"url": "/evaluation_listenotes?moduleimpl_id=%s"
|
||||
% E["moduleimpl_id"],
|
||||
},
|
||||
{
|
||||
"title": "Effacer toutes les notes de cette évaluation",
|
||||
"url": "/evaluation_suppress_alln?evaluation_id=%s"
|
||||
% (E["evaluation_id"],),
|
||||
},
|
||||
],
|
||||
menu_items,
|
||||
base_url=context.absolute_url(),
|
||||
alone=True,
|
||||
)
|
||||
|
474
sco_saisie_notes_moodle.py
Normal file
474
sco_saisie_notes_moodle.py
Normal file
@ -0,0 +1,474 @@
|
||||
# -*- mode: python -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gestion scolarite IUT
|
||||
#
|
||||
# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# Emmanuel Viennet emmanuel.viennet@viennet.net
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
"""Importation de notes depuis Moodle
|
||||
Contrib. Pierre-Alain Jacquot, mai 2021
|
||||
"""
|
||||
|
||||
# QUESTION: un (long) commentaire expliquant le principe de base de ce module
|
||||
|
||||
import requests
|
||||
import re
|
||||
|
||||
|
||||
def cleanhtml(raw_html):
|
||||
cleanr = re.compile("<.*?>")
|
||||
cleantext = re.sub(cleanr, " ", raw_html)
|
||||
cleantext = cleantext.strip()
|
||||
cleantext = cleantext.encode("utf-8")
|
||||
return cleantext
|
||||
|
||||
|
||||
#
|
||||
def get_moodle_course_id(moodle_serveur, moodle_token, courses_short_name):
|
||||
param_cours = {
|
||||
"wstoken": moodle_token,
|
||||
"moodlewsrestformat": "json",
|
||||
"wsfunction": "core_course_get_courses_by_field",
|
||||
"field": "shortname",
|
||||
"value": courses_short_name,
|
||||
}
|
||||
try:
|
||||
r = requests.post(url=moodle_serveur, data=param_cours).json()
|
||||
except ValueError:
|
||||
raise ValueError("Erreur de connexion vérifiez l'URL de Moodle")
|
||||
if "exception" in r:
|
||||
raise ValueError(
|
||||
"Connexion au service web de Moodle impossible %s : Vérifiez votre paramétrage"
|
||||
% r["message"]
|
||||
)
|
||||
if len(r["courses"]) == 0:
|
||||
courseid = 0
|
||||
else:
|
||||
courseid = r["courses"][0]["id"]
|
||||
return courseid
|
||||
|
||||
|
||||
def has_student_role(user):
|
||||
"""
|
||||
Retourne vrai si l'utilisateur a le role 5 : «etudiant» ou «student» dans le cours
|
||||
i.e. il a des notes
|
||||
"""
|
||||
# QUESTION: ce nombre "5" est une constante universelle dans Moodle ?
|
||||
est_etudiant = False
|
||||
for role in user["roles"]:
|
||||
# print "role : "+str(role['roleid'] )
|
||||
if role["roleid"] == 5:
|
||||
# print "est_etudiant "+str(role['roleid'] )
|
||||
est_etudiant = 1
|
||||
return est_etudiant
|
||||
|
||||
|
||||
def get_etudiants_from_course(moodle_serveur, moodle_token, courses_short_name):
|
||||
"""
|
||||
Extrait la liste des étudiants des utilisateurs inscrit dans le cours.
|
||||
Cette liste contient les informations suivante :
|
||||
- id moodle
|
||||
- email
|
||||
- idnumber (numéro d'identification) s'il existe : celui ci peut servir a stocker le EID ou le nip
|
||||
"""
|
||||
courseid = get_moodle_course_id(moodle_serveur, moodle_token, courses_short_name)
|
||||
param_cours = {
|
||||
"wstoken": moodle_token,
|
||||
"moodlewsrestformat": "json",
|
||||
"wsfunction": "core_enrol_get_enrolled_users",
|
||||
"options[0][name]": "onlyactive",
|
||||
"options[0][value]": "1",
|
||||
"options[1][name]": "userfields",
|
||||
"options[1][value]": "id,email,idnumber,roles",
|
||||
"courseid": courseid,
|
||||
}
|
||||
r = requests.post(url=moodle_serveur, data=param_cours).json()
|
||||
etudiants = [user for user in r if has_student_role(user)]
|
||||
# le role n'est plus une information pertinente : suppression
|
||||
for etudiant in etudiants:
|
||||
del etudiant["roles"]
|
||||
etudiant["email"] = etudiant["email"].encode("ascii").lower()
|
||||
return etudiants
|
||||
|
||||
|
||||
def get_evaluation_list(moodle_serveur, moodle_token, courses_short_name):
|
||||
"""
|
||||
Récupère la liste des evaluations du cours Moodle
|
||||
On recherche les notes d'un seul etudiant pour gagner du temps.
|
||||
"""
|
||||
# QUESTION: documenter les valeurs résultats
|
||||
etudiants = get_etudiants_from_course(
|
||||
moodle_serveur, moodle_token, courses_short_name
|
||||
)
|
||||
a_userid = etudiants[0]["id"]
|
||||
courseid = get_moodle_course_id(moodle_serveur, moodle_token, courses_short_name)
|
||||
param_notes = {
|
||||
"wstoken": moodle_token,
|
||||
"moodlewsrestformat": "json",
|
||||
"wsfunction": "gradereport_user_get_grades_table",
|
||||
"courseid": courseid,
|
||||
"userid": a_userid,
|
||||
}
|
||||
r = requests.post(url=moodle_serveur, data=param_notes)
|
||||
notes = r.json()
|
||||
bareme = {}
|
||||
liste_evals = []
|
||||
for etu_notes in notes["tables"][0]["tabledata"]:
|
||||
if "grade" in etu_notes:
|
||||
nom_eval = cleanhtml(etu_notes["itemname"]["content"])
|
||||
liste_evals.append(nom_eval)
|
||||
bareme_min, bareme_max = etu_notes["range"]["content"].split("–")
|
||||
bareme[nom_eval] = {
|
||||
"min": float(bareme_min.replace(",", ".")),
|
||||
"max": float(bareme_max.replace(",", ".")),
|
||||
}
|
||||
return liste_evals, bareme
|
||||
|
||||
|
||||
def get_grades_from_moodle_course(moodle_serveur, moodle_token, courses_short_name):
|
||||
"""
|
||||
Récupère toutes les notes du cours et les remet en forme
|
||||
dans un dictionnaire indexé par le userid de moodle
|
||||
{userid: { nom_eval:note, ...}}
|
||||
"""
|
||||
courseid = get_moodle_course_id(moodle_serveur, moodle_token, courses_short_name)
|
||||
param_notes = {
|
||||
"wstoken": moodle_token,
|
||||
"moodlewsrestformat": "json",
|
||||
"wsfunction": "gradereport_user_get_grades_table",
|
||||
"courseid": courseid,
|
||||
}
|
||||
r = requests.post(url=moodle_serveur, data=param_notes)
|
||||
notes = r.json()
|
||||
notes_evals = {}
|
||||
for etudiant in notes["tables"]:
|
||||
# remise en forme des notes dans un dictionnaire indexe par le nom de la note
|
||||
tab_notes = {}
|
||||
|
||||
for etu_notes in etudiant["tabledata"]:
|
||||
if "grade" in etu_notes:
|
||||
if etu_notes["grade"]["content"] == "-":
|
||||
etu_notes["grade"]["content"] = "SUPR"
|
||||
tab_notes[cleanhtml(etu_notes["itemname"]["content"])] = etu_notes[
|
||||
"grade"
|
||||
]["content"]
|
||||
notes_evals[etudiant["userid"]] = tab_notes
|
||||
return notes_evals
|
||||
|
||||
|
||||
# QUESTION: j'ai l'impression qu'il y a trop de code en commun entre cette fonction et
|
||||
# sco_saisie_notes._form_saisie_notes
|
||||
|
||||
# QUESTION: manque vérification de la présence de décisions de jury ?? (qui devrait bloquer l'import amha)
|
||||
|
||||
|
||||
def import_eval_notes_from_moodle(context, evaluation_id, group_ids=[], REQUEST=None):
|
||||
"""Récuperation des notes sur moodle"""
|
||||
moodle_token = context.get_preference("moodle_ws_token", formsemestre_id)
|
||||
moodle_serveur = context.get_preference("moodle_server_url", formsemestre_id)
|
||||
# Désactive si l'interface n'est pas configurée:
|
||||
if not moodle_serveur or not moodle_token:
|
||||
return "Interface Moodle non paramétrée !"
|
||||
|
||||
authuser = REQUEST.AUTHENTICATED_USER
|
||||
evals = context.do_evaluation_list({"evaluation_id": evaluation_id})
|
||||
if not evals:
|
||||
raise ScoValueError("invalid evaluation_id")
|
||||
E = evals[0]
|
||||
M = context.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0]
|
||||
# M = context.do_moduleimpl_list( args={ 'moduleimpl_id' : E['moduleimpl_id'] } )[0]
|
||||
formsemestre_id = M["formsemestre_id"]
|
||||
if not can_edit_notes(context, authuser, E["moduleimpl_id"]):
|
||||
return (
|
||||
context.sco_header(REQUEST)
|
||||
+ "<h2>Modification des notes impossible pour %s</h2>" % authusername
|
||||
+ """<p>(vérifiez que le semestre n'est pas verrouillé et que vous
|
||||
avez l'autorisation d'effectuer cette opération)</p>
|
||||
<p><a href="moduleimpl_status?moduleimpl_id=%s">Continuer</a></p>
|
||||
"""
|
||||
% E["moduleimpl_id"]
|
||||
+ context.sco_footer(REQUEST)
|
||||
)
|
||||
|
||||
if E["description"]:
|
||||
page_title = 'Saisie des notes de "%s"' % E["description"]
|
||||
else:
|
||||
page_title = "Saisie des notes"
|
||||
|
||||
# Informations sur les groupes à afficher:
|
||||
groups_infos = sco_groups_view.DisplayedGroupsInfos(
|
||||
context,
|
||||
group_ids=group_ids,
|
||||
formsemestre_id=formsemestre_id,
|
||||
select_all_when_unspecified=True,
|
||||
etat=None,
|
||||
REQUEST=REQUEST,
|
||||
)
|
||||
|
||||
H = [
|
||||
context.sco_header(
|
||||
REQUEST,
|
||||
page_title=page_title,
|
||||
javascripts=sco_groups_view.JAVASCRIPTS,
|
||||
cssstyles=sco_groups_view.CSSSTYLES,
|
||||
init_qtip=True,
|
||||
),
|
||||
sco_evaluations.evaluation_describe(
|
||||
context, evaluation_id=evaluation_id, REQUEST=REQUEST
|
||||
),
|
||||
"""<span class="eval_title">Import des notes depuis Moodle</span>""",
|
||||
]
|
||||
H.append(
|
||||
"""<div class="saisienote_etape1">
|
||||
<form action="import_from_moodle" method="post">
|
||||
Nom abrégé du cours sur Moodle <input type="text" size="20" name="course_short_name"/>
|
||||
<input type="submit" value="OK"/>
|
||||
<input type="hidden" name="evaluation_id" value="%s"/></form>
|
||||
</div>
|
||||
"""
|
||||
% (evaluation_id)
|
||||
)
|
||||
if "course_short_name" in REQUEST.form:
|
||||
course_short_name = REQUEST.form["course_short_name"]
|
||||
courseid = get_moodle_course_id(moodle_serveur, moodle_token, course_short_name)
|
||||
|
||||
if courseid == 0:
|
||||
H.append(
|
||||
"""
|
||||
<p class="warning">" %s " n'est pas un nom abrégé de cours connu sur ce Moodle</p>
|
||||
"""
|
||||
% course_short_name
|
||||
)
|
||||
else:
|
||||
list_evaluations, bareme = get_evaluation_list(
|
||||
moodle_serveur, moodle_token, course_short_name
|
||||
)
|
||||
|
||||
msg = "<p> <b>Remarque</b> : Si l'étudiant n'a pas de note sur Moodle la note dans cette évaluation sera supprimée</p>"
|
||||
if len(list_evaluations) > 5:
|
||||
msg += "<p>ATTENTION : Le chargement des notes peut prendre beaucoup de temps </p>"
|
||||
H.append(
|
||||
"""<div class="saisienote_etape2">
|
||||
<span class="eval_title"> liste des évaluations du cours %s </span>
|
||||
<form action="import_from_moodle" method="post">
|
||||
"""
|
||||
% course_short_name
|
||||
)
|
||||
pbplage = False
|
||||
for ev in range(0, len(list_evaluations)):
|
||||
# verification du bareme
|
||||
marque = ""
|
||||
if (
|
||||
bareme[list_evaluations[ev]]["min"] != scu.NOTES_MIN
|
||||
or bareme[list_evaluations[ev]]["max"] != E["note_max"]
|
||||
):
|
||||
marque = (
|
||||
"""<span class="redboldtext" >note entre %.2f et %.2f</span>"""
|
||||
% (
|
||||
bareme[list_evaluations[ev]]["min"],
|
||||
bareme[list_evaluations[ev]]["max"],
|
||||
)
|
||||
)
|
||||
pbplage = True
|
||||
H.append(
|
||||
"""
|
||||
<input type="radio" name="num_eval" value=%d > %s %s<br>
|
||||
"""
|
||||
% (ev, list_evaluations[ev], marque)
|
||||
)
|
||||
if pbplage:
|
||||
msg += (
|
||||
'<p><span class="redboldtext">ATTENTION </span>: certaines évaluations ne sont pas dans la plage %.2f - %.2f il faudrait modifier cette cette évaluation pour pouvoir les importer !</p> '
|
||||
% (scu.NOTES_MIN, E["note_max"])
|
||||
)
|
||||
H.append(
|
||||
"""
|
||||
<input type="submit" value="OK"/>
|
||||
<input type="hidden" name="course_short_name" value="%s"/>
|
||||
<input type="hidden" name="evaluation_id" value="%s"/></form>
|
||||
%s
|
||||
</div>
|
||||
"""
|
||||
% (course_short_name, evaluation_id, msg)
|
||||
)
|
||||
if "num_eval" in REQUEST.form:
|
||||
nom_eval = list_evaluations[int(REQUEST.form["num_eval"])]
|
||||
etudiant_info = get_etudiants_from_course(
|
||||
moodle_serveur, moodle_token, course_short_name
|
||||
)
|
||||
moodle_notes = get_grades_from_moodle_course(
|
||||
moodle_serveur, moodle_token, course_short_name
|
||||
)
|
||||
email_id = {}
|
||||
nip_id = {}
|
||||
for etu in groups_infos.members:
|
||||
email = str(etu["email"]).lower()
|
||||
email_id[email] = etu["etudid"]
|
||||
nip_id[etu["code_nip"]] = etu["etudid"]
|
||||
nouvelles_notes = []
|
||||
for etu in etudiant_info:
|
||||
# La présence d'un code nip est prioritaire sur l'adresse mail
|
||||
if "idnumber" in etu:
|
||||
nouvelles_notes.append(
|
||||
(nip_id[etu["idnumber"]], moodle_notes[etu["id"]][nom_eval])
|
||||
)
|
||||
elif etu["email"] in email_id:
|
||||
email = str(etu["email"]).lower()
|
||||
nouvelles_notes.append(
|
||||
(email_id[email], moodle_notes[etu["id"]][nom_eval])
|
||||
)
|
||||
updiag = do_moodle_import(
|
||||
context,
|
||||
REQUEST,
|
||||
nouvelles_notes,
|
||||
"Moodle/%s/%s" % (course_short_name, nom_eval),
|
||||
)
|
||||
# updiag=[0,"en test: merci de patienter"]
|
||||
if updiag[0]:
|
||||
H.append(updiag[1])
|
||||
H.append(
|
||||
"""<p>Notes chargées.
|
||||
<a class="stdlink" href="moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s">
|
||||
Revenir au tableau de bord du module</a>
|
||||
|
||||
<a class="stdlink" href="saisie_notes?evaluation_id=%(evaluation_id)s">Charger d'autres notes dans cette évaluation</a>
|
||||
</p>"""
|
||||
% E
|
||||
)
|
||||
else:
|
||||
H.append(
|
||||
"""<p class="redboldtext">Notes non chargées !</p>"""
|
||||
+ updiag[1]
|
||||
)
|
||||
H.append(
|
||||
"""
|
||||
<p><a class="stdlink" href="saisie_notes_tableur?evaluation_id=%(evaluation_id)s">
|
||||
Reprendre</a>
|
||||
</p>"""
|
||||
% E
|
||||
)
|
||||
#
|
||||
H.append("""<h3>Autres opérations</h3><ul>""")
|
||||
if can_edit_notes(
|
||||
context, REQUEST.AUTHENTICATED_USER, E["moduleimpl_id"], allow_ens=False
|
||||
):
|
||||
H.append(
|
||||
"""
|
||||
<li>
|
||||
<form action="do_evaluation_set_missing" method="get">
|
||||
Mettre toutes les notes manquantes à <input type="text" size="5" name="value"/>
|
||||
<input type="submit" value="OK"/>
|
||||
<input type="hidden" name="evaluation_id" value="%s"/>
|
||||
<em>ABS indique "absent" (zéro), EXC "excusé" (neutralisées), ATT "attente"</em>
|
||||
</form>
|
||||
</li>
|
||||
<li><a class="stdlink" href="evaluation_suppress_alln?evaluation_id=%s">Effacer toutes les notes de cette évaluation
|
||||
</a> (ceci permet ensuite de supprimer l'évaluation si besoin)
|
||||
</li>"""
|
||||
% (evaluation_id, evaluation_id)
|
||||
) #'
|
||||
H.append(
|
||||
"""<li><a class="stdlink" href="moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s">Revenir au module</a></li>
|
||||
<li><a class="stdlink" href="saisie_notes?evaluation_id=%(evaluation_id)s">Revenir au formulaire de saisie</a></li>
|
||||
</ul>"""
|
||||
% E
|
||||
)
|
||||
H.append(context.sco_footer(REQUEST))
|
||||
return "\n".join(H)
|
||||
|
||||
|
||||
# QUESTION: Beaucoup de code dupliqué de sco-saisie_notes => maintenance trop difficile à terme
|
||||
# => refactoring nécessaire
|
||||
def do_moodle_import(context, REQUEST, notes, comment):
|
||||
"""import moodle"""
|
||||
authuser = REQUEST.AUTHENTICATED_USER
|
||||
evaluation_id = REQUEST.form["evaluation_id"]
|
||||
# comment = "Importée de moodle"#REQUEST.form['comment']
|
||||
E = context.do_evaluation_list({"evaluation_id": evaluation_id})[0]
|
||||
M = context.do_moduleimpl_withmodule_list(moduleimpl_id=E["moduleimpl_id"])[0]
|
||||
# M = context.do_moduleimpl_withmodule_list( args={ 'moduleimpl_id' : E['moduleimpl_id'] } )[0]
|
||||
# Check access
|
||||
# (admin, respformation, and responsable_id)
|
||||
# if not context.can_edit_notes( authuser, E['moduleimpl_id'] ):
|
||||
if not can_edit_notes(context, authuser, E["moduleimpl_id"]):
|
||||
# XXX imaginer un redirect + msg erreur
|
||||
raise AccessDenied("Modification des notes impossible pour %s" % authuser)
|
||||
#
|
||||
diag = []
|
||||
try:
|
||||
# -- check values
|
||||
L, invalids, withoutnotes, absents, tosuppress = _check_notes(
|
||||
notes, E, M["module"]
|
||||
)
|
||||
if len(invalids):
|
||||
diag.append(
|
||||
"Erreur: Moodle fournit %d notes invalides vérifiez que la note maximale est bien la même sur scodoc et sur Moodle</p>"
|
||||
% len(invalids)
|
||||
)
|
||||
if len(invalids) < 25:
|
||||
etudsnames = [
|
||||
context.getEtudInfo(etudid=etudid, filled=True)[0]["nomprenom"]
|
||||
for etudid in invalids
|
||||
]
|
||||
diag.append("Notes invalides pour: " + ", ".join(etudsnames))
|
||||
raise InvalidNoteValue()
|
||||
else:
|
||||
nb_changed, nb_suppress, existing_decisions = _notes_add(
|
||||
context, authuser, evaluation_id, L, comment
|
||||
)
|
||||
# news
|
||||
cnx = context.GetDBConnexion()
|
||||
E = context.do_evaluation_list({"evaluation_id": evaluation_id})[0]
|
||||
M = context.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0]
|
||||
# M = context.do_moduleimpl_list( args={ 'moduleimpl_id':E['moduleimpl_id'] } )[0]
|
||||
mod = context.do_module_list(args={"module_id": M["module_id"]})[0]
|
||||
mod["moduleimpl_id"] = M["moduleimpl_id"]
|
||||
mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod
|
||||
sco_news.add(
|
||||
context,
|
||||
REQUEST,
|
||||
typ=NEWS_NOTE,
|
||||
object=M["moduleimpl_id"],
|
||||
text='Chargement notes dans <a href="%(url)s">%(titre)s</a>' % mod,
|
||||
url=mod["url"],
|
||||
)
|
||||
|
||||
msg = (
|
||||
"<p>%d notes changées (%d sans notes, %d absents, %d note supprimées)</p>"
|
||||
% (nb_changed, len(withoutnotes), len(absents), nb_suppress)
|
||||
)
|
||||
if existing_decisions:
|
||||
msg += """<p class="warning">Important: il y avait déjà des décisions de jury enregistrées, qui sont potentiellement à revoir suite à cette modification !</p>"""
|
||||
# msg += '<p>' + str(notes) # debug
|
||||
return 1, msg
|
||||
|
||||
except InvalidNoteValue:
|
||||
if diag:
|
||||
msg = (
|
||||
'<ul class="tf-msg"><li class="tf_msg">'
|
||||
+ '</li><li class="tf_msg">'.join(diag)
|
||||
+ "</li></ul>"
|
||||
)
|
||||
else:
|
||||
msg = '<ul class="tf-msg"><li class="tf_msg">Une erreur est survenue</li></ul>'
|
||||
return 0, msg + "<p>(pas de notes modifiées)</p>"
|
@ -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&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 += "&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&anneeapogee='+document.getElementById('anneeapogee').value">"""
|
||||
% (sem["formsemestre_id"]),
|
||||
"\n".join(options),
|
||||
"""
|
||||
|
@ -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&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&%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,
|
||||
+ "&dialog_confirmed=1&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&"
|
||||
+ 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&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&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 + "&head_message=photos%20 importees")
|
||||
|
||||
|
||||
def zip_excel_import_files(
|
||||
|
@ -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&etudid=%s" % (
|
||||
formsemestre_id,
|
||||
etudid,
|
||||
)
|
||||
|
@ -1,205 +0,0 @@
|
||||
<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 d’exploitation - 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 à l’algorithmique 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 d’interfaces 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 d’exploitation - 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 d’un système informatique" semestre_id="2" heures_td="10.0" />
|
||||
</matiere>
|
||||
<matiere titre="Architecture matérielle - Systèmes d’exploitation - 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 d’applications" 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 d’applications" 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 d’exploitation - 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 d’exploitation" semestre_id="3" heures_td="14.0" />
|
||||
</matiere>
|
||||
<matiere titre="Architectures matérielles - Systèmes d’exploitation, 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 d’applications" 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 d’exploitation - 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 d’exploitation – Réseaux Analyse, conception et développement d’applications" 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 d’applications mobiles" semestre_id="4" heures_td="10.0" />
|
||||
</matiere>
|
||||
<matiere titre="Analyse, conception et développement d’applications" 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 d’informatique en vue d’une 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 d’applications" 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 l’information 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 d’information" 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 d’applications É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 d’applications" 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 d’entreprise" 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>
|
File diff suppressed because it is too large
Load Diff
@ -1,59 +0,0 @@
|
||||
# -*- 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... """
|
@ -1,108 +0,0 @@
|
||||
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.
|
||||
"""
|
@ -1,117 +0,0 @@
|
||||
""" 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
|
||||
|
||||
"""
|
@ -1,266 +0,0 @@
|
||||
""" 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)
|
||||
|
||||
"""
|
@ -1,267 +0,0 @@
|
||||
# -*- 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?)
|
||||
|
||||
"""
|
||||
|
||||
|
@ -1,261 +0,0 @@
|
||||
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.
|
||||
|
||||
|
||||
|
@ -1,96 +0,0 @@
|
||||
# -*- 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)
|
||||
|
||||
"""
|
@ -1,47 +0,0 @@
|
||||
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"])
|
@ -1,69 +0,0 @@
|
||||
# -*- 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
|
@ -1,135 +0,0 @@
|
||||
""" Création de 2 étudiants, un qui demissionne, un autre defaillant + annuler demission et annuler défaillance
|
||||
|
||||
Fonctions de l’API 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.
|
||||
|
||||
"""
|
@ -1,257 +0,0 @@
|
||||
""" 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.
|
||||
|
||||
"""
|
@ -1,75 +0,0 @@
|
||||
""" 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
|
||||
"""
|
@ -1,79 +0,0 @@
|
||||
import sco_formations
|
||||
import random
|
||||
# La variable context est définie par le script de lancement
|
||||
# l'affecte ainsi pour évietr les warnins pylint:
|
||||
context = context # pylint: disable=undefined-variable
|
||||
REQUEST = REQUEST # pylint: disable=undefined-variable
|
||||
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
||||
import sco_moduleimpl
|
||||
|
||||
G = sco_fake_gen.ScoFake(context.Notes)
|
||||
G.verbose = False
|
||||
|
||||
file = open("scotests/export_formation1.xml")
|
||||
doc = file.read()
|
||||
file.close()
|
||||
|
||||
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:])
|
@ -1,319 +0,0 @@
|
||||
""" 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
|
@ -1,395 +0,0 @@
|
||||
""" 1) Création de 20 étudiants, création d’une 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 l’API 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.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,117 +0,0 @@
|
||||
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))
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
@ -1,72 +0,0 @@
|
||||
import sco_formations
|
||||
import random
|
||||
# La variable context est définie par le script de lancement
|
||||
# l'affecte ainsi pour évietr les warnins pylint:
|
||||
context = context # pylint: disable=undefined-variable
|
||||
REQUEST = REQUEST # pylint: disable=undefined-variable
|
||||
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
||||
import sco_moduleimpl
|
||||
|
||||
G = sco_fake_gen.ScoFake(context.Notes)
|
||||
G.verbose = False
|
||||
|
||||
file = open("scotests/export_formation1.xml")
|
||||
doc = file.read()
|
||||
file.close()
|
||||
|
||||
|
||||
# --- Création de la formation
|
||||
|
||||
f = sco_formations.formation_import_xml(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)
|
@ -1,105 +0,0 @@
|
||||
import sco_formations
|
||||
import random
|
||||
# La variable context est définie par le script de lancement
|
||||
# l'affecte ainsi pour évietr les warnins pylint:
|
||||
context = context # pylint: disable=undefined-variable
|
||||
REQUEST = REQUEST # pylint: disable=undefined-variable
|
||||
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
||||
import sco_moduleimpl
|
||||
|
||||
G = sco_fake_gen.ScoFake(context.Notes)
|
||||
G.verbose = False
|
||||
|
||||
file = open("scotests/export_formation1.xml")
|
||||
doc = file.read()
|
||||
file.close()
|
||||
|
||||
|
||||
# --- Création de la formation
|
||||
|
||||
f = sco_formations.formation_import_xml(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)
|
@ -1,135 +0,0 @@
|
||||
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 [
|
||||
("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)
|
@ -1,173 +0,0 @@
|
||||
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 [
|
||||
("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)
|
@ -1,64 +0,0 @@
|
||||
""" 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.
|
||||
|
||||
"""
|
File diff suppressed because it is too large
Load Diff
25
static/mobile/asset-manifest.json
Normal file
25
static/mobile/asset-manifest.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"files": {
|
||||
"main.css": "./static/css/main.6be5a531.chunk.css",
|
||||
"main.js": "./static/js/main.9d1150c9.chunk.js",
|
||||
"main.js.map": "./static/js/main.9d1150c9.chunk.js.map",
|
||||
"runtime-main.js": "./static/js/runtime-main.b827b16d.js",
|
||||
"runtime-main.js.map": "./static/js/runtime-main.b827b16d.js.map",
|
||||
"static/css/2.4c97ca4f.chunk.css": "./static/css/2.4c97ca4f.chunk.css",
|
||||
"static/js/2.68967b49.chunk.js": "./static/js/2.68967b49.chunk.js",
|
||||
"static/js/2.68967b49.chunk.js.map": "./static/js/2.68967b49.chunk.js.map",
|
||||
"static/js/3.d2558866.chunk.js": "./static/js/3.d2558866.chunk.js",
|
||||
"static/js/3.d2558866.chunk.js.map": "./static/js/3.d2558866.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.68967b49.chunk.js.LICENSE.txt": "./static/js/2.68967b49.chunk.js.LICENSE.txt"
|
||||
},
|
||||
"entrypoints": [
|
||||
"static/js/runtime-main.b827b16d.js",
|
||||
"static/css/2.4c97ca4f.chunk.css",
|
||||
"static/js/2.68967b49.chunk.js",
|
||||
"static/css/main.6be5a531.chunk.css",
|
||||
"static/js/main.9d1150c9.chunk.js"
|
||||
]
|
||||
}
|
BIN
static/mobile/favicon.ico
Normal file
BIN
static/mobile/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
1
static/mobile/index.html
Normal file
1
static/mobile/index.html
Normal file
@ -0,0 +1 @@
|
||||
<!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:"d2558866"}[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.68967b49.chunk.js"></script><script src="./static/js/main.9d1150c9.chunk.js"></script></body></html>
|
20
static/mobile/manifest.json
Normal file
20
static/mobile/manifest.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"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"
|
||||
}
|
3
static/mobile/robots.txt
Normal file
3
static/mobile/robots.txt
Normal file
@ -0,0 +1,3 @@
|
||||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
BIN
static/mobile/scologo.png
Normal file
BIN
static/mobile/scologo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
7
static/mobile/static/css/2.4c97ca4f.chunk.css
Normal file
7
static/mobile/static/css/2.4c97ca4f.chunk.css
Normal file
File diff suppressed because one or more lines are too long
1
static/mobile/static/css/2.4c97ca4f.chunk.css.map
Normal file
1
static/mobile/static/css/2.4c97ca4f.chunk.css.map
Normal file
File diff suppressed because one or more lines are too long
2
static/mobile/static/css/main.6be5a531.chunk.css
Normal file
2
static/mobile/static/css/main.6be5a531.chunk.css
Normal file
@ -0,0 +1,2 @@
|
||||
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 */
|
1
static/mobile/static/css/main.6be5a531.chunk.css.map
Normal file
1
static/mobile/static/css/main.6be5a531.chunk.css.map
Normal file
File diff suppressed because one or more lines are too long
3
static/mobile/static/js/2.68967b49.chunk.js
Normal file
3
static/mobile/static/js/2.68967b49.chunk.js
Normal file
File diff suppressed because one or more lines are too long
65
static/mobile/static/js/2.68967b49.chunk.js.LICENSE.txt
Normal file
65
static/mobile/static/js/2.68967b49.chunk.js.LICENSE.txt
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
1
static/mobile/static/js/2.68967b49.chunk.js.map
Normal file
1
static/mobile/static/js/2.68967b49.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
static/mobile/static/js/3.d2558866.chunk.js
Normal file
2
static/mobile/static/js/3.d2558866.chunk.js
Normal file
@ -0,0 +1,2 @@
|
||||
(this.webpackJsonpscodocmobile=this.webpackJsonpscodocmobile||[]).push([[3],{116: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.d2558866.chunk.js.map
|
1
static/mobile/static/js/3.d2558866.chunk.js.map
Normal file
1
static/mobile/static/js/3.d2558866.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
static/mobile/static/js/main.9d1150c9.chunk.js
Normal file
2
static/mobile/static/js/main.9d1150c9.chunk.js
Normal file
File diff suppressed because one or more lines are too long
1
static/mobile/static/js/main.9d1150c9.chunk.js.map
Normal file
1
static/mobile/static/js/main.9d1150c9.chunk.js.map
Normal file
File diff suppressed because one or more lines are too long
2
static/mobile/static/js/runtime-main.b827b16d.js
Normal file
2
static/mobile/static/js/runtime-main.b827b16d.js
Normal file
@ -0,0 +1,2 @@
|
||||
!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:"d2558866"}[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.b827b16d.js.map
|
1
static/mobile/static/js/runtime-main.b827b16d.js.map
Normal file
1
static/mobile/static/js/runtime-main.b827b16d.js.map
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user