1
0
forked from ScoDoc/ScoDoc

update from master

This commit is contained in:
Emmanuel Viennet 2021-05-29 10:57:56 +02:00
commit 078e0e85e0
65 changed files with 411 additions and 272 deletions

View File

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

View File

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

View File

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

View File

@ -514,6 +514,11 @@ class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp
% REQUEST.BASE0 % 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( H.append(
""" """
<div id="scodoc_attribution"> <div id="scodoc_attribution">

View File

@ -523,7 +523,7 @@ class ZScoUsers(
if authuser.has_permission(ScoUsersAdmin, self): if authuser.has_permission(ScoUsersAdmin, self):
H.append( H.append(
""" """
<li><a class="stdlink" href="create_user_form?user_name=%(user_name)s&amp;edit=1">modifier/déactiver ce compte</a></li> <li><a class="stdlink" href="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> <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] % info[0]

View File

@ -279,7 +279,7 @@ class ZScolar(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!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"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title>Programme DUT R&amp;T</title> <title>Programme DUT TEST</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="LANG" content="fr" /> <meta name="LANG" content="fr" />
@ -679,7 +679,7 @@ REQUEST.URL0=%s<br/>
date = date.next() date = date.next()
FA.append("</select>") FA.append("</select>")
FA.append( FA.append(
'<a href="Absences/EtatAbsencesGr?group_ids=%%(group_id)s&amp;debut=%(date_debut)s&amp;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 % sem
) )
FA.append("</form></td>") FA.append("</form></td>")
@ -715,8 +715,8 @@ REQUEST.URL0=%s<br/>
"""<td> """<td>
<a href="%(url)s/groups_view?group_ids=%(group_id)s">%(label)s</a> <a href="%(url)s/groups_view?group_ids=%(group_id)s">%(label)s</a>
</td><td> </td><td>
(<a href="%(url)s/groups_view?group_ids=%(group_id)s&amp;format=xls">format tableur</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&amp;group_ids=%(group_id)s&amp;etat=I">Photos</a> <a href="%(url)s/groups_view?curtab=tab-photos&group_ids=%(group_id)s&etat=I">Photos</a>
</td>""" </td>"""
% group % group
) )
@ -780,7 +780,7 @@ REQUEST.URL0=%s<br/>
# -------------------------- INFOS SUR ETUDIANTS -------------------------- # -------------------------- INFOS SUR ETUDIANTS --------------------------
security.declareProtected(ScoView, "getEtudInfo") security.declareProtected(ScoView, "getEtudInfo")
def getEtudInfo(self, etudid=False, code_nip=False, filled=False, REQUEST=None): def getEtudInfo(self, etudid=False, code_nip=False, filled=False, REQUEST=None, format=None):
"""infos sur un etudiant pour utilisation en Zope DTML """infos sur un etudiant pour utilisation en Zope DTML
On peut specifier etudid On peut specifier etudid
ou bien cherche dans REQUEST.form: etudid, code_nip, code_ine ou bien cherche dans REQUEST.form: etudid, code_nip, code_ine
@ -791,9 +791,13 @@ REQUEST.URL0=%s<br/>
cnx = self.GetDBConnexion() cnx = self.GetDBConnexion()
args = make_etud_args(etudid=etudid, code_nip=code_nip, REQUEST=REQUEST) args = make_etud_args(etudid=etudid, code_nip=code_nip, REQUEST=REQUEST)
etud = scolars.etudident_list(cnx, args=args) etud = scolars.etudident_list(cnx, args=args)
if filled: if filled:
self.fillEtudsInfo(etud) self.fillEtudsInfo(etud)
return etud if format is None:
return etud
else:
return scu.sendResult(REQUEST, etud, name="etud", format=format)
security.declareProtected(ScoView, "search_etud_in_dept") security.declareProtected(ScoView, "search_etud_in_dept")
search_etud_in_dept = sco_find_etud.search_etud_in_dept search_etud_in_dept = sco_find_etud.search_etud_in_dept
@ -1170,7 +1174,7 @@ REQUEST.URL0=%s<br/>
scolars.etud_annotations_delete(cnx, annotation_id) scolars.etud_annotations_delete(cnx, annotation_id)
return REQUEST.RESPONSE.redirect( return REQUEST.RESPONSE.redirect(
"ficheEtud?etudid=%s&amp;head_message=Annotation%%20supprimée" % (etudid) "ficheEtud?etudid=%s&head_message=Annotation%%20supprimée" % (etudid)
) )
security.declareProtected(ScoEtudChangeAdr, "formChangeCoordonnees") security.declareProtected(ScoEtudChangeAdr, "formChangeCoordonnees")
@ -2772,7 +2776,7 @@ def _simple_error_page(context, msg, DeptId=None):
H = [context.standard_html_header(context), "<h2>Erreur !</h2>", "<p>", msg, "</p>"] H = [context.standard_html_header(context), "<h2>Erreur !</h2>", "<p>", msg, "</p>"]
if DeptId: if DeptId:
H.append( H.append(
'<p><a href="delete_dept?DeptId=%s&amp;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) % (DeptId, DeptId)
) )
H.append(context.standard_html_footer(context)) H.append(context.standard_html_footer(context))

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -76,8 +76,9 @@ def doSignaleAbsence(
description_abs = description description_abs = description
dates = sco_abs.DateRangeISO(context, datedebut, datefin) dates = sco_abs.DateRangeISO(context, datedebut, datefin)
nbadded = 0 nbadded = 0
demijournee = int(demijournee)
for jour in dates: for jour in dates:
if demijournee == "2": if demijournee == 2:
context._AddAbsence( context._AddAbsence(
etudid, jour, False, estjust, REQUEST, description_abs, moduleimpl_id etudid, jour, False, estjust, REQUEST, description_abs, moduleimpl_id
) )
@ -86,9 +87,8 @@ def doSignaleAbsence(
) )
nbadded += 2 nbadded += 2
else: else:
matin = int(demijournee)
context._AddAbsence( context._AddAbsence(
etudid, jour, matin, estjust, REQUEST, description_abs, moduleimpl_id etudid, jour, demijournee, estjust, REQUEST, description_abs, moduleimpl_id
) )
nbadded += 1 nbadded += 1
# #
@ -281,8 +281,9 @@ def doJustifAbsence(
description_abs = description description_abs = description
dates = sco_abs.DateRangeISO(context, datedebut, datefin) dates = sco_abs.DateRangeISO(context, datedebut, datefin)
nbadded = 0 nbadded = 0
demijournee = int(demijournee)
for jour in dates: for jour in dates:
if demijournee == "2": if demijournee == 2:
context._AddJustif( context._AddJustif(
etudid=etudid, etudid=etudid,
jour=jour, jour=jour,
@ -299,11 +300,10 @@ def doJustifAbsence(
) )
nbadded += 2 nbadded += 2
else: else:
matin = int(demijournee)
context._AddJustif( context._AddJustif(
etudid=etudid, etudid=etudid,
jour=jour, jour=jour,
matin=matin, matin=demijournee,
REQUEST=REQUEST, REQUEST=REQUEST,
description=description_abs, description=description_abs,
) )
@ -404,14 +404,14 @@ def doAnnuleAbsence(
dates = sco_abs.DateRangeISO(context, datedebut, datefin) dates = sco_abs.DateRangeISO(context, datedebut, datefin)
nbadded = 0 nbadded = 0
demijournee = int(demijournee)
for jour in dates: for jour in dates:
if demijournee == "2": if demijournee == 2:
context._AnnuleAbsence(etudid, jour, False, REQUEST=REQUEST) context._AnnuleAbsence(etudid, jour, False, REQUEST=REQUEST)
context._AnnuleAbsence(etudid, jour, True, REQUEST=REQUEST) context._AnnuleAbsence(etudid, jour, True, REQUEST=REQUEST)
nbadded += 2 nbadded += 2
else: else:
matin = int(demijournee) context._AnnuleAbsence(etudid, jour, demijournee, REQUEST=REQUEST)
context._AnnuleAbsence(etudid, jour, matin, REQUEST=REQUEST)
nbadded += 1 nbadded += 1
# #
H = [ H = [
@ -539,15 +539,15 @@ def doAnnuleJustif(
etudid = etud["etudid"] etudid = etud["etudid"]
dates = sco_abs.DateRangeISO(context, datedebut0, datefin0) dates = sco_abs.DateRangeISO(context, datedebut0, datefin0)
nbadded = 0 nbadded = 0
demijournee = int(demijournee)
for jour in dates: for jour in dates:
# Attention: supprime matin et après-midi # Attention: supprime matin et après-midi
if demijournee == "2": if demijournee == 2:
context._AnnuleJustif(etudid, jour, False, REQUEST=REQUEST) context._AnnuleJustif(etudid, jour, False, REQUEST=REQUEST)
context._AnnuleJustif(etudid, jour, True, REQUEST=REQUEST) context._AnnuleJustif(etudid, jour, True, REQUEST=REQUEST)
nbadded += 2 nbadded += 2
else: else:
matin = int(demijournee) context._AnnuleJustif(etudid, jour, demijournee, REQUEST=REQUEST)
context._AnnuleJustif(etudid, jour, matin, REQUEST=REQUEST)
nbadded += 1 nbadded += 1
# #
H = [ H = [
@ -720,7 +720,7 @@ def ListeAbsEtud(
): ):
"""Liste des absences d'un étudiant sur l'année en cours """Liste des absences d'un étudiant sur l'année en cours
En format 'html': page avec deux tableaux (non justifiées et justifiées). En format 'html': page avec deux tableaux (non justifiées et justifiées).
En format xls ou pdf: l'un ou l'autre des table, suivant absjust_only. En format json, xml, xls ou pdf: l'un ou l'autre des table, suivant absjust_only.
En format 'text': texte avec liste d'absences (pour mails). En format 'text': texte avec liste d'absences (pour mails).
""" """
absjust_only = int(absjust_only) # si vrai, table absjust seule (export xls ou pdf) absjust_only = int(absjust_only) # si vrai, table absjust seule (export xls ou pdf)
@ -732,10 +732,9 @@ def ListeAbsEtud(
titles, columns_ids, absnonjust, absjust = context.Absences._TablesAbsEtud( titles, columns_ids, absnonjust, absjust = context.Absences._TablesAbsEtud(
etudid, datedebut, with_evals=with_evals, format=format etudid, datedebut, with_evals=with_evals, format=format
) )
if REQUEST: if REQUEST:
base_url_nj = "%s?etudid=%s&amp;absjust_only=0" % (REQUEST.URL0, etudid) base_url_nj = "%s?etudid=%s&absjust_only=0" % (REQUEST.URL0, etudid)
base_url_j = "%s?etudid=%s&amp;absjust_only=1" % (REQUEST.URL0, etudid) base_url_j = "%s?etudid=%s&absjust_only=1" % (REQUEST.URL0, etudid)
else: else:
base_url_nj = base_url_j = "" base_url_nj = base_url_j = ""
tab_absnonjust = GenTable( tab_absnonjust = GenTable(

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -343,7 +343,7 @@ class DisplayedGroupsInfos:
gq = [] gq = []
for group_id in group_ids: for group_id in group_ids:
gq.append("group_ids=" + group_id) gq.append("group_ids=" + group_id)
self.groups_query_args = "&amp;".join(gq) self.groups_query_args = "&".join(gq)
self.base_url = REQUEST.URL0 + "?" + self.groups_query_args self.base_url = REQUEST.URL0 + "?" + self.groups_query_args
self.group_ids = group_ids self.group_ids = group_ids
self.groups = [] self.groups = []
@ -457,10 +457,10 @@ def groups_table(
with_archives = int(with_archives) with_archives = int(with_archives)
with_annotations = int(with_annotations) with_annotations = int(with_annotations)
base_url_np = groups_infos.base_url + "&amp;with_codes=%s" % with_codes base_url_np = groups_infos.base_url + "&with_codes=%s" % with_codes
base_url = ( base_url = (
base_url_np base_url_np
+ "&amp;with_paiement=%s&amp;with_archives=%s&amp;with_annotations=%s" + "&with_paiement=%s&with_archives=%s&with_annotations=%s"
% (with_paiement, with_archives, with_annotations) % (with_paiement, with_archives, with_annotations)
) )
# #
@ -668,11 +668,11 @@ def groups_table(
[ [
tab.html(), tab.html(),
"<ul>", "<ul>",
'<li><a class="stdlink" href="%s&amp;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,), % (tab.base_url,),
'<li><a class="stdlink" href="%s&amp;format=xls">Table Excel</a></li>' '<li><a class="stdlink" href="%s&format=xls">Table Excel</a></li>'
% (tab.base_url,), % (tab.base_url,),
'<li><a class="stdlink" href="%s&amp;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,), % (tab.base_url,),
"""<li> """<li>
<a class="stdlink" href="export_groups_as_moodle_csv?formsemestre_id=%s">Fichier CSV pour Moodle (tous les groupes)</a> <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>", "<li>",
form_choix_jour_saisie_hebdo(context, groups_infos, REQUEST=REQUEST), form_choix_jour_saisie_hebdo(context, groups_infos, REQUEST=REQUEST),
"</li>", "</li>",
"""<li><a class="stdlink" href="Absences/EtatAbsencesGr?%s&amp;debut=%s&amp;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.groups_query_args,
groups_infos.formsemestre["date_debut"], groups_infos.formsemestre["date_debut"],
@ -833,15 +833,15 @@ def tab_absences_html(context, groups_infos, etat=None, REQUEST=None):
"</ul>", "</ul>",
"<h3>Feuilles</h3>", "<h3>Feuilles</h3>",
'<ul class="ul_feuilles">', '<ul class="ul_feuilles">',
"""<li><a class="stdlink" href="%s&amp;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), % (groups_infos.base_url, groups_infos.groups_titles),
"""<li><a class="stdlink" href="trombino?%s&amp;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, % groups_infos.groups_query_args,
"""<li><a class="stdlink" href="pdf_trombino_tours?%s&amp;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, % groups_infos.groups_query_args,
"""<li><a class="stdlink" href="pdf_feuille_releve_absences?%s&amp;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, % groups_infos.groups_query_args,
"""<li><a class="stdlink" href="trombino?%s&amp;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, % groups_infos.groups_query_args,
"</ul>", "</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) group_id = sco_groups.get_default_group(context, groups_infos.formsemestre_id)
if authuser.has_permission(ScoEtudInscrit, context): if authuser.has_permission(ScoEtudInscrit, context):
H.append( H.append(
'<li><a class="stdlink" href="check_group_apogee?group_id=%s&amp;etat=%s">Vérifier codes Apogée</a> (de tous les groupes)</li>' '<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 "") % (group_id, etat or "")
) )
# Lien pour ajout fichiers étudiants # Lien pour ajout fichiers étudiants

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -867,7 +867,7 @@ def formsemestre_lettres_individuelles(
PDFLOCK.release() PDFLOCK.release()
if not pdfdoc: if not pdfdoc:
return REQUEST.RESPONSE.redirect( return REQUEST.RESPONSE.redirect(
"formsemestre_status?formsemestre_id={}&amp;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 formsemestre_id
) )
) )

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,25 @@
{
"files": {
"main.css": "./static/css/main.6be5a531.chunk.css",
"main.js": "./static/js/main.1a008285.chunk.js",
"main.js.map": "./static/js/main.1a008285.chunk.js.map",
"runtime-main.js": "./static/js/runtime-main.f39ba660.js",
"runtime-main.js.map": "./static/js/runtime-main.f39ba660.js.map",
"static/css/2.4c97ca4f.chunk.css": "./static/css/2.4c97ca4f.chunk.css",
"static/js/2.fb06b1f5.chunk.js": "./static/js/2.fb06b1f5.chunk.js",
"static/js/2.fb06b1f5.chunk.js.map": "./static/js/2.fb06b1f5.chunk.js.map",
"static/js/3.b810fcea.chunk.js": "./static/js/3.b810fcea.chunk.js",
"static/js/3.b810fcea.chunk.js.map": "./static/js/3.b810fcea.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.fb06b1f5.chunk.js.LICENSE.txt": "./static/js/2.fb06b1f5.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.f39ba660.js",
"static/css/2.4c97ca4f.chunk.css",
"static/js/2.fb06b1f5.chunk.js",
"static/css/main.6be5a531.chunk.css",
"static/js/main.1a008285.chunk.js"
]
}

BIN
static/mobile/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

1
static/mobile/index.html Normal file
View File

@ -0,0 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Scodoc Mobile"/><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"><link rel="apple-touch-icon" href="./scologo.png"/><link rel="manifest" href="./manifest.json"/><title>Scodoc Mobile</title><link href="./static/css/2.4c97ca4f.chunk.css" rel="stylesheet"><link href="./static/css/main.6be5a531.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,i,a=r[0],c=r[1],l=r[2],s=0,p=[];s<a.length;s++)i=a[s],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&p.push(o[i][0]),o[i]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var c=t[a];0!==o[c]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var u,a=document.createElement("script");a.charset="utf-8",a.timeout=120,i.nc&&a.setAttribute("nonce",i.nc),a.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"b810fcea"}[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.fb06b1f5.chunk.js"></script><script src="./static/js/main.1a008285.chunk.js"></script></body></html>

View File

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

3
static/mobile/robots.txt Normal file
View File

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

BIN
static/mobile/scologo.png Normal file

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

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(this.webpackJsonpscodocmobile=this.webpackJsonpscodocmobile||[]).push([[3],{117: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.b810fcea.chunk.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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:"b810fcea"}[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.f39ba660.js.map

File diff suppressed because one or more lines are too long