diff --git a/app/scodoc/htmlutils.py b/app/scodoc/htmlutils.py
index bd3490be1..23e3279d4 100644
--- a/app/scodoc/htmlutils.py
+++ b/app/scodoc/htmlutils.py
@@ -30,9 +30,8 @@
from __future__ import absolute_import
from flask import g, url_for
-from . import listhistogram
-
import app.scodoc.sco_utils as scu
+from . import listhistogram
def horizontal_bargraph(value, mark):
diff --git a/app/scodoc/listhistogram.py b/app/scodoc/listhistogram.py
index 2e19a6b43..ce25d00f9 100644
--- a/app/scodoc/listhistogram.py
+++ b/app/scodoc/listhistogram.py
@@ -1,7 +1,8 @@
+from __future__ import absolute_import
import math
-def ListHistogram(L, nbins, minmax=None, normalize=None):
+def ListHistogram(L, nbins, minmax=None):
"""Compute histogram of a list.
Does not use Numeric or numarray.
diff --git a/app/scodoc/notes_cache.py b/app/scodoc/notes_cache.py
index a8d2b5c59..18104eea0 100644
--- a/app/scodoc/notes_cache.py
+++ b/app/scodoc/notes_cache.py
@@ -31,6 +31,7 @@
NOTA: inutilisable dans une instance Zope (can't pickle functions)
"""
+from __future__ import absolute_import
from app.scodoc.notes_log import log
@@ -45,7 +46,7 @@ class CacheFunc(object):
self.cache = {} # { arguments : function result }
def __call__(self, *args):
- if self.cache.has_key(args):
+ if args in self.cache:
# log('cache hit %s' % str(args))
return self.cache[args]
else:
diff --git a/app/scodoc/notes_log.py b/app/scodoc/notes_log.py
index abd8723e7..9796bf2df 100644
--- a/app/scodoc/notes_log.py
+++ b/app/scodoc/notes_log.py
@@ -1,6 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
+from __future__ import absolute_import
import os
import re
import inspect
@@ -67,7 +68,7 @@ def retreive_request(skip=0):
"""
def search(frame):
- if frame.f_locals.has_key("REQUEST"):
+ if "REQUEST" in frame.f_locals:
return frame.f_locals["REQUEST"]
if frame.f_back:
return search(frame.f_back)
@@ -99,9 +100,9 @@ def retreive_dept():
# Alarms by email:
def sendAlarm(context, subj, txt):
- import sco_utils
- import sco_emails
- import sco_preferences
+ from . import sco_utils
+ from . import sco_emails
+ from . import sco_preferences
msg = MIMEMultipart()
subj = Header(subj, sco_utils.SCO_ENCODING)
diff --git a/app/scodoc/notes_table.py b/app/scodoc/notes_table.py
index 528c2c85b..965859a12 100644
--- a/app/scodoc/notes_table.py
+++ b/app/scodoc/notes_table.py
@@ -27,6 +27,7 @@
"""Calculs sur les notes et cache des resultats
"""
+from __future__ import absolute_import
from types import StringType, FloatType
import time
import pdb
@@ -121,7 +122,7 @@ def get_sem_ues_modimpls(context, formsemestre_id, modimpls=None):
if not mod["ue_id"] in uedict:
ue = sco_edit_ue.do_ue_list(context, args={"ue_id": mod["ue_id"]})[0]
uedict[ue["ue_id"]] = ue
- ues = uedict.values()
+ ues = list(uedict.values())
ues.sort(key=lambda u: u["numero"])
return ues, modimpls
@@ -259,7 +260,7 @@ class NotesTable:
self.comp_ue_capitalisees()
# Liste des moyennes de tous, en chaines de car., triées
- self._ues = uedict.values()
+ self._ues = list(uedict.values())
self._ues.sort(key=lambda u: u["numero"])
T = []
@@ -421,7 +422,7 @@ class NotesTable:
def get_etud_etat(self, etudid):
"Etat de l'etudiant: 'I', 'D', DEF ou '' (si pas connu dans ce semestre)"
- if self.inscrdict.has_key(etudid):
+ if etudid in self.inscrdict:
return self.inscrdict[etudid]["etat"]
else:
return ""
@@ -1081,7 +1082,7 @@ class NotesTable:
)
decisions_jury_ues = {}
for (etudid, ue_id, code, event_date) in cursor.fetchall():
- if not decisions_jury_ues.has_key(etudid):
+ if etudid not in decisions_jury_ues:
decisions_jury_ues[etudid] = {}
# Calcul des ECTS associes a cette UE:
ects = 0.0
diff --git a/app/scodoc/notesdb.py b/app/scodoc/notesdb.py
index 26fce29ed..b46b2c9b6 100644
--- a/app/scodoc/notesdb.py
+++ b/app/scodoc/notesdb.py
@@ -1,12 +1,12 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
+from __future__ import absolute_import
import pdb, os, sys, string
import traceback
import psycopg2
import psycopg2.pool
import psycopg2.extras
-import thread
from flask import g
@@ -36,27 +36,6 @@ def unquote(s):
return s.replace("&", "&")
-# Ramene une connexion a la base de donnees scolarite
-# pour l'instance donnee par context
-# La connexion est unique (réutilisée) pour chaque thread
-# et est par défaut en autocommit
-# _pools = {}
-#
-#
-# def GetDBConnexion(autocommit=True):
-# """connexion to the DB of a departement"""
-# pool = _pools.get(scu.get_db_cnx_string(), None)
-# if not pool:
-# pool = psycopg2.pool.ThreadedConnectionPool(2, 8, dsn=scu.get_db_cnx_string())
-# _pools[scu.get_db_cnx_string()] = pool
-# # log('GetDBConnexion: created pool for "%s"' % scu.get_db_cnx_string())
-# cnx = pool.getconn(key=(thread.get_ident(), autocommit))
-# # log('GetDBConnexion: autocommit=%s cnx=%s' % (autocommit,cnx))
-# if cnx.autocommit != autocommit:
-# cnx.autocommit = autocommit
-# return cnx
-
-
def open_dept_connection():
"""Open a connection to the current dept db"""
# log("open_dept_connection to " + scu.get_db_cnx_string()) # XXX
@@ -75,22 +54,6 @@ def GetDBConnexion(autocommit=True): # on n'utilise plus autocommit
return g.db_conn
-# Same for users:
-_users_pools = {}
-
-
-def GetUsersDBConnexion(context, autocommit=True):
- pool = _users_pools.get(scu.get_db_cnx_string(), None)
- if not pool:
- pool = psycopg2.pool.ThreadedConnectionPool(2, 8, dsn=scu.get_db_cnx_string())
- _users_pools[scu.get_db_cnx_string()] = pool
- log('GetUsersDBConnexion: created pool for "%s"' % scu.get_db_cnx_string())
- cnx = pool.getconn(key=(thread.get_ident(), autocommit))
- if cnx.autocommit != autocommit:
- cnx.autocommit = autocommit
- return cnx
-
-
# Nota: on pourrait maintenant utiliser psycopg2.extras.DictCursor
class ScoDocCursor(psycopg2.extensions.cursor):
"""A database cursor emulating some methods of psycopg v1 cursors"""
@@ -130,7 +93,7 @@ def DBInsertDict(cnx, table, vals, commit=0, convert_empty_to_nulls=1):
if vals[col] == "":
vals[col] = None
# open('/tmp/vals','a').write( str(vals) + '\n' )
- cols = vals.keys()
+ cols = list(vals.keys())
colnames = ",".join(cols)
fmt = ",".join(["%%(%s)s" % col for col in cols])
# print 'insert into %s (%s) values (%s)' % (table,colnames,fmt)
@@ -329,13 +292,13 @@ class EditableTable:
def create(self, cnx, args, has_uniq_values=False):
"create object in table"
vals = dictfilter(args, self.dbfields, self.filter_nulls)
- if vals.has_key(self.id_name) and not self.allow_set_id:
+ if self.id_name in vals and not self.allow_set_id:
del vals[self.id_name]
if self.html_quote:
quote_dict(vals) # quote all HTML markup
# format value
for title in vals.keys():
- if self.input_formators.has_key(title):
+ if title in self.input_formators:
vals[title] = self.input_formators[title](vals[title])
# insert
oid = DBInsertDict(cnx, self.table_name, vals, commit=True)
@@ -405,7 +368,7 @@ class EditableTable:
if v is None and self.convert_null_outputs_to_empty:
v = ""
# format value
- if not disable_formatting and self.output_formators.has_key(k):
+ if not disable_formatting and k in self.output_formators:
try: # XXX debug "isodate"
v = self.output_formators[k](v)
except:
@@ -422,7 +385,7 @@ class EditableTable:
quote_dict(vals) # quote HTML
# format value
for title in vals.keys():
- if self.input_formators.has_key(title):
+ if title in self.input_formators:
try:
vals[title] = self.input_formators[title](vals[title])
except:
@@ -491,7 +454,7 @@ def dictfilter(d, fields, filter_nulls=True):
# returns a copy of d with only keys listed in "fields" and non null values
r = {}
for f in fields:
- if d.has_key(f) and (d[f] != None or not filter_nulls):
+ if f in d and (d[f] != None or not filter_nulls):
try:
val = d[f].strip()
except:
@@ -656,7 +619,7 @@ def UniqListofDicts(L, key):
d = {}
for item in L:
d[item[key]] = item
- return d.values()
+ return list(d.values())
#
diff --git a/app/scodoc/sco_users.py b/app/scodoc/sco_users.py
index e32a6373c..a0874005e 100644
--- a/app/scodoc/sco_users.py
+++ b/app/scodoc/sco_users.py
@@ -90,7 +90,6 @@ def is_valid_password(cleartxt):
# ---------------
# ---------------
-# XXX TODO supprimer ndb.GetUsersDBConnexion
def index_html(context, REQUEST, all_depts=False, with_inactives=False, format="html"):