forked from ScoDoc/ScoDoc
python-modernize
This commit is contained in:
parent
53cba824eb
commit
7bb45516ed
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
Source: http://wikipython.flibuste.net/moin.py/JouerAvecUnicode#head-1213938516c633958921591439c33d202244e2f4
|
Source: http://wikipython.flibuste.net/moin.py/JouerAvecUnicode#head-1213938516c633958921591439c33d202244e2f4
|
||||||
"""
|
"""
|
||||||
|
import six
|
||||||
|
|
||||||
_reptable = {}
|
_reptable = {}
|
||||||
|
|
||||||
@ -202,5 +203,5 @@ def suppression_diacritics(s):
|
|||||||
@rtype: unicode
|
@rtype: unicode
|
||||||
"""
|
"""
|
||||||
if isinstance(s, str):
|
if isinstance(s, str):
|
||||||
s = unicode(s, "utf8", "replace")
|
s = six.text_type(s, "utf8", "replace")
|
||||||
return s.translate(_reptable)
|
return s.translate(_reptable)
|
||||||
|
@ -196,12 +196,12 @@ class TF:
|
|||||||
for (field, descr) in self.formdescription:
|
for (field, descr) in self.formdescription:
|
||||||
# special case for boolcheckbox
|
# special case for boolcheckbox
|
||||||
if descr.get("input_type", None) == "boolcheckbox" and self.submitted():
|
if descr.get("input_type", None) == "boolcheckbox" and self.submitted():
|
||||||
if not self.values.has_key(field):
|
if field not in self.values:
|
||||||
self.values[field] = 0
|
self.values[field] = 0
|
||||||
else:
|
else:
|
||||||
self.values[field] = 1
|
self.values[field] = 1
|
||||||
if not self.values.has_key(field):
|
if field not in self.values:
|
||||||
if descr.has_key("default"): # first: default in form description
|
if "default" in descr: # first: default in form description
|
||||||
self.values[field] = descr["default"]
|
self.values[field] = descr["default"]
|
||||||
else: # then: use initvalues dict
|
else: # then: use initvalues dict
|
||||||
self.values[field] = self.initvalues.get(field, "")
|
self.values[field] = self.initvalues.get(field, "")
|
||||||
@ -214,7 +214,7 @@ class TF:
|
|||||||
):
|
):
|
||||||
self.values[field] = str(self.values[field])
|
self.values[field] = str(self.values[field])
|
||||||
#
|
#
|
||||||
if not self.values.has_key("tf-checked"):
|
if "tf-checked" not in self.values:
|
||||||
if self.submitted():
|
if self.submitted():
|
||||||
# si rien n'est coché, tf-checked n'existe plus dans la reponse
|
# si rien n'est coché, tf-checked n'existe plus dans la reponse
|
||||||
self.values["tf-checked"] = []
|
self.values["tf-checked"] = []
|
||||||
@ -264,14 +264,14 @@ class TF:
|
|||||||
)
|
)
|
||||||
ok = 0
|
ok = 0
|
||||||
if typ[:3] == "int" or typ == "float" or typ == "real":
|
if typ[:3] == "int" or typ == "float" or typ == "real":
|
||||||
if descr.has_key("min_value") and val < descr["min_value"]:
|
if "min_value" in descr and val < descr["min_value"]:
|
||||||
msg.append(
|
msg.append(
|
||||||
"La valeur (%d) du champ '%s' est trop petite (min=%s)"
|
"La valeur (%d) du champ '%s' est trop petite (min=%s)"
|
||||||
% (val, field, descr["min_value"])
|
% (val, field, descr["min_value"])
|
||||||
)
|
)
|
||||||
ok = 0
|
ok = 0
|
||||||
|
|
||||||
if descr.has_key("max_value") and val > descr["max_value"]:
|
if "max_value" in descr and val > descr["max_value"]:
|
||||||
msg.append(
|
msg.append(
|
||||||
"La valeur (%s) du champ '%s' est trop grande (max=%s)"
|
"La valeur (%s) du champ '%s' est trop grande (max=%s)"
|
||||||
% (val, field, descr["max_value"])
|
% (val, field, descr["max_value"])
|
||||||
@ -279,7 +279,7 @@ class TF:
|
|||||||
ok = 0
|
ok = 0
|
||||||
|
|
||||||
# allowed values
|
# allowed values
|
||||||
if descr.has_key("allowed_values"):
|
if "allowed_values" in descr:
|
||||||
if descr.get("input_type", None) == "checkbox":
|
if descr.get("input_type", None) == "checkbox":
|
||||||
# for checkboxes, val is a list
|
# for checkboxes, val is a list
|
||||||
for v in val:
|
for v in val:
|
||||||
@ -293,7 +293,7 @@ class TF:
|
|||||||
elif not val in descr["allowed_values"]:
|
elif not val in descr["allowed_values"]:
|
||||||
msg.append("valeur invalide (%s) pour le champ '%s'" % (val, field))
|
msg.append("valeur invalide (%s) pour le champ '%s'" % (val, field))
|
||||||
ok = 0
|
ok = 0
|
||||||
if descr.has_key("validator"):
|
if "validator" in descr:
|
||||||
if not descr["validator"](val, field):
|
if not descr["validator"](val, field):
|
||||||
msg.append("valeur invalide (%s) pour le champ '%s'" % (val, field))
|
msg.append("valeur invalide (%s) pour le champ '%s'" % (val, field))
|
||||||
ok = 0
|
ok = 0
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# -*- mode: python -*-
|
# -*- mode: python -*-
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from __future__ import absolute_import
|
|
||||||
import pdb, os, sys, string
|
import string
|
||||||
import traceback
|
import traceback
|
||||||
import psycopg2
|
import psycopg2
|
||||||
import psycopg2.pool
|
import psycopg2.pool
|
||||||
|
@ -224,9 +224,9 @@ def get_code_latex_avis_etudiant(
|
|||||||
scu.SCO_ENCODING
|
scu.SCO_ENCODING
|
||||||
)
|
)
|
||||||
|
|
||||||
# Gestion des pb d'encodage XXX debug
|
# Vérification des pb d'encodage (debug)
|
||||||
assert isinstance(tag_latex, unicode)
|
# assert isinstance(tag_latex, unicode)
|
||||||
assert isinstance(valeur, unicode)
|
# assert isinstance(valeur, unicode)
|
||||||
|
|
||||||
# Substitution
|
# Substitution
|
||||||
code = code.replace("**" + tag_latex + "**", valeur)
|
code = code.replace("**" + tag_latex + "**", valeur)
|
||||||
|
@ -46,10 +46,10 @@ import os
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
except:
|
except ImportError:
|
||||||
try:
|
try:
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
except:
|
except ImportError:
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
from zipfile import ZipFile, BadZipfile
|
from zipfile import ZipFile, BadZipfile
|
||||||
import pprint
|
import pprint
|
||||||
@ -382,7 +382,7 @@ class JuryPE:
|
|||||||
c'est à dire ceux pour lesquels il faudra prendre en compte ses notes dans les calculs de moyenne (type 1A=S1+S2/2)
|
c'est à dire ceux pour lesquels il faudra prendre en compte ses notes dans les calculs de moyenne (type 1A=S1+S2/2)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not self.PARCOURSINFO_DICT.has_key(etudid):
|
if etudid not in self.PARCOURSINFO_DICT:
|
||||||
etud = self.get_cache_etudInfo_d_un_etudiant(
|
etud = self.get_cache_etudInfo_d_un_etudiant(
|
||||||
self.context, etudid
|
self.context, etudid
|
||||||
) # On charge les données de l'étudiant
|
) # On charge les données de l'étudiant
|
||||||
@ -476,7 +476,7 @@ class JuryPE:
|
|||||||
reponse = True
|
reponse = True
|
||||||
if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2:
|
if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2:
|
||||||
pe_tools.pe_print(" -> à éliminer car réorienté (NAR)")
|
pe_tools.pe_print(" -> à éliminer car réorienté (NAR)")
|
||||||
if "DEM" in parcours.values(): # Eliminé car DEM
|
if "DEM" in list(parcours.values()): # Eliminé car DEM
|
||||||
reponse = True
|
reponse = True
|
||||||
if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2:
|
if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2:
|
||||||
pe_tools.pe_print(" -> à éliminer car DEM")
|
pe_tools.pe_print(" -> à éliminer car DEM")
|
||||||
@ -567,8 +567,8 @@ class JuryPE:
|
|||||||
dec = nt.get_etud_decision_sem(
|
dec = nt.get_etud_decision_sem(
|
||||||
etudid
|
etudid
|
||||||
) # quelle est la décision du jury ?
|
) # quelle est la décision du jury ?
|
||||||
if (
|
if dec and dec["code"] in list(
|
||||||
dec and dec["code"] in sco_codes_parcours.CODES_SEM_VALIDES.keys()
|
sco_codes_parcours.CODES_SEM_VALIDES.keys()
|
||||||
): # isinstance( sesMoyennes[i+1], float) and
|
): # isinstance( sesMoyennes[i+1], float) and
|
||||||
# mT = sesMoyennes[i+1] # substitue la moyenne si le semestre suivant est "valide"
|
# mT = sesMoyennes[i+1] # substitue la moyenne si le semestre suivant est "valide"
|
||||||
leFid = sem["formsemestre_id"]
|
leFid = sem["formsemestre_id"]
|
||||||
@ -603,7 +603,7 @@ class JuryPE:
|
|||||||
charge également les données des nouveaux étudiants qui en font partis.
|
charge également les données des nouveaux étudiants qui en font partis.
|
||||||
"""
|
"""
|
||||||
# Semestre taggué avec classement dans le groupe
|
# Semestre taggué avec classement dans le groupe
|
||||||
if not self.semTagDict.has_key(fid):
|
if fid not in self.semTagDict:
|
||||||
nt = self.get_cache_notes_d_un_semestre(self.context, fid)
|
nt = self.get_cache_notes_d_un_semestre(self.context, fid)
|
||||||
|
|
||||||
# Création du semestres
|
# Création du semestres
|
||||||
@ -656,7 +656,7 @@ class JuryPE:
|
|||||||
* '3S', '4S' => fusion des semestres
|
* '3S', '4S' => fusion des semestres
|
||||||
* [ 'Si', 'iA' , ... ] => une liste combinant les formats précédents
|
* [ 'Si', 'iA' , ... ] => une liste combinant les formats précédents
|
||||||
"""
|
"""
|
||||||
champs_possibles = JuryPE.PARCOURS.keys()
|
champs_possibles = list(JuryPE.PARCOURS.keys())
|
||||||
if (
|
if (
|
||||||
not isinstance(liste_semestres, list)
|
not isinstance(liste_semestres, list)
|
||||||
and not isinstance(liste_semestres, str)
|
and not isinstance(liste_semestres, str)
|
||||||
@ -962,7 +962,7 @@ class JuryPE:
|
|||||||
allTags = allTags.union(set(self.get_allTagForAggregat(nom)))
|
allTags = allTags.union(set(self.get_allTagForAggregat(nom)))
|
||||||
return sorted(list(allTags)) if len(allTags) > 0 else []
|
return sorted(list(allTags)) if len(allTags) > 0 else []
|
||||||
|
|
||||||
def table_syntheseJury(self, mode="singlesheet"): # XXX was str_syntheseJury
|
def table_syntheseJury(self, mode="singlesheet"): # was str_syntheseJury
|
||||||
"""Table(s) du jury
|
"""Table(s) du jury
|
||||||
mode: singlesheet ou multiplesheet pour export excel
|
mode: singlesheet ou multiplesheet pour export excel
|
||||||
"""
|
"""
|
||||||
@ -1011,7 +1011,7 @@ class JuryPE:
|
|||||||
]
|
]
|
||||||
|
|
||||||
# Les aggrégats à afficher par ordre tel que indiqué dans le dictionnaire parcours
|
# Les aggrégats à afficher par ordre tel que indiqué dans le dictionnaire parcours
|
||||||
aggregats = JuryPE.PARCOURS.keys() # ['S1', 'S2', ..., '1A', '4S']
|
aggregats = list(JuryPE.PARCOURS.keys()) # ['S1', 'S2', ..., '1A', '4S']
|
||||||
aggregats = sorted(
|
aggregats = sorted(
|
||||||
aggregats, key=lambda t: JuryPE.PARCOURS[t]["ordre"]
|
aggregats, key=lambda t: JuryPE.PARCOURS[t]["ordre"]
|
||||||
) # Tri des aggrégats
|
) # Tri des aggrégats
|
||||||
|
@ -130,7 +130,7 @@ class SemestreTag(pe_tagtable.TableTag):
|
|||||||
self.add_moyennesTag(tag, self.comp_MoyennesTag(tag, force=True))
|
self.add_moyennesTag(tag, self.comp_MoyennesTag(tag, force=True))
|
||||||
self.add_moyennesTag("dut", self.get_moyennes_DUT())
|
self.add_moyennesTag("dut", self.get_moyennes_DUT())
|
||||||
self.taglist = sorted(
|
self.taglist = sorted(
|
||||||
self.tagdict.keys() + ["dut"]
|
list(self.tagdict.keys()) + ["dut"]
|
||||||
) # actualise la liste des tags
|
) # actualise la liste des tags
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
@ -170,7 +170,7 @@ class SemestreTag(pe_tagtable.TableTag):
|
|||||||
tag
|
tag
|
||||||
) # extrait un tagname et un éventuel coefficient de pondération (par defaut: 1)
|
) # extrait un tagname et un éventuel coefficient de pondération (par defaut: 1)
|
||||||
# tagname = tagname
|
# tagname = tagname
|
||||||
if not tagdict.has_key(tagname): # Ajout d'une clé pour le tag
|
if tagname not in tagdict: # Ajout d'une clé pour le tag
|
||||||
tagdict[tagname] = {}
|
tagdict[tagname] = {}
|
||||||
|
|
||||||
# Ajout du modimpl au tagname considéré
|
# Ajout du modimpl au tagname considéré
|
||||||
|
@ -126,7 +126,7 @@ class SetTag(pe_tagtable.TableTag):
|
|||||||
|
|
||||||
# -------------------------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------------------------
|
||||||
def get_etudids(self):
|
def get_etudids(self):
|
||||||
return self.identdict.keys()
|
return list(self.identdict.keys())
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------------------------
|
||||||
def do_taglist(self):
|
def do_taglist(self):
|
||||||
@ -272,7 +272,7 @@ class SetTagInterClasse(pe_tagtable.TableTag):
|
|||||||
|
|
||||||
# -------------------------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------------------------
|
||||||
def get_etudids(self):
|
def get_etudids(self):
|
||||||
return self.identdict.keys()
|
return list(self.identdict.keys())
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------------------------------------
|
||||||
def do_taglist(self):
|
def do_taglist(self):
|
||||||
|
@ -44,6 +44,7 @@ import unicodedata
|
|||||||
|
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
from app.scodoc.notes_log import log
|
from app.scodoc.notes_log import log
|
||||||
|
import six
|
||||||
|
|
||||||
PE_DEBUG = 0
|
PE_DEBUG = 0
|
||||||
|
|
||||||
@ -141,8 +142,8 @@ def escape_for_latex(s):
|
|||||||
}
|
}
|
||||||
exp = re.compile(
|
exp = re.compile(
|
||||||
"|".join(
|
"|".join(
|
||||||
re.escape(unicode(key))
|
re.escape(six.text_type(key))
|
||||||
for key in sorted(conv.keys(), key=lambda item: -len(item))
|
for key in sorted(list(conv.keys()), key=lambda item: -len(item))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return exp.sub(lambda match: conv[match.group()], s)
|
return exp.sub(lambda match: conv[match.group()], s)
|
||||||
|
@ -98,7 +98,7 @@ def pe_view_sem_recap(
|
|||||||
jury = pe_jurype.JuryPE(context, semBase)
|
jury = pe_jurype.JuryPE(context, semBase)
|
||||||
|
|
||||||
# Ajout avis LaTeX au même zip:
|
# Ajout avis LaTeX au même zip:
|
||||||
etudids = jury.syntheseJury.keys()
|
etudids = list(jury.syntheseJury.keys())
|
||||||
|
|
||||||
# Récupération du template latex, du footer latex et du tag identifiant les annotations relatives aux PE
|
# Récupération du template latex, du footer latex et du tag identifiant les annotations relatives aux PE
|
||||||
# (chaines unicodes, html non quoté)
|
# (chaines unicodes, html non quoté)
|
||||||
|
@ -215,7 +215,7 @@ def DateRangeISO(context, date_beg, date_end, workable=1):
|
|||||||
r.append(cur)
|
r.append(cur)
|
||||||
cur = cur.next_day()
|
cur = cur.next_day()
|
||||||
|
|
||||||
return map(lambda x: x.ISO(), r)
|
return [x.ISO() for x in r]
|
||||||
|
|
||||||
|
|
||||||
def day_names(context):
|
def day_names(context):
|
||||||
@ -413,7 +413,7 @@ def ListeAbsDate(context, etudid, beg_date, end_date):
|
|||||||
A[(jour, matin)]["begin"] = dat + " 12:00:00"
|
A[(jour, matin)]["begin"] = dat + " 12:00:00"
|
||||||
A[(jour, matin)]["end"] = dat + " 17:59:59"
|
A[(jour, matin)]["end"] = dat + " 17:59:59"
|
||||||
# sort
|
# sort
|
||||||
R = A.values()
|
R = list(A.values())
|
||||||
R.sort(key=lambda x: (x["begin"]))
|
R.sort(key=lambda x: (x["begin"]))
|
||||||
return R
|
return R
|
||||||
|
|
||||||
|
@ -961,7 +961,7 @@ def _TablesAbsEtud(
|
|||||||
return "après-midi"
|
return "après-midi"
|
||||||
|
|
||||||
def descr_exams(a):
|
def descr_exams(a):
|
||||||
if not a.has_key("evals"):
|
if "evals" not in a:
|
||||||
return ""
|
return ""
|
||||||
ex = []
|
ex = []
|
||||||
for ev in a["evals"]:
|
for ev in a["evals"]:
|
||||||
|
@ -89,6 +89,7 @@ import os
|
|||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
import pprint
|
import pprint
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
# Pour la détection auto de l'encodage des fichiers Apogée:
|
# Pour la détection auto de l'encodage des fichiers Apogée:
|
||||||
try:
|
try:
|
||||||
@ -832,7 +833,7 @@ class ApoData:
|
|||||||
Si les id Apogée ne sont pas uniques (ce n'est pas garanti), garde le premier
|
Si les id Apogée ne sont pas uniques (ce n'est pas garanti), garde le premier
|
||||||
"""
|
"""
|
||||||
elts = collections.OrderedDict()
|
elts = collections.OrderedDict()
|
||||||
for col_id in sorted(cols.keys(), reverse=True):
|
for col_id in sorted(list(cols.keys()), reverse=True):
|
||||||
col = cols[col_id]
|
col = cols[col_id]
|
||||||
if col["Code"] in elts:
|
if col["Code"] in elts:
|
||||||
elts[col["Code"]].append(col)
|
elts[col["Code"]].append(col)
|
||||||
@ -967,7 +968,7 @@ class ApoData:
|
|||||||
% (declared, present)
|
% (declared, present)
|
||||||
)
|
)
|
||||||
# l'ensemble de tous les codes des elements apo des semestres:
|
# l'ensemble de tous les codes des elements apo des semestres:
|
||||||
sem_elems = reduce(set.union, self.get_codes_by_sem().values(), set())
|
sem_elems = reduce(set.union, list(self.get_codes_by_sem().values()), set())
|
||||||
|
|
||||||
return maq_elems, sem_elems
|
return maq_elems, sem_elems
|
||||||
|
|
||||||
@ -1081,7 +1082,7 @@ def _apo_read_cols(f):
|
|||||||
if int(m.group(1)) != i:
|
if int(m.group(1)) != i:
|
||||||
raise FormatError("invalid column id: %s for index %s" % (col_id, i))
|
raise FormatError("invalid column id: %s for index %s" % (col_id, i))
|
||||||
|
|
||||||
cols[col_id] = DictCol(zip(col_keys, fs))
|
cols[col_id] = DictCol(list(zip(col_keys, fs)))
|
||||||
cols[col_id].lineno = f.lineno # for debuging purpose
|
cols[col_id].lineno = f.lineno # for debuging purpose
|
||||||
|
|
||||||
return cols
|
return cols
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
import time
|
import time
|
||||||
from types import StringType
|
from types import StringType
|
||||||
import pprint
|
import pprint
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
from app.scodoc import htmlutils
|
from app.scodoc import htmlutils
|
||||||
import email
|
import email
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
@ -1111,7 +1111,7 @@ def _formsemestre_bulletinetud_header_html(
|
|||||||
# Menu
|
# Menu
|
||||||
endpoint = "notes.formsemestre_bulletinetud"
|
endpoint = "notes.formsemestre_bulletinetud"
|
||||||
url = REQUEST.URL0
|
url = REQUEST.URL0
|
||||||
qurl = urllib.quote_plus(url + "?" + REQUEST.QUERY_STRING)
|
qurl = six.moves.urllib.parse.quote_plus(url + "?" + REQUEST.QUERY_STRING)
|
||||||
|
|
||||||
menuBul = [
|
menuBul = [
|
||||||
{
|
{
|
||||||
|
@ -72,7 +72,7 @@ def bulletin_class_descriptions():
|
|||||||
|
|
||||||
|
|
||||||
def bulletin_class_names():
|
def bulletin_class_names():
|
||||||
return BULLETIN_CLASSES.keys()
|
return list(BULLETIN_CLASSES.keys())
|
||||||
|
|
||||||
|
|
||||||
def bulletin_default_class_name():
|
def bulletin_default_class_name():
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
"""
|
"""
|
||||||
from types import ListType, TupleType, FloatType
|
from types import ListType, TupleType, FloatType
|
||||||
import collections
|
import collections
|
||||||
|
from six.moves import range
|
||||||
|
|
||||||
NOTES_TOLERANCE = 0.00499999999999 # si note >= (BARRE-TOLERANCE), considere ok
|
NOTES_TOLERANCE = 0.00499999999999 # si note >= (BARRE-TOLERANCE), considere ok
|
||||||
# (permet d'eviter d'afficher 10.00 sous barre alors que la moyenne vaut 9.999)
|
# (permet d'eviter d'afficher 10.00 sous barre alors que la moyenne vaut 9.999)
|
||||||
@ -212,7 +213,7 @@ class TypeParcours:
|
|||||||
UNUSED_CODES = set() # Ensemble des codes jury non autorisés dans ce parcours
|
UNUSED_CODES = set() # Ensemble des codes jury non autorisés dans ce parcours
|
||||||
UE_IS_MODULE = False # 1 seul module par UE (si plusieurs modules, etudiants censéments inscrits à un seul d'entre eux)
|
UE_IS_MODULE = False # 1 seul module par UE (si plusieurs modules, etudiants censéments inscrits à un seul d'entre eux)
|
||||||
ECTS_ONLY = False # Parcours avec progression basée uniquement sur les ECTS
|
ECTS_ONLY = False # Parcours avec progression basée uniquement sur les ECTS
|
||||||
ALLOWED_UE_TYPES = UE_TYPE_NAME.keys() # par defaut, autorise tous les types d'UE
|
ALLOWED_UE_TYPES = list(UE_TYPE_NAME.keys()) # par defaut, autorise tous les types d'UE
|
||||||
|
|
||||||
def check(self, formation=None):
|
def check(self, formation=None):
|
||||||
return True, "" # status, diagnostic_message
|
return True, "" # status, diagnostic_message
|
||||||
@ -664,7 +665,7 @@ register_parcours(ParcoursMasterIG())
|
|||||||
|
|
||||||
|
|
||||||
# -------------------------
|
# -------------------------
|
||||||
_tp = TYPES_PARCOURS.items()
|
_tp = list(TYPES_PARCOURS.items())
|
||||||
_tp.sort(key=lambda x: x[1].__doc__) # sort by intitulé
|
_tp.sort(key=lambda x: x[1].__doc__) # sort by intitulé
|
||||||
FORMATION_PARCOURS_DESCRS = [p[1].__doc__ for p in _tp] # intitulés (eg pour menu)
|
FORMATION_PARCOURS_DESCRS = [p[1].__doc__ for p in _tp] # intitulés (eg pour menu)
|
||||||
FORMATION_PARCOURS_TYPES = [p[0] for p in _tp] # codes numeriques (TYPE_PARCOURS)
|
FORMATION_PARCOURS_TYPES = [p[0] for p in _tp] # codes numeriques (TYPE_PARCOURS)
|
||||||
|
@ -284,7 +284,7 @@ def do_moduleimpl_moyennes(context, nt, mod):
|
|||||||
for e in valid_evals:
|
for e in valid_evals:
|
||||||
if e["evaluation_type"] != EVALUATION_NORMALE:
|
if e["evaluation_type"] != EVALUATION_NORMALE:
|
||||||
continue
|
continue
|
||||||
if e["notes"].has_key(etudid):
|
if etudid in e["notes"]:
|
||||||
note = e["notes"][etudid]["value"]
|
note = e["notes"][etudid]["value"]
|
||||||
if note is None: # ABSENT
|
if note is None: # ABSENT
|
||||||
note = 0
|
note = 0
|
||||||
@ -315,7 +315,7 @@ def do_moduleimpl_moyennes(context, nt, mod):
|
|||||||
for e in evals:
|
for e in evals:
|
||||||
if (
|
if (
|
||||||
(e["etat"]["evalcomplete"] or e["etat"]["evalattente"])
|
(e["etat"]["evalcomplete"] or e["etat"]["evalattente"])
|
||||||
and e["notes"].has_key(etudid)
|
and etudid in e["notes"]
|
||||||
) and (e["note_max"] > 0):
|
) and (e["note_max"] > 0):
|
||||||
note = e["notes"][etudid]["value"]
|
note = e["notes"][etudid]["value"]
|
||||||
if note is None:
|
if note is None:
|
||||||
@ -352,7 +352,7 @@ def do_moduleimpl_moyennes(context, nt, mod):
|
|||||||
R[etudid] = user_moy
|
R[etudid] = user_moy
|
||||||
# Note de rattrapage ou deuxième session ?
|
# Note de rattrapage ou deuxième session ?
|
||||||
if eval_rattr:
|
if eval_rattr:
|
||||||
if eval_rattr["notes"].has_key(etudid):
|
if etudid in eval_rattr["notes"]:
|
||||||
note = eval_rattr["notes"][etudid]["value"]
|
note = eval_rattr["notes"][etudid]["value"]
|
||||||
if note != None and note != NOTES_NEUTRALISE and note != NOTES_ATTENTE:
|
if note != None and note != NOTES_NEUTRALISE and note != NOTES_ATTENTE:
|
||||||
if type(R[etudid]) != FloatType:
|
if type(R[etudid]) != FloatType:
|
||||||
@ -397,7 +397,7 @@ def do_formsemestre_moyennes(context, nt, formsemestre_id):
|
|||||||
)[0]
|
)[0]
|
||||||
modimpl["module"] = mod # add module dict to moduleimpl (used by nt)
|
modimpl["module"] = mod # add module dict to moduleimpl (used by nt)
|
||||||
moduleimpl_id = modimpl["moduleimpl_id"]
|
moduleimpl_id = modimpl["moduleimpl_id"]
|
||||||
assert not D.has_key(moduleimpl_id)
|
assert moduleimpl_id not in D
|
||||||
D[moduleimpl_id], valid_evals_mod, attente, expr_diag = do_moduleimpl_moyennes(
|
D[moduleimpl_id], valid_evals_mod, attente, expr_diag = do_moduleimpl_moyennes(
|
||||||
context, nt, modimpl
|
context, nt, modimpl
|
||||||
)
|
)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import thread
|
import six.moves._thread
|
||||||
|
|
||||||
from scodoc_manager import sco_mgr
|
from scodoc_manager import sco_mgr
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
@ -27,7 +27,7 @@ CACHE_evaluations = {}
|
|||||||
def get_evaluations_cache(context):
|
def get_evaluations_cache(context):
|
||||||
"""returns cache for evaluations"""
|
"""returns cache for evaluations"""
|
||||||
u = sco_mgr.get_db_uri()
|
u = sco_mgr.get_db_uri()
|
||||||
if CACHE_evaluations.has_key(u):
|
if u in CACHE_evaluations:
|
||||||
return CACHE_evaluations[u]
|
return CACHE_evaluations[u]
|
||||||
else:
|
else:
|
||||||
log("get_evaluations_cache: new simpleCache")
|
log("get_evaluations_cache: new simpleCache")
|
||||||
@ -41,7 +41,7 @@ class CacheNotesTable:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
log("new CacheTable (id=%s)" % id(self))
|
log("new CacheTable (id=%s)" % id(self))
|
||||||
#
|
#
|
||||||
self.lock = thread.allocate_lock()
|
self.lock = six.moves._thread.allocate_lock()
|
||||||
self.owner_thread = None # thread owning this cache
|
self.owner_thread = None # thread owning this cache
|
||||||
self.nref = 0
|
self.nref = 0
|
||||||
# Cache des NotesTables
|
# Cache des NotesTables
|
||||||
@ -55,13 +55,13 @@ class CacheNotesTable:
|
|||||||
|
|
||||||
def acquire(self):
|
def acquire(self):
|
||||||
"If this thread does not own the cache, acquire the lock"
|
"If this thread does not own the cache, acquire the lock"
|
||||||
if thread.get_ident() != self.owner_thread:
|
if six.moves._thread.get_ident() != self.owner_thread:
|
||||||
if self.lock.locked():
|
if self.lock.locked():
|
||||||
log(
|
log(
|
||||||
"acquire: ident=%s waiting for lock" % thread.get_ident()
|
"acquire: ident=%s waiting for lock" % six.moves._thread.get_ident()
|
||||||
) # XXX debug
|
) # XXX debug
|
||||||
self.lock.acquire()
|
self.lock.acquire()
|
||||||
self.owner_thread = thread.get_ident()
|
self.owner_thread = six.moves._thread.get_ident()
|
||||||
if self.owner_thread is None: # bug catching
|
if self.owner_thread is None: # bug catching
|
||||||
log("WARNING: None thread id !")
|
log("WARNING: None thread id !")
|
||||||
self.nref += 1
|
self.nref += 1
|
||||||
@ -76,10 +76,10 @@ class CacheNotesTable:
|
|||||||
self.lock.release()
|
self.lock.release()
|
||||||
self.owner_thread = None
|
self.owner_thread = None
|
||||||
# Debug:
|
# Debug:
|
||||||
if thread.get_ident() != cur_owner_thread:
|
if six.moves._thread.get_ident() != cur_owner_thread:
|
||||||
log(
|
log(
|
||||||
"WARNING: release: ident=%s != owner=%s nref=%d"
|
"WARNING: release: ident=%s != owner=%s nref=%d"
|
||||||
% (thread.get_ident(), cur_owner_thread, self.nref)
|
% (six.moves._thread.get_ident(), cur_owner_thread, self.nref)
|
||||||
)
|
)
|
||||||
raise NoteProcessError("problem with notes cache")
|
raise NoteProcessError("problem with notes cache")
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ class CacheNotesTable:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
self.acquire()
|
self.acquire()
|
||||||
if self.cache.has_key(formsemestre_id):
|
if formsemestre_id in self.cache:
|
||||||
# log('cache hit %s (id=%s, thread=%s)'
|
# log('cache hit %s (id=%s, thread=%s)'
|
||||||
# % (formsemestre_id, id(self), thread.get_ident()))
|
# % (formsemestre_id, id(self), thread.get_ident()))
|
||||||
return self.cache[formsemestre_id]
|
return self.cache[formsemestre_id]
|
||||||
@ -107,7 +107,7 @@ class CacheNotesTable:
|
|||||||
|
|
||||||
def get_cached_formsemestre_ids(self):
|
def get_cached_formsemestre_ids(self):
|
||||||
"List of currently cached formsemestre_id"
|
"List of currently cached formsemestre_id"
|
||||||
return self.cache.keys()
|
return list(self.cache.keys())
|
||||||
|
|
||||||
def inval_cache(self, context, formsemestre_id=None, pdfonly=False): # >
|
def inval_cache(self, context, formsemestre_id=None, pdfonly=False): # >
|
||||||
"expire cache pour un semestre (ou tous si pas d'argument)"
|
"expire cache pour un semestre (ou tous si pas d'argument)"
|
||||||
@ -144,7 +144,7 @@ class CacheNotesTable:
|
|||||||
)
|
)
|
||||||
if not pdfonly:
|
if not pdfonly:
|
||||||
for formsemestre_id in to_trash:
|
for formsemestre_id in to_trash:
|
||||||
if self.cache.has_key(formsemestre_id):
|
if formsemestre_id in self.cache:
|
||||||
log(
|
log(
|
||||||
"delete %s from cache (id=%s)"
|
"delete %s from cache (id=%s)"
|
||||||
% (formsemestre_id, id(self))
|
% (formsemestre_id, id(self))
|
||||||
@ -191,7 +191,7 @@ class CacheNotesTable:
|
|||||||
if r:
|
if r:
|
||||||
log(
|
log(
|
||||||
"get_bulletins_pdf(%s): cache hit %s (id=%s, thread=%s)"
|
"get_bulletins_pdf(%s): cache hit %s (id=%s, thread=%s)"
|
||||||
% (version, formsemestre_id, id(self), thread.get_ident())
|
% (version, formsemestre_id, id(self), six.moves._thread.get_ident())
|
||||||
)
|
)
|
||||||
return r
|
return r
|
||||||
finally:
|
finally:
|
||||||
@ -219,7 +219,7 @@ class CacheNotesTable:
|
|||||||
def get_notes_cache(context):
|
def get_notes_cache(context):
|
||||||
"returns CacheNotesTable instance for us"
|
"returns CacheNotesTable instance for us"
|
||||||
u = sco_mgr.get_db_uri() # identifie le dept de facon unique
|
u = sco_mgr.get_db_uri() # identifie le dept de facon unique
|
||||||
if not NOTES_CACHE_INST.has_key(u):
|
if u not in NOTES_CACHE_INST:
|
||||||
log("getNotesCache: creating cache for %s" % u)
|
log("getNotesCache: creating cache for %s" % u)
|
||||||
NOTES_CACHE_INST[u] = CacheNotesTable()
|
NOTES_CACHE_INST[u] = CacheNotesTable()
|
||||||
return NOTES_CACHE_INST[u]
|
return NOTES_CACHE_INST[u]
|
||||||
@ -247,7 +247,7 @@ def inval_cache(
|
|||||||
# Cache inscriptions semestres
|
# Cache inscriptions semestres
|
||||||
def get_formsemestre_inscription_cache(context, format=None):
|
def get_formsemestre_inscription_cache(context, format=None):
|
||||||
u = sco_mgr.get_db_uri()
|
u = sco_mgr.get_db_uri()
|
||||||
if CACHE_formsemestre_inscription.has_key(u):
|
if u in CACHE_formsemestre_inscription:
|
||||||
return CACHE_formsemestre_inscription[u]
|
return CACHE_formsemestre_inscription[u]
|
||||||
else:
|
else:
|
||||||
log("get_formsemestre_inscription_cache: new simpleCache")
|
log("get_formsemestre_inscription_cache: new simpleCache")
|
||||||
|
@ -110,7 +110,7 @@ def table_debouche_etudids(context, etudids, keep_numeric=True):
|
|||||||
etud = sco_etud.get_etud_info(filled=1, etudid=etudid)[0]
|
etud = sco_etud.get_etud_info(filled=1, etudid=etudid)[0]
|
||||||
# retrouve le "dernier" semestre (au sens de la date de fin)
|
# retrouve le "dernier" semestre (au sens de la date de fin)
|
||||||
sems = etud["sems"]
|
sems = etud["sems"]
|
||||||
es = [(sems[i]["date_fin_iso"], i) for i in range(len(sems))]
|
es = [(s["date_fin-iso"], i) for i, s in enumerate(sems)]
|
||||||
imax = max(es)[1]
|
imax = max(es)[1]
|
||||||
last_sem = sems[imax]
|
last_sem = sems[imax]
|
||||||
nt = sco_core.get_notes_cache(
|
nt = sco_core.get_notes_cache(
|
||||||
|
@ -265,14 +265,14 @@ def do_formation_create(context, args, REQUEST):
|
|||||||
cnx = ndb.GetDBConnexion()
|
cnx = ndb.GetDBConnexion()
|
||||||
# check unique acronyme/titre/version
|
# check unique acronyme/titre/version
|
||||||
a = args.copy()
|
a = args.copy()
|
||||||
if a.has_key("formation_id"):
|
if "formation_id" in a:
|
||||||
del a["formation_id"]
|
del a["formation_id"]
|
||||||
F = sco_formations.formation_list(context, args=a)
|
F = sco_formations.formation_list(context, args=a)
|
||||||
if len(F) > 0:
|
if len(F) > 0:
|
||||||
log("do_formation_create: error: %d formations matching args=%s" % (len(F), a))
|
log("do_formation_create: error: %d formations matching args=%s" % (len(F), a))
|
||||||
raise ScoValueError("Formation non unique (%s) !" % str(a))
|
raise ScoValueError("Formation non unique (%s) !" % str(a))
|
||||||
# Si pas de formation_code, l'enleve (default SQL)
|
# Si pas de formation_code, l'enleve (default SQL)
|
||||||
if args.has_key("formation_code") and not args["formation_code"]:
|
if "formation_code" in args and not args["formation_code"]:
|
||||||
del args["formation_code"]
|
del args["formation_code"]
|
||||||
#
|
#
|
||||||
r = sco_formations._formationEditor.create(cnx, args)
|
r = sco_formations._formationEditor.create(cnx, args)
|
||||||
@ -294,10 +294,10 @@ def do_formation_edit(context, args):
|
|||||||
# car cela ne change que du cosmetique, (sauf eventuellement le code formation ?)
|
# car cela ne change que du cosmetique, (sauf eventuellement le code formation ?)
|
||||||
# mais si verrouillée on ne peut changer le type de parcours
|
# mais si verrouillée on ne peut changer le type de parcours
|
||||||
if sco_formations.formation_has_locked_sems(context, args["formation_id"]):
|
if sco_formations.formation_has_locked_sems(context, args["formation_id"]):
|
||||||
if args.has_key("type_parcours"):
|
if "type_parcours" in args:
|
||||||
del args["type_parcours"]
|
del args["type_parcours"]
|
||||||
# On ne peut jamais supprimer le code formation:
|
# On ne peut jamais supprimer le code formation:
|
||||||
if args.has_key("formation_code") and not args["formation_code"]:
|
if "formation_code" in args and not args["formation_code"]:
|
||||||
del args["formation_code"]
|
del args["formation_code"]
|
||||||
|
|
||||||
cnx = ndb.GetDBConnexion()
|
cnx = ndb.GetDBConnexion()
|
||||||
|
@ -133,7 +133,7 @@ def module_create(context, matiere_id=None, REQUEST=None):
|
|||||||
context, args={"formation_id": UE["formation_id"]}
|
context, args={"formation_id": UE["formation_id"]}
|
||||||
)[0]
|
)[0]
|
||||||
parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"])
|
parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"])
|
||||||
semestres_indices = range(1, parcours.NB_SEM + 1)
|
semestres_indices = list(range(1, parcours.NB_SEM + 1))
|
||||||
H = [
|
H = [
|
||||||
html_sco_header.sco_header(context, REQUEST, page_title="Création d'un module"),
|
html_sco_header.sco_header(context, REQUEST, page_title="Création d'un module"),
|
||||||
"""<h2>Création d'un module dans la matière %(titre)s""" % M,
|
"""<h2>Création d'un module dans la matière %(titre)s""" % M,
|
||||||
@ -374,7 +374,7 @@ def module_edit(context, module_id=None, REQUEST=None):
|
|||||||
Mids = ["%s!%s" % (x["ue_id"], x["matiere_id"]) for x in M]
|
Mids = ["%s!%s" % (x["ue_id"], x["matiere_id"]) for x in M]
|
||||||
Mod["ue_matiere_id"] = "%s!%s" % (Mod["ue_id"], Mod["matiere_id"])
|
Mod["ue_matiere_id"] = "%s!%s" % (Mod["ue_id"], Mod["matiere_id"])
|
||||||
|
|
||||||
semestres_indices = range(1, parcours.NB_SEM + 1)
|
semestres_indices = list(range(1, parcours.NB_SEM + 1))
|
||||||
|
|
||||||
dest_url = scu.NotesURL() + "/ue_list?formation_id=" + Mod["formation_id"]
|
dest_url = scu.NotesURL() + "/ue_list?formation_id=" + Mod["formation_id"]
|
||||||
|
|
||||||
|
@ -300,7 +300,7 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None):
|
|||||||
]
|
]
|
||||||
if parcours.UE_IS_MODULE:
|
if parcours.UE_IS_MODULE:
|
||||||
# demande le semestre pour creer le module immediatement:
|
# demande le semestre pour creer le module immediatement:
|
||||||
semestres_indices = range(1, parcours.NB_SEM + 1)
|
semestres_indices = list(range(1, parcours.NB_SEM + 1))
|
||||||
fw.append(
|
fw.append(
|
||||||
(
|
(
|
||||||
"semestre_id",
|
"semestre_id",
|
||||||
@ -901,7 +901,7 @@ def do_ue_edit(context, args, bypass_lock=False, dont_invalidate_cache=False):
|
|||||||
if (not bypass_lock) and ue_is_locked(context, ue["ue_id"]):
|
if (not bypass_lock) and ue_is_locked(context, ue["ue_id"]):
|
||||||
raise ScoLockedFormError()
|
raise ScoLockedFormError()
|
||||||
# check: acronyme unique dans cette formation
|
# check: acronyme unique dans cette formation
|
||||||
if args.has_key("acronyme"):
|
if "acronyme" in args:
|
||||||
new_acro = args["acronyme"]
|
new_acro = args["acronyme"]
|
||||||
ues = do_ue_list(
|
ues = do_ue_list(
|
||||||
context, {"formation_id": ue["formation_id"], "acronyme": new_acro}
|
context, {"formation_id": ue["formation_id"], "acronyme": new_acro}
|
||||||
@ -910,7 +910,7 @@ def do_ue_edit(context, args, bypass_lock=False, dont_invalidate_cache=False):
|
|||||||
raise ScoValueError('Acronyme d\'UE "%s" déjà utilisé !' % args["acronyme"])
|
raise ScoValueError('Acronyme d\'UE "%s" déjà utilisé !' % args["acronyme"])
|
||||||
|
|
||||||
# On ne peut pas supprimer le code UE:
|
# On ne peut pas supprimer le code UE:
|
||||||
if args.has_key("ue_code") and not args["ue_code"]:
|
if "ue_code" in args and not args["ue_code"]:
|
||||||
del args["ue_code"]
|
del args["ue_code"]
|
||||||
|
|
||||||
cnx = ndb.GetDBConnexion()
|
cnx = ndb.GetDBConnexion()
|
||||||
|
@ -33,7 +33,7 @@ XXX incompatible avec les ics HyperPlanning Paris 13 (était pour GPU).
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import urllib2
|
import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
|
||||||
import traceback
|
import traceback
|
||||||
import icalendar
|
import icalendar
|
||||||
import pprint
|
import pprint
|
||||||
@ -80,7 +80,7 @@ def formsemestre_load_ics(context, sem):
|
|||||||
ics_data = ""
|
ics_data = ""
|
||||||
else:
|
else:
|
||||||
log("Loading edt from %s" % ics_url)
|
log("Loading edt from %s" % ics_url)
|
||||||
f = urllib2.urlopen(
|
f = six.moves.urllib.request.urlopen(
|
||||||
ics_url, timeout=5
|
ics_url, timeout=5
|
||||||
) # 5s TODO: add config parameter, eg for slow networks
|
) # 5s TODO: add config parameter, eg for slow networks
|
||||||
ics_data = f.read()
|
ics_data = f.read()
|
||||||
|
@ -116,7 +116,7 @@ class EntreprisesEditor(EditableTable):
|
|||||||
for key in r:
|
for key in r:
|
||||||
v = r[key]
|
v = r[key]
|
||||||
# format value
|
# format value
|
||||||
if not disable_formatting and self.output_formators.has_key(key):
|
if not disable_formatting and key in self.output_formators:
|
||||||
v = self.output_formators[key](v)
|
v = self.output_formators[key](v)
|
||||||
d[key] = v
|
d[key] = v
|
||||||
R.append(d)
|
R.append(d)
|
||||||
|
@ -521,7 +521,7 @@ def view_apo_etuds(context, semset_id, title="", nips=[], format="html", REQUEST
|
|||||||
context,
|
context,
|
||||||
semset_id,
|
semset_id,
|
||||||
title=title,
|
title=title,
|
||||||
etuds=etuds.values(),
|
etuds=list(etuds.values()),
|
||||||
keys=("nip", "etape_apo", "nom", "prenom", "inscriptions_scodoc"),
|
keys=("nip", "etape_apo", "nom", "prenom", "inscriptions_scodoc"),
|
||||||
format=format,
|
format=format,
|
||||||
REQUEST=REQUEST,
|
REQUEST=REQUEST,
|
||||||
|
@ -711,7 +711,7 @@ class EtapeBilan:
|
|||||||
rows = []
|
rows = []
|
||||||
|
|
||||||
for data_etu in sorted(
|
for data_etu in sorted(
|
||||||
self.etudiants.values(), key=lambda etu: etu.get_identity()
|
list(self.etudiants.values()), key=lambda etu: etu.get_identity()
|
||||||
):
|
):
|
||||||
nip = data_etu.nip
|
nip = data_etu.nip
|
||||||
etudid = data_etu.etudid
|
etudid = data_etu.etudid
|
||||||
|
@ -339,7 +339,7 @@ def _check_duplicate_code(cnx, args, code_name, context, edit=True, REQUEST=None
|
|||||||
dest_url = "ficheEtud"
|
dest_url = "ficheEtud"
|
||||||
parameters = {"etudid": etudid}
|
parameters = {"etudid": etudid}
|
||||||
else:
|
else:
|
||||||
if args.has_key("tf-submitted"):
|
if "tf-submitted" in args:
|
||||||
del args["tf-submitted"]
|
del args["tf-submitted"]
|
||||||
OK = "Continuer"
|
OK = "Continuer"
|
||||||
dest_url = "etudident_create_form"
|
dest_url = "etudident_create_form"
|
||||||
@ -407,7 +407,7 @@ def identite_create(cnx, args, context=None, REQUEST=None):
|
|||||||
_check_duplicate_code(cnx, args, "code_nip", context, edit=False, REQUEST=REQUEST)
|
_check_duplicate_code(cnx, args, "code_nip", context, edit=False, REQUEST=REQUEST)
|
||||||
_check_duplicate_code(cnx, args, "code_ine", context, edit=False, REQUEST=REQUEST)
|
_check_duplicate_code(cnx, args, "code_ine", context, edit=False, REQUEST=REQUEST)
|
||||||
|
|
||||||
if args.has_key("etudid"):
|
if "etudid" in args:
|
||||||
etudid = args["etudid"]
|
etudid = args["etudid"]
|
||||||
r = identite_list(cnx, {"etudid": etudid})
|
r = identite_list(cnx, {"etudid": etudid})
|
||||||
if r:
|
if r:
|
||||||
@ -593,7 +593,7 @@ class EtudIdentEditor:
|
|||||||
res = []
|
res = []
|
||||||
for i in R:
|
for i in R:
|
||||||
res.append(i)
|
res.append(i)
|
||||||
if A.has_key(i["etudid"]):
|
if i["etudid"] in A:
|
||||||
# merge
|
# merge
|
||||||
res[-1].update(A[i["etudid"]])
|
res[-1].update(A[i["etudid"]])
|
||||||
else: # pas d'etudiant trouve
|
else: # pas d'etudiant trouve
|
||||||
@ -632,11 +632,11 @@ def make_etud_args(etudid=None, code_nip=None, REQUEST=None, raise_exc=True):
|
|||||||
elif code_nip:
|
elif code_nip:
|
||||||
args = {"code_nip": code_nip}
|
args = {"code_nip": code_nip}
|
||||||
elif REQUEST:
|
elif REQUEST:
|
||||||
if REQUEST.form.has_key("etudid"):
|
if "etudid" in REQUEST.form:
|
||||||
args = {"etudid": REQUEST.form["etudid"]}
|
args = {"etudid": REQUEST.form["etudid"]}
|
||||||
elif REQUEST.form.has_key("code_nip"):
|
elif "code_nip" in REQUEST.form:
|
||||||
args = {"code_nip": REQUEST.form["code_nip"]}
|
args = {"code_nip": REQUEST.form["code_nip"]}
|
||||||
elif REQUEST.form.has_key("code_ine"):
|
elif "code_ine" in REQUEST.form:
|
||||||
args = {"code_ine": REQUEST.form["code_ine"]}
|
args = {"code_ine": REQUEST.form["code_ine"]}
|
||||||
if not args and raise_exc:
|
if not args and raise_exc:
|
||||||
raise ValueError("getEtudInfo: no parameter !")
|
raise ValueError("getEtudInfo: no parameter !")
|
||||||
|
@ -31,7 +31,7 @@ import datetime
|
|||||||
import operator
|
import operator
|
||||||
import pprint
|
import pprint
|
||||||
import time
|
import time
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
|
|
||||||
from app.scodoc.notes_log import log, logCallStack
|
from app.scodoc.notes_log import log, logCallStack
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
@ -481,7 +481,7 @@ def do_evaluation_etat(
|
|||||||
groups[group["group_id"]] = group
|
groups[group["group_id"]] = group
|
||||||
#
|
#
|
||||||
isMissing = False
|
isMissing = False
|
||||||
if NotesDB.has_key(i["etudid"]):
|
if i["etudid"] in NotesDB:
|
||||||
val = NotesDB[i["etudid"]]["value"]
|
val = NotesDB[i["etudid"]]["value"]
|
||||||
if val == scu.NOTES_ATTENTE:
|
if val == scu.NOTES_ATTENTE:
|
||||||
isMissing = True
|
isMissing = True
|
||||||
@ -792,7 +792,7 @@ def formsemestre_evaluations_cal(context, formsemestre_id, REQUEST=None):
|
|||||||
e[2] = color_futur
|
e[2] = color_futur
|
||||||
|
|
||||||
CalHTML = sco_abs.YearTable(
|
CalHTML = sco_abs.YearTable(
|
||||||
context, year, events=events.values(), halfday=False, pad_width=None
|
context, year, events=list(events.values()), halfday=False, pad_width=None
|
||||||
)
|
)
|
||||||
|
|
||||||
H = [
|
H = [
|
||||||
@ -840,12 +840,16 @@ def evaluation_date_first_completion(context, evaluation_id):
|
|||||||
# retire de insem ceux qui ne sont pas inscrits au module
|
# retire de insem ceux qui ne sont pas inscrits au module
|
||||||
# ins = [i for i in insem if i["etudid"] in insmodset]
|
# ins = [i for i in insem if i["etudid"] in insmodset]
|
||||||
|
|
||||||
notes = do_evaluation_get_all_notes(
|
notes = list(
|
||||||
context, evaluation_id, filter_suppressed=False
|
do_evaluation_get_all_notes(
|
||||||
).values()
|
context, evaluation_id, filter_suppressed=False
|
||||||
notes_log = do_evaluation_get_all_notes(
|
).values()
|
||||||
context, evaluation_id, filter_suppressed=False, table="notes_notes_log"
|
)
|
||||||
).values()
|
notes_log = list(
|
||||||
|
do_evaluation_get_all_notes(
|
||||||
|
context, evaluation_id, filter_suppressed=False, table="notes_notes_log"
|
||||||
|
).values()
|
||||||
|
)
|
||||||
date_premiere_note = {} # etudid : date
|
date_premiere_note = {} # etudid : date
|
||||||
for note in notes + notes_log:
|
for note in notes + notes_log:
|
||||||
etudid = note["etudid"]
|
etudid = note["etudid"]
|
||||||
@ -1102,7 +1106,11 @@ def evaluation_describe(context, evaluation_id="", edit_in_place=True, REQUEST=N
|
|||||||
group_id = sco_groups.get_default_group(context, formsemestre_id)
|
group_id = sco_groups.get_default_group(context, formsemestre_id)
|
||||||
H.append(
|
H.append(
|
||||||
'<span class="noprint"><a href="%s/Absences/EtatAbsencesDate?group_ids=%s&date=%s">(absences ce jour)</a></span>'
|
'<span class="noprint"><a href="%s/Absences/EtatAbsencesDate?group_ids=%s&date=%s">(absences ce jour)</a></span>'
|
||||||
% (scu.ScoURL(), group_id, urllib.quote(E["jour"], safe=""))
|
% (
|
||||||
|
scu.ScoURL(),
|
||||||
|
group_id,
|
||||||
|
six.moves.urllib.parse.quote(E["jour"], safe=""),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
H.append(
|
H.append(
|
||||||
'</p><p>Coefficient dans le module: <b>%s</b>, notes sur <span id="eval_note_max">%g</span> '
|
'</p><p>Coefficient dans le module: <b>%s</b>, notes sur <span id="eval_note_max">%g</span> '
|
||||||
@ -1249,8 +1257,9 @@ def evaluation_create_form(
|
|||||||
initvalues["visibulletinlist"] = ["X"]
|
initvalues["visibulletinlist"] = ["X"]
|
||||||
else:
|
else:
|
||||||
initvalues["visibulletinlist"] = []
|
initvalues["visibulletinlist"] = []
|
||||||
if REQUEST.form.get("tf-submitted", False) and not REQUEST.form.has_key(
|
if (
|
||||||
"visibulletinlist"
|
REQUEST.form.get("tf-submitted", False)
|
||||||
|
and "visibulletinlist" not in REQUEST.form
|
||||||
):
|
):
|
||||||
REQUEST.form["visibulletinlist"] = []
|
REQUEST.form["visibulletinlist"] = []
|
||||||
#
|
#
|
||||||
|
@ -39,6 +39,7 @@ from app.scodoc.notes_log import log
|
|||||||
from app.scodoc.scolog import logdb
|
from app.scodoc.scolog import logdb
|
||||||
from app.scodoc.sco_exceptions import ScoValueError
|
from app.scodoc.sco_exceptions import ScoValueError
|
||||||
from app.scodoc import sco_preferences
|
from app.scodoc import sco_preferences
|
||||||
|
import six
|
||||||
|
|
||||||
|
|
||||||
# colors, voir exemple format.py
|
# colors, voir exemple format.py
|
||||||
@ -454,7 +455,7 @@ def Excel_to_list(data, convert_to_string=str): # we may need 'encoding' argume
|
|||||||
if not values:
|
if not values:
|
||||||
diag.append("Aucune valeur trouvée dans le classeur !")
|
diag.append("Aucune valeur trouvée dans le classeur !")
|
||||||
return diag, None
|
return diag, None
|
||||||
indexes = values.keys()
|
indexes = list(values.keys())
|
||||||
# search numbers of rows and cols
|
# search numbers of rows and cols
|
||||||
rows = [x[0] for x in indexes]
|
rows = [x[0] for x in indexes]
|
||||||
cols = [x[1] for x in indexes]
|
cols = [x[1] for x in indexes]
|
||||||
@ -466,7 +467,7 @@ def Excel_to_list(data, convert_to_string=str): # we may need 'encoding' argume
|
|||||||
|
|
||||||
for row_idx, col_idx in indexes:
|
for row_idx, col_idx in indexes:
|
||||||
v = values[(row_idx, col_idx)]
|
v = values[(row_idx, col_idx)]
|
||||||
if isinstance(v, unicode):
|
if isinstance(v, six.text_type):
|
||||||
v = v.encode(scu.SCO_ENCODING, "backslashreplace")
|
v = v.encode(scu.SCO_ENCODING, "backslashreplace")
|
||||||
elif convert_to_string:
|
elif convert_to_string:
|
||||||
v = convert_to_string(v)
|
v = convert_to_string(v)
|
||||||
|
@ -243,7 +243,7 @@ def do_formsemestre_create(context, args, REQUEST, silent=False):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# news
|
# news
|
||||||
if not args.has_key("titre"):
|
if "titre" not in args:
|
||||||
args["titre"] = "sans titre"
|
args["titre"] = "sans titre"
|
||||||
args["formsemestre_id"] = formsemestre_id
|
args["formsemestre_id"] = formsemestre_id
|
||||||
args["url"] = "Notes/formsemestre_status?formsemestre_id=%(formsemestre_id)s" % args
|
args["url"] = "Notes/formsemestre_status?formsemestre_id=%(formsemestre_id)s" % args
|
||||||
@ -622,7 +622,7 @@ def list_formsemestre_by_etape(
|
|||||||
context, sem, year=int(annee_scolaire), REQUEST=REQUEST
|
context, sem, year=int(annee_scolaire), REQUEST=REQUEST
|
||||||
):
|
):
|
||||||
ds[sem["formsemestre_id"]] = sem
|
ds[sem["formsemestre_id"]] = sem
|
||||||
sems = ds.values()
|
sems = list(ds.values())
|
||||||
else:
|
else:
|
||||||
sems = do_formsemestre_list(context)
|
sems = do_formsemestre_list(context)
|
||||||
if annee_scolaire:
|
if annee_scolaire:
|
||||||
|
@ -56,6 +56,7 @@ from app.scodoc import sco_permissions_check
|
|||||||
from app.scodoc import sco_portal_apogee
|
from app.scodoc import sco_portal_apogee
|
||||||
from app.scodoc import sco_preferences
|
from app.scodoc import sco_preferences
|
||||||
from app.scodoc import sco_users
|
from app.scodoc import sco_users
|
||||||
|
import six
|
||||||
|
|
||||||
|
|
||||||
def _default_sem_title(F):
|
def _default_sem_title(F):
|
||||||
@ -77,7 +78,7 @@ def formsemestre_createwithmodules(context, REQUEST=None):
|
|||||||
"""<h2>Mise en place d'un semestre de formation</h2>""",
|
"""<h2>Mise en place d'un semestre de formation</h2>""",
|
||||||
]
|
]
|
||||||
r = do_formsemestre_createwithmodules(context, REQUEST=REQUEST)
|
r = do_formsemestre_createwithmodules(context, REQUEST=REQUEST)
|
||||||
if isinstance(r, basestring):
|
if isinstance(r, six.string_types):
|
||||||
H.append(r)
|
H.append(r)
|
||||||
else:
|
else:
|
||||||
return r # response redirect
|
return r # response redirect
|
||||||
@ -106,7 +107,7 @@ def formsemestre_editwithmodules(context, REQUEST, formsemestre_id):
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
r = do_formsemestre_createwithmodules(context, REQUEST=REQUEST, edit=1)
|
r = do_formsemestre_createwithmodules(context, REQUEST=REQUEST, edit=1)
|
||||||
if isinstance(r, basestring):
|
if isinstance(r, six.string_types):
|
||||||
H.append(r)
|
H.append(r)
|
||||||
else:
|
else:
|
||||||
return r # response redirect
|
return r # response redirect
|
||||||
@ -153,7 +154,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
|||||||
login2display = {} # user_name : forme pour affichage = "NOM Prenom (login)"
|
login2display = {} # user_name : forme pour affichage = "NOM Prenom (login)"
|
||||||
for u in userlist:
|
for u in userlist:
|
||||||
login2display[u.user_name] = u.get_nomplogin()
|
login2display[u.user_name] = u.get_nomplogin()
|
||||||
allowed_user_names = login2display.values() + [""]
|
allowed_user_names = list(login2display.values()) + [""]
|
||||||
#
|
#
|
||||||
formation_id = REQUEST.form["formation_id"]
|
formation_id = REQUEST.form["formation_id"]
|
||||||
F = sco_formations.formation_list(context, args={"formation_id": formation_id})
|
F = sco_formations.formation_list(context, args={"formation_id": formation_id})
|
||||||
@ -239,7 +240,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
|||||||
semestre_ids = {}
|
semestre_ids = {}
|
||||||
for mod in mods:
|
for mod in mods:
|
||||||
semestre_ids[mod["semestre_id"]] = 1
|
semestre_ids[mod["semestre_id"]] = 1
|
||||||
semestre_ids = semestre_ids.keys()
|
semestre_ids = list(semestre_ids.keys())
|
||||||
semestre_ids.sort()
|
semestre_ids.sort()
|
||||||
|
|
||||||
modalites = sco_modalites.do_modalite_list(context)
|
modalites = sco_modalites.do_modalite_list(context)
|
||||||
@ -632,8 +633,9 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
|||||||
initvalues["gestion_compensation_lst"] = ["X"]
|
initvalues["gestion_compensation_lst"] = ["X"]
|
||||||
else:
|
else:
|
||||||
initvalues["gestion_compensation_lst"] = []
|
initvalues["gestion_compensation_lst"] = []
|
||||||
if REQUEST.form.get("tf-submitted", False) and not REQUEST.form.has_key(
|
if (
|
||||||
"gestion_compensation_lst"
|
REQUEST.form.get("tf-submitted", False)
|
||||||
|
and "gestion_compensation_lst" not in REQUEST.form
|
||||||
):
|
):
|
||||||
REQUEST.form["gestion_compensation_lst"] = []
|
REQUEST.form["gestion_compensation_lst"] = []
|
||||||
|
|
||||||
@ -642,8 +644,9 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
|||||||
initvalues["gestion_semestrielle_lst"] = ["X"]
|
initvalues["gestion_semestrielle_lst"] = ["X"]
|
||||||
else:
|
else:
|
||||||
initvalues["gestion_semestrielle_lst"] = []
|
initvalues["gestion_semestrielle_lst"] = []
|
||||||
if REQUEST.form.get("tf-submitted", False) and not REQUEST.form.has_key(
|
if (
|
||||||
"gestion_semestrielle_lst"
|
REQUEST.form.get("tf-submitted", False)
|
||||||
|
and "gestion_semestrielle_lst" not in REQUEST.form
|
||||||
):
|
):
|
||||||
REQUEST.form["gestion_semestrielle_lst"] = []
|
REQUEST.form["gestion_semestrielle_lst"] = []
|
||||||
|
|
||||||
@ -652,8 +655,9 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
|||||||
initvalues["bul_publish_xml_lst"] = ["X"]
|
initvalues["bul_publish_xml_lst"] = ["X"]
|
||||||
else:
|
else:
|
||||||
initvalues["bul_publish_xml_lst"] = []
|
initvalues["bul_publish_xml_lst"] = []
|
||||||
if REQUEST.form.get("tf-submitted", False) and not REQUEST.form.has_key(
|
if (
|
||||||
"bul_publish_xml_lst"
|
REQUEST.form.get("tf-submitted", False)
|
||||||
|
and "bul_publish_xml_lst" not in REQUEST.form
|
||||||
):
|
):
|
||||||
REQUEST.form["bul_publish_xml_lst"] = []
|
REQUEST.form["bul_publish_xml_lst"] = []
|
||||||
|
|
||||||
@ -897,7 +901,7 @@ def formsemestre_clone(context, formsemestre_id, REQUEST=None):
|
|||||||
login2display = {} # user_name : forme pour affichage = "NOM Prenom (login)"
|
login2display = {} # user_name : forme pour affichage = "NOM Prenom (login)"
|
||||||
for u in userlist:
|
for u in userlist:
|
||||||
login2display[u.user_name] = u.get_nomplogin()
|
login2display[u.user_name] = u.get_nomplogin()
|
||||||
allowed_user_names = login2display.values() + [""]
|
allowed_user_names = list(login2display.values()) + [""]
|
||||||
|
|
||||||
initvalues = {
|
initvalues = {
|
||||||
"formsemestre_id": sem["formsemestre_id"],
|
"formsemestre_id": sem["formsemestre_id"],
|
||||||
|
@ -568,11 +568,11 @@ function chkbx_select(field_id, state) {
|
|||||||
for ue in ues:
|
for ue in ues:
|
||||||
ue_id = ue["ue_id"]
|
ue_id = ue["ue_id"]
|
||||||
for moduleimpl_id in tf[2]["moduleimpls_%s" % ue_id]:
|
for moduleimpl_id in tf[2]["moduleimpls_%s" % ue_id]:
|
||||||
if a_desinscrire.has_key(moduleimpl_id):
|
if moduleimpl_id in a_desinscrire:
|
||||||
del a_desinscrire[moduleimpl_id]
|
del a_desinscrire[moduleimpl_id]
|
||||||
# supprime ceux auxquel pas inscrit
|
# supprime ceux auxquel pas inscrit
|
||||||
for moduleimpl_id in a_desinscrire.keys():
|
for moduleimpl_id in a_desinscrire.keys():
|
||||||
if not insdict.has_key(moduleimpl_id):
|
if moduleimpl_id not in insdict:
|
||||||
del a_desinscrire[moduleimpl_id]
|
del a_desinscrire[moduleimpl_id]
|
||||||
|
|
||||||
a_inscrire = set()
|
a_inscrire = set()
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
"""Tableau de bord semestre
|
"""Tableau de bord semestre
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
import cgi
|
import cgi
|
||||||
|
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
@ -482,9 +482,9 @@ def retreive_formsemestre_from_request(context, REQUEST):
|
|||||||
"""
|
"""
|
||||||
# Search formsemestre
|
# Search formsemestre
|
||||||
group_ids = REQUEST.form.get("group_ids", [])
|
group_ids = REQUEST.form.get("group_ids", [])
|
||||||
if REQUEST.form.has_key("formsemestre_id"):
|
if "formsemestre_id" in REQUEST.form:
|
||||||
formsemestre_id = REQUEST.form["formsemestre_id"]
|
formsemestre_id = REQUEST.form["formsemestre_id"]
|
||||||
elif REQUEST.form.has_key("moduleimpl_id"):
|
elif "moduleimpl_id" in REQUEST.form:
|
||||||
modimpl = sco_moduleimpl.do_moduleimpl_list(
|
modimpl = sco_moduleimpl.do_moduleimpl_list(
|
||||||
context, moduleimpl_id=REQUEST.form["moduleimpl_id"]
|
context, moduleimpl_id=REQUEST.form["moduleimpl_id"]
|
||||||
)
|
)
|
||||||
@ -492,7 +492,7 @@ def retreive_formsemestre_from_request(context, REQUEST):
|
|||||||
return None # suppressed ?
|
return None # suppressed ?
|
||||||
modimpl = modimpl[0]
|
modimpl = modimpl[0]
|
||||||
formsemestre_id = modimpl["formsemestre_id"]
|
formsemestre_id = modimpl["formsemestre_id"]
|
||||||
elif REQUEST.form.has_key("evaluation_id"):
|
elif "evaluation_id" in REQUEST.form:
|
||||||
E = sco_evaluations.do_evaluation_list(
|
E = sco_evaluations.do_evaluation_list(
|
||||||
context, {"evaluation_id": REQUEST.form["evaluation_id"]}
|
context, {"evaluation_id": REQUEST.form["evaluation_id"]}
|
||||||
)
|
)
|
||||||
@ -503,7 +503,7 @@ def retreive_formsemestre_from_request(context, REQUEST):
|
|||||||
context, moduleimpl_id=E["moduleimpl_id"]
|
context, moduleimpl_id=E["moduleimpl_id"]
|
||||||
)[0]
|
)[0]
|
||||||
formsemestre_id = modimpl["formsemestre_id"]
|
formsemestre_id = modimpl["formsemestre_id"]
|
||||||
elif REQUEST.form.has_key("group_id"):
|
elif "group_id" in REQUEST.form:
|
||||||
group = sco_groups.get_group(context, REQUEST.form["group_id"])
|
group = sco_groups.get_group(context, REQUEST.form["group_id"])
|
||||||
formsemestre_id = group["formsemestre_id"]
|
formsemestre_id = group["formsemestre_id"]
|
||||||
elif group_ids:
|
elif group_ids:
|
||||||
@ -515,7 +515,7 @@ def retreive_formsemestre_from_request(context, REQUEST):
|
|||||||
group_id = group_ids[0]
|
group_id = group_ids[0]
|
||||||
group = sco_groups.get_group(context, group_id)
|
group = sco_groups.get_group(context, group_id)
|
||||||
formsemestre_id = group["formsemestre_id"]
|
formsemestre_id = group["formsemestre_id"]
|
||||||
elif REQUEST.form.has_key("partition_id"):
|
elif "partition_id" in REQUEST.form:
|
||||||
partition = sco_groups.get_partition(context, REQUEST.form["partition_id"])
|
partition = sco_groups.get_partition(context, REQUEST.form["partition_id"])
|
||||||
formsemestre_id = partition["formsemestre_id"]
|
formsemestre_id = partition["formsemestre_id"]
|
||||||
else:
|
else:
|
||||||
@ -781,7 +781,7 @@ def _make_listes_sem(context, sem, REQUEST=None, with_absences=True):
|
|||||||
query_args = cgi.parse_qs(REQUEST.QUERY_STRING)
|
query_args = cgi.parse_qs(REQUEST.QUERY_STRING)
|
||||||
if "head_message" in query_args:
|
if "head_message" in query_args:
|
||||||
del query_args["head_message"]
|
del query_args["head_message"]
|
||||||
destination = "%s?%s" % (REQUEST.URL, urllib.urlencode(query_args, True))
|
destination = "%s?%s" % (REQUEST.URL, six.moves.urllib.parse.urlencode(query_args, True))
|
||||||
destination = destination.replace(
|
destination = destination.replace(
|
||||||
"%", "%%"
|
"%", "%%"
|
||||||
) # car ici utilisee dans un format string !
|
) # car ici utilisee dans un format string !
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
"""Semestres: validation semestre et UE dans parcours
|
"""Semestres: validation semestre et UE dans parcours
|
||||||
"""
|
"""
|
||||||
import urllib, time, datetime
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error, time, datetime
|
||||||
|
|
||||||
import app.scodoc.notesdb as ndb
|
import app.scodoc.notesdb as ndb
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
@ -618,7 +618,7 @@ def formsemestre_recap_parcours_table(
|
|||||||
|
|
||||||
# UEs
|
# UEs
|
||||||
for ue in ues:
|
for ue in ues:
|
||||||
if decisions_ue and decisions_ue.has_key(ue["ue_id"]):
|
if decisions_ue and ue["ue_id"] in decisions_ue:
|
||||||
code = decisions_ue[ue["ue_id"]]["code"]
|
code = decisions_ue[ue["ue_id"]]["code"]
|
||||||
else:
|
else:
|
||||||
code = ""
|
code = ""
|
||||||
@ -732,7 +732,7 @@ def form_decision_manuelle(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Choix code semestre:
|
# Choix code semestre:
|
||||||
codes = sco_codes_parcours.CODES_EXPL.keys()
|
codes = list(sco_codes_parcours.CODES_EXPL.keys())
|
||||||
codes.sort() # fortuitement, cet ordre convient bien !
|
codes.sort() # fortuitement, cet ordre convient bien !
|
||||||
|
|
||||||
H.append(
|
H.append(
|
||||||
@ -789,7 +789,7 @@ def form_decision_manuelle(
|
|||||||
H.append("</select></td></tr>")
|
H.append("</select></td></tr>")
|
||||||
|
|
||||||
# Choix code devenir
|
# Choix code devenir
|
||||||
codes = sco_codes_parcours.DEVENIR_EXPL.keys()
|
codes = list(sco_codes_parcours.DEVENIR_EXPL.keys())
|
||||||
codes.sort() # fortuitement, cet ordre convient aussi bien !
|
codes.sort() # fortuitement, cet ordre convient aussi bien !
|
||||||
|
|
||||||
if Se.sem["semestre_id"] == -1:
|
if Se.sem["semestre_id"] == -1:
|
||||||
@ -1146,7 +1146,7 @@ def formsemestre_validate_previous_ue(context, formsemestre_id, etudid, REQUEST=
|
|||||||
"explanation": "Facultatif: indice du semestre dans la formation",
|
"explanation": "Facultatif: indice du semestre dans la formation",
|
||||||
"allow_null": True,
|
"allow_null": True,
|
||||||
"allowed_values": [""] + [str(x) for x in range(11)],
|
"allowed_values": [""] + [str(x) for x in range(11)],
|
||||||
"labels": ["-"] + range(11),
|
"labels": ["-"] + list(range(11)),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
import operator
|
import operator
|
||||||
from types import FloatType, IntType, LongType, StringType
|
from types import FloatType, IntType, LongType, StringType
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
|
|
||||||
class NoteVector(object):
|
class NoteVector(object):
|
||||||
@ -41,7 +42,7 @@ class NoteVector(object):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
if args:
|
if args:
|
||||||
self.v = map(float, args) # cast to list of float
|
self.v = list(map(float, args)) # cast to list of float
|
||||||
elif "v" in kwargs:
|
elif "v" in kwargs:
|
||||||
v = kwargs["v"]
|
v = kwargs["v"]
|
||||||
if not isinstance(v, NoteVector):
|
if not isinstance(v, NoteVector):
|
||||||
@ -49,7 +50,7 @@ class NoteVector(object):
|
|||||||
for i in range(len(v)):
|
for i in range(len(v)):
|
||||||
try:
|
try:
|
||||||
v[i] = float(v[i])
|
v[i] = float(v[i])
|
||||||
except:
|
except ValueError:
|
||||||
v[i] = 0.0
|
v[i] = 0.0
|
||||||
self.v = v
|
self.v = v
|
||||||
else:
|
else:
|
||||||
|
@ -55,6 +55,7 @@ from app.scodoc import sco_permissions_check
|
|||||||
from app.scodoc.sco_exceptions import ScoException, AccessDenied, ScoValueError
|
from app.scodoc.sco_exceptions import ScoException, AccessDenied, ScoValueError
|
||||||
from app.scodoc.sco_permissions import Permission
|
from app.scodoc.sco_permissions import Permission
|
||||||
from app.scodoc.TrivialFormulator import TrivialFormulator
|
from app.scodoc.TrivialFormulator import TrivialFormulator
|
||||||
|
import six
|
||||||
|
|
||||||
|
|
||||||
def checkGroupName(
|
def checkGroupName(
|
||||||
@ -684,7 +685,9 @@ def setGroups(
|
|||||||
if not group_name:
|
if not group_name:
|
||||||
continue
|
continue
|
||||||
# ajax arguments are encoded in utf-8:
|
# ajax arguments are encoded in utf-8:
|
||||||
group_name = unicode(group_name, "utf-8").encode(scu.SCO_ENCODING)
|
group_name = six.text_type(group_name, "utf-8").encode(
|
||||||
|
scu.SCO_ENCODING
|
||||||
|
) # #py3 #sco8
|
||||||
group_id = createGroup(context, partition_id, group_name, REQUEST=REQUEST)
|
group_id = createGroup(context, partition_id, group_name, REQUEST=REQUEST)
|
||||||
# Place dans ce groupe les etudiants indiqués:
|
# Place dans ce groupe les etudiants indiqués:
|
||||||
for etudid in fs[1:-1]:
|
for etudid in fs[1:-1]:
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
# Re-ecriture en 2014 (re-organisation de l'interface, modernisation du code)
|
# Re-ecriture en 2014 (re-organisation de l'interface, modernisation du code)
|
||||||
import datetime
|
import datetime
|
||||||
import cgi
|
import cgi
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
import time
|
import time
|
||||||
import collections
|
import collections
|
||||||
import operator
|
import operator
|
||||||
@ -51,6 +51,7 @@ from app.scodoc import sco_etud
|
|||||||
from app.scodoc.gen_tables import GenTable
|
from app.scodoc.gen_tables import GenTable
|
||||||
from app.scodoc.sco_exceptions import ScoValueError
|
from app.scodoc.sco_exceptions import ScoValueError
|
||||||
from app.scodoc.sco_permissions import Permission
|
from app.scodoc.sco_permissions import Permission
|
||||||
|
from six.moves import range
|
||||||
|
|
||||||
JAVASCRIPTS = html_sco_header.BOOTSTRAP_MULTISELECT_JS + [
|
JAVASCRIPTS = html_sco_header.BOOTSTRAP_MULTISELECT_JS + [
|
||||||
"js/etud_info.js",
|
"js/etud_info.js",
|
||||||
@ -936,7 +937,7 @@ def form_choix_saisie_semaine(context, groups_infos, REQUEST=None):
|
|||||||
moduleimpl_id = query_args.get("moduleimpl_id", [""])[0]
|
moduleimpl_id = query_args.get("moduleimpl_id", [""])[0]
|
||||||
if "head_message" in query_args:
|
if "head_message" in query_args:
|
||||||
del query_args["head_message"]
|
del query_args["head_message"]
|
||||||
destination = "%s?%s" % (REQUEST.URL, urllib.urlencode(query_args, True))
|
destination = "%s?%s" % (REQUEST.URL, six.moves.urllib.parse.urlencode(query_args, True))
|
||||||
destination = destination.replace(
|
destination = destination.replace(
|
||||||
"%", "%%"
|
"%", "%%"
|
||||||
) # car ici utilisee dans un format string !
|
) # car ici utilisee dans un format string !
|
||||||
|
@ -302,20 +302,20 @@ def scolars_import_excel_file(
|
|||||||
|
|
||||||
# check columns titles
|
# check columns titles
|
||||||
if len(fs) != len(titles):
|
if len(fs) != len(titles):
|
||||||
missing = {}.fromkeys(titles.keys())
|
missing = {}.fromkeys(list(titles.keys()))
|
||||||
unknown = []
|
unknown = []
|
||||||
for f in fs:
|
for f in fs:
|
||||||
if missing.has_key(f):
|
if f in missing:
|
||||||
del missing[f]
|
del missing[f]
|
||||||
else:
|
else:
|
||||||
unknown.append(f)
|
unknown.append(f)
|
||||||
raise ScoValueError(
|
raise ScoValueError(
|
||||||
"Nombre de colonnes incorrect (devrait être %d, et non %d) <br/> (colonnes manquantes: %s, colonnes invalides: %s)"
|
"Nombre de colonnes incorrect (devrait être %d, et non %d) <br/> (colonnes manquantes: %s, colonnes invalides: %s)"
|
||||||
% (len(titles), len(fs), missing.keys(), unknown)
|
% (len(titles), len(fs), list(missing.keys()), unknown)
|
||||||
)
|
)
|
||||||
titleslist = []
|
titleslist = []
|
||||||
for t in fs:
|
for t in fs:
|
||||||
if not titles.has_key(t):
|
if t not in titles:
|
||||||
raise ScoValueError('Colonne invalide: "%s"' % t)
|
raise ScoValueError('Colonne invalide: "%s"' % t)
|
||||||
titleslist.append(t) #
|
titleslist.append(t) #
|
||||||
# ok, same titles
|
# ok, same titles
|
||||||
@ -573,7 +573,7 @@ def _import_one_student(
|
|||||||
else:
|
else:
|
||||||
groupes = []
|
groupes = []
|
||||||
group_ids = [gi[group_name] for group_name in groupes]
|
group_ids = [gi[group_name] for group_name in groupes]
|
||||||
group_ids = {}.fromkeys(group_ids).keys() # uniq
|
group_ids = list({}.fromkeys(group_ids).keys()) # uniq
|
||||||
if None in group_ids:
|
if None in group_ids:
|
||||||
raise ScoValueError(
|
raise ScoValueError(
|
||||||
"groupe invalide sur la ligne %d (groupe %s)" % (linenum, groupes)
|
"groupe invalide sur la ligne %d (groupe %s)" % (linenum, groupes)
|
||||||
@ -714,7 +714,7 @@ def scolars_import_admission(
|
|||||||
gi = sco_groups.GroupIdInferer(context, formsemestre_id)
|
gi = sco_groups.GroupIdInferer(context, formsemestre_id)
|
||||||
groupes = args["groupes"].split(";")
|
groupes = args["groupes"].split(";")
|
||||||
group_ids = [gi[group_name] for group_name in groupes]
|
group_ids = [gi[group_name] for group_name in groupes]
|
||||||
group_ids = {}.fromkeys(group_ids).keys() # uniq
|
group_ids = list({}.fromkeys(group_ids).keys()) # uniq
|
||||||
if None in group_ids:
|
if None in group_ids:
|
||||||
raise ScoValueError(
|
raise ScoValueError(
|
||||||
"groupe invalide sur la ligne %d (groupe %s)"
|
"groupe invalide sur la ligne %d (groupe %s)"
|
||||||
@ -779,19 +779,19 @@ def adm_get_fields(titles, formsemestre_id):
|
|||||||
|
|
||||||
|
|
||||||
def adm_convert_text(v):
|
def adm_convert_text(v):
|
||||||
if type(v) == types.FloatType:
|
if type(v) == float:
|
||||||
return "{:g}".format(v) # evite "1.0"
|
return "{:g}".format(v) # evite "1.0"
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
||||||
def adm_convert_int(v):
|
def adm_convert_int(v):
|
||||||
if type(v) != types.IntType and not v:
|
if type(v) != int and not v:
|
||||||
return None
|
return None
|
||||||
return int(float(v)) # accept "10.0"
|
return int(float(v)) # accept "10.0"
|
||||||
|
|
||||||
|
|
||||||
def adm_convert_real(v):
|
def adm_convert_real(v):
|
||||||
if type(v) != types.FloatType and not v:
|
if type(v) != float and not v:
|
||||||
return None
|
return None
|
||||||
return float(v)
|
return float(v)
|
||||||
|
|
||||||
@ -821,7 +821,7 @@ def adm_table_description_format(context):
|
|||||||
tab = GenTable(
|
tab = GenTable(
|
||||||
titles=titles,
|
titles=titles,
|
||||||
columns_ids=columns_ids,
|
columns_ids=columns_ids,
|
||||||
rows=Fmt.values(),
|
rows=list(Fmt.values()),
|
||||||
html_sortable=True,
|
html_sortable=True,
|
||||||
html_class="table_leftalign",
|
html_class="table_leftalign",
|
||||||
preferences=sco_preferences.SemPreferences(
|
preferences=sco_preferences.SemPreferences(
|
||||||
|
@ -80,14 +80,14 @@ def import_excel_file(datafile, REQUEST=None, context=None):
|
|||||||
cols = {}.fromkeys(TITLES)
|
cols = {}.fromkeys(TITLES)
|
||||||
unknown = []
|
unknown = []
|
||||||
for tit in fs:
|
for tit in fs:
|
||||||
if not cols.has_key(tit):
|
if tit not in cols:
|
||||||
unknown.append(tit)
|
unknown.append(tit)
|
||||||
else:
|
else:
|
||||||
del cols[tit]
|
del cols[tit]
|
||||||
if cols or unknown:
|
if cols or unknown:
|
||||||
raise ScoValueError(
|
raise ScoValueError(
|
||||||
"colonnes incorrectes (on attend %d, et non %d) <br/> (colonnes manquantes: %s, colonnes invalides: %s)"
|
"colonnes incorrectes (on attend %d, et non %d) <br/> (colonnes manquantes: %s, colonnes invalides: %s)"
|
||||||
% (len(TITLES), len(fs), cols.keys(), unknown)
|
% (len(TITLES), len(fs), list(cols.keys()), unknown)
|
||||||
)
|
)
|
||||||
# ok, same titles...
|
# ok, same titles...
|
||||||
U = []
|
U = []
|
||||||
|
@ -82,13 +82,13 @@ def list_authorized_etuds_by_sem(context, sem, delai=274):
|
|||||||
}
|
}
|
||||||
# ajoute attribut inscrit qui indique si l'étudiant est déjà inscrit dans le semestre dest.
|
# ajoute attribut inscrit qui indique si l'étudiant est déjà inscrit dans le semestre dest.
|
||||||
for e in r[src["formsemestre_id"]]["etuds"]:
|
for e in r[src["formsemestre_id"]]["etuds"]:
|
||||||
e["inscrit"] = inscrits.has_key(e["etudid"])
|
e["inscrit"] = e["etudid"] in inscrits
|
||||||
|
|
||||||
# Ajoute liste des etudiants actuellement inscrits
|
# Ajoute liste des etudiants actuellement inscrits
|
||||||
for e in inscrits.values():
|
for e in inscrits.values():
|
||||||
e["inscrit"] = True
|
e["inscrit"] = True
|
||||||
r[sem["formsemestre_id"]] = {
|
r[sem["formsemestre_id"]] = {
|
||||||
"etuds": inscrits.values(),
|
"etuds": list(inscrits.values()),
|
||||||
"infos": {
|
"infos": {
|
||||||
"id": sem["formsemestre_id"],
|
"id": sem["formsemestre_id"],
|
||||||
"title": "Semestre cible: " + sem["titreannee"],
|
"title": "Semestre cible: " + sem["titreannee"],
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
"""Liste des notes d'une évaluation
|
"""Liste des notes d'une évaluation
|
||||||
"""
|
"""
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
from types import StringType
|
from types import StringType
|
||||||
|
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
@ -59,13 +59,13 @@ def do_evaluation_listenotes(context, REQUEST):
|
|||||||
args: evaluation_id
|
args: evaluation_id
|
||||||
"""
|
"""
|
||||||
mode = None
|
mode = None
|
||||||
if REQUEST.form.has_key("evaluation_id"):
|
if "evaluation_id" in REQUEST.form:
|
||||||
evaluation_id = REQUEST.form["evaluation_id"]
|
evaluation_id = REQUEST.form["evaluation_id"]
|
||||||
mode = "eval"
|
mode = "eval"
|
||||||
evals = sco_evaluations.do_evaluation_list(
|
evals = sco_evaluations.do_evaluation_list(
|
||||||
context, {"evaluation_id": evaluation_id}
|
context, {"evaluation_id": evaluation_id}
|
||||||
)
|
)
|
||||||
if REQUEST.form.has_key("moduleimpl_id"):
|
if "moduleimpl_id" in REQUEST.form:
|
||||||
moduleimpl_id = REQUEST.form["moduleimpl_id"]
|
moduleimpl_id = REQUEST.form["moduleimpl_id"]
|
||||||
mode = "module"
|
mode = "module"
|
||||||
evals = sco_evaluations.do_evaluation_list(
|
evals = sco_evaluations.do_evaluation_list(
|
||||||
@ -511,7 +511,7 @@ def _make_table_notes(
|
|||||||
+ "</div></td>\n",
|
+ "</div></td>\n",
|
||||||
'<td style="padding-left: 50px; vertical-align: top;"><p>',
|
'<td style="padding-left: 50px; vertical-align: top;"><p>',
|
||||||
]
|
]
|
||||||
commentkeys = K.items() # [ (comment, key), ... ]
|
commentkeys = list(K.items()) # [ (comment, key), ... ]
|
||||||
commentkeys.sort(lambda x, y: cmp(int(x[1]), int(y[1])))
|
commentkeys.sort(lambda x, y: cmp(int(x[1]), int(y[1])))
|
||||||
for (comment, key) in commentkeys:
|
for (comment, key) in commentkeys:
|
||||||
C.append(
|
C.append(
|
||||||
@ -554,7 +554,7 @@ def _add_eval_columns(
|
|||||||
NotesDB = sco_evaluations.do_evaluation_get_all_notes(context, evaluation_id)
|
NotesDB = sco_evaluations.do_evaluation_get_all_notes(context, evaluation_id)
|
||||||
for row in rows:
|
for row in rows:
|
||||||
etudid = row["etudid"]
|
etudid = row["etudid"]
|
||||||
if NotesDB.has_key(etudid):
|
if etudid in NotesDB:
|
||||||
val = NotesDB[etudid]["value"]
|
val = NotesDB[etudid]["value"]
|
||||||
if val is None:
|
if val is None:
|
||||||
nb_abs += 1
|
nb_abs += 1
|
||||||
@ -591,7 +591,7 @@ def _add_eval_columns(
|
|||||||
row["_css_row_class"] = "etudabs"
|
row["_css_row_class"] = "etudabs"
|
||||||
# regroupe les commentaires
|
# regroupe les commentaires
|
||||||
if explanation:
|
if explanation:
|
||||||
if K.has_key(explanation):
|
if explanation in K:
|
||||||
expl_key = "(%s)" % K[explanation]
|
expl_key = "(%s)" % K[explanation]
|
||||||
else:
|
else:
|
||||||
K[explanation] = K.nextkey()
|
K[explanation] = K.nextkey()
|
||||||
@ -745,7 +745,7 @@ def evaluation_check_absences(context, evaluation_id):
|
|||||||
ExcNonJust = [] # note EXC mais absent non justifie
|
ExcNonJust = [] # note EXC mais absent non justifie
|
||||||
AbsButExc = [] # note ABS mais justifié
|
AbsButExc = [] # note ABS mais justifié
|
||||||
for etudid in etudids:
|
for etudid in etudids:
|
||||||
if NotesDB.has_key(etudid):
|
if etudid in NotesDB:
|
||||||
val = NotesDB[etudid]["value"]
|
val = NotesDB[etudid]["value"]
|
||||||
if (
|
if (
|
||||||
val != None and val != scu.NOTES_NEUTRALISE and val != scu.NOTES_ATTENTE
|
val != None and val != scu.NOTES_NEUTRALISE and val != scu.NOTES_ATTENTE
|
||||||
@ -824,8 +824,8 @@ def evaluation_check_absences_html(
|
|||||||
'<a class="stdlink" href="Absences/doSignaleAbsence?etudid=%s&datedebut=%s&datefin=%s&demijournee=%s&moduleimpl_id=%s">signaler cette absence</a>'
|
'<a class="stdlink" href="Absences/doSignaleAbsence?etudid=%s&datedebut=%s&datefin=%s&demijournee=%s&moduleimpl_id=%s">signaler cette absence</a>'
|
||||||
% (
|
% (
|
||||||
etud["etudid"],
|
etud["etudid"],
|
||||||
urllib.quote(E["jour"]),
|
six.moves.urllib.parse.quote(E["jour"]),
|
||||||
urllib.quote(E["jour"]),
|
six.moves.urllib.parse.quote(E["jour"]),
|
||||||
demijournee,
|
demijournee,
|
||||||
E["moduleimpl_id"],
|
E["moduleimpl_id"],
|
||||||
)
|
)
|
||||||
|
@ -45,7 +45,7 @@ def list_formsemestres_modalites(context, sems):
|
|||||||
if sem["modalite"] not in modalites:
|
if sem["modalite"] not in modalites:
|
||||||
m = do_modalite_list(context, args={"modalite": sem["modalite"]})[0]
|
m = do_modalite_list(context, args={"modalite": sem["modalite"]})[0]
|
||||||
modalites[m["modalite"]] = m
|
modalites[m["modalite"]] = m
|
||||||
modalites = modalites.values()
|
modalites = list(modalites.values())
|
||||||
modalites.sort(key=lambda x: x["numero"])
|
modalites.sort(key=lambda x: x["numero"])
|
||||||
return modalites
|
return modalites
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
"""Tableau de bord module
|
"""Tableau de bord module
|
||||||
"""
|
"""
|
||||||
import time
|
import time
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
|
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
from app.scodoc.sco_permissions import Permission
|
from app.scodoc.sco_permissions import Permission
|
||||||
@ -136,7 +136,7 @@ def moduleimpl_evaluation_menu(context, evaluation_id, nbnotes=0, REQUEST=None):
|
|||||||
"title": "Absences ce jour",
|
"title": "Absences ce jour",
|
||||||
"endpoint": "absences.EtatAbsencesDate",
|
"endpoint": "absences.EtatAbsencesDate",
|
||||||
"args": {
|
"args": {
|
||||||
"date": urllib.quote(E["jour"], safe=""),
|
"date": six.moves.urllib.parse.quote(E["jour"], safe=""),
|
||||||
"group_ids": group_id,
|
"group_ids": group_id,
|
||||||
},
|
},
|
||||||
"enabled": E["jour"],
|
"enabled": E["jour"],
|
||||||
|
@ -46,6 +46,7 @@ from app.scodoc import sco_formsemestre
|
|||||||
from app.scodoc import sco_moduleimpl
|
from app.scodoc import sco_moduleimpl
|
||||||
from app.scodoc import sco_preferences
|
from app.scodoc import sco_preferences
|
||||||
from app.scodoc import sco_users
|
from app.scodoc import sco_users
|
||||||
|
import six
|
||||||
|
|
||||||
_scolar_news_editor = ndb.EditableTable(
|
_scolar_news_editor = ndb.EditableTable(
|
||||||
"scolar_news",
|
"scolar_news",
|
||||||
@ -69,7 +70,7 @@ NEWS_MAP = {
|
|||||||
NEWS_SEM: "création semestre",
|
NEWS_SEM: "création semestre",
|
||||||
NEWS_MISC: "opération", # unused
|
NEWS_MISC: "opération", # unused
|
||||||
}
|
}
|
||||||
NEWS_TYPES = NEWS_MAP.keys()
|
NEWS_TYPES = list(NEWS_MAP.keys())
|
||||||
|
|
||||||
scolar_news_create = _scolar_news_editor.create
|
scolar_news_create = _scolar_news_editor.create
|
||||||
scolar_news_list = _scolar_news_editor.list
|
scolar_news_list = _scolar_news_editor.list
|
||||||
@ -126,7 +127,7 @@ def scolar_news_summary(context, n=5):
|
|||||||
key = (r["type"], r["object"], dmy)
|
key = (r["type"], r["object"], dmy)
|
||||||
selected_news[key] = r
|
selected_news[key] = r
|
||||||
|
|
||||||
news = selected_news.values()
|
news = list(selected_news.values())
|
||||||
# sort by date, descending
|
# sort by date, descending
|
||||||
news.sort(lambda x, y: cmp(y["date"], x["date"]))
|
news.sort(lambda x, y: cmp(y["date"], x["date"]))
|
||||||
news = news[:n]
|
news = news[:n]
|
||||||
@ -139,7 +140,7 @@ def scolar_news_summary(context, n=5):
|
|||||||
for k in n.keys():
|
for k in n.keys():
|
||||||
if n[k] is None:
|
if n[k] is None:
|
||||||
n[k] = ""
|
n[k] = ""
|
||||||
if _scolar_news_editor.output_formators.has_key(k):
|
if k in _scolar_news_editor.output_formators:
|
||||||
n[k] = _scolar_news_editor.output_formators[k](n[k])
|
n[k] = _scolar_news_editor.output_formators[k](n[k])
|
||||||
# date resumee
|
# date resumee
|
||||||
j, m = n["date"].split("/")[:2]
|
j, m = n["date"].split("/")[:2]
|
||||||
@ -233,15 +234,15 @@ def scolar_news_summary_rss(context, title, sco_url, n=5):
|
|||||||
text = html2text(n["text"])
|
text = html2text(n["text"])
|
||||||
items.append(
|
items.append(
|
||||||
PyRSS2Gen.RSSItem(
|
PyRSS2Gen.RSSItem(
|
||||||
title=unicode("%s %s" % (n["rssdate"], text), SCO_ENCODING),
|
title=six.text_type("%s %s" % (n["rssdate"], text), SCO_ENCODING),
|
||||||
link=sco_url + "/" + n["url"],
|
link=sco_url + "/" + n["url"],
|
||||||
pubDate=n["date822"],
|
pubDate=n["date822"],
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
rss = PyRSS2Gen.RSS2(
|
rss = PyRSS2Gen.RSS2(
|
||||||
title=unicode(title, SCO_ENCODING),
|
title=six.text_type(title, SCO_ENCODING),
|
||||||
link=sco_url,
|
link=sco_url,
|
||||||
description=unicode(title, SCO_ENCODING),
|
description=six.text_type(title, SCO_ENCODING),
|
||||||
lastBuildDate=datetime.datetime.now(),
|
lastBuildDate=datetime.datetime.now(),
|
||||||
items=items,
|
items=items,
|
||||||
)
|
)
|
||||||
|
@ -494,7 +494,7 @@ def ficheEtud(context, etudid=None, REQUEST=None):
|
|||||||
|
|
||||||
def menus_etud(context, REQUEST=None):
|
def menus_etud(context, REQUEST=None):
|
||||||
"""Menu etudiant (operations sur l'etudiant)"""
|
"""Menu etudiant (operations sur l'etudiant)"""
|
||||||
if not REQUEST.form.has_key("etudid"):
|
if "etudid" not in REQUEST.form:
|
||||||
return ""
|
return ""
|
||||||
authuser = REQUEST.AUTHENTICATED_USER
|
authuser = REQUEST.AUTHENTICATED_USER
|
||||||
|
|
||||||
|
@ -349,7 +349,7 @@ class SituationEtudParcoursGeneric:
|
|||||||
self.etudid, self.sem, self.nt, sem, nt
|
self.etudid, self.sem, self.nt, sem, nt
|
||||||
)
|
)
|
||||||
|
|
||||||
self.ue_acros = ue_acros.keys()
|
self.ue_acros = list(ue_acros.keys())
|
||||||
self.ue_acros.sort()
|
self.ue_acros.sort()
|
||||||
self.nb_max_ue = nb_max_ue
|
self.nb_max_ue = nb_max_ue
|
||||||
self.sems = sems
|
self.sems = sems
|
||||||
@ -389,7 +389,7 @@ class SituationEtudParcoursGeneric:
|
|||||||
if self.sem["semestre_id"] == NO_SEMESTRE_ID:
|
if self.sem["semestre_id"] == NO_SEMESTRE_ID:
|
||||||
indices = [NO_SEMESTRE_ID]
|
indices = [NO_SEMESTRE_ID]
|
||||||
else:
|
else:
|
||||||
indices = range(1, self.parcours.NB_SEM + 1)
|
indices = list(range(1, self.parcours.NB_SEM + 1))
|
||||||
for i in indices:
|
for i in indices:
|
||||||
# cherche dans les semestres de l'étudiant, en partant du plus récent
|
# cherche dans les semestres de l'étudiant, en partant du plus récent
|
||||||
sem = None
|
sem = None
|
||||||
|
@ -64,6 +64,7 @@ from app.scodoc.sco_exceptions import ScoGenError
|
|||||||
from SuppressAccents import suppression_diacritics
|
from SuppressAccents import suppression_diacritics
|
||||||
from app.scodoc import VERSION
|
from app.scodoc import VERSION
|
||||||
from VERSION import SCOVERSION, SCONAME
|
from VERSION import SCOVERSION, SCONAME
|
||||||
|
import six
|
||||||
|
|
||||||
PAGE_HEIGHT = defaultPageSize[1]
|
PAGE_HEIGHT = defaultPageSize[1]
|
||||||
PAGE_WIDTH = defaultPageSize[0]
|
PAGE_WIDTH = defaultPageSize[0]
|
||||||
@ -81,7 +82,7 @@ def SU(s):
|
|||||||
# eg 'e\xcc\x81' COMBINING ACUTE ACCENT par '\xc3\xa9' LATIN SMALL LETTER E WITH ACUTE
|
# eg 'e\xcc\x81' COMBINING ACUTE ACCENT par '\xc3\xa9' LATIN SMALL LETTER E WITH ACUTE
|
||||||
# car les "combining accents" ne sont pas traités par ReportLab mais peuvent
|
# car les "combining accents" ne sont pas traités par ReportLab mais peuvent
|
||||||
# nous être envoyés par certains navigateurs ou imports
|
# nous être envoyés par certains navigateurs ou imports
|
||||||
u = unicodedata.normalize("NFC", unicode(s, SCO_ENCODING, "replace"))
|
u = unicodedata.normalize("NFC", six.text_type(s, SCO_ENCODING, "replace"))
|
||||||
return u.encode("utf8")
|
return u.encode("utf8")
|
||||||
|
|
||||||
|
|
||||||
@ -330,19 +331,19 @@ def pdf_basic_page(
|
|||||||
|
|
||||||
|
|
||||||
# Gestion du lock pdf
|
# Gestion du lock pdf
|
||||||
import threading, time, Queue, thread
|
import threading, time, six.moves.queue, six.moves._thread
|
||||||
|
|
||||||
|
|
||||||
class PDFLock:
|
class PDFLock:
|
||||||
def __init__(self, timeout=15):
|
def __init__(self, timeout=15):
|
||||||
self.Q = Queue.Queue(1)
|
self.Q = six.moves.queue.Queue(1)
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
self.current_thread = None
|
self.current_thread = None
|
||||||
self.nref = 0
|
self.nref = 0
|
||||||
|
|
||||||
def release(self):
|
def release(self):
|
||||||
"Release lock. Raise Empty if not acquired first"
|
"Release lock. Raise Empty if not acquired first"
|
||||||
if self.current_thread == thread.get_ident():
|
if self.current_thread == six.moves._thread.get_ident():
|
||||||
self.nref -= 1
|
self.nref -= 1
|
||||||
if self.nref == 0:
|
if self.nref == 0:
|
||||||
log("PDFLock: release from %s" % self.current_thread)
|
log("PDFLock: release from %s" % self.current_thread)
|
||||||
@ -354,14 +355,14 @@ class PDFLock:
|
|||||||
|
|
||||||
def acquire(self):
|
def acquire(self):
|
||||||
"Acquire lock. Raise ScoGenError if can't lock after timeout."
|
"Acquire lock. Raise ScoGenError if can't lock after timeout."
|
||||||
if self.current_thread == thread.get_ident():
|
if self.current_thread == six.moves._thread.get_ident():
|
||||||
self.nref += 1
|
self.nref += 1
|
||||||
return # deja lock pour ce thread
|
return # deja lock pour ce thread
|
||||||
try:
|
try:
|
||||||
self.Q.put(1, True, self.timeout)
|
self.Q.put(1, True, self.timeout)
|
||||||
except Queue.Full:
|
except six.moves.queue.Full:
|
||||||
raise ScoGenError(msg="Traitement PDF occupé: ré-essayez")
|
raise ScoGenError(msg="Traitement PDF occupé: ré-essayez")
|
||||||
self.current_thread = thread.get_ident()
|
self.current_thread = six.moves._thread.get_ident()
|
||||||
self.nref = 1
|
self.nref = 1
|
||||||
log("PDFLock: granted to %s" % self.current_thread)
|
log("PDFLock: granted to %s" % self.current_thread)
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ import os
|
|||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
import random
|
import random
|
||||||
import urllib2
|
import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
|
||||||
import traceback
|
import traceback
|
||||||
from PIL import Image as PILImage
|
from PIL import Image as PILImage
|
||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
@ -355,7 +355,7 @@ def copy_portal_photo_to_fs(context, etud, REQUEST=None):
|
|||||||
f = None
|
f = None
|
||||||
try:
|
try:
|
||||||
log("copy_portal_photo_to_fs: getting %s" % url)
|
log("copy_portal_photo_to_fs: getting %s" % url)
|
||||||
f = urllib2.urlopen(url, timeout=portal_timeout) # python >= 2.7
|
f = six.moves.urllib.request.urlopen(url, timeout=portal_timeout) # python >= 2.7
|
||||||
except:
|
except:
|
||||||
log("download failed: exception:\n%s" % traceback.format_exc())
|
log("download failed: exception:\n%s" % traceback.format_exc())
|
||||||
log("called from:\n" + "".join(traceback.format_stack()))
|
log("called from:\n" + "".join(traceback.format_stack()))
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
Contribution M. Salomon, UFC / IUT DE BELFORT-MONTBÉLIARD, 2016
|
Contribution M. Salomon, UFC / IUT DE BELFORT-MONTBÉLIARD, 2016
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
import random
|
import random
|
||||||
|
|
||||||
import app.scodoc.sco_utils as scu
|
import app.scodoc.sco_utils as scu
|
||||||
@ -155,7 +155,7 @@ def do_placement_selectetuds(context, REQUEST):
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
if not (REQUEST.form.has_key("group_ids") and REQUEST.form["group_ids"]):
|
if not ("group_ids" in REQUEST.form and REQUEST.form["group_ids"]):
|
||||||
submitbuttonattributes = ['disabled="1"']
|
submitbuttonattributes = ['disabled="1"']
|
||||||
else:
|
else:
|
||||||
submitbuttonattributes = [] # groupe(s) preselectionnés
|
submitbuttonattributes = [] # groupe(s) preselectionnés
|
||||||
@ -208,7 +208,10 @@ def do_placement_selectetuds(context, REQUEST):
|
|||||||
columns = tf[2]["columns"]
|
columns = tf[2]["columns"]
|
||||||
numbering = tf[2]["numbering"]
|
numbering = tf[2]["numbering"]
|
||||||
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=" + six.moves.urllib.parse.quote_plus(x))
|
||||||
|
for x in group_ids
|
||||||
|
]
|
||||||
query = (
|
query = (
|
||||||
"evaluation_id=%s&placement_method=%s&teachers=%s&building=%s&room=%s&columns=%s&numbering=%s&"
|
"evaluation_id=%s&placement_method=%s&teachers=%s&building=%s&room=%s&columns=%s&numbering=%s&"
|
||||||
% (
|
% (
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import os, time
|
import os, time
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
import xml
|
import xml
|
||||||
import xml.sax.saxutils
|
import xml.sax.saxutils
|
||||||
import xml.dom.minidom
|
import xml.dom.minidom
|
||||||
@ -39,6 +39,8 @@ import app.scodoc.sco_utils as scu
|
|||||||
from app.scodoc.notes_log import log
|
from app.scodoc.notes_log import log
|
||||||
from app.scodoc.sco_exceptions import ScoValueError
|
from app.scodoc.sco_exceptions import ScoValueError
|
||||||
from app.scodoc import sco_preferences
|
from app.scodoc import sco_preferences
|
||||||
|
import six
|
||||||
|
from six.moves import range
|
||||||
|
|
||||||
SCO_CACHE_ETAPE_FILENAME = os.path.join(scu.SCO_TMP_DIR, "last_etapes.xml")
|
SCO_CACHE_ETAPE_FILENAME = os.path.join(scu.SCO_TMP_DIR, "last_etapes.xml")
|
||||||
|
|
||||||
@ -155,10 +157,10 @@ def get_inscrits_etape(context, code_etape, anneeapogee=None, ntrials=2):
|
|||||||
req = (
|
req = (
|
||||||
etud_url
|
etud_url
|
||||||
+ "?"
|
+ "?"
|
||||||
+ urllib.urlencode((("etape", code_etape), ("annee", anneeapogee)))
|
+ six.moves.urllib.parse.urlencode((("etape", code_etape), ("annee", anneeapogee)))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
req = etud_url + "?" + urllib.urlencode((("etape", code_etape),))
|
req = etud_url + "?" + six.moves.urllib.parse.urlencode((("etape", code_etape),))
|
||||||
actual_timeout = float(portal_timeout) / ntrials
|
actual_timeout = float(portal_timeout) / ntrials
|
||||||
if portal_timeout > 0:
|
if portal_timeout > 0:
|
||||||
actual_timeout = max(1, actual_timeout)
|
actual_timeout = max(1, actual_timeout)
|
||||||
@ -172,7 +174,7 @@ def get_inscrits_etape(context, code_etape, anneeapogee=None, ntrials=2):
|
|||||||
|
|
||||||
# Filtre sur annee inscription Apogee:
|
# Filtre sur annee inscription Apogee:
|
||||||
def check_inscription(e):
|
def check_inscription(e):
|
||||||
if e.has_key("inscription"):
|
if "inscription" in e:
|
||||||
if e["inscription"] == anneeapogee:
|
if e["inscription"] == anneeapogee:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
@ -203,7 +205,7 @@ def query_apogee_portal(context, **args):
|
|||||||
# XXX TODO : va poser problème pour la page modif données étudiants : A VOIR
|
# XXX TODO : va poser problème pour la page modif données étudiants : A VOIR
|
||||||
return []
|
return []
|
||||||
portal_timeout = sco_preferences.get_preference(context, "portal_timeout")
|
portal_timeout = sco_preferences.get_preference(context, "portal_timeout")
|
||||||
req = etud_url + "?" + urllib.urlencode(args.items())
|
req = etud_url + "?" + six.moves.urllib.parse.urlencode(list(args.items()))
|
||||||
doc = scu.query_portal(req, timeout=portal_timeout) # sco_utils
|
doc = scu.query_portal(req, timeout=portal_timeout) # sco_utils
|
||||||
return xml_to_list_of_dicts(doc, req=req)
|
return xml_to_list_of_dicts(doc, req=req)
|
||||||
|
|
||||||
@ -261,7 +263,7 @@ def xml_to_list_of_dicts(doc, req=None):
|
|||||||
def get_infos_apogee_allaccents(context, nom, prenom):
|
def get_infos_apogee_allaccents(context, nom, prenom):
|
||||||
"essai recup infos avec differents codages des accents"
|
"essai recup infos avec differents codages des accents"
|
||||||
if nom:
|
if nom:
|
||||||
unom = unicode(nom, scu.SCO_ENCODING)
|
unom = six.text_type(nom, scu.SCO_ENCODING)
|
||||||
nom_noaccents = str(scu.suppression_diacritics(unom))
|
nom_noaccents = str(scu.suppression_diacritics(unom))
|
||||||
nom_utf8 = unom.encode("utf-8")
|
nom_utf8 = unom.encode("utf-8")
|
||||||
else:
|
else:
|
||||||
@ -269,7 +271,7 @@ def get_infos_apogee_allaccents(context, nom, prenom):
|
|||||||
nom_utf8 = nom
|
nom_utf8 = nom
|
||||||
|
|
||||||
if prenom:
|
if prenom:
|
||||||
uprenom = unicode(prenom, scu.SCO_ENCODING)
|
uprenom = six.text_type(prenom, scu.SCO_ENCODING)
|
||||||
prenom_noaccents = str(scu.suppression_diacritics(uprenom))
|
prenom_noaccents = str(scu.suppression_diacritics(uprenom))
|
||||||
prenom_utf8 = uprenom.encode("utf-8")
|
prenom_utf8 = uprenom.encode("utf-8")
|
||||||
else:
|
else:
|
||||||
@ -325,7 +327,7 @@ def get_etud_apogee(context, code_nip):
|
|||||||
if not etud_url:
|
if not etud_url:
|
||||||
return {}
|
return {}
|
||||||
portal_timeout = sco_preferences.get_preference(context, "portal_timeout")
|
portal_timeout = sco_preferences.get_preference(context, "portal_timeout")
|
||||||
req = etud_url + "?" + urllib.urlencode((("nip", code_nip),))
|
req = etud_url + "?" + six.moves.urllib.parse.urlencode((("nip", code_nip),))
|
||||||
doc = scu.query_portal(req, timeout=portal_timeout)
|
doc = scu.query_portal(req, timeout=portal_timeout)
|
||||||
d = _normalize_apo_fields(xml_to_list_of_dicts(doc, req=req))
|
d = _normalize_apo_fields(xml_to_list_of_dicts(doc, req=req))
|
||||||
if not d:
|
if not d:
|
||||||
@ -346,7 +348,7 @@ def get_default_etapes(context):
|
|||||||
if line and line[0] != "#":
|
if line and line[0] != "#":
|
||||||
dept, code, intitule = [x.strip() for x in line.split(":")]
|
dept, code, intitule = [x.strip() for x in line.split(":")]
|
||||||
if dept and code:
|
if dept and code:
|
||||||
if etapes.has_key(dept):
|
if dept in etapes:
|
||||||
etapes[dept][code] = intitule
|
etapes[dept][code] = intitule
|
||||||
else:
|
else:
|
||||||
etapes[dept] = {code: intitule}
|
etapes[dept] = {code: intitule}
|
||||||
@ -418,7 +420,7 @@ def _xml_list_codes(target_dict, dept, nodes):
|
|||||||
if e.nodeType == e.ELEMENT_NODE:
|
if e.nodeType == e.ELEMENT_NODE:
|
||||||
intitule = e.childNodes[0].nodeValue.encode(scu.SCO_ENCODING)
|
intitule = e.childNodes[0].nodeValue.encode(scu.SCO_ENCODING)
|
||||||
code = e.attributes["code"].value.encode(scu.SCO_ENCODING)
|
code = e.attributes["code"].value.encode(scu.SCO_ENCODING)
|
||||||
if target_dict.has_key(dept):
|
if dept in target_dict:
|
||||||
target_dict[dept][code] = intitule
|
target_dict[dept][code] = intitule
|
||||||
else:
|
else:
|
||||||
target_dict[dept] = {code: intitule}
|
target_dict[dept] = {code: intitule}
|
||||||
@ -442,19 +444,19 @@ def get_etapes_apogee_dept(context):
|
|||||||
log("get_etapes_apogee_dept: pas de sections par departement")
|
log("get_etapes_apogee_dept: pas de sections par departement")
|
||||||
|
|
||||||
infos = get_etapes_apogee(context)
|
infos = get_etapes_apogee(context)
|
||||||
if portal_dept_name and not infos.has_key(portal_dept_name):
|
if portal_dept_name and portal_dept_name not in infos:
|
||||||
log(
|
log(
|
||||||
"get_etapes_apogee_dept: pas de section '%s' dans la reponse portail"
|
"get_etapes_apogee_dept: pas de section '%s' dans la reponse portail"
|
||||||
% portal_dept_name
|
% portal_dept_name
|
||||||
)
|
)
|
||||||
return []
|
return []
|
||||||
if portal_dept_name:
|
if portal_dept_name:
|
||||||
etapes = infos[portal_dept_name].items()
|
etapes = list(infos[portal_dept_name].items())
|
||||||
else:
|
else:
|
||||||
# prend toutes les etapes
|
# prend toutes les etapes
|
||||||
etapes = []
|
etapes = []
|
||||||
for k in infos.keys():
|
for k in infos.keys():
|
||||||
etapes += infos[k].items()
|
etapes += list(infos[k].items())
|
||||||
|
|
||||||
etapes.sort() # tri sur le code etape
|
etapes.sort() # tri sur le code etape
|
||||||
return etapes
|
return etapes
|
||||||
@ -483,7 +485,7 @@ def _normalize_apo_fields(infolist):
|
|||||||
ajoute les champs 'etape' (= None) et 'prenom' ('') s'ils ne sont pas présents.
|
ajoute les champs 'etape' (= None) et 'prenom' ('') s'ils ne sont pas présents.
|
||||||
"""
|
"""
|
||||||
for infos in infolist:
|
for infos in infolist:
|
||||||
if infos.has_key("paiementinscription"):
|
if "paiementinscription" in infos:
|
||||||
infos["paiementinscription"] = (
|
infos["paiementinscription"] = (
|
||||||
scu.strlower(infos["paiementinscription"]) == "true"
|
scu.strlower(infos["paiementinscription"]) == "true"
|
||||||
)
|
)
|
||||||
@ -495,7 +497,7 @@ def _normalize_apo_fields(infolist):
|
|||||||
infos["paiementinscription"] = None
|
infos["paiementinscription"] = None
|
||||||
infos["paiementinscription_str"] = "?"
|
infos["paiementinscription_str"] = "?"
|
||||||
|
|
||||||
if infos.has_key("datefinalisationinscription"):
|
if "datefinalisationinscription" in infos:
|
||||||
infos["datefinalisationinscription"] = _portal_date_dmy2date(
|
infos["datefinalisationinscription"] = _portal_date_dmy2date(
|
||||||
infos["datefinalisationinscription"]
|
infos["datefinalisationinscription"]
|
||||||
)
|
)
|
||||||
@ -506,10 +508,10 @@ def _normalize_apo_fields(infolist):
|
|||||||
infos["datefinalisationinscription"] = None
|
infos["datefinalisationinscription"] = None
|
||||||
infos["datefinalisationinscription_str"] = ""
|
infos["datefinalisationinscription_str"] = ""
|
||||||
|
|
||||||
if not infos.has_key("etape"):
|
if "etape" not in infos:
|
||||||
infos["etape"] = None
|
infos["etape"] = None
|
||||||
|
|
||||||
if not infos.has_key("prenom"):
|
if "prenom" not in infos:
|
||||||
infos["prenom"] = ""
|
infos["prenom"] = ""
|
||||||
|
|
||||||
return infolist
|
return infolist
|
||||||
@ -529,7 +531,7 @@ def check_paiement_etuds(context, etuds):
|
|||||||
"""
|
"""
|
||||||
# interrogation séquentielle longue...
|
# interrogation séquentielle longue...
|
||||||
for etud in etuds:
|
for etud in etuds:
|
||||||
if not etud.has_key("code_nip"):
|
if "code_nip" not in etud:
|
||||||
etud["paiementinscription"] = None
|
etud["paiementinscription"] = None
|
||||||
etud["paiementinscription_str"] = "(pas de code)"
|
etud["paiementinscription_str"] = "(pas de code)"
|
||||||
etud["datefinalisationinscription"] = None
|
etud["datefinalisationinscription"] = None
|
||||||
@ -563,7 +565,7 @@ def get_maquette_apogee(context, etape="", annee_scolaire=""):
|
|||||||
req = (
|
req = (
|
||||||
maquette_url
|
maquette_url
|
||||||
+ "?"
|
+ "?"
|
||||||
+ urllib.urlencode((("etape", etape), ("annee", annee_scolaire)))
|
+ six.moves.urllib.parse.urlencode((("etape", etape), ("annee", annee_scolaire)))
|
||||||
)
|
)
|
||||||
doc = scu.query_portal(req, timeout=portal_timeout)
|
doc = scu.query_portal(req, timeout=portal_timeout)
|
||||||
return doc
|
return doc
|
||||||
|
@ -1797,9 +1797,7 @@ class BasePreferences(object):
|
|||||||
self.prefs[p["formsemestre_id"]] = {}
|
self.prefs[p["formsemestre_id"]] = {}
|
||||||
|
|
||||||
# Convert types:
|
# Convert types:
|
||||||
if p["name"] in self.prefs_dict and self.prefs_dict[p["name"]].has_key(
|
if p["name"] in self.prefs_dict and "type" in self.prefs_dict[p["name"]]:
|
||||||
"type"
|
|
||||||
):
|
|
||||||
typ = self.prefs_dict[p["name"]]["type"]
|
typ = self.prefs_dict[p["name"]]["type"]
|
||||||
if typ == "float":
|
if typ == "float":
|
||||||
# special case for float values (where NULL means 0)
|
# special case for float values (where NULL means 0)
|
||||||
@ -1879,7 +1877,7 @@ class BasePreferences(object):
|
|||||||
modif = False
|
modif = False
|
||||||
cnx = ndb.GetDBConnexion()
|
cnx = ndb.GetDBConnexion()
|
||||||
if name is None:
|
if name is None:
|
||||||
names = self.prefs[formsemestre_id].keys()
|
names = list(self.prefs[formsemestre_id].keys())
|
||||||
else:
|
else:
|
||||||
names = [name]
|
names = [name]
|
||||||
for name in names:
|
for name in names:
|
||||||
|
@ -135,14 +135,14 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
|
|||||||
nbabsjust[etudid] = AbsEtudSem.CountAbs() - AbsEtudSem.CountAbsJust()
|
nbabsjust[etudid] = AbsEtudSem.CountAbs() - AbsEtudSem.CountAbsJust()
|
||||||
|
|
||||||
# Codes des UE "semestre précédent":
|
# Codes des UE "semestre précédent":
|
||||||
ue_prev_codes = prev_moy_ue.keys()
|
ue_prev_codes = list(prev_moy_ue.keys())
|
||||||
ue_prev_codes.sort(
|
ue_prev_codes.sort(
|
||||||
lambda x, y, prev_ue_acro=prev_ue_acro: cmp( # pylint: disable=undefined-variable
|
lambda x, y, prev_ue_acro=prev_ue_acro: cmp( # pylint: disable=undefined-variable
|
||||||
prev_ue_acro[x], prev_ue_acro[y]
|
prev_ue_acro[x], prev_ue_acro[y]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
# Codes des UE "semestre courant":
|
# Codes des UE "semestre courant":
|
||||||
ue_codes = moy_ue.keys()
|
ue_codes = list(moy_ue.keys())
|
||||||
ue_codes.sort(
|
ue_codes.sort(
|
||||||
lambda x, y, ue_acro=ue_acro: cmp( # pylint: disable=undefined-variable
|
lambda x, y, ue_acro=ue_acro: cmp( # pylint: disable=undefined-variable
|
||||||
ue_acro[x], ue_acro[y]
|
ue_acro[x], ue_acro[y]
|
||||||
@ -280,7 +280,7 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
|
|||||||
#
|
#
|
||||||
L.append([""])
|
L.append([""])
|
||||||
# Explications des codes
|
# Explications des codes
|
||||||
codes = sco_codes_parcours.CODES_EXPL.keys()
|
codes = list(sco_codes_parcours.CODES_EXPL.keys())
|
||||||
codes.sort()
|
codes.sort()
|
||||||
L.append(["Explication des codes"])
|
L.append(["Explication des codes"])
|
||||||
for code in codes:
|
for code in codes:
|
||||||
|
@ -572,10 +572,10 @@ def formsemestre_pvjury(
|
|||||||
for row in rows:
|
for row in rows:
|
||||||
counts[row["decision"]] += 1
|
counts[row["decision"]] += 1
|
||||||
# add codes for previous (for explanation, without count)
|
# add codes for previous (for explanation, without count)
|
||||||
if row.has_key("prev_decision") and row["prev_decision"]:
|
if "prev_decision" in row and row["prev_decision"]:
|
||||||
counts[row["prev_decision"]] += 0
|
counts[row["prev_decision"]] += 0
|
||||||
# Légende des codes
|
# Légende des codes
|
||||||
codes = counts.keys() # sco_codes_parcours.CODES_EXPL.keys()
|
codes = list(counts.keys()) # sco_codes_parcours.CODES_EXPL.keys()
|
||||||
codes.sort()
|
codes.sort()
|
||||||
H.append("<h3>Explication des codes</h3>")
|
H.append("<h3>Explication des codes</h3>")
|
||||||
lines = []
|
lines = []
|
||||||
|
@ -835,7 +835,7 @@ def _pvjury_pdf_type(
|
|||||||
|
|
||||||
def _format_pv_cell(x):
|
def _format_pv_cell(x):
|
||||||
"""convert string to paragraph"""
|
"""convert string to paragraph"""
|
||||||
if type(x) == types.StringType:
|
if type(x) == bytes:
|
||||||
return Paragraph(SU(x), cell_style)
|
return Paragraph(SU(x), cell_style)
|
||||||
else:
|
else:
|
||||||
return x
|
return x
|
||||||
@ -862,7 +862,7 @@ def _pvjury_pdf_type(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Légende des codes
|
# Légende des codes
|
||||||
codes = sco_codes_parcours.CODES_EXPL.keys()
|
codes = list(sco_codes_parcours.CODES_EXPL.keys())
|
||||||
codes.sort()
|
codes.sort()
|
||||||
objects += sco_pdf.makeParas(
|
objects += sco_pdf.makeParas(
|
||||||
"""<para spaceBefore="15mm" fontSize="14">
|
"""<para spaceBefore="15mm" fontSize="14">
|
||||||
|
@ -616,7 +616,7 @@ def make_formsemestre_recapcomplet(
|
|||||||
i == 0 or F[0][i] == "classement"
|
i == 0 or F[0][i] == "classement"
|
||||||
): # Rang: force tri numerique pour sortable
|
): # Rang: force tri numerique pour sortable
|
||||||
cls = cls + " sortnumeric"
|
cls = cls + " sortnumeric"
|
||||||
if cod2mod.has_key(F[0][i]): # lien vers etat module
|
if F[0][i] in cod2mod: # lien vers etat module
|
||||||
mod = cod2mod[F[0][i]]
|
mod = cod2mod[F[0][i]]
|
||||||
cells += '<td class="%s"><a href="moduleimpl_status?moduleimpl_id=%s" title="%s (%s)">%s</a></td>' % (
|
cells += '<td class="%s"><a href="moduleimpl_status?moduleimpl_id=%s" title="%s (%s)">%s</a></td>' % (
|
||||||
cls,
|
cls,
|
||||||
@ -765,7 +765,7 @@ def make_formsemestre_recapcomplet(
|
|||||||
# recap des decisions jury (nombre dans chaque code):
|
# recap des decisions jury (nombre dans chaque code):
|
||||||
if codes_nb:
|
if codes_nb:
|
||||||
H.append("<h4>Décisions du jury</h4><table>")
|
H.append("<h4>Décisions du jury</h4><table>")
|
||||||
cods = codes_nb.keys()
|
cods = list(codes_nb.keys())
|
||||||
cods.sort()
|
cods.sort()
|
||||||
for cod in cods:
|
for cod in cods:
|
||||||
H.append("<tr><td>%s</td><td>%d</td></tr>" % (cod, codes_nb[cod]))
|
H.append("<tr><td>%s</td><td>%d</td></tr>" % (cod, codes_nb[cod]))
|
||||||
@ -812,7 +812,7 @@ def _list_notes_evals(context, evals, etudid):
|
|||||||
NotesDB = sco_evaluations.do_evaluation_get_all_notes(
|
NotesDB = sco_evaluations.do_evaluation_get_all_notes(
|
||||||
context, e["evaluation_id"]
|
context, e["evaluation_id"]
|
||||||
)
|
)
|
||||||
if NotesDB.has_key(etudid):
|
if etudid in NotesDB:
|
||||||
val = NotesDB[etudid]["value"]
|
val = NotesDB[etudid]["value"]
|
||||||
else:
|
else:
|
||||||
# Note manquante mais prise en compte immédiate: affiche ATT
|
# Note manquante mais prise en compte immédiate: affiche ATT
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
@ -76,7 +76,7 @@ def formsemestre_etuds_stats(context, sem, only_primo=False):
|
|||||||
etud["etat"] = nt.get_etud_etat(etudid)
|
etud["etat"] = nt.get_etud_etat(etudid)
|
||||||
if etud["etat"] == "D":
|
if etud["etat"] == "D":
|
||||||
etud["codedecision"] = "DEM"
|
etud["codedecision"] = "DEM"
|
||||||
if not etud.has_key("codedecision"):
|
if "codedecision" not in etud:
|
||||||
etud["codedecision"] = "(nd)" # pas de decision jury
|
etud["codedecision"] = "(nd)" # pas de decision jury
|
||||||
# Ajout devenir (autorisations inscriptions), utile pour stats passage
|
# Ajout devenir (autorisations inscriptions), utile pour stats passage
|
||||||
aut_list = sco_parcours_dut.formsemestre_get_autorisation_inscription(
|
aut_list = sco_parcours_dut.formsemestre_get_autorisation_inscription(
|
||||||
@ -116,9 +116,9 @@ def _categories_and_results(etuds, category, result):
|
|||||||
for etud in etuds:
|
for etud in etuds:
|
||||||
categories[etud[category]] = True
|
categories[etud[category]] = True
|
||||||
results[etud[result]] = True
|
results[etud[result]] = True
|
||||||
categories = categories.keys()
|
categories = list(categories.keys())
|
||||||
categories.sort()
|
categories.sort()
|
||||||
results = results.keys()
|
results = list(results.keys())
|
||||||
results.sort()
|
results.sort()
|
||||||
return categories, results
|
return categories, results
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ def _results_by_category(
|
|||||||
results = {} # { result_value : True }
|
results = {} # { result_value : True }
|
||||||
for etud in etuds:
|
for etud in etuds:
|
||||||
results[etud[result]] = True
|
results[etud[result]] = True
|
||||||
if Count.has_key(etud[category]):
|
if etud[category] in Count:
|
||||||
Count[etud[category]][etud[result]] += 1
|
Count[etud[category]][etud[result]] += 1
|
||||||
else:
|
else:
|
||||||
Count[etud[category]] = scu.DictDefault(kv_dict={etud[result]: 1})
|
Count[etud[category]] = scu.DictDefault(kv_dict={etud[result]: 1})
|
||||||
@ -162,7 +162,7 @@ def _results_by_category(
|
|||||||
for l in C:
|
for l in C:
|
||||||
l["sumpercent"] = "%2.1f%%" % ((100.0 * l["sum"]) / tot)
|
l["sumpercent"] = "%2.1f%%" % ((100.0 * l["sum"]) / tot)
|
||||||
#
|
#
|
||||||
codes = results.keys()
|
codes = list(results.keys())
|
||||||
codes.sort()
|
codes.sort()
|
||||||
|
|
||||||
bottom_titles = []
|
bottom_titles = []
|
||||||
@ -298,7 +298,7 @@ def formsemestre_report_counts(
|
|||||||
F = ["""<p><em>Aucun étudiant</em></p>"""]
|
F = ["""<p><em>Aucun étudiant</em></p>"""]
|
||||||
else:
|
else:
|
||||||
if allkeys:
|
if allkeys:
|
||||||
keys = etuds[0].keys()
|
keys = list(etuds[0].keys())
|
||||||
else:
|
else:
|
||||||
# clés présentées à l'utilisateur:
|
# clés présentées à l'utilisateur:
|
||||||
keys = [
|
keys = [
|
||||||
@ -448,7 +448,7 @@ def table_suivi_cohorte(
|
|||||||
civilites.add(etud["civilite"])
|
civilites.add(etud["civilite"])
|
||||||
if etud["statut"]: # ne montre pas les statuts non renseignés
|
if etud["statut"]: # ne montre pas les statuts non renseignés
|
||||||
statuts.add(etud["statut"])
|
statuts.add(etud["statut"])
|
||||||
sems = S.values()
|
sems = list(S.values())
|
||||||
# tri les semestres par date de debut
|
# tri les semestres par date de debut
|
||||||
for s in sems:
|
for s in sems:
|
||||||
d, m, y = [int(x) for x in s["date_debut"].split("/")]
|
d, m, y = [int(x) for x in s["date_debut"].split("/")]
|
||||||
@ -1066,7 +1066,7 @@ def tsp_etud_list(
|
|||||||
def tsp_grouped_list(context, codes_etuds):
|
def tsp_grouped_list(context, codes_etuds):
|
||||||
"""Liste pour table regroupant le nombre d'étudiants (+ bulle avec les noms) de chaque parcours"""
|
"""Liste pour table regroupant le nombre d'étudiants (+ bulle avec les noms) de chaque parcours"""
|
||||||
L = []
|
L = []
|
||||||
parcours = codes_etuds.keys()
|
parcours = list(codes_etuds.keys())
|
||||||
parcours.sort()
|
parcours.sort()
|
||||||
for p in parcours:
|
for p in parcours:
|
||||||
nb = len(codes_etuds[p])
|
nb = len(codes_etuds[p])
|
||||||
@ -1128,7 +1128,7 @@ def table_suivi_parcours(
|
|||||||
)
|
)
|
||||||
# Calcule intitulés de colonnes
|
# Calcule intitulés de colonnes
|
||||||
S = set()
|
S = set()
|
||||||
sems_ids = list(apply(S.union, [e["decisions_jury"].keys() for e in etuds]))
|
sems_ids = list(S.union(*[list(e["decisions_jury"].keys()) for e in etuds]))
|
||||||
sems_ids.sort()
|
sems_ids.sort()
|
||||||
sem_tits = ["S%s" % s for s in sems_ids]
|
sem_tits = ["S%s" % s for s in sems_ids]
|
||||||
titles.update([(s, s) for s in sem_tits])
|
titles.update([(s, s) for s in sem_tits])
|
||||||
@ -1338,7 +1338,7 @@ def graph_parcours(
|
|||||||
edges[(s["formsemestre_id"], nid)].add(etudid)
|
edges[(s["formsemestre_id"], nid)].add(etudid)
|
||||||
diploma_nodes.append(nid)
|
diploma_nodes.append(nid)
|
||||||
#
|
#
|
||||||
g = scu.pydot.graph_from_edges(edges.keys())
|
g = scu.pydot.graph_from_edges(list(edges.keys()))
|
||||||
for fid in isolated_nodes:
|
for fid in isolated_nodes:
|
||||||
if not fid in connected_nodes:
|
if not fid in connected_nodes:
|
||||||
n = scu.pydot.Node(name=fid)
|
n = scu.pydot.Node(name=fid)
|
||||||
@ -1528,7 +1528,7 @@ def formsemestre_graph_parcours(
|
|||||||
op = "only_primo=on&"
|
op = "only_primo=on&"
|
||||||
else:
|
else:
|
||||||
op = ""
|
op = ""
|
||||||
url = urllib.quote(
|
url = six.moves.urllib.parse.quote(
|
||||||
"formsemestre_graph_parcours?formsemestre_id=%s&%sbac=%s&bacspecialite=%s&civilite=%s&statut=%s&format="
|
"formsemestre_graph_parcours?formsemestre_id=%s&%sbac=%s&bacspecialite=%s&civilite=%s&statut=%s&format="
|
||||||
% (formsemestre_id, op, bac, bacspecialite, civilite, statut)
|
% (formsemestre_id, op, bac, bacspecialite, civilite, statut)
|
||||||
)
|
)
|
||||||
|
@ -306,7 +306,7 @@ def do_evaluation_set_missing(
|
|||||||
)
|
)
|
||||||
notes = []
|
notes = []
|
||||||
for etudid in etudids: # pour tous les inscrits
|
for etudid in etudids: # pour tous les inscrits
|
||||||
if not NotesDB.has_key(etudid): # pas de note
|
if etudid not in NotesDB: # pas de note
|
||||||
notes.append((etudid, value))
|
notes.append((etudid, value))
|
||||||
# Check value
|
# Check value
|
||||||
L, invalids, _, _, _ = _check_notes(notes, E, M["module"])
|
L, invalids, _, _, _ = _check_notes(notes, E, M["module"])
|
||||||
@ -455,9 +455,7 @@ def _notes_add(context, uid, evaluation_id, notes, comment=None, do_it=True):
|
|||||||
Return number of changed notes
|
Return number of changed notes
|
||||||
"""
|
"""
|
||||||
uid = str(uid)
|
uid = str(uid)
|
||||||
now = apply(
|
now = psycopg2.Timestamp(*time.localtime()[:6]) # datetime.datetime.now().isoformat()
|
||||||
psycopg2.Timestamp, time.localtime()[:6]
|
|
||||||
) # datetime.datetime.now().isoformat()
|
|
||||||
# Verifie inscription et valeur note
|
# Verifie inscription et valeur note
|
||||||
_ = {}.fromkeys(
|
_ = {}.fromkeys(
|
||||||
sco_groups.do_evaluation_listeetuds_groups(
|
sco_groups.do_evaluation_listeetuds_groups(
|
||||||
@ -484,7 +482,7 @@ def _notes_add(context, uid, evaluation_id, notes, comment=None, do_it=True):
|
|||||||
try:
|
try:
|
||||||
for (etudid, value) in notes:
|
for (etudid, value) in notes:
|
||||||
changed = False
|
changed = False
|
||||||
if not NotesDB.has_key(etudid):
|
if etudid not in NotesDB:
|
||||||
# nouvelle note
|
# nouvelle note
|
||||||
if value != scu.NOTES_SUPPRESS:
|
if value != scu.NOTES_SUPPRESS:
|
||||||
if do_it:
|
if do_it:
|
||||||
@ -1024,7 +1022,7 @@ def _get_sorted_etuds(context, E, etudids, formsemestre_id):
|
|||||||
e["absinfo"] = '<span class="sn_abs">' + " ".join(warn_abs_lst) + "</span> "
|
e["absinfo"] = '<span class="sn_abs">' + " ".join(warn_abs_lst) + "</span> "
|
||||||
|
|
||||||
# Note actuelle de l'étudiant:
|
# Note actuelle de l'étudiant:
|
||||||
if NotesDB.has_key(etudid):
|
if etudid in NotesDB:
|
||||||
e["val"] = _displayNote(NotesDB[etudid]["value"])
|
e["val"] = _displayNote(NotesDB[etudid]["value"])
|
||||||
comment = NotesDB[etudid]["comment"]
|
comment = NotesDB[etudid]["comment"]
|
||||||
if comment is None:
|
if comment is None:
|
||||||
|
@ -235,7 +235,7 @@ class SemSet(dict):
|
|||||||
nt = sco_core.get_notes_cache(
|
nt = sco_core.get_notes_cache(
|
||||||
context,
|
context,
|
||||||
).get_NotesTable(context, sem["formsemestre_id"])
|
).get_NotesTable(context, sem["formsemestre_id"])
|
||||||
sem["etuds"] = nt.identdict.values()
|
sem["etuds"] = list(nt.identdict.values())
|
||||||
sem["nips"] = {e["code_nip"] for e in sem["etuds"] if e["code_nip"]}
|
sem["nips"] = {e["code_nip"] for e in sem["etuds"] if e["code_nip"]}
|
||||||
sem["etuds_without_nip"] = {
|
sem["etuds_without_nip"] = {
|
||||||
e["etudid"] for e in sem["etuds"] if not e["code_nip"]
|
e["etudid"] for e in sem["etuds"] if not e["code_nip"]
|
||||||
|
@ -281,11 +281,11 @@ def build_page(
|
|||||||
)
|
)
|
||||||
year = time.localtime()[0]
|
year = time.localtime()[0]
|
||||||
if anneeapogee and abs(year - int(anneeapogee)) < 50:
|
if anneeapogee and abs(year - int(anneeapogee)) < 50:
|
||||||
years = range(
|
years = list(
|
||||||
min(year - 1, int(anneeapogee) - 1), max(year, int(anneeapogee)) + 1
|
range(min(year - 1, int(anneeapogee) - 1), max(year, int(anneeapogee)) + 1)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
years = range(year - 1, year + 1)
|
years = list(range(year - 1, year + 1))
|
||||||
anneeapogee = ""
|
anneeapogee = ""
|
||||||
options = []
|
options = []
|
||||||
for y in years:
|
for y in years:
|
||||||
@ -478,7 +478,7 @@ def list_synch(context, sem, anneeapogee=None):
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
"inscrits_without_key": {
|
"inscrits_without_key": {
|
||||||
"etuds": inscrits_without_key.values(),
|
"etuds": list(inscrits_without_key.values()),
|
||||||
"infos": {
|
"infos": {
|
||||||
"id": "inscrits_without_key",
|
"id": "inscrits_without_key",
|
||||||
"title": "Etudiants ScoDoc sans clé Apogée (NIP)",
|
"title": "Etudiants ScoDoc sans clé Apogée (NIP)",
|
||||||
@ -709,7 +709,7 @@ def do_import_etud_admission(
|
|||||||
e = al[0]
|
e = al[0]
|
||||||
if get_opt_str(etud, "inscription"):
|
if get_opt_str(etud, "inscription"):
|
||||||
e["annee"] = args["annee"]
|
e["annee"] = args["annee"]
|
||||||
keys = args.keys()
|
keys = list(args.keys())
|
||||||
for k in keys:
|
for k in keys:
|
||||||
if not args[k]:
|
if not args[k]:
|
||||||
del args[k]
|
del args[k]
|
||||||
|
@ -246,7 +246,7 @@ def module_tag_set(context, module_id="", taglist=[], REQUEST=None):
|
|||||||
#
|
#
|
||||||
if not taglist:
|
if not taglist:
|
||||||
taglist = []
|
taglist = []
|
||||||
elif type(taglist) == types.StringType:
|
elif type(taglist) == bytes:
|
||||||
taglist = taglist.split(",")
|
taglist = taglist.split(",")
|
||||||
taglist = [t.strip() for t in taglist]
|
taglist = [t.strip() for t in taglist]
|
||||||
log("module_tag_set: module_id=%s taglist=%s" % (module_id, taglist))
|
log("module_tag_set: module_id=%s taglist=%s" % (module_id, taglist))
|
||||||
|
@ -649,7 +649,7 @@ def zip_excel_import_files(
|
|||||||
log("zip: ignoring %s" % name)
|
log("zip: ignoring %s" % name)
|
||||||
if Filename2Etud:
|
if Filename2Etud:
|
||||||
# lignes excel non traitées
|
# lignes excel non traitées
|
||||||
unmatched_files = Filename2Etud.keys()
|
unmatched_files = list(Filename2Etud.keys())
|
||||||
else:
|
else:
|
||||||
unmatched_files = []
|
unmatched_files = []
|
||||||
# 3- Result page
|
# 3- Result page
|
||||||
|
@ -152,7 +152,7 @@ def external_ue_inscrit_et_note(
|
|||||||
)
|
)
|
||||||
# Inscription des étudiants
|
# Inscription des étudiants
|
||||||
sco_moduleimpl.do_moduleimpl_inscrit_etuds(
|
sco_moduleimpl.do_moduleimpl_inscrit_etuds(
|
||||||
context, moduleimpl_id, formsemestre_id, notes_etuds.keys(), REQUEST=REQUEST
|
context, moduleimpl_id, formsemestre_id, list(notes_etuds.keys()), REQUEST=REQUEST
|
||||||
)
|
)
|
||||||
|
|
||||||
# Création d'une évaluation si il n'y en a pas déjà:
|
# Création d'une évaluation si il n'y en a pas déjà:
|
||||||
@ -179,7 +179,7 @@ def external_ue_inscrit_et_note(
|
|||||||
context,
|
context,
|
||||||
REQUEST.AUTHENTICATED_USER,
|
REQUEST.AUTHENTICATED_USER,
|
||||||
evaluation_id,
|
evaluation_id,
|
||||||
notes_etuds.items(),
|
list(notes_etuds.items()),
|
||||||
do_it=True,
|
do_it=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -102,17 +102,17 @@ class NotesOperation(dict):
|
|||||||
|
|
||||||
def list_operations(context, evaluation_id):
|
def list_operations(context, evaluation_id):
|
||||||
"""returns list of NotesOperation for this evaluation"""
|
"""returns list of NotesOperation for this evaluation"""
|
||||||
notes = sco_evaluations.do_evaluation_get_all_notes(
|
notes = list(sco_evaluations.do_evaluation_get_all_notes(
|
||||||
context, evaluation_id, filter_suppressed=False
|
context, evaluation_id, filter_suppressed=False
|
||||||
).values()
|
).values())
|
||||||
notes_log = sco_evaluations.do_evaluation_get_all_notes(
|
notes_log = list(sco_evaluations.do_evaluation_get_all_notes(
|
||||||
context, evaluation_id, filter_suppressed=False, table="notes_notes_log"
|
context, evaluation_id, filter_suppressed=False, table="notes_notes_log"
|
||||||
).values()
|
).values())
|
||||||
dt = OPERATION_DATE_TOLERANCE
|
dt = OPERATION_DATE_TOLERANCE
|
||||||
NotesDates = {} # { uid : intervalmap }
|
NotesDates = {} # { uid : intervalmap }
|
||||||
|
|
||||||
for note in notes + notes_log:
|
for note in notes + notes_log:
|
||||||
if not NotesDates.has_key(note["uid"]):
|
if note["uid"] not in NotesDates:
|
||||||
NotesDates[note["uid"]] = intervalmap()
|
NotesDates[note["uid"]] = intervalmap()
|
||||||
nd = NotesDates[note["uid"]]
|
nd = NotesDates[note["uid"]]
|
||||||
if nd[note["date"]] is None:
|
if nd[note["date"]] is None:
|
||||||
|
@ -38,11 +38,11 @@ import numbers
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import thread
|
import six.moves._thread
|
||||||
import time
|
import time
|
||||||
import types
|
import types
|
||||||
import urllib
|
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
|
||||||
import urllib2
|
import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
|
||||||
import xml.sax.saxutils
|
import xml.sax.saxutils
|
||||||
|
|
||||||
# XML generation package (apt-get install jaxml)
|
# XML generation package (apt-get install jaxml)
|
||||||
@ -54,7 +54,7 @@ try:
|
|||||||
STRING_TYPES = six.string_types
|
STRING_TYPES = six.string_types
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# fallback for very old ScoDoc instances
|
# fallback for very old ScoDoc instances
|
||||||
STRING_TYPES = types.StringType
|
STRING_TYPES = bytes
|
||||||
|
|
||||||
from PIL import Image as PILImage
|
from PIL import Image as PILImage
|
||||||
|
|
||||||
@ -72,9 +72,7 @@ from app.scodoc import VERSION
|
|||||||
|
|
||||||
# ----- TEMPORAIRE POUR MIGRATION SCODOC7 -> SCODOC8 avant python3
|
# ----- TEMPORAIRE POUR MIGRATION SCODOC7 -> SCODOC8 avant python3
|
||||||
def sco8_join(L, sep="\n"): # sco8
|
def sco8_join(L, sep="\n"): # sco8
|
||||||
return sep.join(
|
return sep.join([x if not isinstance(x, str) else x.encode("utf-8") for x in L])
|
||||||
[x if not isinstance(x, types.UnicodeType) else x.encode("utf-8") for x in L]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# ----- CALCUL ET PRESENTATION DES NOTES
|
# ----- CALCUL ET PRESENTATION DES NOTES
|
||||||
@ -139,7 +137,7 @@ def fmt_note(val, note_max=None, keep_numeric=False):
|
|||||||
return "EXC" # excuse, note neutralise
|
return "EXC" # excuse, note neutralise
|
||||||
if val == NOTES_ATTENTE:
|
if val == NOTES_ATTENTE:
|
||||||
return "ATT" # attente, note neutralisee
|
return "ATT" # attente, note neutralisee
|
||||||
if type(val) == types.FloatType or type(val) == types.IntType:
|
if type(val) == float or type(val) == int:
|
||||||
if note_max != None and note_max > 0:
|
if note_max != None and note_max > 0:
|
||||||
val = val * 20.0 / note_max
|
val = val * 20.0 / note_max
|
||||||
if keep_numeric:
|
if keep_numeric:
|
||||||
@ -199,7 +197,7 @@ class DictDefault(dict): # obsolete, use collections.defaultdict
|
|||||||
self.update(kv_dict)
|
self.update(kv_dict)
|
||||||
|
|
||||||
def __getitem__(self, k):
|
def __getitem__(self, k):
|
||||||
if self.has_key(k):
|
if k in self:
|
||||||
return self.get(k)
|
return self.get(k)
|
||||||
value = copy.copy(self.defaultvalue)
|
value = copy.copy(self.defaultvalue)
|
||||||
self[k] = value
|
self[k] = value
|
||||||
@ -229,7 +227,7 @@ def group_by_key(d, key):
|
|||||||
|
|
||||||
|
|
||||||
# ----- Global lock for critical sections (except notes_tables caches)
|
# ----- Global lock for critical sections (except notes_tables caches)
|
||||||
GSL = thread.allocate_lock() # Global ScoDoc Lock
|
GSL = six.moves._thread.allocate_lock() # Global ScoDoc Lock
|
||||||
|
|
||||||
# ----- Repertoire "var" (local)
|
# ----- Repertoire "var" (local)
|
||||||
SCODOC_VAR_DIR = os.path.join(Config.INSTANCE_HOME, "var", "scodoc")
|
SCODOC_VAR_DIR = os.path.join(Config.INSTANCE_HOME, "var", "scodoc")
|
||||||
@ -436,12 +434,12 @@ isiterable = lambda obj: getattr(obj, "__iter__", False)
|
|||||||
def unescape_html_dict(d):
|
def unescape_html_dict(d):
|
||||||
"""un-escape all dict values, recursively"""
|
"""un-escape all dict values, recursively"""
|
||||||
try:
|
try:
|
||||||
indices = d.keys()
|
indices = list(d.keys())
|
||||||
except:
|
except:
|
||||||
indices = range(len(d))
|
indices = list(range(len(d)))
|
||||||
for k in indices:
|
for k in indices:
|
||||||
v = d[k]
|
v = d[k]
|
||||||
if type(v) == types.StringType:
|
if type(v) == bytes:
|
||||||
d[k] = unescape_html(v)
|
d[k] = unescape_html(v)
|
||||||
elif isiterable(v):
|
elif isiterable(v):
|
||||||
unescape_html_dict(v)
|
unescape_html_dict(v)
|
||||||
@ -486,7 +484,7 @@ def simple_dictlist2xml(dictlist, doc=None, tagname=None, quote=False):
|
|||||||
raise ValueError("invalid empty tagname !")
|
raise ValueError("invalid empty tagname !")
|
||||||
if not doc:
|
if not doc:
|
||||||
doc = jaxml.XML_document(encoding=SCO_ENCODING)
|
doc = jaxml.XML_document(encoding=SCO_ENCODING)
|
||||||
scalar_types = [types.StringType, types.UnicodeType, types.IntType, types.FloatType]
|
scalar_types = [bytes, str, int, float]
|
||||||
for d in dictlist:
|
for d in dictlist:
|
||||||
doc._push()
|
doc._push()
|
||||||
if (
|
if (
|
||||||
@ -507,7 +505,7 @@ def simple_dictlist2xml(dictlist, doc=None, tagname=None, quote=False):
|
|||||||
[(k, v) for (k, v) in d.items() if type(v) in scalar_types]
|
[(k, v) for (k, v) in d.items() if type(v) in scalar_types]
|
||||||
)
|
)
|
||||||
getattr(doc, tagname)(**d_scalar)
|
getattr(doc, tagname)(**d_scalar)
|
||||||
d_list = dict([(k, v) for (k, v) in d.items() if type(v) == types.ListType])
|
d_list = dict([(k, v) for (k, v) in d.items() if type(v) == list])
|
||||||
if d_list:
|
if d_list:
|
||||||
for (k, v) in d_list.items():
|
for (k, v) in d_list.items():
|
||||||
simple_dictlist2xml(v, doc=doc, tagname=k, quote=quote)
|
simple_dictlist2xml(v, doc=doc, tagname=k, quote=quote)
|
||||||
@ -545,7 +543,7 @@ def stripquotes(s):
|
|||||||
|
|
||||||
def suppress_accents(s):
|
def suppress_accents(s):
|
||||||
"s is an ordinary string, encoding given by SCO_ENCODING"
|
"s is an ordinary string, encoding given by SCO_ENCODING"
|
||||||
return str(suppression_diacritics(unicode(s, SCO_ENCODING)))
|
return str(suppression_diacritics(six.text_type(s, SCO_ENCODING)))
|
||||||
|
|
||||||
|
|
||||||
def sanitize_string(s):
|
def sanitize_string(s):
|
||||||
@ -639,7 +637,7 @@ def sendJSON(REQUEST, data):
|
|||||||
|
|
||||||
|
|
||||||
def sendXML(REQUEST, data, tagname=None, force_outer_xml_tag=True):
|
def sendXML(REQUEST, data, tagname=None, force_outer_xml_tag=True):
|
||||||
if type(data) != types.ListType:
|
if type(data) != list:
|
||||||
data = [data] # always list-of-dicts
|
data = [data] # always list-of-dicts
|
||||||
if force_outer_xml_tag:
|
if force_outer_xml_tag:
|
||||||
root_tagname = tagname + "_list"
|
root_tagname = tagname + "_list"
|
||||||
@ -898,7 +896,7 @@ def query_portal(req, msg="Portail Apogee", timeout=3):
|
|||||||
log("query_portal: %s" % req)
|
log("query_portal: %s" % req)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
f = urllib2.urlopen(req, timeout=timeout) # seconds / request
|
f = six.moves.urllib.request.urlopen(req, timeout=timeout) # seconds / request
|
||||||
except:
|
except:
|
||||||
log("query_portal: can't connect to %s" % msg)
|
log("query_portal: can't connect to %s" % msg)
|
||||||
return ""
|
return ""
|
||||||
@ -913,7 +911,7 @@ def query_portal(req, msg="Portail Apogee", timeout=3):
|
|||||||
|
|
||||||
def AnneeScolaire(REQUEST=None): # TODO remplacer REQUEST #sco8
|
def AnneeScolaire(REQUEST=None): # TODO remplacer REQUEST #sco8
|
||||||
"annee de debut de l'annee scolaire courante"
|
"annee de debut de l'annee scolaire courante"
|
||||||
if REQUEST and REQUEST.form.has_key("sco_year"):
|
if REQUEST and "sco_year" in REQUEST.form:
|
||||||
year = REQUEST.form["sco_year"]
|
year = REQUEST.form["sco_year"]
|
||||||
try:
|
try:
|
||||||
year = int(year)
|
year = int(year)
|
||||||
@ -992,7 +990,7 @@ def confirm_dialog(
|
|||||||
if not dest_url:
|
if not dest_url:
|
||||||
dest_url = REQUEST.URL
|
dest_url = REQUEST.URL
|
||||||
# strip remaining parameters from destination url:
|
# strip remaining parameters from destination url:
|
||||||
dest_url = urllib.splitquery(dest_url)[0]
|
dest_url = six.moves.urllib.parse.splitquery(dest_url)[0]
|
||||||
H = [
|
H = [
|
||||||
"""<form action="%s" method="post">""" % dest_url,
|
"""<form action="%s" method="post">""" % dest_url,
|
||||||
message,
|
message,
|
||||||
|
Loading…
Reference in New Issue
Block a user