diff --git a/app/pe/pe_tools.py b/app/pe/pe_tools.py
index aef0839823..46e706eecb 100644
--- a/app/pe/pe_tools.py
+++ b/app/pe/pe_tools.py
@@ -44,7 +44,6 @@ import unicodedata
import app.scodoc.sco_utils as scu
from app import log
-import six
PE_DEBUG = 0
@@ -145,7 +144,7 @@ def escape_for_latex(s):
}
exp = re.compile(
"|".join(
- re.escape(six.text_type(key))
+ re.escape(key)
for key in sorted(list(conv.keys()), key=lambda item: -len(item))
)
)
diff --git a/app/scodoc/gen_tables.py b/app/scodoc/gen_tables.py
index f6ac6c343f..a986494edd 100644
--- a/app/scodoc/gen_tables.py
+++ b/app/scodoc/gen_tables.py
@@ -752,6 +752,8 @@ if __name__ == "__main__":
)
document.build(objects)
data = doc.getvalue()
- open("/tmp/gen_table.pdf", "wb").write(data)
+ with open("/tmp/gen_table.pdf", "wb") as f:
+ f.write(data)
p = T.make_page(format="pdf")
- open("toto.pdf", "wb").write(p)
+ with open("toto.pdf", "wb") as f:
+ f.write(p)
diff --git a/app/scodoc/intervals.py b/app/scodoc/intervals.py
index 9c9b59cc5a..f4159bea70 100644
--- a/app/scodoc/intervals.py
+++ b/app/scodoc/intervals.py
@@ -4,11 +4,8 @@
# Code from http://code.activestate.com/recipes/457411/
-from __future__ import print_function
from bisect import bisect_left, bisect_right
-from six.moves import zip
-
class intervalmap(object):
"""
diff --git a/app/scodoc/notes_table.py b/app/scodoc/notes_table.py
index 3ded586836..a06c2ccd5d 100644
--- a/app/scodoc/notes_table.py
+++ b/app/scodoc/notes_table.py
@@ -27,10 +27,7 @@
"""Calculs sur les notes et cache des resultats
"""
-import inspect
-import os
-import pdb
-import time
+
from operator import itemgetter
from flask import g, url_for
@@ -40,12 +37,8 @@ import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app import log
from app.scodoc.sco_formulas import NoteVector
-from app.scodoc.sco_exceptions import (
- AccessDenied,
- NoteProcessError,
- ScoException,
- ScoValueError,
-)
+from app.scodoc.sco_exceptions import ScoValueError
+
from app.scodoc.sco_formsemestre import (
formsemestre_uecoef_list,
formsemestre_uecoef_create,
diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py
index 8ebab00aa2..f747d91272 100644
--- a/app/scodoc/sco_archives.py
+++ b/app/scodoc/sco_archives.py
@@ -203,7 +203,9 @@ class BaseArchiver(object):
def get_archive_description(self, archive_id):
"""Return description of archive"""
self.initialize()
- return open(os.path.join(archive_id, "_description.txt")).read()
+ with open(os.path.join(archive_id, "_description.txt")) as f:
+ descr = f.read()
+ return descr
def create_obj_archive(self, oid: int, description: str):
"""Creates a new archive for this object and returns its id."""
@@ -232,9 +234,8 @@ class BaseArchiver(object):
try:
scu.GSL.acquire()
fname = os.path.join(archive_id, filename)
- f = open(fname, "wb")
- f.write(data)
- f.close()
+ with open(fname, "wb") as f:
+ f.write(data)
finally:
scu.GSL.release()
return filename
@@ -247,7 +248,9 @@ class BaseArchiver(object):
raise ValueError("invalid filename")
fname = os.path.join(archive_id, filename)
log("reading archive file %s" % fname)
- return open(fname, "rb").read()
+ with open(fname, "rb") as f:
+ data = f.read()
+ return data
def get_archived_file(self, oid, archive_name, filename):
"""Recupere donnees du fichier indiqué et envoie au client"""
diff --git a/app/scodoc/sco_codes_parcours.py b/app/scodoc/sco_codes_parcours.py
index 251a7adafe..ce0ab664bd 100644
--- a/app/scodoc/sco_codes_parcours.py
+++ b/app/scodoc/sco_codes_parcours.py
@@ -28,7 +28,6 @@
"""Semestres: Codes gestion parcours (constantes)
"""
import collections
-from six.moves import range
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)
diff --git a/app/scodoc/sco_dump_db.py b/app/scodoc/sco_dump_db.py
index 126d278323..8fa2e209ec 100644
--- a/app/scodoc/sco_dump_db.py
+++ b/app/scodoc/sco_dump_db.py
@@ -167,7 +167,8 @@ def _anonymize_db(ano_db_name):
def _get_scodoc_serial():
try:
- return int(open(os.path.join(scu.SCODOC_VERSION_DIR, "scodoc.sn")).read())
+ with open(os.path.join(scu.SCODOC_VERSION_DIR, "scodoc.sn")) as f:
+ return int(f.read())
except:
return 0
diff --git a/app/scodoc/sco_edt_cal.py b/app/scodoc/sco_edt_cal.py
index 312a6a4fc9..f526c092f8 100644
--- a/app/scodoc/sco_edt_cal.py
+++ b/app/scodoc/sco_edt_cal.py
@@ -33,10 +33,10 @@ XXX incompatible avec les ics HyperPlanning Paris 13 (était pour GPU).
"""
-import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
-import traceback
import icalendar
import pprint
+import traceback
+import urllib
import app.scodoc.sco_utils as scu
from app import log
@@ -80,7 +80,7 @@ def formsemestre_load_ics(sem):
ics_data = ""
else:
log("Loading edt from %s" % ics_url)
- f = six.moves.urllib.request.urlopen(
+ f = urllib.request.urlopen(
ics_url, timeout=5
) # 5s TODO: add config parameter, eg for slow networks
ics_data = f.read()
diff --git a/app/scodoc/sco_etud.py b/app/scodoc/sco_etud.py
index 53d68f9630..a2f2aebc91 100644
--- a/app/scodoc/sco_etud.py
+++ b/app/scodoc/sco_etud.py
@@ -830,8 +830,8 @@ appreciations_edit = _appreciationsEditor.edit
def read_etablissements():
filename = os.path.join(scu.SCO_TOOLS_DIR, scu.CONFIG.ETABL_FILENAME)
log("reading %s" % filename)
- f = open(filename)
- L = [x[:-1].split(";") for x in f]
+ with open(filename) as f:
+ L = [x[:-1].split(";") for x in f]
E = {}
for l in L[1:]:
E[l[0]] = {
diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py
index 2e238fe57a..e66ca28d6c 100644
--- a/app/scodoc/sco_formsemestre_edit.py
+++ b/app/scodoc/sco_formsemestre_edit.py
@@ -58,7 +58,6 @@ from app.scodoc import sco_permissions_check
from app.scodoc import sco_portal_apogee
from app.scodoc import sco_preferences
from app.scodoc import sco_users
-import six
def _default_sem_title(F):
diff --git a/app/scodoc/sco_formsemestre_validation.py b/app/scodoc/sco_formsemestre_validation.py
index 7c49c792a8..5319ee2a4e 100644
--- a/app/scodoc/sco_formsemestre_validation.py
+++ b/app/scodoc/sco_formsemestre_validation.py
@@ -27,7 +27,7 @@
"""Semestres: validation semestre et UE dans parcours
"""
-import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error, time, datetime
+import time
import flask
from flask import url_for, g, request
@@ -494,7 +494,7 @@ def formsemestre_recap_parcours_table(
with_links=False,
with_all_columns=True,
a_url="",
- sem_info={},
+ sem_info=None,
show_details=False,
):
"""Tableau HTML recap parcours
@@ -502,6 +502,7 @@ def formsemestre_recap_parcours_table(
sem_info = { formsemestre_id : txt } permet d'ajouter des informations associées à chaque semestre
with_all_columns: si faux, pas de colonne "assiduité".
"""
+ sem_info = sem_info or {}
H = []
linktmpl = '%s'
minuslink = linktmpl % scu.icontag("minus_img", border="0", alt="-")
diff --git a/app/scodoc/sco_groups.py b/app/scodoc/sco_groups.py
index 0a776813c0..dac9892483 100644
--- a/app/scodoc/sco_groups.py
+++ b/app/scodoc/sco_groups.py
@@ -59,8 +59,6 @@ from app.scodoc.sco_exceptions import ScoException, AccessDenied, ScoValueError
from app.scodoc.sco_permissions import Permission
from app.scodoc.TrivialFormulator import TrivialFormulator
-import six
-
def checkGroupName(
groupName,
@@ -732,10 +730,6 @@ def setGroups(
group_name = fs[0].strip()
if not group_name:
continue
- # ajax arguments are encoded in utf-8:
- # group_name = six.text_type(group_name, "utf-8").encode(
- # scu.SCO_ENCODING
- # ) # #py3 #sco8
group_id = createGroup(partition_id, group_name)
# Place dans ce groupe les etudiants indiqués:
for etudid in fs[1:-1]:
diff --git a/app/scodoc/sco_pdf.py b/app/scodoc/sco_pdf.py
index c504ae1763..77e6f4e1bf 100755
--- a/app/scodoc/sco_pdf.py
+++ b/app/scodoc/sco_pdf.py
@@ -350,7 +350,6 @@ def pdf_basic_page(
# Gestion du lock pdf
-import threading, time, six.moves.queue, six.moves._thread
class PDFLock(object):
diff --git a/app/scodoc/sco_portal_apogee.py b/app/scodoc/sco_portal_apogee.py
index e79b35312a..07006affdf 100644
--- a/app/scodoc/sco_portal_apogee.py
+++ b/app/scodoc/sco_portal_apogee.py
@@ -39,7 +39,6 @@ import app.scodoc.sco_utils as scu
from app import log
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc import sco_preferences
-import six
SCO_CACHE_ETAPE_FILENAME = os.path.join(scu.SCO_TMP_DIR, "last_etapes.xml")
@@ -386,7 +385,8 @@ def get_etapes_apogee():
# cache le resultat (utile si le portail repond de façon intermitente)
if infos:
log("get_etapes_apogee: caching result")
- open(SCO_CACHE_ETAPE_FILENAME, "w").write(doc)
+ with open(SCO_CACHE_ETAPE_FILENAME, "w") as f:
+ f.write(doc)
except:
log("invalid XML response from getEtapes Web Service\n%s" % etapes_url)
# Avons nous la copie d'une réponse récente ?
diff --git a/app/scodoc/sco_report.py b/app/scodoc/sco_report.py
index 7d9a808218..078da6697a 100644
--- a/app/scodoc/sco_report.py
+++ b/app/scodoc/sco_report.py
@@ -31,7 +31,6 @@
"""
import os
import tempfile
-import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
import re
import time
import datetime
@@ -1399,7 +1398,8 @@ def graph_parcours(
# Genere graphe
_, path = tempfile.mkstemp(".gr")
g.write(path=path, format=format)
- data = open(path, "rb").read()
+ with open(path, "rb") as f:
+ data = f.read()
log("dot generated %d bytes in %s format" % (len(data), format))
if not data:
log("graph.to_string=%s" % g.to_string())
diff --git a/app/views/entreprises.py b/app/views/entreprises.py
index 9d1e76a061..5b8cec66a7 100644
--- a/app/views/entreprises.py
+++ b/app/views/entreprises.py
@@ -35,6 +35,7 @@ Note: Code très ancien, porté de Zope/DTML, peu utilisable
import time
+import urllib
from flask import request
from flask_login import current_user
@@ -166,14 +167,14 @@ def index_html(etud_nom=None, limit=50, offset="", format="html"):
if offset:
webparams["offset"] = max((offset or 0) - limit, 0)
prev_lnk = 'précédentes' % (
- request.base_url + "?" + six.moves.urllib.parse.urlencode(webparams)
+ request.base_url + "?" + urllib.parse.urlencode(webparams)
)
else:
prev_lnk = ""
if len(entreprises) >= limit:
webparams["offset"] = (offset or 0) + limit
next_lnk = 'suivantes' % (
- request.base_url + "?" + six.moves.urllib.parse.urlencode(webparams)
+ request.base_url + "?" + urllib.parse.urlencode(webparams)
)
else:
next_lnk = ""
diff --git a/misc/change_enseignant.py b/misc/change_enseignant.py
deleted file mode 100755
index 438adef6bd..0000000000
--- a/misc/change_enseignant.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""Change un identifiant d'enseignant (pour corriger une erreur, typiquement un doublon)
-
-(à lancer en tant qu'utilisateur postgres)
-Emmanuel Viennet, 2007 - 2014
-"""
-
-from __future__ import print_function
-import pdb, os, sys
-import psycopg2
-from six.moves import input
-
-if len(sys.argv) != 4:
- print("Usage: %s database ancien_utilisateur nouvel_utilisateur" % sys.argv[0])
- print("Exemple: change_enseignant.py SCOGEII toto tata")
- sys.exit(1)
-
-dbname = sys.argv[1]
-OLD_ID = sys.argv[2]
-NEW_ID = sys.argv[3]
-
-DBCNXSTRING = "dbname=%s" % dbname
-
-# Confirmation
-ans = input(
- "Remplacer le l'utilisateur %s par %s dans toute la base du departement %s ?"
- % (OLD_ID, NEW_ID, dbname)
-).strip()
-if not ans or ans[0].lower() not in "oOyY":
- print("annulation")
- sys.exit(-1)
-
-
-cnx = psycopg2.connect(DBCNXSTRING)
-
-cursor = cnx.cursor()
-req = "update %s set %s=%%(new_id)s where %s=%%(old_id)s"
-args = {"old_id": OLD_ID, "new_id": NEW_ID}
-
-tables_attr = {
- "notes_formsemestre": "responsable_id",
- "entreprise_contact": "enseignant",
- "admissions": "rapporteur",
- "notes_moduleimpl": "responsable_id",
- "notes_modules_enseignants": "ens_id",
- "notes_notes": "uid",
- "notes_notes_log": "uid",
- "notes_appreciations": "author",
-}
-
-for (table, attr) in tables_attr.items():
- cursor.execute(req % (table, attr, attr), args)
- print("table %s: %s" % (table, cursor.statusmessage))
-
-cnx.commit()
diff --git a/requirements-3.9.txt b/requirements-3.9.txt
index 682b05053e..4c83a175a0 100755
--- a/requirements-3.9.txt
+++ b/requirements-3.9.txt
@@ -58,7 +58,6 @@ redis==3.5.3
reportlab==3.6.1
requests==2.26.0
rq==1.9.0
-six==1.16.0
SQLAlchemy==1.4.22
toml==0.10.2
urllib3==1.26.6