forked from ScoDoc/ScoDoc
Compare commits
5 Commits
master
...
moodle-not
Author | SHA1 | Date |
---|---|---|
Emmanuel Viennet | 06d83cc691 | |
Emmanuel Viennet | e943e7f283 | |
Emmanuel Viennet | be30cf66fa | |
Emmanuel Viennet | 2c5e59120c | |
Emmanuel Viennet | 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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
|
|
@ -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"
|
||||
]
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
|
@ -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>
|
|
@ -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"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Disallow:
|
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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 */
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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.
|
||||
*/
|
File diff suppressed because one or more lines are too long
|
@ -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
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue