1
0
forked from ScoDoc/ScoDoc

python-modernize

This commit is contained in:
Emmanuel Viennet 2021-07-09 17:47:06 +02:00
parent 53cba824eb
commit 7bb45516ed
63 changed files with 284 additions and 260 deletions

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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é

View File

@ -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):

View File

@ -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)

View File

@ -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é)

View File

@ -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

View File

@ -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"]:

View File

@ -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

View File

@ -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 = [
{ {

View File

@ -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():

View File

@ -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)

View File

@ -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
) )

View File

@ -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")

View File

@ -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(

View File

@ -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()

View File

@ -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"]

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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,

View File

@ -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

View File

@ -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 !")

View File

@ -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"] = []
# #

View File

@ -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)

View File

@ -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:

View File

@ -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"],

View File

@ -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()

View File

@ -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 !

View File

@ -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)),
}, },
), ),
( (

View File

@ -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:

View File

@ -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]:

View File

@ -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 !

View File

@ -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(

View File

@ -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 = []

View File

@ -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"],

View File

@ -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"],
) )

View File

@ -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

View File

@ -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"],

View File

@ -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,
) )

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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()))

View File

@ -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&"
% ( % (

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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 = []

View File

@ -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">

View File

@ -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

View File

@ -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)
) )

View File

@ -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:

View File

@ -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"]

View File

@ -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]

View File

@ -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))

View File

@ -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

View File

@ -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,
) )

View File

@ -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:

View File

@ -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,