Compare commits
2 Commits
aefd14b420
...
2835777ea6
Author | SHA1 | Date | |
---|---|---|---|
2835777ea6 | |||
284257e5e1 |
@ -34,8 +34,9 @@ import time
|
||||
import pdb
|
||||
import collections
|
||||
import types
|
||||
import re
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
import scolars
|
||||
@ -107,7 +108,7 @@ ADMISSION_MODIFIABLE_FIELDS = (
|
||||
def sco_import_format(with_codesemestre=True):
|
||||
"returns tuples (Attribut, Type, Table, AllowNulls, Description)"
|
||||
r = []
|
||||
for l in open(SCO_SRCDIR + "/" + FORMAT_FILE):
|
||||
for l in open(scu.SCO_SRCDIR + "/" + FORMAT_FILE):
|
||||
l = l.strip()
|
||||
if l and l[0] != "#":
|
||||
fs = l.split(";")
|
||||
@ -166,10 +167,10 @@ def sco_import_generate_excel_sample(
|
||||
titles = []
|
||||
titlesStyles = []
|
||||
for l in fmt:
|
||||
name = strlower(l[0])
|
||||
name = scu.strlower(l[0])
|
||||
if (not with_codesemestre) and name == "codesemestre":
|
||||
continue # pas de colonne codesemestre
|
||||
if only_tables is not None and strlower(l[2]) not in only_tables:
|
||||
if only_tables is not None and scu.strlower(l[2]) not in only_tables:
|
||||
continue # table non demandée
|
||||
if name in exclude_cols:
|
||||
continue # colonne exclue
|
||||
@ -206,7 +207,7 @@ def sco_import_generate_excel_sample(
|
||||
)
|
||||
l.append(etud["partitionsgroupes"])
|
||||
else:
|
||||
key = strlower(field).split()[0]
|
||||
key = scu.strlower(field).split()[0]
|
||||
l.append(etud.get(key, ""))
|
||||
lines.append(l)
|
||||
else:
|
||||
@ -279,7 +280,7 @@ def scolars_import_excel_file(
|
||||
titles = {}
|
||||
fmt = sco_import_format()
|
||||
for l in fmt:
|
||||
tit = strlower(l[0]).split()[0] # titles in lowercase, and take 1st word
|
||||
tit = scu.strlower(l[0]).split()[0] # titles in lowercase, and take 1st word
|
||||
if (
|
||||
(not formsemestre_id) or (tit != "codesemestre")
|
||||
) and tit not in exclude_cols:
|
||||
@ -288,7 +289,7 @@ def scolars_import_excel_file(
|
||||
# log("titles=%s" % titles)
|
||||
# remove quotes, downcase and keep only 1st word
|
||||
try:
|
||||
fs = [strlower(stripquotes(s)).split()[0] for s in data[0]]
|
||||
fs = [scu.strlower(scu.stripquotes(s)).split()[0] for s in data[0]]
|
||||
except:
|
||||
raise ScoValueError("Titres de colonnes invalides (ou vides ?)")
|
||||
# log("excel: fs='%s'\ndata=%s" % (str(fs), str(data)))
|
||||
@ -365,7 +366,7 @@ def scolars_import_excel_file(
|
||||
% (val, linenum, titleslist[i])
|
||||
)
|
||||
# xxx Ad-hoc checks (should be in format description)
|
||||
if strlower(titleslist[i]) == "sexe":
|
||||
if scu.strlower(titleslist[i]) == "sexe":
|
||||
try:
|
||||
val = scolars.normalize_sexe(val)
|
||||
except:
|
||||
@ -374,13 +375,13 @@ def scolars_import_excel_file(
|
||||
% (val, linenum, titleslist[i])
|
||||
)
|
||||
# Excel date conversion:
|
||||
if strlower(titleslist[i]) == "date_naissance":
|
||||
if scu.strlower(titleslist[i]) == "date_naissance":
|
||||
if val:
|
||||
if re.match("^[0-9]*\.?[0-9]*$", str(val)):
|
||||
val = sco_excel.xldate_as_datetime(float(val))
|
||||
# INE
|
||||
if (
|
||||
strlower(titleslist[i]) == "code_ine"
|
||||
scu.strlower(titleslist[i]) == "code_ine"
|
||||
and always_require_ine
|
||||
and not val
|
||||
):
|
||||
@ -703,7 +704,7 @@ _ADM_PATTERN = re.compile(r"[\W]+", re.UNICODE) # supprime tout sauf alphanum
|
||||
|
||||
|
||||
def adm_normalize_string(s): # normalize unicode title
|
||||
return suppression_diacritics(_ADM_PATTERN.sub("", s.strip().lower())).replace(
|
||||
return scu.suppression_diacritics(_ADM_PATTERN.sub("", s.strip().lower())).replace(
|
||||
"_", ""
|
||||
)
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
import cgi
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from sco_formsemestre_status import formsemestre_page_title
|
||||
|
||||
"""
|
||||
@ -97,7 +97,7 @@ def sco_header(
|
||||
"page_title": page_title or context.title_or_id(),
|
||||
"no_side_bar": no_side_bar,
|
||||
"ScoURL": context.ScoURL(),
|
||||
"encoding": SCO_ENCODING,
|
||||
"encoding": scu.SCO_ENCODING,
|
||||
"titrebandeau_mkup": "<td>" + titrebandeau + "</td>",
|
||||
"authuser": str(REQUEST.AUTHENTICATED_USER),
|
||||
}
|
||||
@ -226,7 +226,7 @@ def sco_header(
|
||||
|
||||
# Body et bandeau haut:
|
||||
H.append("""<body %(bodyOnLoad_mkup)s>""" % params)
|
||||
H.append(CUSTOM_HTML_HEADER)
|
||||
H.append(scu.CUSTOM_HTML_HEADER)
|
||||
#
|
||||
if not no_side_bar:
|
||||
H.append(context.sidebar(REQUEST))
|
||||
@ -260,4 +260,6 @@ def sco_header(
|
||||
|
||||
def sco_footer(context, REQUEST=None):
|
||||
"""Main HTMl pages footer"""
|
||||
return """</div><!-- /gtrcontent -->""" + CUSTOM_HTML_FOOTER + """</body></html>"""
|
||||
return (
|
||||
"""</div><!-- /gtrcontent -->""" + scu.CUSTOM_HTML_FOOTER + """</body></html>"""
|
||||
)
|
||||
|
@ -25,7 +25,7 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from sco_abs import getAbsSemEtud
|
||||
from sco_permissions import (
|
||||
ScoUsersAdmin,
|
||||
@ -82,7 +82,7 @@ def sidebar_common(context, REQUEST=None):
|
||||
def sidebar(context, REQUEST=None):
|
||||
"Main HTML page sidebar"
|
||||
# rewritten from legacy DTML code
|
||||
params = {"ScoURL": context.ScoURL(), "SCO_USER_MANUAL": SCO_USER_MANUAL}
|
||||
params = {"ScoURL": context.ScoURL(), "SCO_USER_MANUAL": scu.SCO_USER_MANUAL}
|
||||
|
||||
H = ['<div class="sidebar">', sidebar_common(context, REQUEST)]
|
||||
|
||||
@ -148,7 +148,7 @@ def sidebar(context, REQUEST=None):
|
||||
# ---------
|
||||
H.append("</div><br/> ") # /etud-insidebar
|
||||
# Logo
|
||||
scologo_img = icontag("scologo_img")
|
||||
scologo_img = scu.icontag("scologo_img")
|
||||
H.append('<div class="logo-insidebar"><div class="logo-logo">%s<br/>' % scologo_img)
|
||||
H.append(
|
||||
"""<a href="%(ScoURL)s/about" class="sidebar">A propos</a><br/>
|
||||
|
@ -28,6 +28,7 @@
|
||||
"""Calculs sur les notes et cache des resultats
|
||||
"""
|
||||
from types import StringType, FloatType
|
||||
import time
|
||||
import pdb
|
||||
import inspect
|
||||
|
||||
@ -35,7 +36,7 @@ import inspect
|
||||
import scolars
|
||||
import sco_groups
|
||||
from notes_log import log, logCallStack
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
import sco_codes_parcours
|
||||
from sco_codes_parcours import DEF, UE_SPORT, UE_is_fondamentale, UE_is_professionnelle
|
||||
@ -56,7 +57,7 @@ from sco_exceptions import (
|
||||
)
|
||||
|
||||
# Support for old user-written "bonus" functions with 2 args:
|
||||
BONUS_TWO_ARGS = len(inspect.getargspec(CONFIG.compute_bonus)[0]) == 2
|
||||
BONUS_TWO_ARGS = len(inspect.getargspec(scu.CONFIG.compute_bonus)[0]) == 2
|
||||
|
||||
|
||||
def comp_ranks(T):
|
||||
@ -195,7 +196,7 @@ class NotesTable:
|
||||
for i in range(len(self.inscrlist)):
|
||||
rangalpha[self.inscrlist[i]["etudid"]] = i
|
||||
|
||||
self.bonus = DictDefault(defaultvalue=0)
|
||||
self.bonus = scu.DictDefault(defaultvalue=0)
|
||||
# Notes dans les modules { moduleimpl_id : { etudid: note_moyenne_dans_ce_module } }
|
||||
(
|
||||
self._modmoys,
|
||||
@ -371,16 +372,19 @@ class NotesTable:
|
||||
def get_sexnom(self, etudid):
|
||||
"M. DUPONT"
|
||||
etud = self.identdict[etudid]
|
||||
return etud["sexe"] + " " + strupper(etud["nom_usuel"] or etud["nom"])
|
||||
return etud["sexe"] + " " + scu.strupper(etud["nom_usuel"] or etud["nom"])
|
||||
|
||||
def get_nom_short(self, etudid):
|
||||
"formatte nom d'un etud (pour table recap)"
|
||||
etud = self.identdict[etudid]
|
||||
# Attention aux caracteres multibytes pour decouper les 2 premiers:
|
||||
return (
|
||||
strupper(etud["nom_usuel"] or etud["nom"])
|
||||
scu.strupper(etud["nom_usuel"] or etud["nom"])
|
||||
+ " "
|
||||
+ etud["prenom"].decode(SCO_ENCODING).capitalize()[:2].encode(SCO_ENCODING)
|
||||
+ etud["prenom"]
|
||||
.decode(scu.SCO_ENCODING)
|
||||
.capitalize()[:2]
|
||||
.encode(scu.SCO_ENCODING)
|
||||
+ "."
|
||||
)
|
||||
|
||||
@ -624,7 +628,7 @@ class NotesTable:
|
||||
# si 'NI', etudiant non inscrit a ce module
|
||||
if val != "NI":
|
||||
est_inscrit = True
|
||||
if modimpl["module"]["module_type"] == MODULE_STANDARD:
|
||||
if modimpl["module"]["module_type"] == scu.MODULE_STANDARD:
|
||||
coef = modimpl["module"]["coefficient"]
|
||||
if modimpl["ue"]["type"] != UE_SPORT:
|
||||
notes.append(val, name=modimpl["module"]["code"])
|
||||
@ -660,7 +664,7 @@ class NotesTable:
|
||||
except:
|
||||
# log('comp_etud_moy_ue: exception: val=%s coef=%s' % (val,coef))
|
||||
pass
|
||||
elif modimpl["module"]["module_type"] == MODULE_MALUS:
|
||||
elif modimpl["module"]["module_type"] == scu.MODULE_MALUS:
|
||||
try:
|
||||
ue_malus += val
|
||||
except:
|
||||
@ -680,7 +684,7 @@ class NotesTable:
|
||||
moy = sum_notes / sum_coefs
|
||||
if ue_malus:
|
||||
moy -= ue_malus
|
||||
moy = max(NOTES_MIN, min(moy, 20.0))
|
||||
moy = max(scu.NOTES_MIN, min(moy, 20.0))
|
||||
moy_valid = True
|
||||
else:
|
||||
moy = "NA"
|
||||
@ -906,7 +910,7 @@ class NotesTable:
|
||||
# mu["moy"] can be a number, or "NA", or "ERR" (user-defined UE formulas)
|
||||
if (
|
||||
(mu["ue"]["type"] != UE_SPORT)
|
||||
and isnumber(mu["moy"])
|
||||
and scu.isnumber(mu["moy"])
|
||||
and (mu["est_inscrit"] or mu["is_capitalized"])
|
||||
):
|
||||
coef_ue = mu["ue"]["coefficient"]
|
||||
@ -939,9 +943,11 @@ class NotesTable:
|
||||
|
||||
if BONUS_TWO_ARGS:
|
||||
# backward compat: compute_bonus took only 2 args
|
||||
bonus = CONFIG.compute_bonus(notes_bonus_gen, coefs_bonus_gen)
|
||||
bonus = scu.CONFIG.compute_bonus(
|
||||
notes_bonus_gen, coefs_bonus_gen
|
||||
)
|
||||
else:
|
||||
bonus = CONFIG.compute_bonus(
|
||||
bonus = scu.CONFIG.compute_bonus(
|
||||
notes_bonus_gen, coefs_bonus_gen, infos=infos
|
||||
)
|
||||
self.bonus[etudid] = bonus
|
||||
@ -1154,7 +1160,7 @@ class NotesTable:
|
||||
ue_capitalisees = { etudid :
|
||||
[{ 'moy':, 'event_date' : ,'formsemestre_id' : }, ...] }
|
||||
"""
|
||||
self.ue_capitalisees = DictDefault(defaultvalue=[])
|
||||
self.ue_capitalisees = scu.DictDefault(defaultvalue=[])
|
||||
cnx = None
|
||||
for etudid in self.get_etudids():
|
||||
capital = formsemestre_get_etud_capitalisation(
|
||||
@ -1295,7 +1301,7 @@ class NotesTable:
|
||||
{
|
||||
"formsemestre_id": self.formsemestre_id,
|
||||
"etudid": etudid,
|
||||
"code_attente": NOTES_ATTENTE,
|
||||
"code_attente": scu.NOTES_ATTENTE,
|
||||
},
|
||||
)
|
||||
return len(cursor.fetchall()) > 0
|
||||
@ -1339,7 +1345,7 @@ class CacheNotesTable:
|
||||
# Cache des classeur PDF (bulletins)
|
||||
self.pdfcache = {} # { formsemestre_id : (filename, pdfdoc) }
|
||||
# Listeners:
|
||||
self.listeners = DictDefault(
|
||||
self.listeners = scu.DictDefault(
|
||||
defaultvalue={}
|
||||
) # {formsemestre_id : {listener_id : callback }}
|
||||
|
||||
|
@ -37,12 +37,14 @@ Created on Thu Sep 8 09:36:33 2016
|
||||
"""
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import datetime
|
||||
import operator
|
||||
import re
|
||||
import unicodedata
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import notes_table
|
||||
|
||||
PE_DEBUG = 0
|
||||
@ -175,7 +177,7 @@ def add_pe_stuff_to_zip(context, zipfile, ziproot):
|
||||
|
||||
Also copy logos
|
||||
"""
|
||||
PE_AUX_DIR = os.path.join(SCO_SRCDIR, "config/doc_poursuites_etudes")
|
||||
PE_AUX_DIR = os.path.join(scu.SCO_SRCDIR, "config/doc_poursuites_etudes")
|
||||
distrib_dir = os.path.join(PE_AUX_DIR, "distrib")
|
||||
distrib_pathnames = list_directory_filenames(
|
||||
distrib_dir
|
||||
@ -204,7 +206,7 @@ def add_pe_stuff_to_zip(context, zipfile, ziproot):
|
||||
# Logos: (add to logos/ directory in zip)
|
||||
logos_names = ["logo_header.jpg", "logo_footer.jpg"]
|
||||
for f in logos_names:
|
||||
logo = os.path.join(SCODOC_LOGOS_DIR, f)
|
||||
logo = os.path.join(scu.SCODOC_LOGOS_DIR, f)
|
||||
if os.path.isfile(logo):
|
||||
add_local_file_to_zip(zipfile, ziproot, logo, "avis/logos/" + f)
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
|
||||
"""
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
import sco_formsemestre_status
|
||||
@ -110,7 +110,7 @@ def pe_view_sem_recap(
|
||||
# template fourni via le formulaire Web
|
||||
if avis_tmpl_file:
|
||||
template_latex = avis_tmpl_file.read()
|
||||
template_latex = template_latex.decode(SCO_ENCODING)
|
||||
template_latex = template_latex.decode(scu.SCO_ENCODING)
|
||||
else:
|
||||
# template indiqué dans préférences ScoDoc ?
|
||||
template_latex = pe_avislatex.get_code_latex_from_scodoc_preference(
|
||||
@ -127,7 +127,7 @@ def pe_view_sem_recap(
|
||||
# template fourni via le formulaire Web
|
||||
if footer_tmpl_file:
|
||||
footer_latex = footer_tmpl_file.read()
|
||||
footer_latex = footer_latex.decode(SCO_ENCODING)
|
||||
footer_latex = footer_latex.decode(scu.SCO_ENCODING)
|
||||
else:
|
||||
footer_latex = pe_avislatex.get_code_latex_from_scodoc_preference(
|
||||
context, formsemestre_id, champ="pe_avis_latex_footer"
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
Il suffit d'appeler abs_notify() après chaque ajout d'absence.
|
||||
"""
|
||||
import datetime
|
||||
from email.MIMEMultipart import ( # pylint: disable=no-name-in-module,import-error
|
||||
MIMEMultipart,
|
||||
)
|
||||
@ -40,7 +41,7 @@ from email.Header import Header # pylint: disable=no-name-in-module,import-erro
|
||||
from email import Encoders # pylint: disable=no-name-in-module,import-error
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from scolog import logdb
|
||||
import sco_bulletins
|
||||
@ -257,10 +258,10 @@ def abs_notification_message(context, sem, prefs, etudid, nbabs, nbabsjust):
|
||||
subject = """Trop d'absences pour %(nomprenom)s""" % etud
|
||||
#
|
||||
msg = MIMEMultipart()
|
||||
subj = Header("[ScoDoc] " + subject, SCO_ENCODING)
|
||||
subj = Header("[ScoDoc] " + subject, scu.SCO_ENCODING)
|
||||
msg["Subject"] = subj
|
||||
msg["From"] = prefs["email_from_addr"]
|
||||
txt = MIMEText(txt, "plain", SCO_ENCODING)
|
||||
txt = MIMEText(txt, "plain", scu.SCO_ENCODING)
|
||||
msg.attach(txt)
|
||||
return msg
|
||||
|
||||
|
@ -46,7 +46,7 @@ Pour chaque étudiant commun:
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_apogee_csv
|
||||
from gen_tables import GenTable
|
||||
|
@ -45,15 +45,17 @@
|
||||
qui est une description (humaine, format libre) de l'archive.
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import time
|
||||
from mx.DateTime import DateTime as mxDateTime
|
||||
import mx.DateTime
|
||||
import re
|
||||
import shutil
|
||||
import glob
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
import sco_pvjury
|
||||
import sco_excel
|
||||
@ -62,6 +64,7 @@ import sco_groups
|
||||
import sco_groups_view
|
||||
from sco_recapcomplet import make_formsemestre_recapcomplet
|
||||
import sco_bulletins_pdf
|
||||
from TrivialFormulator import TrivialFormulator
|
||||
from sco_exceptions import (
|
||||
AccessDenied,
|
||||
)
|
||||
@ -78,12 +81,12 @@ class BaseArchiver:
|
||||
for dir in dirs[1:]:
|
||||
path = os.path.join(path, dir)
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
if not os.path.isdir(path):
|
||||
log("creating directory %s" % path)
|
||||
os.mkdir(path)
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
|
||||
def get_obj_dir(self, context, oid):
|
||||
"""
|
||||
@ -92,7 +95,7 @@ class BaseArchiver:
|
||||
"""
|
||||
dept_dir = os.path.join(self.root, context.DeptId())
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
if not os.path.isdir(dept_dir):
|
||||
log("creating directory %s" % dept_dir)
|
||||
os.mkdir(dept_dir)
|
||||
@ -101,7 +104,7 @@ class BaseArchiver:
|
||||
log("creating directory %s" % obj_dir)
|
||||
os.mkdir(obj_dir)
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
return obj_dir
|
||||
|
||||
def list_oids(self, context):
|
||||
@ -129,10 +132,10 @@ class BaseArchiver:
|
||||
def delete_archive(self, archive_id):
|
||||
"""Delete (forever) this archive"""
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
shutil.rmtree(archive_id, ignore_errors=True)
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
|
||||
def get_archive_date(self, archive_id):
|
||||
"""Returns date (as a DateTime object) of an archive"""
|
||||
@ -142,10 +145,10 @@ class BaseArchiver:
|
||||
def list_archive(self, archive_id):
|
||||
"""Return list of filenames (without path) in archive"""
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
files = os.listdir(archive_id)
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
files.sort()
|
||||
return [f for f in files if f and f[0] != "_"]
|
||||
|
||||
@ -185,10 +188,10 @@ class BaseArchiver:
|
||||
)
|
||||
log("creating archive: %s" % archive_id)
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
os.mkdir(archive_id) # if exists, raises an OSError
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
self.store(archive_id, "_description.txt", description)
|
||||
return archive_id
|
||||
|
||||
@ -197,21 +200,21 @@ class BaseArchiver:
|
||||
Filename may be modified (sanitized): return used filename
|
||||
The file is created or replaced.
|
||||
"""
|
||||
filename = sanitize_filename(filename)
|
||||
filename = scu.sanitize_filename(filename)
|
||||
log("storing %s (%d bytes) in %s" % (filename, len(data), archive_id))
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
fname = os.path.join(archive_id, filename)
|
||||
f = open(fname, "w")
|
||||
f.write(data)
|
||||
f.close()
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
return filename
|
||||
|
||||
def get(self, archive_id, filename):
|
||||
"""Retreive data"""
|
||||
if not is_valid_filename(filename):
|
||||
if not scu.is_valid_filename(filename):
|
||||
log('Archiver.get: invalid filename "%s"' % filename)
|
||||
raise ValueError("invalid filename")
|
||||
fname = os.path.join(archive_id, filename)
|
||||
@ -223,18 +226,18 @@ class BaseArchiver:
|
||||
# XXX très incomplet: devrait inférer et assigner un type MIME
|
||||
archive_id = self.get_id_from_name(context, oid, archive_name)
|
||||
data = self.get(archive_id, filename)
|
||||
ext = os.path.splitext(strlower(filename))[1]
|
||||
ext = os.path.splitext(scu.strlower(filename))[1]
|
||||
if ext == ".html" or ext == ".htm":
|
||||
return data
|
||||
elif ext == ".xml":
|
||||
REQUEST.RESPONSE.setHeader("content-type", XML_MIMETYPE)
|
||||
REQUEST.RESPONSE.setHeader("content-type", scu.XML_MIMETYPE)
|
||||
return data
|
||||
elif ext == ".xls":
|
||||
return sco_excel.sendExcelFile(REQUEST, data, filename)
|
||||
elif ext == ".csv":
|
||||
return sendCSVFile(REQUEST, data, filename)
|
||||
return scu.sendCSVFile(REQUEST, data, filename)
|
||||
elif ext == ".pdf":
|
||||
return sendPDFFile(REQUEST, data, filename)
|
||||
return scu.sendPDFFile(REQUEST, data, filename)
|
||||
|
||||
return data # should set mimetype...
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
les dossiers d'admission et autres pièces utiles.
|
||||
"""
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import ImportScolars
|
||||
import sco_formsemestre
|
||||
@ -40,6 +40,7 @@ import sco_excel
|
||||
import sco_archives
|
||||
from sco_permissions import ScoEtudAddAnnotations
|
||||
from sco_exceptions import AccessDenied
|
||||
from TrivialFormulator import TrivialFormulator
|
||||
|
||||
|
||||
class EtudsArchiver(sco_archives.BaseArchiver):
|
||||
@ -67,10 +68,10 @@ def etud_list_archives_html(context, REQUEST, etudid):
|
||||
"content": EtudsArchive.list_archive(archive_id),
|
||||
}
|
||||
L.append(a)
|
||||
delete_icon = icontag(
|
||||
delete_icon = scu.icontag(
|
||||
"delete_small_img", title="Supprimer fichier", alt="supprimer"
|
||||
)
|
||||
delete_disabled_icon = icontag(
|
||||
delete_disabled_icon = scu.icontag(
|
||||
"delete_small_dis_img", title="Suppression non autorisée"
|
||||
)
|
||||
H = ['<div class="etudarchive"><ul>']
|
||||
@ -139,7 +140,7 @@ def etud_upload_file_form(context, REQUEST, etudid):
|
||||
% etud,
|
||||
"""<p>Le fichier ne doit pas dépasser %sMo.</p>
|
||||
"""
|
||||
% (CONFIG.ETUD_MAX_FILE_SIZE / (1024 * 1024)),
|
||||
% (scu.CONFIG.ETUD_MAX_FILE_SIZE / (1024 * 1024)),
|
||||
]
|
||||
tf = TrivialFormulator(
|
||||
REQUEST.URL0,
|
||||
@ -179,7 +180,7 @@ def _store_etud_file_to_new_archive(
|
||||
):
|
||||
"""Store data to new archive."""
|
||||
filesize = len(data)
|
||||
if filesize < 10 or filesize > CONFIG.ETUD_MAX_FILE_SIZE:
|
||||
if filesize < 10 or filesize > scu.CONFIG.ETUD_MAX_FILE_SIZE:
|
||||
return 0, "Fichier image de taille invalide ! (%d)" % filesize
|
||||
archive_id = EtudsArchive.create_obj_archive(context, etudid, description)
|
||||
EtudsArchive.store(archive_id, filename, data)
|
||||
|
@ -31,7 +31,7 @@
|
||||
(coût théorique en heures équivalent TD)
|
||||
"""
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from gen_tables import GenTable
|
||||
import sco_excel, sco_pdf
|
||||
@ -39,6 +39,7 @@ from sco_pdf import SU
|
||||
import sco_formsemestre
|
||||
import sco_moduleimpl
|
||||
import sco_formsemestre_status
|
||||
import VERSION
|
||||
|
||||
|
||||
def formsemestre_table_estim_cost(
|
||||
@ -144,7 +145,7 @@ def formsemestre_table_estim_cost(
|
||||
(dans ce cas, retoucher le tableau excel exporté).
|
||||
</div>
|
||||
""",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
filename="EstimCout-S%s" % sem["semestre_id"],
|
||||
)
|
||||
return tab
|
||||
|
12
sco_dept.py
12
sco_dept.py
@ -28,7 +28,7 @@
|
||||
"""Page accueil département (liste des semestres, etc)
|
||||
"""
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_modalites
|
||||
import sco_news
|
||||
@ -45,7 +45,7 @@ def index_html(context, REQUEST=None, showcodes=0, showsemtable=0):
|
||||
|
||||
# News:
|
||||
# 2020-12-30: abandonne l'icon rss
|
||||
# rssicon = icontag("rssscodoc_img", title="Flux RSS", border="0")
|
||||
# rssicon = scu.icontag("rssscodoc_img", title="Flux RSS", border="0")
|
||||
H.append(sco_news.scolar_news_summary_html(context)) # , rssicon=rssicon))
|
||||
|
||||
# Avertissement de mise à jour:
|
||||
@ -56,9 +56,11 @@ def index_html(context, REQUEST=None, showcodes=0, showsemtable=0):
|
||||
cursems = [] # semestres "courants"
|
||||
othersems = [] # autres (verrouillés)
|
||||
# icon image:
|
||||
groupicon = icontag("groupicon_img", title="Inscrits", border="0")
|
||||
emptygroupicon = icontag("emptygroupicon_img", title="Pas d'inscrits", border="0")
|
||||
lockicon = icontag("lock32_img", title="verrouillé", border="0")
|
||||
groupicon = scu.icontag("groupicon_img", title="Inscrits", border="0")
|
||||
emptygroupicon = scu.icontag(
|
||||
"emptygroupicon_img", title="Pas d'inscrits", border="0"
|
||||
)
|
||||
lockicon = scu.icontag("lock32_img", title="verrouillé", border="0")
|
||||
# Sélection sur l'etat du semestre
|
||||
for sem in sems:
|
||||
if sem["etat"] == "1" and sem["modalite"] != "EXT":
|
||||
|
@ -46,7 +46,7 @@ pg_dump SCORT | psql ANORT
|
||||
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import fcntl
|
||||
import subprocess
|
||||
import requests
|
||||
@ -61,7 +61,7 @@ from email import Encoders # pylint: disable=no-name-in-module,import-error
|
||||
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from sco_exceptions import ScoValueError
|
||||
|
||||
@ -98,22 +98,25 @@ def sco_dump_and_send_db(context, REQUEST=None):
|
||||
|
||||
# Send
|
||||
r = _send_db(context, REQUEST, ano_db_name)
|
||||
if r.status_code == requests.codes.INSUFFICIENT_STORAGE:
|
||||
if (
|
||||
r.status_code
|
||||
== requests.codes.INSUFFICIENT_STORAGE # pylint: disable=no-member
|
||||
):
|
||||
H.append(
|
||||
"""<p class="warning">
|
||||
Erreur: espace serveur trop plein.
|
||||
Merci de contacter <a href="mailto:{0}">{0}</a></p>""".format(
|
||||
SCO_DEV_MAIL
|
||||
scu.SCO_DEV_MAIL
|
||||
)
|
||||
)
|
||||
elif r.status_code == requests.codes.OK:
|
||||
elif r.status_code == requests.codes.OK: # pylint: disable=no-member
|
||||
H.append("""<p>Opération effectuée.</p>""")
|
||||
else:
|
||||
H.append(
|
||||
"""<p class="warning">
|
||||
Erreur: code <tt>{0} {1}</tt>
|
||||
Merci de contacter <a href="mailto:{2}">{2}</a></p>""".format(
|
||||
r.status_code, r.reason, SCO_DEV_MAIL
|
||||
r.status_code, r.reason, scu.SCO_DEV_MAIL
|
||||
)
|
||||
)
|
||||
|
||||
@ -133,7 +136,7 @@ def _duplicate_db(db_name, ano_db_name):
|
||||
cmd = ["createdb", "-E", "UTF-8", ano_db_name]
|
||||
log("sco_dump_and_send_db/_duplicate_db: {}".format(cmd))
|
||||
try:
|
||||
out = subprocess.check_output(cmd)
|
||||
_ = subprocess.check_output(cmd)
|
||||
except subprocess.CalledProcessError as e:
|
||||
log("sco_dump_and_send_db: exception createdb {}".format(e))
|
||||
raise ScoValueError(
|
||||
@ -143,7 +146,7 @@ def _duplicate_db(db_name, ano_db_name):
|
||||
cmd = "pg_dump {} | psql {}".format(db_name, ano_db_name)
|
||||
log("sco_dump_and_send_db/_duplicate_db: {}".format(cmd))
|
||||
try:
|
||||
out = subprocess.check_output(cmd, shell=1)
|
||||
_ = subprocess.check_output(cmd, shell=1)
|
||||
except subprocess.CalledProcessError as e:
|
||||
log("sco_dump_and_send_db: exception {}".format(e))
|
||||
raise ScoValueError(
|
||||
@ -155,10 +158,10 @@ def _duplicate_db(db_name, ano_db_name):
|
||||
|
||||
def _anonymize_db(ano_db_name):
|
||||
"""Anonymize a departement database"""
|
||||
cmd = os.path.join(SCO_CONFIG_DIR, "anonymize_db.py")
|
||||
cmd = os.path.join(scu.SCO_CONFIG_DIR, "anonymize_db.py")
|
||||
log("_anonymize_db: {}".format(cmd))
|
||||
try:
|
||||
out = subprocess.check_output([cmd, ano_db_name])
|
||||
_ = subprocess.check_output([cmd, ano_db_name])
|
||||
except subprocess.CalledProcessError as e:
|
||||
log("sco_dump_and_send_db: exception in anonymisation: {}".format(e))
|
||||
raise ScoValueError(
|
||||
@ -168,7 +171,7 @@ def _anonymize_db(ano_db_name):
|
||||
|
||||
def _get_scodoc_serial(context):
|
||||
try:
|
||||
return int(open(os.path.join(SCODOC_VERSION_DIR, "scodoc.sn")).read())
|
||||
return int(open(os.path.join(scu.SCODOC_VERSION_DIR, "scodoc.sn")).read())
|
||||
except:
|
||||
return 0
|
||||
|
||||
@ -187,7 +190,7 @@ def _send_db(context, REQUEST, ano_db_name):
|
||||
log("uploading anonymized dump...")
|
||||
files = {"file": (ano_db_name + ".gz", data)}
|
||||
r = requests.post(
|
||||
SCO_DUMP_UP_URL,
|
||||
scu.SCO_DUMP_UP_URL,
|
||||
files=files,
|
||||
data={
|
||||
"dept_name": context.get_preference("DeptName"),
|
||||
@ -196,8 +199,8 @@ def _send_db(context, REQUEST, ano_db_name):
|
||||
"sent_by": context.Users.user_info(str(REQUEST.AUTHENTICATED_USER))[
|
||||
"nomcomplet"
|
||||
],
|
||||
"sco_version": SCOVERSION,
|
||||
"sco_subversion": get_svn_version(SCO_CONFIG_DIR),
|
||||
"sco_version": scu.SCOVERSION,
|
||||
"sco_subversion": scu.get_svn_version(scu.SCO_CONFIG_DIR),
|
||||
},
|
||||
)
|
||||
return r
|
||||
@ -215,7 +218,7 @@ def _drop_ano_db(ano_db_name):
|
||||
cmd = ["dropdb", ano_db_name]
|
||||
log("sco_dump_and_send_db: {}".format(cmd))
|
||||
try:
|
||||
out = subprocess.check_output(cmd)
|
||||
_ = subprocess.check_output(cmd)
|
||||
except subprocess.CalledProcessError as e:
|
||||
log("sco_dump_and_send_db: exception dropdb {}".format(e))
|
||||
raise ScoValueError(
|
||||
|
@ -29,9 +29,9 @@
|
||||
(portage from DTML)
|
||||
"""
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
from TrivialFormulator import TrivialFormulator, TF, tf_error_message
|
||||
import sco_codes_parcours
|
||||
import sco_formsemestre
|
||||
from sco_exceptions import ScoValueError
|
||||
|
@ -29,9 +29,9 @@
|
||||
(portage from DTML)
|
||||
"""
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
from TrivialFormulator import TrivialFormulator, TF, tf_error_message
|
||||
import sco_formsemestre
|
||||
from sco_exceptions import ScoValueError
|
||||
|
||||
@ -91,7 +91,7 @@ associé.
|
||||
+ tf[1]
|
||||
+ context.sco_footer(REQUEST)
|
||||
)
|
||||
matiere_id = context.do_matiere_create(tf[2], REQUEST)
|
||||
_ = context.do_matiere_create(tf[2], REQUEST)
|
||||
return REQUEST.RESPONSE.redirect(dest_url)
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
(portage from DTML)
|
||||
"""
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_codes_parcours
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
@ -101,7 +101,7 @@ def module_create(context, matiere_id=None, REQUEST=None):
|
||||
"title": "Type",
|
||||
"explanation": "",
|
||||
"labels": ("Standard", "Malus"),
|
||||
"allowed_values": (str(MODULE_STANDARD), str(MODULE_MALUS)),
|
||||
"allowed_values": (str(scu.MODULE_STANDARD), str(scu.MODULE_MALUS)),
|
||||
},
|
||||
),
|
||||
(
|
||||
@ -142,7 +142,7 @@ def module_create(context, matiere_id=None, REQUEST=None):
|
||||
{
|
||||
"input_type": "menu",
|
||||
"type": "int",
|
||||
"title": strcapitalize(parcours.SESSION_NAME),
|
||||
"title": scu.strcapitalize(parcours.SESSION_NAME),
|
||||
"explanation": "%s de début du module dans la formation standard"
|
||||
% parcours.SESSION_NAME,
|
||||
"labels": [str(x) for x in semestres_indices],
|
||||
@ -288,7 +288,7 @@ def module_edit(context, module_id=None, REQUEST=None):
|
||||
"title": "Type",
|
||||
"explanation": "",
|
||||
"labels": ("Standard", "Malus"),
|
||||
"allowed_values": (str(MODULE_STANDARD), str(MODULE_MALUS)),
|
||||
"allowed_values": (str(scu.MODULE_STANDARD), str(scu.MODULE_MALUS)),
|
||||
"enabled": unlocked,
|
||||
},
|
||||
),
|
||||
@ -401,7 +401,7 @@ def edit_module_set_code_apogee(context, id=None, value=None, REQUEST=None):
|
||||
|
||||
context.do_module_edit({"module_id": module_id, "code_apogee": value})
|
||||
if not value:
|
||||
value = APO_MISSING_CODE_STR
|
||||
value = scu.APO_MISSING_CODE_STR
|
||||
return value
|
||||
|
||||
|
||||
@ -446,7 +446,7 @@ def formation_add_malus_modules(context, formation_id, titre=None, REQUEST=None)
|
||||
[
|
||||
mod
|
||||
for mod in context.do_module_list(args={"ue_id": ue["ue_id"]})
|
||||
if mod["module_type"] == MODULE_MALUS
|
||||
if mod["module_type"] == scu.MODULE_MALUS
|
||||
]
|
||||
)
|
||||
if nb_mod_malus == 0:
|
||||
@ -492,7 +492,7 @@ def ue_add_malus_module(context, ue_id, titre=None, code=None, REQUEST=None):
|
||||
"matiere_id": matiere_id,
|
||||
"formation_id": ue["formation_id"],
|
||||
"semestre_id": semestre_id,
|
||||
"module_type": MODULE_MALUS,
|
||||
"module_type": scu.MODULE_MALUS,
|
||||
},
|
||||
REQUEST,
|
||||
)
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
"""
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
from gen_tables import GenTable
|
||||
@ -160,7 +160,7 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None):
|
||||
{
|
||||
"input_type": "menu",
|
||||
"type": "int",
|
||||
"title": strcapitalize(parcours.SESSION_NAME),
|
||||
"title": scu.strcapitalize(parcours.SESSION_NAME),
|
||||
"explanation": "%s de début du module dans la formation"
|
||||
% parcours.SESSION_NAME,
|
||||
"labels": [str(x) for x in semestres_indices],
|
||||
@ -308,15 +308,15 @@ def ue_list(context, formation_id=None, msg="", REQUEST=None):
|
||||
editable = perm_change
|
||||
tag_editable = authuser.has_permission(ScoEditFormationTags, context) or perm_change
|
||||
if locked:
|
||||
lockicon = icontag("lock32_img", title="verrouillé")
|
||||
lockicon = scu.icontag("lock32_img", title="verrouillé")
|
||||
else:
|
||||
lockicon = ""
|
||||
|
||||
arrow_up, arrow_down, arrow_none = sco_groups.getArrowIconsTags(context, REQUEST)
|
||||
delete_icon = icontag(
|
||||
delete_icon = scu.icontag(
|
||||
"delete_small_img", title="Supprimer (module inutilisé)", alt="supprimer"
|
||||
)
|
||||
delete_disabled_icon = icontag(
|
||||
delete_disabled_icon = scu.icontag(
|
||||
"delete_small_dis_img", title="Suppression impossible (module utilisé)"
|
||||
)
|
||||
H = [
|
||||
@ -417,7 +417,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
|
||||
klass = ""
|
||||
UE["code_apogee_str"] = (
|
||||
""", Apo: <span class="%s" data-url="edit_ue_set_code_apogee" id="%s" data-placeholder="%s">"""
|
||||
% (klass, UE["ue_id"], APO_MISSING_CODE_STR)
|
||||
% (klass, UE["ue_id"], scu.APO_MISSING_CODE_STR)
|
||||
+ (UE["code_apogee"] or "")
|
||||
+ "</span>"
|
||||
)
|
||||
@ -493,7 +493,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
|
||||
Mod["module_id"]
|
||||
)
|
||||
klass = "notes_module_list"
|
||||
if Mod["module_type"] == MODULE_MALUS:
|
||||
if Mod["module_type"] == scu.MODULE_MALUS:
|
||||
klass += " module_malus"
|
||||
H.append('<li class="%s">' % klass)
|
||||
|
||||
@ -532,7 +532,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
|
||||
)
|
||||
H.append(
|
||||
'<span class="formation_module_tit">%s</span>'
|
||||
% join_words(Mod["code"], Mod["titre"])
|
||||
% scu.join_words(Mod["code"], Mod["titre"])
|
||||
)
|
||||
if mod_editable:
|
||||
H.append("</a>")
|
||||
@ -546,7 +546,7 @@ Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module
|
||||
klass = ""
|
||||
heurescoef += (
|
||||
', Apo: <span class="%s" data-url="edit_module_set_code_apogee" id="%s" data-placeholder="%s">'
|
||||
% (klass, Mod["module_id"], APO_MISSING_CODE_STR)
|
||||
% (klass, Mod["module_id"], scu.APO_MISSING_CODE_STR)
|
||||
+ (Mod["code_apogee"] or "")
|
||||
+ "</span>"
|
||||
)
|
||||
@ -778,7 +778,7 @@ def edit_ue_set_code_apogee(context, id=None, value=None, REQUEST=None):
|
||||
dont_invalidate_cache=False,
|
||||
)
|
||||
if not value:
|
||||
value = APO_MISSING_CODE_STR
|
||||
value = scu.APO_MISSING_CODE_STR
|
||||
return value
|
||||
|
||||
|
||||
@ -850,7 +850,7 @@ def formation_table_recap(context, formation_id, format="html", REQUEST=None):
|
||||
columns_ids=columns_ids,
|
||||
rows=T,
|
||||
titles=titles,
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % scu.VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
caption=title,
|
||||
html_caption=title,
|
||||
html_class="table_leftalign",
|
||||
|
@ -38,7 +38,8 @@ import traceback
|
||||
import icalendar
|
||||
import pprint
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
import sco_groups
|
||||
import sco_groups_view
|
||||
@ -148,7 +149,7 @@ def group_edt_json(context, group_id, start="", end="", REQUEST=None):
|
||||
}
|
||||
J.append(d)
|
||||
|
||||
return sendJSON(REQUEST, J)
|
||||
return scu.sendJSON(REQUEST, J)
|
||||
|
||||
|
||||
"""XXX
|
||||
|
@ -75,7 +75,9 @@
|
||||
|
||||
"""
|
||||
|
||||
from sco_utils import *
|
||||
import re
|
||||
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
import notes_table
|
||||
@ -111,7 +113,7 @@ def apo_csv_store(context, csv_data, annee_scolaire, sem_id):
|
||||
"""
|
||||
# sanity check
|
||||
filesize = len(csv_data)
|
||||
if filesize < 10 or filesize > CONFIG.ETUD_MAX_FILE_SIZE:
|
||||
if filesize < 10 or filesize > scu.CONFIG.ETUD_MAX_FILE_SIZE:
|
||||
raise ScoValueError("Fichier csv de taille invalide ! (%d)" % filesize)
|
||||
|
||||
if not annee_scolaire:
|
||||
|
@ -31,7 +31,7 @@
|
||||
from cStringIO import StringIO
|
||||
from zipfile import ZipFile
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
import sco_formsemestre_status
|
||||
@ -448,7 +448,7 @@ def table_apo_csv_list(context, semset, REQUEST=None):
|
||||
)
|
||||
t["_filename_target"] = view_link
|
||||
t["_etape_apo_target"] = view_link
|
||||
t["suppress"] = icontag(
|
||||
t["suppress"] = scu.icontag(
|
||||
"delete_small_img", border="0", alt="supprimer", title="Supprimer"
|
||||
)
|
||||
t["_suppress_target"] = "view_apo_csv_delete?etape_apo=%s&semset_id=%s" % (
|
||||
@ -485,8 +485,8 @@ def view_apo_etuds(context, semset_id, title="", nips=[], format="html", REQUEST
|
||||
if not semset_id:
|
||||
raise ValueError("invalid null semset_id")
|
||||
semset = sco_semset.SemSet(context, semset_id=semset_id)
|
||||
annee_scolaire = semset["annee_scolaire"]
|
||||
sem_id = semset["sem_id"]
|
||||
# annee_scolaire = semset["annee_scolaire"]
|
||||
# sem_id = semset["sem_id"]
|
||||
|
||||
if nips and type(nips) != type([]):
|
||||
nips = [nips]
|
||||
@ -687,7 +687,7 @@ def view_apo_csv(context, etape_apo="", semset_id="", format="html", REQUEST=Non
|
||||
sem_id = semset["sem_id"]
|
||||
csv_data = sco_etape_apogee.apo_csv_get(context, etape_apo, annee_scolaire, sem_id)
|
||||
if format == "raw":
|
||||
return sendCSVFile(REQUEST, csv_data, etape_apo + ".txt")
|
||||
return scu.sendCSVFile(REQUEST, csv_data, etape_apo + ".txt")
|
||||
apo_data = sco_apogee_csv.ApoData(csv_data, periode=semset["sem_id"])
|
||||
|
||||
(
|
||||
@ -839,7 +839,7 @@ def apo_csv_export_results(
|
||||
+ "-%s-" % periode
|
||||
+ "-".join(etapes_apo)
|
||||
)
|
||||
basename = sco_archives.sanitize_filename(unescape_html(basename))
|
||||
basename = scu.sanitize_filename(scu.unescape_html(basename))
|
||||
|
||||
dest_zip.close()
|
||||
size = data.tell()
|
||||
|
81
sco_excel.py
81
sco_excel.py
@ -33,8 +33,9 @@ from pyExcelerator import *
|
||||
|
||||
from notes_log import log
|
||||
from scolog import logdb
|
||||
from sco_exceptions import *
|
||||
from sco_utils import *
|
||||
|
||||
from sco_exceptions import ScoValueError
|
||||
import sco_utils as scu
|
||||
import notesdb
|
||||
|
||||
import time, datetime
|
||||
@ -57,9 +58,11 @@ def sendExcelFile(REQUEST, data, filename):
|
||||
(on ne doit rien avoir émis avant, car ici sont générés les entetes)
|
||||
"""
|
||||
filename = (
|
||||
unescape_html(suppress_accents(filename)).replace("&", "").replace(" ", "_")
|
||||
scu.unescape_html(scu.suppress_accents(filename))
|
||||
.replace("&", "")
|
||||
.replace(" ", "_")
|
||||
)
|
||||
REQUEST.RESPONSE.setHeader("content-type", XLS_MIMETYPE)
|
||||
REQUEST.RESPONSE.setHeader("content-type", scu.XLS_MIMETYPE)
|
||||
REQUEST.RESPONSE.setHeader(
|
||||
"content-disposition", 'attachment; filename="%s"' % filename
|
||||
)
|
||||
@ -216,7 +219,7 @@ class ScoExcelSheet:
|
||||
sauvegarde = True
|
||||
else:
|
||||
sauvegarde = False
|
||||
ws0 = wb.add_sheet(self.sheet_name.decode(SCO_ENCODING))
|
||||
ws0 = wb.add_sheet(self.sheet_name.decode(scu.SCO_ENCODING))
|
||||
li = 0
|
||||
for l in self.cells:
|
||||
co = 0
|
||||
@ -225,7 +228,7 @@ class ScoExcelSheet:
|
||||
if type(c) == LongType:
|
||||
c = int(c) # assume all ScoDoc longs fits in int !
|
||||
elif type(c) not in (IntType, FloatType):
|
||||
c = str(c).decode(SCO_ENCODING)
|
||||
c = str(c).decode(scu.SCO_ENCODING)
|
||||
|
||||
ws0.write(li, co, c, self.get_cell_style(li, co))
|
||||
co += 1
|
||||
@ -240,14 +243,14 @@ def Excel_SimpleTable(titles=[], lines=[[]], SheetName="feuille", titlesStyles=[
|
||||
"""Export simple type 'CSV': 1ere ligne en gras, le reste tel quel"""
|
||||
# XXX devrait maintenant utiliser ScoExcelSheet
|
||||
wb = Workbook()
|
||||
ws0 = wb.add_sheet(SheetName.decode(SCO_ENCODING))
|
||||
ws0 = wb.add_sheet(SheetName.decode(scu.SCO_ENCODING))
|
||||
if not titlesStyles:
|
||||
style = Excel_MakeStyle(bold=True)
|
||||
titlesStyles = [style] * len(titles)
|
||||
# ligne de titres
|
||||
col = 0
|
||||
for it in titles:
|
||||
ws0.write(0, col, it.decode(SCO_ENCODING), titlesStyles[col])
|
||||
ws0.write(0, col, it.decode(scu.SCO_ENCODING), titlesStyles[col])
|
||||
col += 1
|
||||
# suite
|
||||
default_style = Excel_MakeStyle()
|
||||
@ -262,7 +265,7 @@ def Excel_SimpleTable(titles=[], lines=[[]], SheetName="feuille", titlesStyles=[
|
||||
if type(it) == LongType:
|
||||
it = int(it) # assume all ScoDoc longs fits in int !
|
||||
elif type(it) not in (IntType, FloatType):
|
||||
it = str(it).decode(SCO_ENCODING)
|
||||
it = str(it).decode(scu.SCO_ENCODING)
|
||||
cell_style = text_style
|
||||
ws0.write(li, col, it, cell_style)
|
||||
col += 1
|
||||
@ -279,7 +282,7 @@ def Excel_feuille_saisie(E, titreannee, description, lines):
|
||||
"""
|
||||
SheetName = "Saisie notes"
|
||||
wb = Workbook()
|
||||
ws0 = wb.add_sheet(SheetName.decode(SCO_ENCODING))
|
||||
ws0 = wb.add_sheet(SheetName.decode(scu.SCO_ENCODING))
|
||||
# ajuste largeurs colonnes (unite inconnue, empirique)
|
||||
ws0.col(0).width = 400 # codes
|
||||
ws0.col(1).width = 6000 # noms
|
||||
@ -366,10 +369,14 @@ def Excel_feuille_saisie(E, titreannee, description, lines):
|
||||
ws0.write(li, 0, u"Ne pas modifier les cases en mauve !", style_expl)
|
||||
li += 1
|
||||
# Nom du semestre
|
||||
ws0.write(li, 0, unescape_html(titreannee).decode(SCO_ENCODING), style_titres)
|
||||
ws0.write(
|
||||
li, 0, scu.unescape_html(titreannee).decode(scu.SCO_ENCODING), style_titres
|
||||
)
|
||||
li += 1
|
||||
# description evaluation
|
||||
ws0.write(li, 0, unescape_html(description).decode(SCO_ENCODING), style_titres)
|
||||
ws0.write(
|
||||
li, 0, scu.unescape_html(description).decode(scu.SCO_ENCODING), style_titres
|
||||
)
|
||||
li += 1
|
||||
ws0.write(
|
||||
li, 0, u"Evaluation du %s (coef. %g)" % (E["jour"], E["coefficient"]), style
|
||||
@ -387,7 +394,7 @@ def Excel_feuille_saisie(E, titreannee, description, lines):
|
||||
for line in lines:
|
||||
li += 1
|
||||
st = style_nom
|
||||
ws0.write(li, 0, ("!" + line[0]).decode(SCO_ENCODING), style_ro) # code
|
||||
ws0.write(li, 0, ("!" + line[0]).decode(scu.SCO_ENCODING), style_ro) # code
|
||||
if line[3] != "I":
|
||||
st = style_dem
|
||||
if line[3] == "D": # demissionnaire
|
||||
@ -396,15 +403,15 @@ def Excel_feuille_saisie(E, titreannee, description, lines):
|
||||
s = line[3] # etat autre
|
||||
else:
|
||||
s = line[4] # groupes TD/TP/...
|
||||
ws0.write(li, 1, line[1].decode(SCO_ENCODING), st)
|
||||
ws0.write(li, 2, line[2].decode(SCO_ENCODING), st)
|
||||
ws0.write(li, 3, s.decode(SCO_ENCODING), st)
|
||||
ws0.write(li, 1, line[1].decode(scu.SCO_ENCODING), st)
|
||||
ws0.write(li, 2, line[2].decode(scu.SCO_ENCODING), st)
|
||||
ws0.write(li, 3, s.decode(scu.SCO_ENCODING), st)
|
||||
try:
|
||||
val = float(line[5])
|
||||
except:
|
||||
val = line[5].decode(SCO_ENCODING)
|
||||
val = line[5].decode(scu.SCO_ENCODING)
|
||||
ws0.write(li, 4, val, style_notes) # note
|
||||
ws0.write(li, 5, line[6].decode(SCO_ENCODING), style_comment) # comment
|
||||
ws0.write(li, 5, line[6].decode(scu.SCO_ENCODING), style_comment) # comment
|
||||
# explication en bas
|
||||
li += 2
|
||||
ws0.write(li, 1, u"Code notes", style_titres)
|
||||
@ -426,7 +433,7 @@ def Excel_to_list(data, convert_to_string=str): # we may need 'encoding' argume
|
||||
convert_to_string is a conversion function applied to all non-string values (ie numbers)
|
||||
"""
|
||||
try:
|
||||
P = parse_xls("", SCO_ENCODING, doc=data)
|
||||
P = parse_xls("", scu.SCO_ENCODING, doc=data)
|
||||
except:
|
||||
log("Excel_to_list: failure to import document")
|
||||
open("/tmp/last_scodoc_import_failure.xls", "w").write(data)
|
||||
@ -443,7 +450,7 @@ def Excel_to_list(data, convert_to_string=str): # we may need 'encoding' argume
|
||||
diag.append("Attention: n'utilise que la première feuille du classeur !")
|
||||
# fill matrix
|
||||
sheet_name, values = P[0]
|
||||
sheet_name = sheet_name.encode(SCO_ENCODING, "backslashreplace")
|
||||
sheet_name = sheet_name.encode(scu.SCO_ENCODING, "backslashreplace")
|
||||
if not values:
|
||||
diag.append("Aucune valeur trouvée dans le classeur !")
|
||||
return diag, None
|
||||
@ -454,13 +461,13 @@ def Excel_to_list(data, convert_to_string=str): # we may need 'encoding' argume
|
||||
nbcols = max(cols) + 1
|
||||
nbrows = max(rows) + 1
|
||||
M = []
|
||||
for i in range(nbrows):
|
||||
for _ in range(nbrows):
|
||||
M.append([""] * nbcols)
|
||||
|
||||
for row_idx, col_idx in indexes:
|
||||
v = values[(row_idx, col_idx)]
|
||||
if isinstance(v, unicode):
|
||||
v = v.encode(SCO_ENCODING, "backslashreplace")
|
||||
v = v.encode(scu.SCO_ENCODING, "backslashreplace")
|
||||
elif convert_to_string:
|
||||
v = convert_to_string(v)
|
||||
M[row_idx][col_idx] = v
|
||||
@ -485,7 +492,7 @@ def Excel_feuille_listeappel(
|
||||
formsemestre_id = sem["formsemestre_id"]
|
||||
SheetName = "Liste " + groupname
|
||||
wb = Workbook()
|
||||
ws0 = wb.add_sheet(SheetName.decode(SCO_ENCODING))
|
||||
ws0 = wb.add_sheet(SheetName.decode(scu.SCO_ENCODING))
|
||||
|
||||
font1 = Font()
|
||||
font1.name = "Arial"
|
||||
@ -569,7 +576,7 @@ def Excel_feuille_listeappel(
|
||||
sem["date_debut"],
|
||||
sem["date_fin"],
|
||||
)
|
||||
).decode(SCO_ENCODING),
|
||||
).decode(scu.SCO_ENCODING),
|
||||
style2,
|
||||
)
|
||||
# ligne 2
|
||||
@ -578,7 +585,7 @@ def Excel_feuille_listeappel(
|
||||
# ligne 3
|
||||
li += 1
|
||||
ws0.write(li, 1, u"Enseignant :", style2)
|
||||
ws0.write(li, 5, ("Groupe %s" % groupname).decode(SCO_ENCODING), style3)
|
||||
ws0.write(li, 5, ("Groupe %s" % groupname).decode(scu.SCO_ENCODING), style3)
|
||||
# Avertissement pour ne pas confondre avec listes notes
|
||||
ws0.write(
|
||||
li + 1, 2, u"Ne pas utiliser cette feuille pour saisir les notes !", style1i
|
||||
@ -590,7 +597,9 @@ def Excel_feuille_listeappel(
|
||||
co = 2
|
||||
for partition in partitions:
|
||||
if partition["partition_name"]:
|
||||
ws0.write(li, co, partition["partition_name"].decode(SCO_ENCODING), style3)
|
||||
ws0.write(
|
||||
li, co, partition["partition_name"].decode(scu.SCO_ENCODING), style3
|
||||
)
|
||||
co += 1
|
||||
if with_codes:
|
||||
coc = co
|
||||
@ -607,7 +616,11 @@ def Excel_feuille_listeappel(
|
||||
li += 1
|
||||
ws0.write(li, 0, n, style1b)
|
||||
nomprenom = (
|
||||
t["sexe"] + " " + t["nom"] + " " + strcapitalize(strlower(t["prenom"]))
|
||||
t["sexe"]
|
||||
+ " "
|
||||
+ t["nom"]
|
||||
+ " "
|
||||
+ scu.strcapitalize(scu.strlower(t["prenom"]))
|
||||
)
|
||||
style_nom = style2t3
|
||||
if with_paiement:
|
||||
@ -618,31 +631,31 @@ def Excel_feuille_listeappel(
|
||||
elif not paie:
|
||||
nomprenom += " (non paiement)"
|
||||
style_nom = style2t3bold
|
||||
ws0.write(li, 1, nomprenom.decode(SCO_ENCODING), style_nom)
|
||||
ws0.write(li, 1, nomprenom.decode(scu.SCO_ENCODING), style_nom)
|
||||
co = 2
|
||||
for partition in partitions:
|
||||
if partition["partition_name"]:
|
||||
ws0.write(
|
||||
li,
|
||||
co,
|
||||
t.get(partition["partition_id"], "").decode(SCO_ENCODING),
|
||||
t.get(partition["partition_id"], "").decode(scu.SCO_ENCODING),
|
||||
style2t3,
|
||||
)
|
||||
co += 1
|
||||
if with_codes:
|
||||
ws0.write(li, coc, t["etudid"].decode(SCO_ENCODING), style2t3)
|
||||
ws0.write(li, coc, t["etudid"].decode(scu.SCO_ENCODING), style2t3)
|
||||
if t["code_nip"]:
|
||||
code_nip = t["code_nip"].decode(SCO_ENCODING)
|
||||
code_nip = t["code_nip"].decode(scu.SCO_ENCODING)
|
||||
else:
|
||||
code_nip = u""
|
||||
ws0.write(li, coc + 1, code_nip, style2t3)
|
||||
if t["code_ine"]:
|
||||
code_ine = t["code_ine"].decode(SCO_ENCODING)
|
||||
code_ine = t["code_ine"].decode(scu.SCO_ENCODING)
|
||||
else:
|
||||
code_ine = u""
|
||||
ws0.write(li, coc + 2, code_ine, style2t3)
|
||||
if t["etath"]:
|
||||
etath = t["etath"].decode(SCO_ENCODING)
|
||||
etath = t["etath"].decode(scu.SCO_ENCODING)
|
||||
else:
|
||||
etath = u""
|
||||
ws0.write(li, co, etath, style2b) # etat
|
||||
@ -654,7 +667,7 @@ def Excel_feuille_listeappel(
|
||||
dt = time.strftime("%d/%m/%Y à %Hh%M")
|
||||
if server_name:
|
||||
dt += " sur " + server_name
|
||||
ws0.write(li, 1, ("Liste éditée le " + dt).decode(SCO_ENCODING), style1i)
|
||||
ws0.write(li, 1, ("Liste éditée le " + dt).decode(scu.SCO_ENCODING), style1i)
|
||||
#
|
||||
ws0.col(0).width = 850
|
||||
ws0.col(1).width = 9000
|
||||
|
@ -29,6 +29,9 @@
|
||||
"""
|
||||
from types import ListType
|
||||
|
||||
import notesdb as ndb
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import scolars
|
||||
import sco_bac
|
||||
import sco_formsemestre
|
||||
@ -36,11 +39,10 @@ import sco_parcours_dut
|
||||
import sco_codes_parcours
|
||||
from sco_codes_parcours import NO_SEMESTRE_ID
|
||||
import sco_excel
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
from gen_tables import GenTable
|
||||
import sco_pvjury
|
||||
import html_sco_header
|
||||
import VERSION
|
||||
|
||||
|
||||
def _build_results_table(context, start_date=None, end_date=None, types_parcours=[]):
|
||||
@ -97,9 +99,9 @@ def _build_results_table(context, start_date=None, end_date=None, types_parcours
|
||||
rows=rows,
|
||||
titles=titles,
|
||||
columns_ids=columns_ids,
|
||||
filename=make_filename("scodoc-results-%s-%s" % (start_date, end_date)),
|
||||
filename=scu.make_filename("scodoc-results-%s-%s" % (start_date, end_date)),
|
||||
caption="Résultats ScoDoc de %s à %s" % (start_date, end_date),
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
html_class="table_leftalign",
|
||||
html_sortable=True,
|
||||
preferences=context.get_preferences(),
|
||||
@ -190,7 +192,7 @@ def _build_results_list(context, dpv_by_sem, etuds_infos):
|
||||
code = "-"
|
||||
r[sem["semestre_id"]] = code
|
||||
r["periode"] = sem["periode"]
|
||||
r["anneescolaire"] = annee_scolaire_debut(
|
||||
r["anneescolaire"] = scu.annee_scolaire_debut(
|
||||
int(sem["annee_debut"]), sem["mois_debut_ord"]
|
||||
)
|
||||
r["sid"] = "{} {} {}".format(
|
||||
@ -238,7 +240,7 @@ def scodoc_table_results(
|
||||
REQUEST.URL0,
|
||||
start_date,
|
||||
end_date,
|
||||
"&types_parcours=".join([str(x) for s in types_parcours]),
|
||||
"&types_parcours=".join([str(x) for x in types_parcours]),
|
||||
)
|
||||
if format != "html":
|
||||
return tab.make_page(
|
||||
|
@ -30,7 +30,7 @@
|
||||
from types import ListType
|
||||
import xml.dom.minidom
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
@ -130,7 +130,7 @@ def search_etud_in_dept(
|
||||
if title:
|
||||
H.append("<h2>%s</h2>" % title)
|
||||
|
||||
if is_valid_code_nip(expnom):
|
||||
if scu.is_valid_code_nip(expnom):
|
||||
etuds = search_etuds_infos(context, code_nip=expnom, REQUEST=REQUEST)
|
||||
elif expnom:
|
||||
etuds = search_etuds_infos(context, expnom=expnom, REQUEST=REQUEST)
|
||||
@ -220,10 +220,10 @@ def search_etuds_infos(context, expnom=None, code_nip=None, REQUEST=None):
|
||||
"""recherche les étudiants correspondants à expnom ou au code_nip
|
||||
et ramene liste de mappings utilisables en DTML.
|
||||
"""
|
||||
may_be_nip = is_valid_code_nip(expnom)
|
||||
may_be_nip = scu.is_valid_code_nip(expnom)
|
||||
cnx = context.GetDBConnexion()
|
||||
if expnom and not may_be_nip:
|
||||
expnom = strupper(expnom) # les noms dans la BD sont en uppercase
|
||||
expnom = scu.strupper(expnom) # les noms dans la BD sont en uppercase
|
||||
etuds = scolars.etudident_list(cnx, args={"nom": expnom}, test="~")
|
||||
else:
|
||||
code_nip = code_nip or expnom
|
||||
@ -240,13 +240,12 @@ def search_etud_by_name(context, term, REQUEST=None):
|
||||
Accepte aussi un début de code NIP (au moins 6 caractères)
|
||||
Renvoie une liste de nom en JSON
|
||||
"""
|
||||
cnx = context.GetDBConnexion()
|
||||
may_be_nip = is_valid_code_nip(term)
|
||||
# term = strupper(term) # conserve les accents
|
||||
may_be_nip = scu.is_valid_code_nip(term)
|
||||
# term = scu.strupper(term) # conserve les accents
|
||||
term = term.upper()
|
||||
if (
|
||||
not ALPHANUM_EXP.match(
|
||||
term.decode(SCO_ENCODING)
|
||||
not scu.ALPHANUM_EXP.match(
|
||||
term.decode(scu.SCO_ENCODING)
|
||||
) # n'autorise pas les caractères spéciaux
|
||||
and not may_be_nip
|
||||
):
|
||||
@ -281,7 +280,7 @@ def search_etud_by_name(context, term, REQUEST=None):
|
||||
for x in r
|
||||
]
|
||||
# log(data)
|
||||
return sendJSON(REQUEST, data)
|
||||
return scu.sendJSON(REQUEST, data)
|
||||
|
||||
|
||||
# ---------- Recherche sur plusieurs département
|
||||
@ -387,7 +386,7 @@ def search_inscr_etud_by_nip(context, code_nip, REQUEST=None, format="json"):
|
||||
Renvoie une liste des inscriptions de l'étudiants dans tout ScoDoc:
|
||||
code_nip, nom, prenom, sexe, dept, formsemestre_id, date_debut_sem, date_fin_sem
|
||||
"""
|
||||
result, depts = search_etud_in_accessible_depts(
|
||||
result, _ = search_etud_in_accessible_depts(
|
||||
context, code_nip=code_nip, REQUEST=REQUEST
|
||||
)
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
from operator import itemgetter
|
||||
import xml.dom.minidom
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
@ -40,6 +40,7 @@ import sco_tag_module
|
||||
from gen_tables import GenTable
|
||||
from sco_exceptions import ScoValueError
|
||||
from sco_permissions import ScoChangeFormation
|
||||
import VERSION
|
||||
|
||||
|
||||
def formation_export(
|
||||
@ -83,7 +84,7 @@ def formation_export(
|
||||
if mod["ects"] is None:
|
||||
del mod["ects"]
|
||||
|
||||
return sendResult(
|
||||
return scu.sendResult(
|
||||
REQUEST, F, name="formation", format=format, force_outer_xml_tag=False
|
||||
)
|
||||
|
||||
@ -115,7 +116,7 @@ def XMLToDicts(element, encoding):
|
||||
|
||||
|
||||
def formation_import_xml(
|
||||
context, REQUEST, doc, import_tags=True, encoding=SCO_ENCODING
|
||||
context, REQUEST, doc, import_tags=True, encoding=scu.SCO_ENCODING
|
||||
):
|
||||
"""Create a formation from XML representation
|
||||
(format dumped by formation_export( format='xml' ))
|
||||
@ -206,13 +207,13 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
|
||||
"""
|
||||
formations = context.formation_list(formation_id=formation_id, args=args)
|
||||
title = "Programmes pédagogiques"
|
||||
lockicon = icontag(
|
||||
lockicon = scu.icontag(
|
||||
"lock32_img", title="Comporte des semestres verrouillés", border="0"
|
||||
)
|
||||
suppricon = icontag(
|
||||
suppricon = scu.icontag(
|
||||
"delete_small_img", border="0", alt="supprimer", title="Supprimer"
|
||||
)
|
||||
editicon = icontag(
|
||||
editicon = scu.icontag(
|
||||
"edit_img", border="0", alt="modifier", title="Modifier titres et code"
|
||||
)
|
||||
|
||||
@ -304,7 +305,7 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
|
||||
columns_ids=columns_ids,
|
||||
rows=formations,
|
||||
titles=titles,
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
caption=title,
|
||||
html_caption=title,
|
||||
table_id="formation_list_table",
|
||||
|
@ -27,8 +27,9 @@
|
||||
|
||||
"""Operations de base sur les formsemestres
|
||||
"""
|
||||
import time
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from gen_tables import GenTable
|
||||
@ -163,7 +164,9 @@ def formsemestre_enrich(context, sem):
|
||||
|
||||
sem["annee"] = annee_debut
|
||||
# 2007 ou 2007-2008:
|
||||
sem["anneescolaire"] = annee_scolaire_repr(int(annee_debut), sem["mois_debut_ord"])
|
||||
sem["anneescolaire"] = scu.annee_scolaire_repr(
|
||||
int(annee_debut), sem["mois_debut_ord"]
|
||||
)
|
||||
# La période: considère comme "S1" (ou S3) les débuts en aout-sept-octobre
|
||||
# devrait sans doute pouvoir etre changé...
|
||||
if sem["mois_debut_ord"] >= 8 and sem["mois_debut_ord"] <= 10:
|
||||
@ -429,7 +432,7 @@ def sem_in_semestre_scolaire(context, sem, year=False, saison=0, REQUEST=None):
|
||||
)
|
||||
"""
|
||||
if not year:
|
||||
year = AnneeScolaire(REQUEST)
|
||||
year = scu.AnneeScolaire(REQUEST)
|
||||
# est-on dans la même année universitaire ?
|
||||
if sem["mois_debut_ord"] > 7:
|
||||
if sem["annee_debut"] != str(year):
|
||||
@ -453,7 +456,7 @@ def sem_in_annee_scolaire(context, sem, year=False, REQUEST=None):
|
||||
Si annee non specifiée, année scolaire courante
|
||||
"""
|
||||
if not year:
|
||||
year = AnneeScolaire(REQUEST)
|
||||
year = scu.AnneeScolaire(REQUEST)
|
||||
return ((sem["annee_debut"] == str(year)) and (sem["mois_debut_ord"] > 7)) or (
|
||||
(sem["annee_debut"] == str(year + 1)) and (sem["mois_debut_ord"] <= 7)
|
||||
)
|
||||
@ -595,7 +598,7 @@ def view_formsemestre_by_etape(context, etape_apo=None, format="html", REQUEST=N
|
||||
tab = table_formsemestres(
|
||||
context,
|
||||
list_formsemestre_by_etape(
|
||||
context, etape_apo=etape_apo, annee_scolaire=AnneeScolaire(REQUEST)
|
||||
context, etape_apo=etape_apo, annee_scolaire=scu.AnneeScolaire(REQUEST)
|
||||
),
|
||||
html_title=html_title,
|
||||
html_next_section="""<form action="view_formsemestre_by_etape">
|
||||
|
@ -29,7 +29,7 @@
|
||||
"""
|
||||
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
|
@ -29,7 +29,7 @@
|
||||
"""
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import sco_groups
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
@ -88,7 +88,7 @@ def formsemestre_editwithmodules(context, REQUEST, formsemestre_id):
|
||||
if sem["etat"] != "1":
|
||||
H.append(
|
||||
"""<p>%s<b>Ce semestre est verrouillé.</b></p>"""
|
||||
% icontag("lock_img", border="0", title="Semestre verrouillé")
|
||||
% scu.icontag("lock_img", border="0", title="Semestre verrouillé")
|
||||
)
|
||||
else:
|
||||
H.append(do_formsemestre_createwithmodules(context, REQUEST=REQUEST, edit=1))
|
||||
@ -346,7 +346,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
||||
# fallback: code etape libre
|
||||
mf = mf_manual
|
||||
|
||||
for n in range(1, EDIT_NB_ETAPES + 1):
|
||||
for n in range(1, scu.EDIT_NB_ETAPES + 1):
|
||||
mf["title"] = "Etape Apogée (%d)" % n
|
||||
modform.append(("etape_apo" + str(n), mf.copy()))
|
||||
modform.append(
|
||||
@ -644,7 +644,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
||||
if ndb.DateDMYtoISO(tf[2]["date_debut"]) > ndb.DateDMYtoISO(tf[2]["date_fin"]):
|
||||
msg = '<ul class="tf-msg"><li class="tf-msg">Dates de début et fin incompatibles !</li></ul>'
|
||||
if context.get_preference("always_require_apo_sem_codes") and not any(
|
||||
[tf[2]["etape_apo" + str(n)] for n in range(0, EDIT_NB_ETAPES + 1)]
|
||||
[tf[2]["etape_apo" + str(n)] for n in range(0, scu.EDIT_NB_ETAPES + 1)]
|
||||
):
|
||||
msg = '<ul class="tf-msg"><li class="tf-msg">Code étape Apogée manquant</li></ul>'
|
||||
|
||||
@ -695,7 +695,7 @@ def do_formsemestre_createwithmodules(context, REQUEST=None, edit=False):
|
||||
start_i = 0
|
||||
else:
|
||||
start_i = 1
|
||||
for n in range(start_i, EDIT_NB_ETAPES + 1):
|
||||
for n in range(start_i, scu.EDIT_NB_ETAPES + 1):
|
||||
tf[2]["etapes"].append(
|
||||
ApoEtapeVDI(
|
||||
etape=tf[2]["etape_apo" + str(n)], vdi=tf[2]["vdi_apo" + str(n)]
|
||||
@ -1666,12 +1666,12 @@ def get_formsemestre_session_id(context, sem, F, parcours):
|
||||
(modalite or "").replace("FAP", "FA").replace("APP", "FA")
|
||||
) # exception pour code Apprentissage
|
||||
if sem["semestre_id"] > 0:
|
||||
decale = sem_decale_str(sem)
|
||||
decale = scu.sem_decale_str(sem)
|
||||
semestre_id = "S%d" % sem["semestre_id"] + decale
|
||||
else:
|
||||
semestre_id = F["code_specialite"]
|
||||
annee_sco = str(annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]))
|
||||
annee_sco = str(scu.annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]))
|
||||
|
||||
return sanitize_string(
|
||||
return scu.sanitize_string(
|
||||
"-".join((ImputationDept, parcours_type, modalite, semestre_id, annee_sco))
|
||||
)
|
||||
|
@ -30,13 +30,13 @@
|
||||
import urllib, time, datetime
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from scolog import logdb
|
||||
from notes_table import *
|
||||
import notes_table
|
||||
from TrivialFormulator import TrivialFormulator, tf_error_message
|
||||
from sco_exceptions import ScoValueError
|
||||
from sco_abs import getAbsSemEtud
|
||||
|
||||
import sco_formsemestre
|
||||
import sco_formsemestre_edit
|
||||
import sco_formsemestre_status
|
||||
@ -486,8 +486,8 @@ def formsemestre_recap_parcours_table(
|
||||
"""
|
||||
H = []
|
||||
linktmpl = '<span onclick="toggle_vis(this);" class="toggle_sem sem_%%s">%s</span>'
|
||||
minuslink = linktmpl % icontag("minus_img", border="0", alt="-")
|
||||
pluslink = linktmpl % icontag("plus_img", border="0", alt="+")
|
||||
minuslink = linktmpl % scu.icontag("minus_img", border="0", alt="-")
|
||||
pluslink = linktmpl % scu.icontag("plus_img", border="0", alt="+")
|
||||
if show_details:
|
||||
sd = " recap_show_details"
|
||||
plusminus = minuslink
|
||||
@ -497,7 +497,7 @@ def formsemestre_recap_parcours_table(
|
||||
H.append('<table class="recap_parcours%s"><tr>' % sd)
|
||||
H.append(
|
||||
'<th><span onclick="toggle_all_sems(this);" title="Ouvrir/fermer tous les semestres">%s</span></th><th></th><th>Semestre</th>'
|
||||
% icontag("plus18_img", width=18, height=18, border=0, title="", alt="+")
|
||||
% scu.icontag("plus18_img", width=18, height=18, border=0, title="", alt="+")
|
||||
)
|
||||
H.append("<th>Etat</th><th>Abs</th>")
|
||||
# titres des UE
|
||||
@ -591,7 +591,7 @@ def formsemestre_recap_parcours_table(
|
||||
else:
|
||||
default_sem_info = ""
|
||||
if sem["etat"] != "1": # locked
|
||||
lockicon = icontag("lock32_img", title="verrouillé", border="0")
|
||||
lockicon = scu.icontag("lock32_img", title="verrouillé", border="0")
|
||||
default_sem_info += lockicon
|
||||
if sem["formation_code"] != Se.formation["formation_code"]:
|
||||
default_sem_info += "Autre formation: %s" % sem["formation_code"]
|
||||
@ -601,8 +601,7 @@ def formsemestre_recap_parcours_table(
|
||||
)
|
||||
# Moy Gen (sous le code decision)
|
||||
H.append(
|
||||
'<td class="rcp_moy">%s</td>'
|
||||
% notes_table.fmt_note(nt.get_etud_moy_gen(etudid))
|
||||
'<td class="rcp_moy">%s</td>' % scu.fmt_note(nt.get_etud_moy_gen(etudid))
|
||||
)
|
||||
# Absences (nb d'abs non just. dans ce semestre)
|
||||
AbsEtudSem = getAbsSemEtud(context, sem, etudid)
|
||||
@ -642,7 +641,7 @@ def formsemestre_recap_parcours_table(
|
||||
|
||||
H.append(
|
||||
'<td class="%s" title="%s">%s</td>'
|
||||
% (class_ue, " ".join(explanation_ue), notes_table.fmt_note(moy_ue))
|
||||
% (class_ue, " ".join(explanation_ue), scu.fmt_note(moy_ue))
|
||||
)
|
||||
if len(ues) < Se.nb_max_ue:
|
||||
H.append('<td colspan="%d"></td>' % (Se.nb_max_ue - len(ues)))
|
||||
|
@ -32,7 +32,7 @@ import operator
|
||||
import traceback
|
||||
from types import FloatType, IntType, LongType, StringType
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
|
||||
|
||||
|
@ -33,7 +33,7 @@ Optimisation possible:
|
||||
et éviter ainsi l'appel ulterieur à get_etud_groups() dans _make_table_notes
|
||||
|
||||
"""
|
||||
|
||||
import time
|
||||
import collections
|
||||
import re
|
||||
import sets
|
||||
@ -43,7 +43,7 @@ import operator
|
||||
import jaxml
|
||||
import xml.dom.minidom
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from scolog import logdb
|
||||
@ -75,7 +75,8 @@ def checkGroupName(
|
||||
): # XXX unused: now allow any string as a group or partition name
|
||||
"Raises exception if not a valid group name"
|
||||
if groupName and (
|
||||
not re.match(r"^\w+$", groupName) or (simplesqlquote(groupName) != groupName)
|
||||
not re.match(r"^\w+$", groupName)
|
||||
or (scu.simplesqlquote(groupName) != groupName)
|
||||
):
|
||||
log("!!! invalid group name: " + groupName)
|
||||
raise ValueError("invalid group name: " + groupName)
|
||||
@ -247,7 +248,7 @@ def get_group_members(context, group_id, etat=None):
|
||||
|
||||
r.sort(key=operator.itemgetter("nom_disp", "prenom")) # tri selon nom_usuel ou nom
|
||||
|
||||
if CONFIG.ALLOW_NULL_PRENOM:
|
||||
if scu.CONFIG.ALLOW_NULL_PRENOM:
|
||||
for x in r:
|
||||
x["prenom"] = x["prenom"] or ""
|
||||
|
||||
@ -433,7 +434,7 @@ def formsemestre_partition_list(context, formsemestre_id, format="xml", REQUEST=
|
||||
# Ajoute les groupes
|
||||
for p in partitions:
|
||||
p["group"] = get_partition_groups(context, p)
|
||||
return sendResult(REQUEST, partitions, name="partition", format=format)
|
||||
return scu.sendResult(REQUEST, partitions, name="partition", format=format)
|
||||
|
||||
|
||||
def XMLgetGroupsInPartition(context, partition_id, REQUEST=None): # was XMLgetGroupesTD
|
||||
@ -454,8 +455,8 @@ def XMLgetGroupsInPartition(context, partition_id, REQUEST=None): # was XMLgetG
|
||||
) # > inscrdict
|
||||
etuds_set = set(nt.inscrdict)
|
||||
# XML response:
|
||||
REQUEST.RESPONSE.setHeader("content-type", XML_MIMETYPE)
|
||||
doc = jaxml.XML_document(encoding=SCO_ENCODING)
|
||||
REQUEST.RESPONSE.setHeader("content-type", scu.XML_MIMETYPE)
|
||||
doc = jaxml.XML_document(encoding=scu.SCO_ENCODING)
|
||||
doc._text('<ajax-response><response type="object" id="MyUpdater">')
|
||||
doc._push()
|
||||
|
||||
@ -687,7 +688,7 @@ def setGroups(
|
||||
if not group_name:
|
||||
continue
|
||||
# ajax arguments are encoded in utf-8:
|
||||
group_name = unicode(group_name, "utf-8").encode(SCO_ENCODING)
|
||||
group_name = unicode(group_name, "utf-8").encode(scu.SCO_ENCODING)
|
||||
group_id = createGroup(context, partition_id, group_name, REQUEST=REQUEST)
|
||||
# Place dans ce groupe les etudiants indiqués:
|
||||
for etudid in fs[1:-1]:
|
||||
@ -695,7 +696,7 @@ def setGroups(
|
||||
context, etudid, group_id, partition, REQUEST=REQUEST
|
||||
)
|
||||
|
||||
REQUEST.RESPONSE.setHeader("content-type", XML_MIMETYPE)
|
||||
REQUEST.RESPONSE.setHeader("content-type", scu.XML_MIMETYPE)
|
||||
return (
|
||||
'<?xml version="1.0" encoding="utf-8"?><response>Groupes enregistrés</response>'
|
||||
)
|
||||
@ -797,9 +798,9 @@ def partition_create(
|
||||
def getArrowIconsTags(context, REQUEST):
|
||||
"""returns html tags for arrows"""
|
||||
#
|
||||
arrow_up = icontag("arrow_up", title="remonter")
|
||||
arrow_down = icontag("arrow_down", title="descendre")
|
||||
arrow_none = icontag("arrow_none", title="")
|
||||
arrow_up = scu.icontag("arrow_up", title="remonter")
|
||||
arrow_down = scu.icontag("arrow_down", title="descendre")
|
||||
arrow_none = scu.icontag("arrow_none", title="")
|
||||
|
||||
return arrow_up, arrow_down, arrow_none
|
||||
|
||||
@ -811,7 +812,7 @@ def editPartitionForm(context, formsemestre_id=None, REQUEST=None):
|
||||
raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !")
|
||||
partitions = get_partitions_list(context, formsemestre_id)
|
||||
arrow_up, arrow_down, arrow_none = getArrowIconsTags(context, REQUEST)
|
||||
suppricon = icontag(
|
||||
suppricon = scu.icontag(
|
||||
"delete_small_img", border="0", alt="supprimer", title="Supprimer"
|
||||
)
|
||||
#
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
import re
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
|
@ -36,7 +36,7 @@ from email.Header import Header # pylint: disable=no-name-in-module,import-erro
|
||||
from email import Encoders # pylint: disable=no-name-in-module,import-error
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
import sco_news
|
||||
@ -74,11 +74,11 @@ def import_excel_file(datafile, REQUEST=None, context=None):
|
||||
exceldata = datafile.read()
|
||||
if not exceldata:
|
||||
raise ScoValueError("Ficher excel vide ou invalide")
|
||||
diag, data = sco_excel.Excel_to_list(exceldata)
|
||||
_, data = sco_excel.Excel_to_list(exceldata)
|
||||
if not data: # probably a bug
|
||||
raise ScoException("import_excel_file: empty file !")
|
||||
# 1- --- check title line
|
||||
fs = [strlower(stripquotes(s)) for s in data[0]]
|
||||
fs = [scu.strlower(scu.stripquotes(s)) for s in data[0]]
|
||||
log("excel: fs='%s'\ndata=%s" % (str(fs), str(data)))
|
||||
# check cols
|
||||
cols = {}.fromkeys(TITLES)
|
||||
@ -221,16 +221,16 @@ ScoDoc est un logiciel libre développé à l'Université Paris 13 par Emmanuel
|
||||
Pour plus d'informations sur ce logiciel, voir %s
|
||||
|
||||
"""
|
||||
% SCO_WEBSITE
|
||||
% scu.SCO_WEBSITE
|
||||
)
|
||||
msg = MIMEMultipart()
|
||||
if reset:
|
||||
msg["Subject"] = Header("Mot de passe ScoDoc", SCO_ENCODING)
|
||||
msg["Subject"] = Header("Mot de passe ScoDoc", scu.SCO_ENCODING)
|
||||
else:
|
||||
msg["Subject"] = Header("Votre accès ScoDoc", SCO_ENCODING)
|
||||
msg["Subject"] = Header("Votre accès ScoDoc", scu.SCO_ENCODING)
|
||||
msg["From"] = context.get_preference("email_from_addr")
|
||||
msg["To"] = u["email"]
|
||||
msg.epilogue = ""
|
||||
txt = MIMEText(txt, "plain", SCO_ENCODING)
|
||||
txt = MIMEText(txt, "plain", scu.SCO_ENCODING)
|
||||
msg.attach(txt)
|
||||
context.sendEmail(msg)
|
||||
|
@ -28,12 +28,12 @@
|
||||
"""Form. pour inscription rapide des etudiants d'un semestre dans un autre
|
||||
Utilise les autorisations d'inscription délivrées en jury.
|
||||
"""
|
||||
|
||||
from gen_tables import GenTable
|
||||
import datetime
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from gen_tables import GenTable
|
||||
import sco_codes_parcours
|
||||
import sco_pvjury
|
||||
import sco_formsemestre
|
||||
@ -226,14 +226,9 @@ def list_source_sems(context, sem, delai=None):
|
||||
othersems = []
|
||||
d, m, y = [int(x) for x in sem["date_debut"].split("/")]
|
||||
date_debut_dst = datetime.date(y, m, d)
|
||||
d, m, y = [int(x) for x in sem["date_fin"].split("/")]
|
||||
date_fin_dst = datetime.date(y, m, d)
|
||||
|
||||
delais = datetime.timedelta(delai)
|
||||
for s in sems:
|
||||
# pdb.set_trace()
|
||||
# if s['etat'] != '1':
|
||||
# continue # saute semestres pas ouverts
|
||||
if s["formsemestre_id"] == sem["formsemestre_id"]:
|
||||
continue # saute le semestre destination
|
||||
if s["date_fin"]:
|
||||
@ -279,9 +274,6 @@ def formsemestre_inscr_passage(
|
||||
|
||||
"""
|
||||
inscrit_groupes = int(inscrit_groupes)
|
||||
# log('formsemestre_inscr_passage: formsemestre_id=%s submitted=%s, dialog_confirmed=%s len(etuds)=%d'
|
||||
# % (formsemestre_id, submitted, dialog_confirmed, len(etuds)) )
|
||||
cnx = context.GetDBConnexion()
|
||||
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
||||
# -- check lock
|
||||
if sem["etat"] != "1":
|
||||
@ -561,7 +553,7 @@ def etuds_select_boxes(
|
||||
if base_url and etuds:
|
||||
H.append(
|
||||
'<a href="%s&export_cat_xls=%s">%s</a> '
|
||||
% (base_url, src_cat, ICON_XLS)
|
||||
% (base_url, src_cat, scu.ICON_XLS)
|
||||
)
|
||||
H.append("</div>")
|
||||
for etud in etuds:
|
||||
|
@ -28,15 +28,12 @@
|
||||
"""Liste des notes d'une évaluation
|
||||
"""
|
||||
import urllib
|
||||
from types import StringType
|
||||
|
||||
from htmlutils import histogram_notes
|
||||
|
||||
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
from notes_table import *
|
||||
import sco_formsemestre
|
||||
import sco_moduleimpl
|
||||
import sco_groups
|
||||
@ -44,6 +41,8 @@ import sco_evaluations
|
||||
import htmlutils
|
||||
import sco_excel
|
||||
from gen_tables import GenTable
|
||||
from htmlutils import histogram_notes
|
||||
import VERSION
|
||||
|
||||
|
||||
def do_evaluation_listenotes(context, REQUEST):
|
||||
@ -52,7 +51,6 @@ def do_evaluation_listenotes(context, REQUEST):
|
||||
|
||||
args: evaluation_id
|
||||
"""
|
||||
cnx = context.GetDBConnexion()
|
||||
mode = None
|
||||
if REQUEST.form.has_key("evaluation_id"):
|
||||
evaluation_id = REQUEST.form["evaluation_id"]
|
||||
@ -69,9 +67,6 @@ def do_evaluation_listenotes(context, REQUEST):
|
||||
|
||||
format = REQUEST.form.get("format", "html")
|
||||
E = evals[0] # il y a au moins une evaluation
|
||||
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
|
||||
formsemestre_id = M["formsemestre_id"]
|
||||
|
||||
# description de l'evaluation
|
||||
if mode == "eval":
|
||||
H = [
|
||||
@ -318,11 +313,11 @@ def _make_table_notes(
|
||||
"code": code,
|
||||
"_code_td_attrs": 'style="padding-left: 1em; padding-right: 2em;"',
|
||||
"etudid": etudid,
|
||||
"nom": strupper(etud["nom"]),
|
||||
"nom": scu.strupper(etud["nom"]),
|
||||
"_nomprenom_target": "formsemestre_bulletinetud?formsemestre_id=%s&etudid=%s"
|
||||
% (M["formsemestre_id"], etudid),
|
||||
"_nomprenom_td_attrs": 'id="%s" class="etudinfo"' % (etud["etudid"]),
|
||||
"prenom": strcapitalize(strlower(etud["prenom"])),
|
||||
"prenom": scu.strcapitalize(scu.strlower(etud["prenom"])),
|
||||
"nomprenom": etud["nomprenom"],
|
||||
"group": grc,
|
||||
"email": etud["email"],
|
||||
@ -437,7 +432,7 @@ def _make_table_notes(
|
||||
if len(evals) == 1:
|
||||
evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"]))
|
||||
hh = "%s, %s (%d étudiants)" % (E["description"], gr_title, len(etudids))
|
||||
filename = make_filename("notes_%s_%s" % (evalname, gr_title_filename))
|
||||
filename = scu.make_filename("notes_%s_%s" % (evalname, gr_title_filename))
|
||||
caption = hh
|
||||
pdf_title = "%(description)s (%(jour)s)" % e
|
||||
html_title = ""
|
||||
@ -447,7 +442,7 @@ def _make_table_notes(
|
||||
% (nb_abs, nb_att)
|
||||
)
|
||||
else:
|
||||
filename = make_filename("notes_%s_%s" % (Mod["code"], gr_title_filename))
|
||||
filename = scu.make_filename("notes_%s_%s" % (Mod["code"], gr_title_filename))
|
||||
title = "Notes du module %(code)s %(titre)s" % Mod
|
||||
title += " semestre %(titremois)s" % sem
|
||||
if gr_title and gr_title != "tous":
|
||||
@ -470,7 +465,7 @@ def _make_table_notes(
|
||||
html_sortable=True,
|
||||
base_url=base_url,
|
||||
filename=filename,
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
caption=caption,
|
||||
html_next_section=html_next_section,
|
||||
page_title="Notes de " + sem["titremois"],
|
||||
@ -552,10 +547,10 @@ def _add_eval_columns(
|
||||
val = NotesDB[etudid]["value"]
|
||||
if val is None:
|
||||
nb_abs += 1
|
||||
if val == NOTES_ATTENTE:
|
||||
if val == scu.NOTES_ATTENTE:
|
||||
nb_att += 1
|
||||
# calcul moyenne SANS LES ABSENTS
|
||||
if val != None and val != NOTES_NEUTRALISE and val != NOTES_ATTENTE:
|
||||
if val != None and val != scu.NOTES_NEUTRALISE and val != scu.NOTES_ATTENTE:
|
||||
if e["note_max"] > 0:
|
||||
valsur20 = val * 20.0 / e["note_max"] # remet sur 20
|
||||
else:
|
||||
@ -565,7 +560,7 @@ def _add_eval_columns(
|
||||
val = valsur20 # affichage notes / 20 demandé
|
||||
nb_notes = nb_notes + 1
|
||||
sum_notes += val
|
||||
val_fmt = fmt_note(val, keep_numeric=keep_numeric)
|
||||
val_fmt = scu.fmt_note(val, keep_numeric=keep_numeric)
|
||||
comment = NotesDB[etudid]["comment"]
|
||||
if comment is None:
|
||||
comment = ""
|
||||
@ -661,7 +656,7 @@ def _add_moymod_column(
|
||||
val = nt.get_etud_mod_moy(
|
||||
e["moduleimpl_id"], etudid
|
||||
) # note sur 20, ou 'NA','NI'
|
||||
row[col_id] = fmt_note(val, keep_numeric=keep_numeric)
|
||||
row[col_id] = scu.fmt_note(val, keep_numeric=keep_numeric)
|
||||
row["_" + col_id + "_td_attrs"] = ' class="moyenne" '
|
||||
if type(val) != StringType:
|
||||
notes.append(val)
|
||||
@ -715,8 +710,6 @@ def evaluation_check_absences(context, evaluation_id):
|
||||
if not E["jour"]:
|
||||
return [], [], [], [], [] # evaluation sans date
|
||||
|
||||
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
|
||||
formsemestre_id = M["formsemestre_id"]
|
||||
etudids = sco_groups.do_evaluation_listeetuds_groups(
|
||||
context, evaluation_id, getallstudents=True
|
||||
)
|
||||
@ -744,17 +737,17 @@ def evaluation_check_absences(context, evaluation_id):
|
||||
if NotesDB.has_key(etudid):
|
||||
val = NotesDB[etudid]["value"]
|
||||
if (
|
||||
val != None and val != NOTES_NEUTRALISE and val != NOTES_ATTENTE
|
||||
val != None and val != scu.NOTES_NEUTRALISE and val != scu.NOTES_ATTENTE
|
||||
) and etudid in As:
|
||||
# note valide et absent
|
||||
ValButAbs.append(etudid)
|
||||
if val is None and not etudid in As:
|
||||
# absent mais pas signale comme tel
|
||||
AbsNonSignalee.append(etudid)
|
||||
if val == NOTES_NEUTRALISE and not etudid in As:
|
||||
if val == scu.NOTES_NEUTRALISE and not etudid in As:
|
||||
# Neutralisé mais pas signale absent
|
||||
ExcNonSignalee.append(etudid)
|
||||
if val == NOTES_NEUTRALISE and etudid in NJs:
|
||||
if val == scu.NOTES_NEUTRALISE and etudid in NJs:
|
||||
# EXC mais pas justifié
|
||||
ExcNonJust.append(etudid)
|
||||
if val is None and etudid in Justs:
|
||||
|
@ -32,13 +32,14 @@
|
||||
|
||||
import tempfile, urllib, re
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import scolars
|
||||
import sco_groups
|
||||
import sco_report
|
||||
from gen_tables import GenTable
|
||||
import sco_formsemestre
|
||||
import VERSION
|
||||
|
||||
|
||||
def formsemestre_table_etuds_lycees(
|
||||
@ -99,7 +100,7 @@ def _table_etuds_lycees(
|
||||
context, etuds, group_lycees, title, preferences, no_links=False
|
||||
):
|
||||
etuds = [scolars.etud_add_lycee_infos(e) for e in etuds]
|
||||
etuds_by_lycee = group_by_key(etuds, "codelycee")
|
||||
etuds_by_lycee = scu.group_by_key(etuds, "codelycee")
|
||||
#
|
||||
if group_lycees:
|
||||
L = [etuds_by_lycee[codelycee][0] for codelycee in etuds_by_lycee]
|
||||
@ -156,7 +157,7 @@ def _table_etuds_lycees(
|
||||
"nomlycee": "Lycée",
|
||||
"villelycee": "Commune",
|
||||
},
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
caption=title,
|
||||
page_title="Carte lycées d'origine",
|
||||
html_sortable=True,
|
||||
@ -176,7 +177,6 @@ def formsemestre_etuds_lycees(
|
||||
REQUEST=None,
|
||||
):
|
||||
"""Table des lycées d'origine"""
|
||||
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
||||
tab, etuds_by_lycee = formsemestre_table_etuds_lycees(
|
||||
context, formsemestre_id, only_primo=only_primo, group_lycees=not no_grouping
|
||||
)
|
||||
|
@ -30,15 +30,15 @@
|
||||
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from scolog import logdb
|
||||
from notes_table import *
|
||||
import sco_formsemestre
|
||||
import sco_moduleimpl
|
||||
import sco_groups
|
||||
import htmlutils
|
||||
from sco_permissions import ScoEtudInscrit
|
||||
from sco_exceptions import ScoValueError
|
||||
|
||||
|
||||
def moduleimpl_inscriptions_edit(
|
||||
@ -454,7 +454,7 @@ def get_etuds_with_capitalized_ue(context, formsemestre_id):
|
||||
"""For each UE, computes list of students capitalizing the UE.
|
||||
returns { ue_id : [ { infos } ] }
|
||||
"""
|
||||
UECaps = DictDefault(defaultvalue=[])
|
||||
UECaps = scu.DictDefault(defaultvalue=[])
|
||||
nt = context._getNotesCache().get_NotesTable(
|
||||
context, formsemestre_id
|
||||
) # > get_ues, get_etud_ue_status
|
||||
|
@ -31,8 +31,9 @@
|
||||
|
||||
"""
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
import scolars
|
||||
import sco_bac
|
||||
import sco_photos
|
||||
@ -62,7 +63,7 @@ def _menuScolarite(context, authuser, sem, etudid):
|
||||
"""
|
||||
locked = sem["etat"] != "1"
|
||||
if locked:
|
||||
lockicon = icontag("lock32_img", title="verrouillé", border="0")
|
||||
lockicon = scu.icontag("lock32_img", title="verrouillé", border="0")
|
||||
return lockicon # no menu
|
||||
if not authuser.has_permission(
|
||||
ScoEtudInscrit, context
|
||||
@ -220,7 +221,7 @@ def ficheEtud(context, etudid=None, REQUEST=None):
|
||||
sem_info = {}
|
||||
for sem in info["sems"]:
|
||||
if sem["ins"]["etat"] != "I":
|
||||
descr, junk = etud_descr_situation_semestre(
|
||||
descr, _ = etud_descr_situation_semestre(
|
||||
context.Notes,
|
||||
etudid,
|
||||
sem["formsemestre_id"],
|
||||
@ -288,7 +289,7 @@ def ficheEtud(context, etudid=None, REQUEST=None):
|
||||
] = '<td class="annodel"><a href="doSuppressAnnotation?etudid=%s&annotation_id=%s">%s</a></td>' % (
|
||||
etudid,
|
||||
a["id"],
|
||||
icontag(
|
||||
scu.icontag(
|
||||
"delete_img",
|
||||
border="0",
|
||||
alt="suppress",
|
||||
@ -387,7 +388,7 @@ def ficheEtud(context, etudid=None, REQUEST=None):
|
||||
else:
|
||||
info["tit_anno"] = ""
|
||||
# Inscriptions
|
||||
if info["sems"]:
|
||||
if info["sems"]: # XXX rcl unused ? à voir
|
||||
rcl = (
|
||||
"""(<a href="%(ScoURL)s/Notes/formsemestre_validation_etud_form?check=1&etudid=%(etudid)s&formsemestre_id=%(last_formsemestre_id)s&desturl=ficheEtud?etudid=%(etudid)s">récapitulatif parcours</a>)"""
|
||||
% info
|
||||
|
@ -44,7 +44,9 @@ import sco_evaluations
|
||||
import sco_saisie_notes
|
||||
import sco_excel
|
||||
from sco_excel import *
|
||||
from TrivialFormulator import TrivialFormulator
|
||||
from gen_tables import GenTable
|
||||
import VERSION
|
||||
|
||||
|
||||
def do_placement_selectetuds(context, REQUEST):
|
||||
@ -125,7 +127,10 @@ def do_placement_selectetuds(context, REQUEST):
|
||||
(
|
||||
"group_ids",
|
||||
{
|
||||
"default": [g["group_id"] for g in groups],
|
||||
"default": [
|
||||
g["group_id"] # pylint: disable=invalid-sequence-index
|
||||
for g in groups
|
||||
],
|
||||
"input_type": "hidden",
|
||||
"type": "list",
|
||||
},
|
||||
@ -297,8 +302,8 @@ def do_placement(context, REQUEST):
|
||||
{"etudid": etudid, "formsemestre_id": M["formsemestre_id"]}
|
||||
)[0]
|
||||
if inscr["etat"] != "D":
|
||||
nom = strupper(ident["nom"])
|
||||
prenom = strcapitalize(strlower(ident["prenom"]))
|
||||
nom = scu.strupper(ident["nom"])
|
||||
prenom = scu.strcapitalize(scu.strlower(ident["prenom"]))
|
||||
listetud.append((nom, prenom))
|
||||
random.shuffle(listetud)
|
||||
|
||||
@ -374,7 +379,9 @@ def do_placement(context, REQUEST):
|
||||
columns_ids=columns_ids,
|
||||
rows=rows,
|
||||
filename=filename,
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME
|
||||
+ scu.timedate_human_repr()
|
||||
+ "",
|
||||
pdf_title=pdf_title,
|
||||
# pdf_shorttitle = '',
|
||||
preferences=context.get_preferences(M["formsemestre_id"]),
|
||||
@ -444,7 +451,7 @@ def Excel_feuille_placement(
|
||||
wb = Workbook()
|
||||
|
||||
SheetName0 = "Emargement"
|
||||
ws0 = wb.add_sheet(SheetName0.decode(SCO_ENCODING))
|
||||
ws0 = wb.add_sheet(SheetName0.decode(scu.SCO_ENCODING))
|
||||
# ajuste largeurs colonnes (unite inconnue, empirique)
|
||||
width = 4500
|
||||
if nbcolumns > 5:
|
||||
@ -455,7 +462,7 @@ def Excel_feuille_placement(
|
||||
ws0.col(0).width = 750
|
||||
|
||||
SheetName1 = "Positions"
|
||||
ws1 = wb.add_sheet(SheetName1.decode(SCO_ENCODING))
|
||||
ws1 = wb.add_sheet(SheetName1.decode(scu.SCO_ENCODING))
|
||||
if numbering == "coordinate":
|
||||
ws1.col(0).width = 4000
|
||||
ws1.col(1).width = 4500
|
||||
@ -654,8 +661,8 @@ def Excel_feuille_placement(
|
||||
else:
|
||||
li += 1
|
||||
line += 1
|
||||
ws0.write(li, 0, desceval[0].decode(SCO_ENCODING), style_titres)
|
||||
ws1.write(li, 0, desceval[0].decode(SCO_ENCODING), style_titres)
|
||||
ws0.write(li, 0, desceval[0].decode(scu.SCO_ENCODING), style_titres)
|
||||
ws1.write(li, 0, desceval[0].decode(scu.SCO_ENCODING), style_titres)
|
||||
li += 1
|
||||
ws0.write(
|
||||
li,
|
||||
@ -727,8 +734,8 @@ def Excel_feuille_placement(
|
||||
ws0.write(li0, 0, line, style2b)
|
||||
col = 1
|
||||
for etudid in linetud:
|
||||
ws0.write(li0, col, (etudid[0]).decode(SCO_ENCODING), style1t)
|
||||
ws0.write(li0 + 1, col, (etudid[1]).decode(SCO_ENCODING), style1m)
|
||||
ws0.write(li0, col, (etudid[0]).decode(scu.SCO_ENCODING), style1t)
|
||||
ws0.write(li0 + 1, col, (etudid[1]).decode(scu.SCO_ENCODING), style1m)
|
||||
ws0.row(li0 + 2).height = space
|
||||
if numbering == "coordinate":
|
||||
ws0.write(li0 + 2, col, " ", style1bb)
|
||||
@ -757,8 +764,8 @@ def Excel_feuille_placement(
|
||||
for etudid in orderetud:
|
||||
li1 += 1
|
||||
line += 1
|
||||
ws1.write(li1, col, (etudid[0]).decode(SCO_ENCODING), style2l)
|
||||
ws1.write(li1, col + 1, (etudid[1]).decode(SCO_ENCODING), style2m1)
|
||||
ws1.write(li1, col, (etudid[0]).decode(scu.SCO_ENCODING), style2l)
|
||||
ws1.write(li1, col + 1, (etudid[1]).decode(scu.SCO_ENCODING), style2m1)
|
||||
if numbering == "coordinate":
|
||||
ws1.write(li1, col + 2, etudid[2], style2m2)
|
||||
ws1.write(li1, col + 3, etudid[3], style2r)
|
||||
|
@ -31,13 +31,14 @@ Recapitule tous les semestres validés dans une feuille excel.
|
||||
"""
|
||||
import collections
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from gen_tables import GenTable
|
||||
import sco_formsemestre
|
||||
import sco_groups
|
||||
import sco_abs
|
||||
from sco_codes_parcours import code_semestre_validant, code_semestre_attente
|
||||
import VERSION
|
||||
|
||||
|
||||
def etud_get_poursuite_info(context, sem, etud):
|
||||
@ -62,7 +63,7 @@ def etud_get_poursuite_info(context, sem, etud):
|
||||
moy_ues = [
|
||||
(
|
||||
ue["acronyme"],
|
||||
fmt_note(nt.get_etud_ue_status(etudid, ue["ue_id"])["moy"]),
|
||||
scu.fmt_note(nt.get_etud_ue_status(etudid, ue["ue_id"])["moy"]),
|
||||
)
|
||||
for ue in ues
|
||||
]
|
||||
@ -79,7 +80,7 @@ def etud_get_poursuite_info(context, sem, etud):
|
||||
for modimpl in modimpls: # dans chaque UE les modules
|
||||
if modimpl["module"]["ue_id"] == ue["ue_id"]:
|
||||
codeModule = modimpl["module"]["code"]
|
||||
noteModule = fmt_note(
|
||||
noteModule = scu.fmt_note(
|
||||
nt.get_etud_mod_moy(modimpl["moduleimpl_id"], etudid)
|
||||
)
|
||||
if noteModule != "NI": # si étudiant inscrit au module
|
||||
@ -103,8 +104,8 @@ def etud_get_poursuite_info(context, sem, etud):
|
||||
and nt.get_etud_etat(etudid) == "I"
|
||||
):
|
||||
d = [
|
||||
("moy", fmt_note(nt.get_etud_moy_gen(etudid))),
|
||||
("moy_promo", fmt_note(nt.moy_moy)),
|
||||
("moy", scu.fmt_note(nt.get_etud_moy_gen(etudid))),
|
||||
("moy_promo", scu.fmt_note(nt.moy_moy)),
|
||||
("rang", nt.get_etud_rang(etudid)),
|
||||
("effectif", len(nt.T)),
|
||||
("date_debut", s["date_debut"]),
|
||||
@ -154,7 +155,6 @@ def formsemestre_poursuite_report(
|
||||
):
|
||||
"""Table avec informations "poursuite" """
|
||||
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
||||
nt = context._getNotesCache().get_NotesTable(context, formsemestre_id)
|
||||
etuds = context.getEtudInfoGroupes(
|
||||
[sco_groups.get_default_group(context, formsemestre_id)]
|
||||
)
|
||||
@ -191,9 +191,9 @@ def formsemestre_poursuite_report(
|
||||
pdf_link=False, # pas d'export pdf
|
||||
preferences=context.get_preferences(formsemestre_id),
|
||||
)
|
||||
tab.filename = make_filename("poursuite " + sem["titreannee"])
|
||||
tab.filename = scu.make_filename("poursuite " + sem["titreannee"])
|
||||
|
||||
tab.origin = "Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + ""
|
||||
tab.origin = "Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + ""
|
||||
tab.caption = "Récapitulatif %s." % sem["titreannee"]
|
||||
tab.html_caption = "Récapitulatif %s." % sem["titreannee"]
|
||||
tab.base_url = "%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id)
|
||||
|
@ -28,8 +28,9 @@
|
||||
"""ScoDoc preferences (replaces old Zope properties)
|
||||
"""
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from TrivialFormulator import TrivialFormulator, TF
|
||||
import sco_formsemestre
|
||||
import sco_bulletins_generator
|
||||
@ -1749,7 +1750,7 @@ class sco_base_preferences:
|
||||
"""Load all preferences from db"""
|
||||
log("loading preferences")
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
cnx = self.context.GetDBConnexion()
|
||||
preflist = self._editor.list(cnx)
|
||||
self.prefs = {None: {}} # { formsemestre_id (or None) : { name : value } }
|
||||
@ -1796,9 +1797,9 @@ class sco_base_preferences:
|
||||
% (name, value)
|
||||
)
|
||||
except:
|
||||
# search in CONFIG
|
||||
if hasattr(CONFIG, name):
|
||||
value = getattr(CONFIG, name)
|
||||
# search in scu.CONFIG
|
||||
if hasattr(scu.CONFIG, name):
|
||||
value = getattr(scu.CONFIG, name)
|
||||
log(
|
||||
"sco_preferences: found default value in config for %s=%s"
|
||||
% (name, value)
|
||||
@ -1813,7 +1814,7 @@ class sco_base_preferences:
|
||||
# add to db table
|
||||
self._editor.create(cnx, {"name": name, "value": value})
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
|
||||
def get(self, formsemestre_id, name):
|
||||
"""Returns preference value.
|
||||
@ -1845,7 +1846,7 @@ class sco_base_preferences:
|
||||
def save(self, formsemestre_id=None, name=None):
|
||||
"""Write one or all (if name is None) values to db"""
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
modif = False
|
||||
cnx = self.context.GetDBConnexion()
|
||||
if name is None:
|
||||
@ -1892,7 +1893,7 @@ class sco_base_preferences:
|
||||
if modif:
|
||||
self.context.Notes._inval_cache(pdfonly=False) # > modif preferences
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
|
||||
def set(self, formsemestre_id, name, value):
|
||||
if not name or name[0] == "_" or name not in PREFS_NAMES:
|
||||
@ -1908,7 +1909,7 @@ class sco_base_preferences:
|
||||
if not formsemestre_id:
|
||||
raise ScoException()
|
||||
try:
|
||||
GSL.acquire()
|
||||
scu.GSL.acquire()
|
||||
if formsemestre_id in self.prefs and name in self.prefs[formsemestre_id]:
|
||||
del self.prefs[formsemestre_id][name]
|
||||
cnx = self.context.GetDBConnexion()
|
||||
@ -1920,7 +1921,7 @@ class sco_base_preferences:
|
||||
self._editor.delete(cnx, pdb[0]["pref_id"])
|
||||
self.context.Notes._inval_cache(pdfonly=False) # > modif preferences
|
||||
finally:
|
||||
GSL.release()
|
||||
scu.GSL.release()
|
||||
|
||||
def edit(self, REQUEST):
|
||||
"""HTML dialog: edit global preferences"""
|
||||
|
@ -27,8 +27,9 @@
|
||||
|
||||
"""Feuille excel pour preparation des jurys
|
||||
"""
|
||||
import time
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import notes_table
|
||||
import sco_groups
|
||||
@ -38,6 +39,7 @@ import sco_parcours_dut
|
||||
import sco_codes_parcours
|
||||
from scolars import format_nom, format_prenom, format_sexe, format_lycee
|
||||
from sco_abs import getAbsSemEtud
|
||||
import VERSION
|
||||
|
||||
|
||||
def feuille_preparation_jury(context, formsemestre_id, REQUEST):
|
||||
@ -53,10 +55,10 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
|
||||
context, formsemestre_id
|
||||
)["partition_id"]
|
||||
|
||||
prev_moy_ue = DictDefault(defaultvalue={}) # ue_code_s : { etudid : moy ue }
|
||||
prev_moy_ue = scu.DictDefault(defaultvalue={}) # ue_code_s : { etudid : moy ue }
|
||||
prev_ue_acro = {} # ue_code_s : acronyme (à afficher)
|
||||
prev_moy = {} # moyennes gen sem prec
|
||||
moy_ue = DictDefault(defaultvalue={}) # ue_acro : moyennes { etudid : moy ue }
|
||||
moy_ue = scu.DictDefault(defaultvalue={}) # ue_acro : moyennes { etudid : moy ue }
|
||||
ue_acro = {} # ue_code_s : acronyme (à afficher)
|
||||
moy = {} # moyennes gen
|
||||
moy_inter = {} # moyenne gen. sur les 2 derniers semestres
|
||||
@ -155,7 +157,7 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
|
||||
sp = "S%s" % (sid - 1)
|
||||
|
||||
L = sco_excel.ScoExcelSheet(sheet_name="Prepa Jury %s" % sn)
|
||||
L.append(["Feuille préparation Jury %s" % unescape_html(sem["titreannee"])])
|
||||
L.append(["Feuille préparation Jury %s" % scu.unescape_html(sem["titreannee"])])
|
||||
L.append([]) # empty line
|
||||
|
||||
titles = ["Rang"]
|
||||
@ -211,7 +213,7 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
|
||||
|
||||
def fmt(x):
|
||||
"reduit les notes a deux chiffres"
|
||||
x = notes_table.fmt_note(x, keep_numeric=False)
|
||||
x = scu.fmt_note(x, keep_numeric=False)
|
||||
try:
|
||||
return float(x)
|
||||
except:
|
||||
|
@ -28,6 +28,9 @@
|
||||
"""Edition des PV de jury
|
||||
"""
|
||||
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
|
||||
import scolars
|
||||
import sco_formsemestre
|
||||
import sco_groups
|
||||
@ -36,8 +39,7 @@ import sco_parcours_dut
|
||||
import sco_codes_parcours
|
||||
from sco_codes_parcours import NO_SEMESTRE_ID
|
||||
import sco_excel
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
from TrivialFormulator import TrivialFormulator
|
||||
from gen_tables import GenTable
|
||||
import sco_pvpdf
|
||||
from sco_pdf import *
|
||||
@ -135,7 +137,7 @@ def _comp_ects_by_ue_code_and_type(nt, decision_ues):
|
||||
return {}, {}
|
||||
|
||||
ects_by_ue_code = {}
|
||||
ects_by_ue_type = DictDefault(defaultvalue=0) # { ue_type : ects validés }
|
||||
ects_by_ue_type = scu.DictDefault(defaultvalue=0) # { ue_type : ects validés }
|
||||
for ue_id in decision_ues:
|
||||
d = decision_ues[ue_id]
|
||||
ue = nt.uedict[ue_id]
|
||||
@ -245,7 +247,7 @@ def dict_pvjury(
|
||||
if d["decision_sem"] and sco_codes_parcours.code_semestre_validant(
|
||||
d["decision_sem"]["code"]
|
||||
):
|
||||
d["mention"] = get_mention(nt.get_etud_moy_gen(etudid))
|
||||
d["mention"] = scu.get_mention(nt.get_etud_moy_gen(etudid))
|
||||
else:
|
||||
d["mention"] = ""
|
||||
# Versions "en français": (avec les UE capitalisées d'ailleurs)
|
||||
@ -513,8 +515,8 @@ def formsemestre_pvjury(
|
||||
rows=rows,
|
||||
titles=titles,
|
||||
columns_ids=columns_ids,
|
||||
filename=make_filename("decisions " + sem["titreannee"]),
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
filename=scu.make_filename("decisions " + sem["titreannee"]),
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
caption="Décisions jury pour " + sem["titreannee"],
|
||||
html_class="table_leftalign",
|
||||
html_sortable=True,
|
||||
@ -552,7 +554,7 @@ def formsemestre_pvjury(
|
||||
H.append(tab.html())
|
||||
|
||||
# Count number of cases for each decision
|
||||
counts = DictDefault()
|
||||
counts = scu.DictDefault()
|
||||
for row in rows:
|
||||
counts[row["decision"]] += 1
|
||||
# add codes for previous (for explanation, without count)
|
||||
@ -705,7 +707,7 @@ def formsemestre_pvjury_pdf(
|
||||
else:
|
||||
groups_filename = ""
|
||||
filename = "PV-%s%s-%s.pdf" % (sem["titre_num"], groups_filename, dt)
|
||||
return sendPDFFile(REQUEST, pdfdoc, filename)
|
||||
return scu.sendPDFFile(REQUEST, pdfdoc, filename)
|
||||
|
||||
|
||||
def descrform_pvjury(context, sem):
|
||||
@ -872,7 +874,7 @@ def formsemestre_lettres_individuelles(
|
||||
dt = time.strftime("%Y-%m-%d")
|
||||
groups_filename = "-" + groups_infos.groups_filename
|
||||
filename = "lettres-%s%s-%s.pdf" % (sem["titre_num"], groups_filename, dt)
|
||||
return sendPDFFile(REQUEST, pdfdoc, filename)
|
||||
return scu.sendPDFFile(REQUEST, pdfdoc, filename)
|
||||
|
||||
|
||||
def descrform_lettres_individuelles():
|
||||
|
10
sco_pvpdf.py
10
sco_pvpdf.py
@ -27,18 +27,18 @@
|
||||
|
||||
"""Edition des PV de jury
|
||||
"""
|
||||
import os
|
||||
import types
|
||||
|
||||
import sco_formsemestre
|
||||
from sco_pdf import *
|
||||
import sco_utils as scu
|
||||
import sco_formsemestre
|
||||
import sco_pvjury
|
||||
import sco_codes_parcours
|
||||
from sco_utils import *
|
||||
from sco_pdf import PDFLOCK
|
||||
import sco_preferences
|
||||
import sco_bulletins_pdf
|
||||
|
||||
import os
|
||||
import types
|
||||
|
||||
LOGO_FOOTER_ASPECT = CONFIG.LOGO_FOOTER_ASPECT # XXX A AUTOMATISER
|
||||
LOGO_FOOTER_HEIGHT = CONFIG.LOGO_FOOTER_HEIGHT * mm
|
||||
@ -354,7 +354,7 @@ def pdf_lettres_individuelles(
|
||||
if e["decision_sem"]: # decision prise
|
||||
etud = context.getEtudInfo(e["identite"]["etudid"], filled=True)[0]
|
||||
params["nomEtud"] = etud["nomprenom"]
|
||||
bookmarks[npages + 1] = suppress_accents(etud["nomprenom"])
|
||||
bookmarks[npages + 1] = scu.suppress_accents(etud["nomprenom"])
|
||||
objects += pdf_lettre_individuelle(
|
||||
dpv["formsemestre"], e, etud, params, signature, context=context
|
||||
)
|
||||
|
@ -27,8 +27,12 @@
|
||||
|
||||
"""Tableau recapitulatif des notes d'un semestre
|
||||
"""
|
||||
import time
|
||||
import datetime
|
||||
import jaxml
|
||||
|
||||
from notes_table import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_bulletins, sco_excel
|
||||
import sco_groups
|
||||
import sco_evaluations
|
||||
@ -37,6 +41,7 @@ import sco_formsemestre_status
|
||||
import sco_bulletins_xml
|
||||
import sco_bulletins_json
|
||||
import sco_codes_parcours
|
||||
from sco_codes_parcours import DEF, UE_SPORT
|
||||
import sco_bac
|
||||
|
||||
|
||||
@ -133,7 +138,7 @@ def formsemestre_recapcomplet(
|
||||
H.append("checked")
|
||||
H.append(""" >cacher bac</input>""")
|
||||
if tabformat == "xml":
|
||||
REQUEST.RESPONSE.setHeader("content-type", XML_MIMETYPE)
|
||||
REQUEST.RESPONSE.setHeader("content-type", scu.XML_MIMETYPE)
|
||||
H.append(
|
||||
do_formsemestre_recapcomplet(
|
||||
context,
|
||||
@ -201,11 +206,11 @@ def do_formsemestre_recapcomplet(
|
||||
if format == "xml" or format == "html":
|
||||
return data
|
||||
elif format == "csv":
|
||||
return sendCSVFile(REQUEST, data, filename)
|
||||
return scu.sendCSVFile(REQUEST, data, filename)
|
||||
elif format[:3] == "xls":
|
||||
return sco_excel.sendExcelFile(REQUEST, data, filename)
|
||||
elif format == "json":
|
||||
return sendJSON(REQUEST, data)
|
||||
return scu.sendJSON(REQUEST, data)
|
||||
else:
|
||||
raise ValueError("unknown format %s" % format)
|
||||
|
||||
@ -345,7 +350,7 @@ def make_formsemestre_recapcomplet(
|
||||
return val
|
||||
|
||||
# Compte les decisions de jury
|
||||
codes_nb = DictDefault(defaultvalue=0)
|
||||
codes_nb = scu.DictDefault(defaultvalue=0)
|
||||
#
|
||||
is_dem = {} # etudid : bool
|
||||
for t in T:
|
||||
@ -396,7 +401,7 @@ def make_formsemestre_recapcomplet(
|
||||
else:
|
||||
l.append(gr_name) # groupe
|
||||
|
||||
l.append(fmtnum(fmt_note(t[0], keep_numeric=keep_numeric))) # moy_gen
|
||||
l.append(fmtnum(scu.fmt_note(t[0], keep_numeric=keep_numeric))) # moy_gen
|
||||
# Ajoute rangs dans groupes seulement si CSV ou XLS
|
||||
if format[:3] == "xls" or format == "csv":
|
||||
rang_gr, ninscrits_gr, gr_name = sco_bulletins.get_etud_rangs_groups(
|
||||
@ -410,7 +415,7 @@ def make_formsemestre_recapcomplet(
|
||||
i += 1
|
||||
if ue["type"] != UE_SPORT:
|
||||
l.append(
|
||||
fmtnum(fmt_note(t[i], keep_numeric=keep_numeric))
|
||||
fmtnum(scu.fmt_note(t[i], keep_numeric=keep_numeric))
|
||||
) # moyenne etud dans ue
|
||||
else: # UE_SPORT:
|
||||
# n'affiche pas la moyenne d'UE dans ce cas
|
||||
@ -423,7 +428,9 @@ def make_formsemestre_recapcomplet(
|
||||
if modimpl["module"]["ue_id"] == ue["ue_id"]:
|
||||
l.append(
|
||||
fmtnum(
|
||||
fmt_note(t[j + len(ues) + 1], keep_numeric=keep_numeric)
|
||||
scu.fmt_note(
|
||||
t[j + len(ues) + 1], keep_numeric=keep_numeric
|
||||
)
|
||||
)
|
||||
) # moyenne etud dans module
|
||||
if format == "xlsall":
|
||||
@ -458,7 +465,7 @@ def make_formsemestre_recapcomplet(
|
||||
l += [""]
|
||||
l.append(corner_value)
|
||||
if format[:3] == "xls" or format == "csv":
|
||||
for partition in partitions:
|
||||
for _ in partitions:
|
||||
l += [""] # rangs dans les groupes
|
||||
for ue in ues:
|
||||
if ue["type"] != UE_SPORT:
|
||||
@ -476,7 +483,7 @@ def make_formsemestre_recapcomplet(
|
||||
else:
|
||||
l.append(str(ue[key]))
|
||||
else:
|
||||
l.append(fmt_note(ue[key], keep_numeric=keep_numeric))
|
||||
l.append(scu.fmt_note(ue[key], keep_numeric=keep_numeric))
|
||||
else: # UE_SPORT:
|
||||
# n'affiche pas la moyenne d'UE dans ce cas
|
||||
if not hidemodules:
|
||||
@ -500,7 +507,7 @@ def make_formsemestre_recapcomplet(
|
||||
): # garde val numerique pour excel
|
||||
val = str(val)
|
||||
else: # moyenne du module
|
||||
val = fmt_note(val, keep_numeric=keep_numeric)
|
||||
val = scu.fmt_note(val, keep_numeric=keep_numeric)
|
||||
l.append(val)
|
||||
|
||||
if format == "xlsall":
|
||||
@ -514,13 +521,15 @@ def make_formsemestre_recapcomplet(
|
||||
F.append(l + ["", ""]) # ajoute cellules code_nip et etudid inutilisees ici
|
||||
|
||||
add_bottom_stat(
|
||||
"min", "Min", corner_value=fmt_note(nt.moy_min, keep_numeric=keep_numeric)
|
||||
"min", "Min", corner_value=scu.fmt_note(nt.moy_min, keep_numeric=keep_numeric)
|
||||
)
|
||||
add_bottom_stat(
|
||||
"max", "Max", corner_value=fmt_note(nt.moy_max, keep_numeric=keep_numeric)
|
||||
"max", "Max", corner_value=scu.fmt_note(nt.moy_max, keep_numeric=keep_numeric)
|
||||
)
|
||||
add_bottom_stat(
|
||||
"moy", "Moyennes", corner_value=fmt_note(nt.moy_moy, keep_numeric=keep_numeric)
|
||||
"moy",
|
||||
"Moyennes",
|
||||
corner_value=scu.fmt_note(nt.moy_moy, keep_numeric=keep_numeric),
|
||||
)
|
||||
add_bottom_stat("coef", "Coef")
|
||||
add_bottom_stat("nb_valid_evals", "Nb évals")
|
||||
@ -645,7 +654,9 @@ def make_formsemestre_recapcomplet(
|
||||
idx_col_moy = idx_col_gr + 1
|
||||
cssclass = "recap_col_moy"
|
||||
try:
|
||||
if float(nsn[idx_col_moy]) < (nt.parcours.BARRE_MOY - NOTES_TOLERANCE):
|
||||
if float(nsn[idx_col_moy]) < (
|
||||
nt.parcours.BARRE_MOY - scu.NOTES_TOLERANCE
|
||||
):
|
||||
cssclass = "recap_col_moy_inf"
|
||||
except:
|
||||
pass
|
||||
@ -734,7 +745,7 @@ def make_formsemestre_recapcomplet(
|
||||
H.append("</table>")
|
||||
return "\n".join(H), "", "html"
|
||||
elif format == "csv":
|
||||
CSV = CSV_LINESEP.join([CSV_FIELDSEP.join(str(x)) for x in F])
|
||||
CSV = scu.CSV_LINESEP.join([scu.CSV_FIELDSEP.join(str(x)) for x in F])
|
||||
semname = sem["titre_num"].replace(" ", "_")
|
||||
date = time.strftime("%d-%m-%Y")
|
||||
filename = "notes_modules-%s-%s.csv" % (semname, date)
|
||||
@ -774,8 +785,8 @@ def _list_notes_evals(context, evals, etudid):
|
||||
val = NotesDB[etudid]["value"]
|
||||
else:
|
||||
# Note manquante mais prise en compte immédiate: affiche ATT
|
||||
val = NOTES_ATTENTE
|
||||
val_fmt = fmt_note(val, keep_numeric=True)
|
||||
val = scu.NOTES_ATTENTE
|
||||
val_fmt = scu.fmt_note(val, keep_numeric=True)
|
||||
L.append(val_fmt)
|
||||
return L
|
||||
|
||||
@ -806,7 +817,7 @@ def _list_notes_evals_stats(context, evals, key):
|
||||
):
|
||||
if key == "moy":
|
||||
val = e["etat"]["moy_num"]
|
||||
L.append(fmt_note(val, keep_numeric=True))
|
||||
L.append(scu.fmt_note(val, keep_numeric=True))
|
||||
elif key == "max":
|
||||
L.append(e["note_max"])
|
||||
elif key == "min":
|
||||
@ -834,7 +845,7 @@ def _formsemestre_recapcomplet_xml(
|
||||
if not T:
|
||||
return "", "", "xml"
|
||||
|
||||
doc = jaxml.XML_document(encoding=SCO_ENCODING)
|
||||
doc = jaxml.XML_document(encoding=scu.SCO_ENCODING)
|
||||
if xml_nodate:
|
||||
docdate = ""
|
||||
else:
|
||||
@ -928,4 +939,4 @@ def formsemestres_bulletins(context, annee_scolaire, REQUEST=None):
|
||||
)
|
||||
jslist.append(J)
|
||||
|
||||
return sendJSON(REQUEST, jslist)
|
||||
return scu.sendJSON(REQUEST, jslist)
|
||||
|
@ -39,7 +39,7 @@ sem_set_list(context)
|
||||
|
||||
"""
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
@ -417,7 +417,7 @@ def semset_page(context, format="html", REQUEST=None):
|
||||
"""
|
||||
semsets = get_semsets_list(context)
|
||||
for s in semsets:
|
||||
s["suppress"] = icontag(
|
||||
s["suppress"] = scu.icontag(
|
||||
"delete_small_img", border="0", alt="supprimer", title="Supprimer"
|
||||
)
|
||||
s["_suppress_target"] = "do_semset_delete?semset_id=%s" % (s["semset_id"])
|
||||
@ -479,7 +479,7 @@ def semset_page(context, format="html", REQUEST=None):
|
||||
]
|
||||
H.append(tab.html())
|
||||
|
||||
annee_courante = int(AnneeScolaire(REQUEST))
|
||||
annee_courante = int(scu.AnneeScolaire(REQUEST))
|
||||
menu_annee = "\n".join(
|
||||
[
|
||||
'<option value="%s">%s</option>' % (i, i)
|
||||
|
@ -36,7 +36,7 @@
|
||||
|
||||
import types
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from sco_exceptions import ScoValueError, AccessDenied
|
||||
@ -200,7 +200,7 @@ class ModuleTag(ScoTag):
|
||||
def module_tag_search(context, term, REQUEST=None):
|
||||
"""List all used tag names (for auto-completion)"""
|
||||
# restrict charset to avoid injections
|
||||
if not ALPHANUM_EXP.match(term.decode(SCO_ENCODING)):
|
||||
if not scu.ALPHANUM_EXP.match(term.decode(scu.SCO_ENCODING)):
|
||||
data = []
|
||||
else:
|
||||
r = ndb.SimpleDictFetch(
|
||||
@ -210,7 +210,7 @@ def module_tag_search(context, term, REQUEST=None):
|
||||
)
|
||||
data = [x["title"] for x in r]
|
||||
|
||||
return sendJSON(REQUEST, data)
|
||||
return scu.sendJSON(REQUEST, data)
|
||||
|
||||
|
||||
def module_tag_list(context, module_id=""):
|
||||
|
@ -37,8 +37,9 @@ import xml
|
||||
import tempfile
|
||||
|
||||
from notes_log import log
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from sco_exceptions import ScoValueError
|
||||
from TrivialFormulator import TrivialFormulator
|
||||
import scolars
|
||||
import sco_photos
|
||||
import sco_formsemestre
|
||||
@ -50,6 +51,7 @@ from sco_pdf import *
|
||||
import ImportScolars
|
||||
import sco_excel
|
||||
from reportlab.lib import colors
|
||||
from PIL import Image as PILImage
|
||||
|
||||
|
||||
def trombino(
|
||||
@ -166,8 +168,7 @@ def check_local_photos_availability(context, groups_infos, REQUEST, format=""):
|
||||
"""
|
||||
nb_missing = 0
|
||||
for t in groups_infos.members:
|
||||
etudid = t["etudid"]
|
||||
url = sco_photos.etud_photo_url(
|
||||
_ = sco_photos.etud_photo_url(
|
||||
context, t, REQUEST=REQUEST
|
||||
) # -> copy distant files if needed
|
||||
if not sco_photos.etud_photo_is_local(context, t):
|
||||
@ -376,7 +377,7 @@ def _trombino_pdf(context, groups_infos, REQUEST):
|
||||
document.build(objects)
|
||||
data = report.getvalue()
|
||||
|
||||
return sendPDFFile(REQUEST, data, filename)
|
||||
return scu.sendPDFFile(REQUEST, data, filename)
|
||||
|
||||
|
||||
# --------------------- Sur une idée de l'IUT d'Orléans:
|
||||
@ -459,7 +460,7 @@ def _listeappel_photos_pdf(context, groups_infos, REQUEST):
|
||||
document.build(objects)
|
||||
data = report.getvalue()
|
||||
|
||||
return sendPDFFile(REQUEST, data, filename)
|
||||
return scu.sendPDFFile(REQUEST, data, filename)
|
||||
|
||||
|
||||
# --------------------- Upload des photos de tout un groupe
|
||||
@ -593,7 +594,7 @@ def zip_excel_import_files(
|
||||
fn = fn.replace("\\", "/") # not sure if this is necessary ?
|
||||
fn = fn.strip()
|
||||
if lowercase:
|
||||
fn = strlower(fn)
|
||||
fn = scu.strlower(fn)
|
||||
fn = fn.split("/")[-1] # use only last component, not directories
|
||||
return fn
|
||||
|
||||
|
@ -38,8 +38,8 @@ from zipfile import ZipFile, BadZipfile
|
||||
import xml
|
||||
import tempfile
|
||||
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
from sco_utils import *
|
||||
import sco_abs
|
||||
import scolars
|
||||
import sco_photos
|
||||
@ -283,7 +283,7 @@ def pdf_trombino_tours(
|
||||
document.build(objects)
|
||||
data = report.getvalue()
|
||||
|
||||
return sendPDFFile(REQUEST, data, filename)
|
||||
return scu.sendPDFFile(REQUEST, data, filename)
|
||||
|
||||
|
||||
# Feuille d'absences en pdf avec photos:
|
||||
@ -477,4 +477,4 @@ def pdf_feuille_releve_absences(
|
||||
document.build(objects)
|
||||
data = report.getvalue()
|
||||
|
||||
return sendPDFFile(REQUEST, data, filename)
|
||||
return scu.sendPDFFile(REQUEST, data, filename)
|
||||
|
@ -55,13 +55,14 @@ Solution proposée (nov 2014):
|
||||
"""
|
||||
|
||||
import notesdb as ndb
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
import sco_formsemestre
|
||||
import sco_moduleimpl
|
||||
import sco_edit_ue
|
||||
import sco_saisie_notes
|
||||
import sco_codes_parcours
|
||||
from TrivialFormulator import TrivialFormulator, tf_error_message
|
||||
from sco_permissions import ScoImplement
|
||||
from sco_exceptions import AccessDenied, ScoValueError
|
||||
|
||||
@ -164,7 +165,7 @@ def external_ue_inscrit_et_note(
|
||||
description="note externe",
|
||||
)
|
||||
# Saisie des notes
|
||||
nbchanged, nbsuppress, existing_decisions = sco_saisie_notes._notes_add(
|
||||
_, _, _ = sco_saisie_notes._notes_add(
|
||||
context,
|
||||
REQUEST.AUTHENTICATED_USER,
|
||||
evaluation_id,
|
||||
|
@ -35,7 +35,7 @@ Pour une évaluation:
|
||||
- historique: table notes_notes_log
|
||||
|
||||
saisie de notes == saisir ou supprimer une ou plusieurs notes (mêmes date et uid)
|
||||
/!\ tolérance sur les dates (200ms ?)
|
||||
! tolérance sur les dates (200ms ?)
|
||||
Chaque saisie affecte ou remplace une ou plusieurs notes.
|
||||
|
||||
Opérations:
|
||||
@ -48,12 +48,13 @@ Opérations:
|
||||
import datetime
|
||||
from intervals import intervalmap
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
import notesdb as ndb
|
||||
from notes_log import log
|
||||
from gen_tables import GenTable
|
||||
import sco_formsemestre
|
||||
import sco_moduleimpl
|
||||
import VERSION
|
||||
|
||||
# deux notes (de même uid) sont considérées comme de la même opération si
|
||||
# elles sont séparées de moins de 2*tolerance:
|
||||
@ -121,7 +122,7 @@ def list_operations(context, evaluation_id):
|
||||
|
||||
Ops = []
|
||||
for uid in NotesDates.keys():
|
||||
for (t0, t1), notes in NotesDates[uid].items():
|
||||
for (t0, _), notes in NotesDates[uid].items():
|
||||
Op = NotesOperation(
|
||||
evaluation_id=evaluation_id,
|
||||
date=t0,
|
||||
@ -201,7 +202,7 @@ def formsemestre_list_saisies_notes(
|
||||
caption="Saisies de notes dans %s" % sem["titreannee"],
|
||||
preferences=context.get_preferences(formsemestre_id),
|
||||
base_url="%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id),
|
||||
origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
|
||||
origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
|
||||
)
|
||||
return tab.make_page(context, format=format, REQUEST=REQUEST)
|
||||
|
||||
@ -242,7 +243,7 @@ def get_note_history(context, evaluation_id, etudid, REQUEST=None, fmt=""):
|
||||
x["user_name"] = context.Users.user_info(x["uid"])["nomcomplet"]
|
||||
|
||||
if fmt == "json":
|
||||
return sendJSON(REQUEST, history)
|
||||
return scu.sendJSON(REQUEST, history)
|
||||
else:
|
||||
return history
|
||||
|
||||
|
@ -29,8 +29,11 @@
|
||||
""" Verification version logiciel vs version "stable" sur serveur
|
||||
N'effectue pas la mise à jour automatiquement, mais permet un affichage d'avertissement.
|
||||
"""
|
||||
import datetime
|
||||
import re
|
||||
|
||||
from sco_utils import *
|
||||
import sco_utils as scu
|
||||
from notes_log import log
|
||||
|
||||
# Appel renvoyant la subversion "stable"
|
||||
# La notion de "stable" est juste là pour éviter d'afficher trop frequemment
|
||||
@ -46,7 +49,9 @@ def get_last_stable_version():
|
||||
(do not wait server answer more than 3 seconds)
|
||||
"""
|
||||
global _LAST_UP_TO_DATE_REQUEST
|
||||
ans = query_portal(GET_VER_URL, msg="ScoDoc version server", timeout=3) # sco_utils
|
||||
ans = scu.query_portal(
|
||||
GET_VER_URL, msg="ScoDoc version server", timeout=3
|
||||
) # sco_utils
|
||||
if ans:
|
||||
ans = ans.strip()
|
||||
_LAST_UP_TO_DATE_REQUEST = datetime.datetime.now()
|
||||
@ -74,7 +79,7 @@ def is_up_to_date(context):
|
||||
return _UP_TO_DATE, _UP_TO_DATE_MSG
|
||||
|
||||
last_stable_ver = get_last_stable_version()
|
||||
cur_ver = get_svn_version(context.file_path) # in sco_utils
|
||||
cur_ver = scu.get_svn_version(context.file_path) # in sco_utils
|
||||
cur_ver2 = cur_ver
|
||||
cur_ver_num = -1
|
||||
# Convert versions to integers:
|
||||
|
17
sco_utils.py
17
sco_utils.py
@ -32,7 +32,6 @@ import os
|
||||
import sys
|
||||
import copy
|
||||
import re
|
||||
|
||||
import bisect
|
||||
import types
|
||||
import numbers
|
||||
@ -41,6 +40,10 @@ import urllib2
|
||||
import xml.sax.saxutils
|
||||
import time
|
||||
import datetime
|
||||
import json
|
||||
|
||||
# XML generation package (apt-get install jaxml)
|
||||
import jaxml
|
||||
|
||||
try:
|
||||
import six
|
||||
@ -52,21 +55,11 @@ except ImportError:
|
||||
|
||||
from PIL import Image as PILImage
|
||||
|
||||
# XML generation package (apt-get install jaxml)
|
||||
import jaxml
|
||||
|
||||
import json
|
||||
|
||||
from VERSION import SCOVERSION
|
||||
import VERSION
|
||||
|
||||
from SuppressAccents import suppression_diacritics
|
||||
|
||||
# from sco_exceptions import *
|
||||
# from sco_permissions import *
|
||||
from TrivialFormulator import TrivialFormulator, TF, tf_error_message
|
||||
from notes_log import log, logCallStack
|
||||
|
||||
from notes_log import log
|
||||
from sco_codes_parcours import NOTES_TOLERANCE, CODES_EXPL
|
||||
|
||||
# ----- CALCUL ET PRESENTATION DES NOTES
|
||||
|
Loading…
Reference in New Issue
Block a user