diff --git a/VERSION.py b/VERSION.py index 0a182ca31..67d94d7ba 100644 --- a/VERSION.py +++ b/VERSION.py @@ -1,13 +1,14 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "8.00a" +SCOVERSION = "8.01a" SCONAME = "ScoDoc" SCONEWS = """
Module concerné par ces absences (%(optionel_txt)s): @@ -1327,7 +1327,7 @@ class ZAbsences( for a in absnonjust: a["justlink"] = "justifier" a["_justlink_target"] = ( - "doJustifAbsence?etudid=%s&datedebut=%s&datefin=%s&demijournee=%s" + "doJustifAbsence?etudid=%s&datedebut=%s&datefin=%s&demijournee=%s" % (etudid, a["datedmy"], a["datedmy"], a["ampm"]) ) # @@ -1463,7 +1463,7 @@ class ZAbsences( ) + "
Période du %s au %s (nombre de demi-journées)
"
% (debut, fin),
- base_url="%s&formsemestre_id=%s&debut=%s&fin=%s"
+ base_url="%s&formsemestre_id=%s&debut=%s&fin=%s"
% (groups_infos.base_url, formsemestre_id, debut, fin),
filename="etat_abs_"
+ scu.make_filename(
@@ -1700,7 +1700,7 @@ ou entrez une date pour visualiser les absents un jour donné :
"ProcessBilletAbsenceForm?billet_id=%s" % b["billet_id"]
)
if etud:
- b["_etat_str_target"] += "&etudid=%s" % etud["etudid"]
+ b["_etat_str_target"] += "&etudid=%s" % etud["etudid"]
b["_billet_id_target"] = b["_etat_str_target"]
else:
b["etat_str"] = "ok"
diff --git a/ZNotes.py b/ZNotes.py
index b3068e834..9cc2e6dd1 100644
--- a/ZNotes.py
+++ b/ZNotes.py
@@ -563,7 +563,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
)
if redirect:
return REQUEST.RESPONSE.redirect(
- "ue_list?formation_id=" + new_id + "&msg=Nouvelle version !"
+ "ue_list?formation_id=" + new_id + "&msg=Nouvelle version !"
)
else:
return new_id, modules_old2new, ues_old2new
@@ -1251,7 +1251,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl
]
for ens in M["ens"]:
H.append(
- '
Pour changer le responsable du module, passez par la - page "Modification du semestre", accessible uniquement au responsable de la formation (chef de département) + page "Modification du semestre", accessible uniquement au responsable de la formation (chef de département)
""" % ( sem["formation_id"], @@ -1410,7 +1410,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl return REQUEST.RESPONSE.redirect( "moduleimpl_status?moduleimpl_id=" + moduleimpl_id - + "&head_message=responsable%20modifié" + + "&head_message=responsable%20modifié" ) _expr_help = """Expérimental: formule de calcul de la moyenne %(target)s
@@ -1498,7 +1498,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl return REQUEST.RESPONSE.redirect( "moduleimpl_status?moduleimpl_id=" + moduleimpl_id - + "&head_message=règle%20de%20calcul%20modifiée" + + "&head_message=règle%20de%20calcul%20modifiée" ) security.declareProtected(ScoView, "view_module_abs") @@ -1639,7 +1639,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl return REQUEST.RESPONSE.redirect( "formsemestre_status?formsemestre_id=" + formsemestre_id - + "&head_message=règle%20de%20calcul%20modifiée" + + "&head_message=règle%20de%20calcul%20modifiée" ) security.declareProtected(ScoView, "formsemestre_enseignants_list") @@ -1869,7 +1869,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl raise ScoValueError( """Désinscription impossible: l'étudiant a une décision de jury (la supprimer avant si nécessaire: - + supprimer décision jury ) """ @@ -2691,7 +2691,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl if not can_edit_app: raise AccessDenied("vous n'avez pas le droit d'ajouter une appreciation") # - bull_url = "formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" % ( + bull_url = "formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s" % ( formsemestre_id, etudid, ) @@ -3035,7 +3035,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl OK="Supprimer", dest_url="", REQUEST=REQUEST, - cancel_url="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s" + cancel_url="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s" % (formsemestre_id, etudid), parameters={"etudid": etudid, "formsemestre_id": formsemestre_id}, ) @@ -3045,7 +3045,7 @@ class ZNotes(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Impl ) return REQUEST.RESPONSE.redirect( self.ScoURL() - + "/Notes/formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&head_message=Décision%%20supprimée" + + "/Notes/formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&head_message=Décision%%20supprimée" % (formsemestre_id, etudid) ) diff --git a/ZScoDoc.py b/ZScoDoc.py index e25ec0a14..ad0d64340 100644 --- a/ZScoDoc.py +++ b/ZScoDoc.py @@ -514,6 +514,11 @@ class ZScoDoc(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp % REQUEST.BASE0 ) + # Lien expérimental temporaire: + H.append( + 'Version mobile (expérimentale, à vos risques et périls)
' + ) + H.append( """", msg, "
"] if DeptId: H.append( - 'Supprimer le dossier %s(très recommandé !)
' + 'Supprimer le dossier %s(très recommandé !)
' % (DeptId, DeptId) ) H.append(context.standard_html_footer(context)) diff --git a/bonus_sport.py b/bonus_sport.py index 3a4222e69..80cf7a71c 100644 --- a/bonus_sport.py +++ b/bonus_sport.py @@ -45,9 +45,16 @@ def bonus_iutv(notes_sport, coefs, infos=None): return bonus -def bonus_iut_stdenis(notes_sport, coefs, infos=None): - """Semblable à bonus_iutv mais sans coefficients et total limité à 0.5 points. +def bonus_direct(notes_sport, coefs, infos=None): + """Un bonus direct et sans chichis: les points sont directement ajoutés à la moyenne générale. + Les coefficients sont ignorés: tous les points de bonus sont sommés. + (rappel: la note est ramenée sur 20 avant application). """ + return sum(notes_sport) + + +def bonus_iut_stdenis(notes_sport, coefs, infos=None): + """Semblable à bonus_iutv mais sans coefficients et total limité à 0.5 points.""" points = sum([x - 10 for x in notes_sport if x > 10]) # points au dessus de 10 bonus = points * 0.05 # ou / 20 return min(bonus, 0.5) # bonus limité à 1/2 point @@ -62,7 +69,7 @@ def bonus_colmar(notes_sport, coefs, infos=None): sur 20 obtenus dans chacune des matières optionnelles sont cumulés dans la limite de 10 points. 5% de ces points cumulés s'ajoutent à la moyenne générale du semestre déjà obtenue par l'étudiant. - + """ # les coefs sont ignorés points = sum([x - 10 for x in notes_sport if x > 10]) @@ -73,7 +80,7 @@ def bonus_colmar(notes_sport, coefs, infos=None): def bonus_iutva(notes_sport, coefs, infos=None): """Calcul bonus modules optionels (sport, culture), règle IUT Ville d'Avray - + Les étudiants de l'IUT peuvent suivre des enseignements optionnels de l'Université Paris 10 (C2I) non rattachés à une unité d'enseignement. Si la note est >= 10 et < 12, bonus de 0.1 point @@ -93,42 +100,13 @@ def bonus_iutva(notes_sport, coefs, infos=None): return 0 -# XXX Inutilisé (mai 2020) ? à confirmer avant suppression XXX -# def bonus_iut1grenoble_v0(notes_sport, coefs, infos=None): -# """Calcul bonus sport IUT Grenoble sur la moyenne générale -# -# La note de sport de nos étudiants va de 0 à 5 points. -# Chaque point correspond à un % qui augmente la moyenne de chaque UE et la moyenne générale. -# Par exemple : note de sport 2/5 : chaque UE sera augmentée de 2%, ainsi que la moyenne générale. -# -# Calcul ici du bonus sur moyenne générale et moyennes d'UE non capitalisées. -# """ -# # les coefs sont ignorés -# # notes de 0 à 5 -# points = sum([x for x in notes_sport]) -# factor = (points / 4.0) / 100.0 -# bonus = infos["moy"] * factor -# # Modifie les moyennes de toutes les UE: -# for ue_id in infos["moy_ues"]: -# ue_status = infos["moy_ues"][ue_id] -# if ue_status["sum_coefs"] > 0: -# # modifie moyenne UE ds semestre courant -# ue_status["cur_moy_ue"] = ue_status["cur_moy_ue"] * (1.0 + factor) -# if not ue_status["is_capitalized"]: -# # si non capitalisee, modifie moyenne prise en compte -# ue_status["moy"] = ue_status["cur_moy_ue"] -# -# # open('/tmp/log','a').write( pprint.pformat(ue_status) + '\n\n' ) -# return bonus - - def bonus_iut1grenoble_2017(notes_sport, coefs, infos=None): """Calcul bonus sport IUT Grenoble sur la moyenne générale (version 2017) - - La note de sport de nos étudiants va de 0 à 5 points. + + La note de sport de nos étudiants va de 0 à 5 points. Chaque point correspond à un % qui augmente la moyenne de chaque UE et la moyenne générale. Par exemple : note de sport 2/5 : la moyenne générale sera augmentée de 2%. - + Calcul ici du bonus sur moyenne générale """ # les coefs sont ignorés @@ -162,14 +140,14 @@ def bonus_lille(notes_sport, coefs, infos=None): def bonus_iutlh(notes_sport, coefs, infos=None): """Calcul bonus sport IUT du Havre sur moyenne générale et UE - La note de sport de nos étudiants va de 0 à 20 points. - m2=m1*(1+0.005*((10-N1)+(10-N2)) - m2 : Nouvelle moyenne de l'unité d'enseignement si note de sport et/ou de langue supérieure à 10 - m1 : moyenne de l'unité d'enseignement avant bonification - N1 : note de sport si supérieure à 10 - N2 : note de seconde langue si supérieure à 10 - Par exemple : sport 15/20 et langue 12/20 : chaque UE sera multipliée par 1+0.005*7, ainsi que la moyenne générale. - Calcul ici de la moyenne générale et moyennes d'UE non capitalisées. + La note de sport de nos étudiants va de 0 à 20 points. + m2=m1*(1+0.005*((10-N1)+(10-N2)) + m2 : Nouvelle moyenne de l'unité d'enseignement si note de sport et/ou de langue supérieure à 10 + m1 : moyenne de l'unité d'enseignement avant bonification + N1 : note de sport si supérieure à 10 + N2 : note de seconde langue si supérieure à 10 + Par exemple : sport 15/20 et langue 12/20 : chaque UE sera multipliée par 1+0.005*7, ainsi que la moyenne générale. + Calcul ici de la moyenne générale et moyennes d'UE non capitalisées. """ # les coefs sont ignorés points = sum([x - 10 for x in notes_sport if x > 10]) @@ -205,8 +183,8 @@ def bonus_tours(notes_sport, coefs, infos=None): def bonus_iutr(notes_sport, coefs, infos=None): """Calcul du bonus , regle de l'IUT de Roanne (contribuée par Raphael C., nov 2012) - Le bonus est compris entre 0 et 0.35 point. - cette procédure modifie la moyenne de chaque UE capitalisable. + Le bonus est compris entre 0 et 0.35 point. + cette procédure modifie la moyenne de chaque UE capitalisable. """ # modifie les moyennes de toutes les UE: @@ -260,7 +238,7 @@ def bonus_saint_etienne(notes_sport, coefs, infos=None): """IUT de Saint-Etienne (jan 2014) Nous avons différents types de bonification bonfication Sport / Associations - coopératives de département / Bureau Des Étudiants + coopératives de département / Bureau Des Étudiants / engagement citoyen / Langues optionnelles Nous ajoutons sur le bulletin une bonification qui varie entre 0,1 et 0,3 ou 0,35 pour chaque item la bonification totale ne doit pas excéder les 0,6 point. @@ -278,9 +256,9 @@ def bonus_saint_etienne(notes_sport, coefs, infos=None): def bonus_iutTarbes(notes_sport, coefs, infos=None): - """Calcul bonus modules optionnels + """Calcul bonus modules optionnels (sport, Langues, action sociale, Théâtre), règle IUT Tarbes - Les coefficients ne sont pas pris en compte, + Les coefficients ne sont pas pris en compte, seule la meilleure note est prise en compte le 1/30ème des points au-dessus de 10 sur 20 est retenu et s'ajoute à la moyenne générale du semestre déjà obtenue par l'étudiant. @@ -408,7 +386,7 @@ def bonus_iutbethune(notes_sport, coefs, infos=None): def bonus_demo(notes_sport, coefs, infos=None): """Fausse fonction "bonus" pour afficher les informations disponibles et aider les développeurs. - Les informations sont placées dans le fichier /tmp/scodoc_bonus.log + Les informations sont placées dans le fichier /tmp/scodoc_bonus.log qui est ECRASE à chaque appel. *** Ne pas utiliser en production !!! *** """ diff --git a/config/config.sh b/config/config.sh index bfd614034..eaed2f752 100644 --- a/config/config.sh +++ b/config/config.sh @@ -34,9 +34,11 @@ export POSTGRES_USER=www-data if [ "${debian_version}" = "10" ] then PSQL=/usr/lib/postgresql/11/bin/psql + export POSTGRES_SERVICE="postgresql@11-main.service" elif [ "${debian_version}" = "9" ] then PSQL=/usr/lib/postgresql/9.6/bin/psql + export POSTGRES_SERVICE="postgresql" elif [ "${debian_version}" = "8" ] then PSQL=/usr/lib/postgresql/9.4/bin/psql diff --git a/config/configure_systemd.sh b/config/configure_systemd.sh index 8ad275add..032dde90a 100755 --- a/config/configure_systemd.sh +++ b/config/configure_systemd.sh @@ -8,7 +8,13 @@ source utils.sh check_uid_root "$0" 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 echo "A partir de maintenant, utiliser" diff --git a/config/etc/scodoc.service b/config/etc/scodoc.service index 927420fc5..c91c3f08d 100644 --- a/config/etc/scodoc.service +++ b/config/etc/scodoc.service @@ -1,13 +1,15 @@ # ScoDoc7 service # Zope based -# Depends on postgresql -# => is restarted when postgresql restarts +# Depends on {{postgresql}} (replaced by installation script by +# postgresql@11-main.service on Debian 10 +# postgresql on Debian <= 9 +# => is restarted when {{postgresql}} restarts # [Unit] Description=ScoDoc 7 service -After=network.target postgresql@11-main.service -Requires=postgresql@11-main.service -PartOf=postgresql@11-main.service +After=network.target {{postgresql}} +Requires={{postgresql}} +PartOf={{postgresql}} StartLimitIntervalSec=0 [Service] @@ -21,4 +23,4 @@ ExecStop=/opt/scodoc/bin/zopectl stop ExecReload=/opt/scodoc/bin/zopectl restart [Install] -WantedBy=postgresql@11-main.service +WantedBy={{postgresql}} diff --git a/config/install_debian10.sh b/config/install_debian10.sh index b3efab7a9..9269af542 100755 --- a/config/install_debian10.sh +++ b/config/install_debian10.sh @@ -31,11 +31,13 @@ fi chgrp www-data "$SCODOC_DIR" "$SCODOC_DIR"/ZopeProducts/* chmod g+w "$SCODOC_DIR" "$SCODOC_DIR"/ZopeProducts/* -chgrp -R www-data "${SCODOC_VAR_DIR}"/photos -chmod -R g+w "${SCODOC_VAR_DIR}"/photos +if [ -d "${SCODOC_VAR_DIR}"/photos ]; then + chgrp -R www-data "${SCODOC_VAR_DIR}"/photos + chmod -R g+w "${SCODOC_VAR_DIR}"/photos +fi if [ ! -e "${SCODOC_VERSION_DIR}" ]; then - mkdir "${SCODOC_VERSION_DIR}" + mkdir -p "${SCODOC_VERSION_DIR}" chown www-data.www-data "${SCODOC_VERSION_DIR}" fi @@ -217,9 +219,7 @@ read ans if [ "$(norm_ans "$ans")" != 'N' ] then # ScoDoc 7.19+ uses systemd - echo 'Installation du demarrage automatique de ScoDoc (systemd)' - cp "$SCODOC_DIR"/config/etc/scodoc.service /etc/systemd/system - systemctl enable scodoc.service + $SCODOC_DIR/config/configure_systemd.sh fi diff --git a/config/save_scodoc_data.sh b/config/save_scodoc_data.sh index 58cac2cca..e599525f4 100755 --- a/config/save_scodoc_data.sh +++ b/config/save_scodoc_data.sh @@ -60,7 +60,7 @@ then fi chown root "$DEST" -# Zope DB and ScoDoc archives: +# Zope DB, ScoDoc archives, configuration, photos, etc. echo "Copying var/ ..." cp -rp "$INSTANCE_DIR/var" "$DEST" diff --git a/debug.py b/debug.py index 4b7d3e45c..676f3039d 100644 --- a/debug.py +++ b/debug.py @@ -67,7 +67,11 @@ def go(app, n=0, verbose=True): def go_dept(app, dept, verbose=True): objs = app.ScoDoc.objectValues("Folder") 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 verbose: print("context in dept ", context.DeptId()) diff --git a/gen_tables.py b/gen_tables.py index 3f5a95ef3..51cc641f0 100644 --- a/gen_tables.py +++ b/gen_tables.py @@ -445,14 +445,14 @@ class GenTable: if self.base_url: if self.xls_link: H.append( - ' %s' + ' %s' % (self.base_url, scu.ICON_XLS) ) if self.xls_link and self.pdf_link: H.append(" ") if self.pdf_link: H.append( - ' %s' + ' %s' % (self.base_url, scu.ICON_PDF) ) H.append("") diff --git a/sco_abs_views.py b/sco_abs_views.py index 70ada694f..c8190983f 100644 --- a/sco_abs_views.py +++ b/sco_abs_views.py @@ -76,8 +76,9 @@ def doSignaleAbsence( description_abs = description dates = sco_abs.DateRangeISO(context, datedebut, datefin) nbadded = 0 + demijournee = int(demijournee) for jour in dates: - if demijournee == "2": + if demijournee == 2: context._AddAbsence( etudid, jour, False, estjust, REQUEST, description_abs, moduleimpl_id ) @@ -86,9 +87,8 @@ def doSignaleAbsence( ) nbadded += 2 else: - matin = int(demijournee) context._AddAbsence( - etudid, jour, matin, estjust, REQUEST, description_abs, moduleimpl_id + etudid, jour, demijournee, estjust, REQUEST, description_abs, moduleimpl_id ) nbadded += 1 # @@ -281,8 +281,9 @@ def doJustifAbsence( description_abs = description dates = sco_abs.DateRangeISO(context, datedebut, datefin) nbadded = 0 + demijournee = int(demijournee) for jour in dates: - if demijournee == "2": + if demijournee == 2: context._AddJustif( etudid=etudid, jour=jour, @@ -299,11 +300,10 @@ def doJustifAbsence( ) nbadded += 2 else: - matin = int(demijournee) context._AddJustif( etudid=etudid, jour=jour, - matin=matin, + matin=demijournee, REQUEST=REQUEST, description=description_abs, ) @@ -404,14 +404,14 @@ def doAnnuleAbsence( dates = sco_abs.DateRangeISO(context, datedebut, datefin) nbadded = 0 + demijournee = int(demijournee) for jour in dates: - if demijournee == "2": + if demijournee == 2: context._AnnuleAbsence(etudid, jour, False, REQUEST=REQUEST) context._AnnuleAbsence(etudid, jour, True, REQUEST=REQUEST) nbadded += 2 else: - matin = int(demijournee) - context._AnnuleAbsence(etudid, jour, matin, REQUEST=REQUEST) + context._AnnuleAbsence(etudid, jour, demijournee, REQUEST=REQUEST) nbadded += 1 # H = [ @@ -539,15 +539,15 @@ def doAnnuleJustif( etudid = etud["etudid"] dates = sco_abs.DateRangeISO(context, datedebut0, datefin0) nbadded = 0 + demijournee = int(demijournee) for jour in dates: # Attention: supprime matin et après-midi - if demijournee == "2": + if demijournee == 2: context._AnnuleJustif(etudid, jour, False, REQUEST=REQUEST) context._AnnuleJustif(etudid, jour, True, REQUEST=REQUEST) nbadded += 2 else: - matin = int(demijournee) - context._AnnuleJustif(etudid, jour, matin, REQUEST=REQUEST) + context._AnnuleJustif(etudid, jour, demijournee, REQUEST=REQUEST) nbadded += 1 # H = [ @@ -720,7 +720,7 @@ def ListeAbsEtud( ): """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 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). """ 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( etudid, datedebut, with_evals=with_evals, format=format ) - if REQUEST: - base_url_nj = "%s?etudid=%s&absjust_only=0" % (REQUEST.URL0, etudid) - base_url_j = "%s?etudid=%s&absjust_only=1" % (REQUEST.URL0, etudid) + base_url_nj = "%s?etudid=%s&absjust_only=0" % (REQUEST.URL0, etudid) + base_url_j = "%s?etudid=%s&absjust_only=1" % (REQUEST.URL0, etudid) else: base_url_nj = base_url_j = "" tab_absnonjust = GenTable( diff --git a/sco_archives.py b/sco_archives.py index 18d89bfe8..70a0553b0 100644 --- a/sco_archives.py +++ b/sco_archives.py @@ -484,7 +484,7 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement. # submitted or cancelled: return REQUEST.RESPONSE.redirect( - "formsemestre_list_archives?formsemestre_id=%s&head_message=%s" + "formsemestre_list_archives?formsemestre_id=%s&head_message=%s" % (formsemestre_id, msg) ) @@ -510,7 +510,7 @@ def formsemestre_list_archives(context, REQUEST, formsemestre_id): for a in L: archive_name = PVArchive.get_archive_name(a["archive_id"]) H.append( - 'Editer les validations d'UE dans ce semestre extérieur
""" @@ -1074,7 +1074,7 @@ def _formsemestre_bulletinetud_header_html( menuBul = [ { "title": "Réglages bulletins", - "url": "formsemestre_edit_options?formsemestre_id=%s&target_url=%s" + "url": "formsemestre_edit_options?formsemestre_id=%s&target_url=%s" % (formsemestre_id, qurl), "enabled": (uid in sem["responsables"]) or authuser.has_permission(ScoImplement, context), @@ -1085,13 +1085,13 @@ def _formsemestre_bulletinetud_header_html( context, formsemestre_id ), "url": url - + "?formsemestre_id=%s&etudid=%s&format=pdf&version=%s" + + "?formsemestre_id=%s&etudid=%s&format=pdf&version=%s" % (formsemestre_id, etudid, version), }, { "title": "Envoi par mail à %s" % etud["email"], "url": url - + "?formsemestre_id=%s&etudid=%s&format=pdfmail&version=%s" + + "?formsemestre_id=%s&etudid=%s&format=pdfmail&version=%s" % (formsemestre_id, etudid, version), "enabled": etud["email"] and can_send_bulletin_by_mail( @@ -1101,7 +1101,7 @@ def _formsemestre_bulletinetud_header_html( { "title": "Envoi par mail à %s (adr. personnelle)" % etud["emailperso"], "url": url - + "?formsemestre_id=%s&etudid=%s&format=pdfmail&version=%s&prefer_mail_perso=1" + + "?formsemestre_id=%s&etudid=%s&format=pdfmail&version=%s&prefer_mail_perso=1" % (formsemestre_id, etudid, version), "enabled": etud["emailperso"] and can_send_bulletin_by_mail( @@ -1111,12 +1111,12 @@ def _formsemestre_bulletinetud_header_html( { "title": "Version XML", "url": url - + "?formsemestre_id=%s&etudid=%s&format=xml&version=%s" + + "?formsemestre_id=%s&etudid=%s&format=xml&version=%s" % (formsemestre_id, etudid, version), }, { "title": "Ajouter une appréciation", - "url": "appreciation_add_form?etudid=%s&formsemestre_id=%s" + "url": "appreciation_add_form?etudid=%s&formsemestre_id=%s" % (etudid, formsemestre_id), "enabled": ( (authuser in sem["responsables"]) @@ -1125,31 +1125,31 @@ def _formsemestre_bulletinetud_header_html( }, { "title": "Enregistrer un semestre effectué ailleurs", - "url": "formsemestre_ext_create_form?etudid=%s&formsemestre_id=%s" + "url": "formsemestre_ext_create_form?etudid=%s&formsemestre_id=%s" % (etudid, formsemestre_id), "enabled": authuser.has_permission(ScoImplement, context), }, { "title": "Enregistrer une validation d'UE antérieure", - "url": "formsemestre_validate_previous_ue?etudid=%s&formsemestre_id=%s" + "url": "formsemestre_validate_previous_ue?etudid=%s&formsemestre_id=%s" % (etudid, formsemestre_id), "enabled": context._can_validate_sem(REQUEST, formsemestre_id), }, { "title": "Enregistrer note d'une UE externe", - "url": "external_ue_create_form?etudid=%s&formsemestre_id=%s" + "url": "external_ue_create_form?etudid=%s&formsemestre_id=%s" % (etudid, formsemestre_id), "enabled": context._can_validate_sem(REQUEST, formsemestre_id), }, { "title": "Entrer décisions jury", - "url": "formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s" + "url": "formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s" % (formsemestre_id, etudid), "enabled": context._can_validate_sem(REQUEST, formsemestre_id), }, { "title": "Editer PV jury", - "url": "formsemestre_pvjury_pdf?formsemestre_id=%s&etudid=%s" + "url": "formsemestre_pvjury_pdf?formsemestre_id=%s&etudid=%s" % (formsemestre_id, etudid), "enabled": True, }, @@ -1162,7 +1162,7 @@ def _formsemestre_bulletinetud_header_html( '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 - " + " inscrire à un autre semestre"
""" @@ -191,7 +191,7 @@ def formsemestre_ext_create_form(context, etudid, formsemestre_id, REQUEST=None) return "\n".join(H) + "\n" + tf[1] + F elif tf[0] == -1: return REQUEST.RESPONSE.redirect( - "%s/formsemestre_bulletinetud?formsemestre_id==%s&etudid=%s" + "%s/formsemestre_bulletinetud?formsemestre_id==%s&etudid=%s" % (context.ScoURL(), formsemestre_id, etudid) ) else: diff --git a/sco_formsemestre_inscriptions.py b/sco_formsemestre_inscriptions.py index e3c127e3d..f61dbd940 100644 --- a/sco_formsemestre_inscriptions.py +++ b/sco_formsemestre_inscriptions.py @@ -147,7 +147,7 @@ def formsemestre_inscription_with_modules_form( if (not only_ext) or (sem["modalite"] == "EXT"): H.append( """ -Continuer quand même l'inscription
""" + """Continuer quand même l'inscription
""" % (etudid, formsemestre_id, sco_groups.make_query_groups(group_ids)) ) return "\n".join(H) + F @@ -332,7 +332,7 @@ def formsemestre_inscription_option(context, etudid, formsemestre_id, REQUEST=No sem_origin = sco_formsemestre.get_formsemestre( context, ue_status["formsemestre_id"] ) - ue_descr += ' (capitalisée le %s)' % ( + ue_descr += ' (capitalisée le %s)' % ( sem_origin["formsemestre_id"], etudid, sem_origin["titreannee"], diff --git a/sco_formsemestre_status.py b/sco_formsemestre_status.py index 3ff709d2f..a9c63623a 100644 --- a/sco_formsemestre_status.py +++ b/sco_formsemestre_status.py @@ -154,7 +154,7 @@ def formsemestre_status_menubar(context, sem, REQUEST): }, { "title": "Modifier le semestre", - "url": "formsemestre_editwithmodules?formation_id=%(formation_id)s&formsemestre_id=%(formsemestre_id)s" + "url": "formsemestre_editwithmodules?formation_id=%(formation_id)s&formsemestre_id=%(formsemestre_id)s" % sem, "enabled": ( authuser.has_permission(ScoImplement, context) @@ -292,7 +292,7 @@ def formsemestre_status_menubar(context, sem, REQUEST): }, { "title": "Exporter table des étudiants", - "url": "groups_view?format=allxls&group_ids=" + "url": "groups_view?format=allxls&group_ids=" + sco_groups.get_default_group( context, formsemestre_id, fix_if_missing=True, REQUEST=REQUEST ), @@ -388,7 +388,7 @@ def formsemestre_status_menubar(context, sem, REQUEST): }, { "title": "Saisie des décisions du jury", - "url": "formsemestre_recapcomplet?modejury=1&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id=" + "url": "formsemestre_recapcomplet?modejury=1&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id=" + formsemestre_id, "enabled": context._can_validate_sem(REQUEST, formsemestre_id), }, @@ -684,7 +684,7 @@ def formsemestre_description_table( caption=title, html_caption=title, html_class="table_leftalign formsemestre_description", - base_url="%s?formsemestre_id=%s&with_evals=%s" + base_url="%s?formsemestre_id=%s&with_evals=%s" % (REQUEST.URL0, formsemestre_id, with_evals), page_title=title, html_title=context.html_sem_header( @@ -917,7 +917,7 @@ def formsemestre_status(context, formsemestre_id=None, REQUEST=None): if can_edit: H.append( - ' ' + ' ' % (formsemestre_id, ue["ue_id"]) ) H.append( diff --git a/sco_formsemestre_validation.py b/sco_formsemestre_validation.py index 151abaa23..95313f59b 100644 --- a/sco_formsemestre_validation.py +++ b/sco_formsemestre_validation.py @@ -109,13 +109,13 @@ def formsemestre_validation_etud_form( if etud_index_prev != None: etud_p = context.getEtudInfo(etudid=T[etud_index_prev][-1], filled=True)[0] Footer.append( - 'Etud. précédent (%s)' + 'Etud. précédent (%s)' % (formsemestre_id, etud_index_prev, etud_p["nomprenom"]) ) if etud_index_next != None: etud_n = context.getEtudInfo(etudid=T[etud_index_next][-1], filled=True)[0] Footer.append( - 'Etud. suivant (%s)' + 'Etud. suivant (%s)' % (formsemestre_id, etud_index_next, etud_n["nomprenom"]) ) Footer.append("") @@ -171,12 +171,12 @@ def formsemestre_validation_etud_form( if check: if not desturl: desturl = ( - "formsemestre_recapcomplet?modejury=1&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id=" + "formsemestre_recapcomplet?modejury=1&hidemodules=1&hidebac=1&pref_override=0&formsemestre_id=" + formsemestre_id ) if sortcol: desturl += ( - "&sortcol=" + sortcol + "&sortcol=" + sortcol ) # pour refaire tri sorttable du tableau de notes desturl += "#etudid%s" % etudid # va a la bonne ligne H.append('' % desturl) @@ -205,13 +205,13 @@ def formsemestre_validation_etud_form( if not Se.prev_decision: H.append( tf_error_message( - """Le jury n\'a pas statué sur le semestre précédent ! (le faire maintenant)""" + """Le jury n\'a pas statué sur le semestre précédent ! (le faire maintenant)""" % (Se.prev["formsemestre_id"], etudid) ) ) if decision_jury: H.append( - 'Supprimer décision existante' + 'Supprimer décision existante' % (etudid, formsemestre_id) ) H.append(context.sco_footer(REQUEST)) @@ -249,7 +249,7 @@ def formsemestre_validation_etud_form( - + """ % (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( - """""" + """""" % (etudid, formsemestre_id) ) @@ -402,23 +402,23 @@ def _redirect_valid_choice( formsemestre_id, etudid, Se, choice, desturl, sortcol, REQUEST ): adr = ( - "formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1" + "formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1" % (formsemestre_id, etudid) ) if sortcol: - adr += "&sortcol=" + sortcol + adr += "&sortcol=" + sortcol # if desturl: - # desturl += "&desturl=" + desturl + # desturl += "&desturl=" + desturl return REQUEST.RESPONSE.redirect(adr) # Si le precedent a été modifié, demande relecture du parcours. # sinon renvoie au listing general, # if choice.new_code_prev: -# REQUEST.RESPONSE.redirect( 'formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1&desturl=%s' % (formsemestre_id, etudid, desturl) ) +# REQUEST.RESPONSE.redirect( 'formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&check=1&desturl=%s' % (formsemestre_id, etudid, desturl) ) # else: # if not desturl: -# desturl = 'formsemestre_recapcomplet?modejury=1&hidemodules=1&formsemestre_id=' + formsemestre_id +# desturl = 'formsemestre_recapcomplet?modejury=1&hidemodules=1&formsemestre_id=' + formsemestre_id # REQUEST.RESPONSE.redirect(desturl) @@ -555,7 +555,7 @@ def formsemestre_recap_parcours_table( ) H.append('`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `