New-Style Classes

This commit is contained in:
Emmanuel Viennet 2021-07-09 23:31:16 +02:00
parent 510e6dc9c7
commit 8d8b8a3ae9
35 changed files with 68 additions and 50 deletions

View File

@ -113,7 +113,7 @@ def TrivialFormulator(
return res, form, t.result
class TF:
class TF(object):
def __init__(
self,
form_url,

View File

@ -92,7 +92,7 @@ def go_dept(app, dept, verbose=True):
raise ValueError("dep %s not found" % dept)
class FakeUser:
class FakeUser(object):
def __init__(self, name):
self.name = name
@ -106,7 +106,7 @@ class FakeUser:
return True
class DummyResponse:
class DummyResponse(object):
"""Emulation vide de Reponse http Zope"""
def __init__(self):
@ -120,7 +120,7 @@ class DummyResponse:
self.redirected = url
class DummyRequest:
class DummyRequest(object):
"""Emulation vide de Request Zope"""
def __init__(self):

View File

@ -72,7 +72,7 @@ def mark_paras(L, tags):
return L
class DEFAULT_TABLE_PREFERENCES:
class DEFAULT_TABLE_PREFERENCES(object):
"""Default preferences for tables created without preferences argument"""
values = {
@ -85,7 +85,7 @@ class DEFAULT_TABLE_PREFERENCES:
return self.values[k]
class GenTable:
class GenTable(object):
"""Simple 2D tables with export to HTML, PDF, Excel, CSV.
Can be sub-classed to generate fancy formats.
"""
@ -679,7 +679,7 @@ class GenTable:
# -----
class SeqGenTable:
class SeqGenTable(object):
"""Sequence de GenTable: permet de générer un classeur excel avec un tab par table.
L'ordre des tabs est conservé (1er tab == 1ere table ajoutée)
"""

View File

@ -20,7 +20,7 @@ DEFAULT_LOG_DIR = "/tmp" # clients should call set_log_directory to change this
ALARM_DESTINATION = "emmanuel.viennet@univ-paris13.fr" # XXX a mettre en preference
class _logguer:
class _logguer(object):
def __init__(self):
self.file = None
self.directory = None

View File

@ -153,7 +153,7 @@ def comp_etud_sum_coef_modules_ue(context, formsemestre_id, etudid, ue_id):
return s
class NotesTable:
class NotesTable(object):
"""Une NotesTable représente un tableau de notes pour un semestre de formation.
Les colonnes sont des modules.
Les lignes des étudiants.

View File

@ -253,7 +253,7 @@ def DBDelete(cnx, table, colid, val, commit=False):
# REQN = 0
class EditableTable:
class EditableTable(object):
"""--- generic class: SQL table with create/edit/list/delete"""
def __init__(

View File

@ -85,7 +85,7 @@ def comp_nom_semestre_dans_parcours(context, sem):
# ----------------------------------------------------------------------------------------
class JuryPE:
class JuryPE(object):
"""Classe memorisant toutes les informations necessaires pour etablir un jury de PE. Modele
base sur NotesTable

View File

@ -42,7 +42,7 @@ import datetime
from app.scodoc import notes_table
class TableTag:
class TableTag(object):
"""
Classe mémorisant les moyennes des étudiants à différents tag et permettant de calculer les rangs et les statistiques :
- nom : Nom représentatif des données de la Table

View File

@ -84,7 +84,7 @@ def MonthNbDays(month, year):
return 30
class ddmmyyyy:
class ddmmyyyy(object):
"""immutable dates"""
def __init__(self, date=None, fmt="ddmmyyyy", work_saturday=False):
@ -987,7 +987,7 @@ def MonthTableBody(
# absences à une date donnée).
#
# --------------------------------------------------------------------
class CAbsSemEtud:
class CAbsSemEtud(object):
"""Comptes d'absences d'un etudiant dans un semestre"""
def __init__(self, context, sem, etudid):

View File

@ -220,7 +220,7 @@ class DictCol(dict):
pass
class ApoElt:
class ApoElt(object):
"""Definition d'un Element Apogee
sur plusieurs colonnes du fichier CSV
"""
@ -248,7 +248,7 @@ class ApoElt:
return "ApoElt(code='%s', cols=%s)" % (self.code, pprint.pformat(self.cols))
class EtuCol:
class EtuCol(object):
"""Valeurs colonnes d'un element pour un etudiant"""
def __init__(self, nip, apo_elt, init_vals):
@ -669,7 +669,7 @@ class ApoEtud(dict):
return cur_sem, autre_sem
class ApoData:
class ApoData(object):
def __init__(
self,
data,

View File

@ -70,7 +70,7 @@ from app.scodoc import sco_pvjury
from app.scodoc import sco_pvpdf
class BaseArchiver:
class BaseArchiver(object):
def __init__(self, archive_type=""):
dirs = [Config.INSTANCE_HOME, "var", "scodoc", "archives"]
if archive_type:

View File

@ -130,7 +130,7 @@ BACS_SSP = {(t[0], t[1]): t[2:] for t in _BACS}
BACS_S = {t[0]: t[2:] for t in _BACS}
class Baccalaureat:
class Baccalaureat(object):
def __init__(self, bac, specialite=""):
self.bac = bac
self.specialite = specialite

View File

@ -97,7 +97,7 @@ def bulletin_get_class_name_displayed(context, formsemestre_id):
return "invalide ! (voir paramètres)"
class BulletinGenerator:
class BulletinGenerator(object):
"Virtual superclass for PDF bulletin generators" ""
# Here some helper methods
# see sco_bulletins_standard.BulletinGeneratorStandard subclass for real methods

View File

@ -387,7 +387,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator):
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorLegacy)
class BulTableStyle:
class BulTableStyle(object):
"""Construction du style de tables reportlab platypus pour les bulletins "classiques" """
LINEWIDTH = 0.5

View File

@ -32,7 +32,7 @@
import time
# Cache data
class simpleCache:
class simpleCache(object):
def __init__(self):
self.cache = {}
self.inval_cache() # >

View File

@ -171,7 +171,7 @@ DEVENIRS_NEXT2 = {NEXT_OR_NEXT2: 1, NEXT2: 1}
NO_SEMESTRE_ID = -1 # code semestre si pas de semestres
# Regles gestion parcours
class DUTRule:
class DUTRule(object):
def __init__(self, rule_id, premise, conclusion):
self.rule_id = rule_id
self.premise = premise
@ -196,7 +196,7 @@ class DUTRule:
DEFAULT_TYPE_PARCOURS = 100 # pour le menu de creation nouvelle formation
class TypeParcours:
class TypeParcours(object):
TYPE_PARCOURS = None # id, utilisé par notes_formation.type_parcours
NAME = None # required
NB_SEM = 1 # Nombre de semestres
@ -213,7 +213,9 @@ class TypeParcours:
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)
ECTS_ONLY = False # Parcours avec progression basée uniquement sur les ECTS
ALLOWED_UE_TYPES = list(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):
return True, "" # status, diagnostic_message

View File

@ -35,7 +35,7 @@ def get_evaluations_cache(context):
return CACHE_evaluations[u]
class CacheNotesTable:
class CacheNotesTable(object):
"""gestion rudimentaire de cache pour les NotesTables"""
def __init__(self):
@ -191,7 +191,12 @@ class CacheNotesTable:
if r:
log(
"get_bulletins_pdf(%s): cache hit %s (id=%s, thread=%s)"
% (version, formsemestre_id, id(self), six.moves._thread.get_ident())
% (
version,
formsemestre_id,
id(self),
six.moves._thread.get_ident(),
)
)
return r
finally:

View File

@ -125,7 +125,7 @@ FLAG = {
}
class DataEtudiant:
class DataEtudiant(object):
"""
Structure de donnée des informations pour un étudiant
"""
@ -230,7 +230,7 @@ def entete_liste_etudiant():
"""
class EtapeBilan:
class EtapeBilan(object):
"""
Structure de donnée représentation l'état global de la comparaison ScoDoc/Apogée
"""

View File

@ -576,7 +576,7 @@ admission_list = _admissionEditor.list
admission_edit = _admissionEditor.edit
# Edition simultanee de identite et admission
class EtudIdentEditor:
class EtudIdentEditor(object):
def create(self, cnx, args, context=None, REQUEST=None):
etudid = identite_create(cnx, args, context, REQUEST)
args["etudid"] = etudid

View File

@ -179,7 +179,7 @@ def Excel_MakeStyle(
return style
class ScoExcelSheet:
class ScoExcelSheet(object):
def __init__(self, sheet_name="feuille", default_style=None):
self.sheet_name = sheet_name
self.cells = [] # list of list

View File

@ -386,7 +386,7 @@ def _write_formsemestre_aux(context, sem, fieldname, valuename):
# ------ Utilisé pour stocker le VDI avec le code étape (noms de fichiers maquettes et code semestres)
class ApoEtapeVDI:
class ApoEtapeVDI(object):
_ETAPE_VDI_SEP = "!"
def __init__(self, etape_vdi=None, etape="", vdi=""):

View File

@ -1517,7 +1517,7 @@ def make_query_groups(group_ids):
return ""
class GroupIdInferer:
class GroupIdInferer(object):
"""Sert à retrouver l'id d'un groupe dans un semestre donné
à partir de son nom.
Attention: il peut y avoir plusieurs groupes de même nom

View File

@ -295,7 +295,7 @@ if (group_id) {
return "\n".join(H)
class DisplayedGroupsInfos:
class DisplayedGroupsInfos(object):
"""Container with attributes describing groups to display in the page
.groups_query_args : 'group_ids=xxx&group_ids=yyy'
.base_url : url de la requete, avec les groupes, sans les autres paramètres

View File

@ -130,7 +130,7 @@ def scolar_news_summary(context, n=5):
news = list(selected_news.values())
# sort by date, descending
news.sort(itemgetter("date"), reverse=True)
news.sort(key=itemgetter("date"), reverse=True)
news = news[:n]
# mimic EditableTable.list output formatting:
for n in news:

View File

@ -63,7 +63,7 @@ from app.scodoc.dutrules import DUTRules # regles generees a partir du CSV
from app.scodoc.sco_exceptions import ScoValueError
class DecisionSem:
class DecisionSem(object):
"Decision prenable pour un semestre"
def __init__(
@ -116,7 +116,7 @@ def SituationEtudParcours(context, etud, formsemestre_id):
return SituationEtudParcoursGeneric(context, etud, formsemestre_id, nt)
class SituationEtudParcoursGeneric:
class SituationEtudParcoursGeneric(object):
"Semestre dans un parcours"
def __init__(self, context, etud, formsemestre_id, nt):

View File

@ -334,7 +334,7 @@ def pdf_basic_page(
import threading, time, six.moves.queue, six.moves._thread
class PDFLock:
class PDFLock(object):
def __init__(self, timeout=15):
self.Q = six.moves.queue.Queue(1)
self.timeout = timeout

View File

@ -40,7 +40,7 @@ _SCO_PERMISSIONS = (
)
class Permission:
class Permission(object):
"Permissions for ScoDoc"
NBITS = 1 # maximum bits used (for formatting)
ALL_PERMISSIONS = [-1]

View File

@ -50,7 +50,7 @@ def has_portal(context):
return get_portal_url(context)
class PortalInterface:
class PortalInterface(object):
def __init__(self):
self.warning = False
@ -157,10 +157,14 @@ def get_inscrits_etape(context, code_etape, anneeapogee=None, ntrials=2):
req = (
etud_url
+ "?"
+ six.moves.urllib.parse.urlencode((("etape", code_etape), ("annee", anneeapogee)))
+ six.moves.urllib.parse.urlencode(
(("etape", code_etape), ("annee", anneeapogee))
)
)
else:
req = etud_url + "?" + six.moves.urllib.parse.urlencode((("etape", code_etape),))
req = (
etud_url + "?" + six.moves.urllib.parse.urlencode((("etape", code_etape),))
)
actual_timeout = float(portal_timeout) / ntrials
if portal_timeout > 0:
actual_timeout = max(1, actual_timeout)
@ -565,7 +569,9 @@ def get_maquette_apogee(context, etape="", annee_scolaire=""):
req = (
maquette_url
+ "?"
+ six.moves.urllib.parse.urlencode((("etape", etape), ("annee", annee_scolaire)))
+ six.moves.urllib.parse.urlencode(
(("etape", etape), ("annee", annee_scolaire))
)
)
doc = scu.query_portal(req, timeout=portal_timeout)
return doc

View File

@ -479,7 +479,7 @@ def table_suivi_cohorte(
# 3-- Regroupe les semestres par date de debut
P = [] # liste de periodsem
class periodsem:
class periodsem(object):
pass
# semestre de depart:

View File

@ -59,7 +59,7 @@ from app.scodoc.sco_permissions import Permission
# module_tag_set( module_id, taglist ) -> modifie les tags
class ScoTag:
class ScoTag(object):
"""Generic tags for ScoDoc"""
# must be overloaded:

View File

@ -204,7 +204,7 @@ class DictDefault(dict): # obsolete, use collections.defaultdict
return value
class WrapDict:
class WrapDict(object):
"""Wrap a dict so that getitem returns '' when values are None"""
def __init__(self, adict, NoneValue=""):

View File

@ -15,7 +15,7 @@
# souvent de comprendre le code qui les utilise pour ne pas faire d'erreur: attention.
class CFG:
class CFG(object):
pass

View File

@ -16,7 +16,7 @@
# souvent de comprendre le code qui les utilise pour ne pas faire d'erreur: attention.
class CFG:
class CFG(object):
pass

View File

@ -23,7 +23,12 @@ from config import Config
from app.scodoc.sco_exceptions import ScoConfigurationError
class ScoDeptDescription:
class ScoDeptDescription(object):
"""Description d'un département
.dept_id : eg "RT"
.db_uri : dept database URI
"""
def __init__(self, filename):
"""Read dept description from dept file"""
if os.path.split(filename)[1][-4:] != ".cfg":

View File

@ -63,7 +63,7 @@ def logging_meth(func):
return wrapper_logging_meth
class ScoFake:
class ScoFake(object):
def __init__(self, context, verbose=True):
self.context = context
self.verbose = verbose