diff --git a/sco_bulletins_generator.py b/sco_bulletins_generator.py
index 717cd9be1f..691059746d 100644
--- a/sco_bulletins_generator.py
+++ b/sco_bulletins_generator.py
@@ -42,12 +42,22 @@ La préférence 'bul_pdf_class_name' est obsolete (inutilisée).
"""
+import time
+import cStringIO
import collections
+import traceback
+import reportlab
+from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Frame, PageBreak
+from reportlab.platypus import Table, TableStyle, Image, KeepInFrame
+import sco_utils
+import VERSION
+from sco_exceptions import NoteProcessError
import sco_preferences
from notes_log import log
import sco_formsemestre
-from sco_pdf import *
+import sco_pdf
+from sco_pdf import PDFLOCK
BULLETIN_CLASSES = (
collections.OrderedDict()
@@ -145,7 +155,7 @@ class BulletinGenerator:
dt,
self.infos["etud"]["nom"],
)
- filename = unescape_html(filename).replace(" ", "_").replace("&", "")
+ filename = sco_utils.unescape_html(filename).replace(" ", "_").replace("&", "")
return filename
def generate(self, format="", stand_alone=True):
@@ -166,8 +176,10 @@ class BulletinGenerator:
def generate_html(self):
"""Return bulletin as an HTML string"""
H = ['
']
- H.append(self.bul_table(format="html")) # table des notes
- H.append(self.bul_part_below(format="html")) # infos sous la table
+ # table des notes:
+ H.append(self.bul_table(format="html")) # pylint: disable=no-member
+ # infos sous la table:
+ H.append(self.bul_part_below(format="html")) # pylint: disable=no-member
H.append("
")
return "\n".join(H)
@@ -179,10 +191,14 @@ class BulletinGenerator:
"""
formsemestre_id = self.infos["formsemestre_id"]
- objects = self.bul_title_pdf() # partie haute du bulletin
- objects += self.bul_table(format="pdf") # table des notes
- objects += self.bul_part_below(format="pdf") # infos sous la table
- objects += self.bul_signatures_pdf() # signatures
+ # partie haute du bulletin
+ objects = self.bul_title_pdf() # pylint: disable=no-member
+ # table des notes
+ objects += self.bul_table(format="pdf") # pylint: disable=no-member
+ # infos sous la table
+ objects += self.bul_part_below(format="pdf") # pylint: disable=no-member
+ # signatures
+ objects += self.bul_signatures_pdf() # pylint: disable=no-member
# Réduit sur une page
objects = [KeepInFrame(0, 0, objects, mode="shrink")]
@@ -194,13 +210,13 @@ class BulletinGenerator:
# Generation du document PDF
sem = sco_formsemestre.get_formsemestre(self.context, formsemestre_id)
report = cStringIO.StringIO() # in-memory document, no disk file
- document = BaseDocTemplate(report)
+ document = sco_pdf.BaseDocTemplate(report)
document.addPageTemplates(
- ScolarsPageTemplate(
+ sco_pdf.ScolarsPageTemplate(
document,
context=self.context,
author="%s %s (E. Viennet) [%s]"
- % (SCONAME, SCOVERSION, self.description),
+ % (VERSION.SCONAME, VERSION.SCOVERSION, self.description),
title="Bulletin %s de %s"
% (sem["titremois"], self.infos["etud"]["nomprenom"]),
subject="Bulletin de note",
@@ -222,7 +238,9 @@ class BulletinGenerator:
"""
try:
# put each table cell in a Paragraph
- Pt = [[Paragraph(SU(x), self.CellStyle) for x in line] for line in P]
+ Pt = [
+ [Paragraph(sco_pdf.SU(x), self.CellStyle) for x in line] for line in P
+ ]
except:
# enquête sur exception intermittente...
log("*** bug in PDF buildTableObject:")
diff --git a/sco_report.py b/sco_report.py
index 4e1d13ee56..3f4a69b035 100644
--- a/sco_report.py
+++ b/sco_report.py
@@ -29,16 +29,22 @@
- statistiques decisions
- suivi cohortes
"""
+import os
+import tempfile
+import urllib
+import re
+import time
+import mx
import mx.DateTime
from mx.DateTime import DateTime as mxDateTime
-import tempfile, urllib, re
-
-from notesdb import *
-from sco_utils import *
+import sco_utils as scu
+import VERSION
from notes_log import log
from gen_tables import GenTable
import sco_excel, sco_pdf
+from notesdb import DateDMYtoISO
+from sco_exceptions import ScoValueError
import sco_codes_parcours
from sco_codes_parcours import code_semestre_validant
import sco_parcours_dut
@@ -129,7 +135,7 @@ def _results_by_category(
if Count.has_key(etud[category]):
Count[etud[category]][etud[result]] += 1
else:
- Count[etud[category]] = DictDefault(kv_dict={etud[result]: 1})
+ Count[etud[category]] = scu.DictDefault(kv_dict={etud[result]: 1})
# conversion en liste de dict
C = [Count[cat] for cat in categories]
# Totaux par lignes et colonnes
@@ -214,9 +220,9 @@ def formsemestre_report(
formsemestre_id=formsemestre_id,
)
#
- tab.filename = make_filename("stats " + sem["titreannee"])
+ tab.filename = scu.make_filename("stats " + 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épartition des résultats par %s, semestre %s" % (
category_name,
sem["titreannee"],
@@ -259,7 +265,7 @@ def formsemestre_report_counts(
Tableau comptage avec choix des categories
"""
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
- category_name = strcapitalize(category)
+ category_name = scu.strcapitalize(category)
title = "Comptages " + category_name
etuds = formsemestre_etuds_stats(context, sem, only_primo=only_primo)
tab = formsemestre_report(
@@ -484,7 +490,7 @@ def table_suivi_cohorte(
indices_sems.sort()
for p in P:
p.nb_etuds = 0 # nombre total d'etudiants dans la periode
- p.sems_by_id = DictDefault(defaultvalue=[])
+ p.sems_by_id = scu.DictDefault(defaultvalue=[])
for s in p.sems:
p.sems_by_id[s["semestre_id"]].append(s)
p.nb_etuds += len(s["members"])
@@ -623,8 +629,8 @@ def table_suivi_cohorte(
rows=L,
html_col_width="4em",
html_sortable=True,
- filename=make_filename("cohorte " + sem["titreannee"]),
- origin="Généré par %s le " % VERSION.SCONAME + timedate_human_repr() + "",
+ filename=scu.make_filename("cohorte " + sem["titreannee"]),
+ origin="Généré par %s le " % VERSION.SCONAME + scu.timedate_human_repr() + "",
caption="Suivi cohorte " + pp + sem["titreannee"] + dbac,
page_title="Suivi cohorte " + sem["titreannee"],
html_class="table_cohorte",
@@ -666,7 +672,6 @@ def formsemestre_suivi_cohorte(
):
"""Affiche suivi cohortes par numero de semestre"""
percent = int(percent)
- sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
tab, expl, bacs, bacspecialites, annee_bacs, sexes, statuts = table_suivi_cohorte(
context,
formsemestre_id,
@@ -1049,7 +1054,7 @@ def table_suivi_parcours(
etuds, bacs, bacspecialites, annee_bacs, sexes, statuts = tsp_etud_list(
context, formsemestre_id, only_primo=only_primo
)
- codes_etuds = DictDefault(defaultvalue=[])
+ codes_etuds = scu.DictDefault(defaultvalue=[])
for etud in etuds:
etud["codeparcours"], etud["decisions_jury"] = get_codeparcoursetud(
context, etud
@@ -1105,7 +1110,7 @@ def table_suivi_parcours(
columns_ids=columns_ids,
rows=L,
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="Parcours suivis, étudiants %s semestre " % primostr
+ sem["titreannee"],
page_title="Parcours " + sem["titreannee"],
@@ -1164,7 +1169,6 @@ def formsemestre_suivi_parcours(
REQUEST=None,
):
"""Effectifs dans les differents parcours possibles."""
- sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
tab = table_suivi_parcours(
context,
formsemestre_id,
@@ -1211,9 +1215,8 @@ def graph_parcours(
statut="",
):
""""""
- if not WITH_PYDOT:
+ if not scu.WITH_PYDOT:
raise ScoValueError("pydot module is not installed")
- sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
etuds, bacs, bacspecialites, annee_bacs, sexes, statuts = tsp_etud_list(
context,
formsemestre_id,
@@ -1227,12 +1230,12 @@ def graph_parcours(
# log('graph_parcours: %s etuds (only_primo=%s)' % (len(etuds), only_primo))
if not etuds:
return "", etuds, bacs, bacspecialites, annee_bacs, sexes, statuts
- edges = DictDefault(
+ edges = scu.DictDefault(
defaultvalue=set()
) # {(formsemestre_id_origin, formsemestre_id_dest) : etud_set}
sems = {}
- effectifs = DictDefault(defaultvalue=set()) # formsemestre_id : etud_set
- decisions = DictDefault(defaultvalue={}) # formsemestre_id : { code : nb_etud }
+ effectifs = scu.DictDefault(defaultvalue=set()) # formsemestre_id : etud_set
+ decisions = scu.DictDefault(defaultvalue={}) # formsemestre_id : { code : nb_etud }
isolated_nodes = []
connected_nodes = set()
diploma_nodes = []
@@ -1279,7 +1282,11 @@ def graph_parcours(
dem_nodes[s["formsemestre_id"]] = nid
edges[(s["formsemestre_id"], nid)].add(etudid)
# ajout noeud pour NAR (seulement pour noeud de depart)
- if s["formsemestre_id"] == formsemestre_id and dec and dec["code"] == NAR:
+ if (
+ s["formsemestre_id"] == formsemestre_id
+ and dec
+ and dec["code"] == sco_codes_parcours.NAR
+ ):
nid = "_nar_" + s["formsemestre_id"]
nar_nodes[s["formsemestre_id"]] = nid
edges[(s["formsemestre_id"], nid)].add(etudid)
@@ -1295,10 +1302,10 @@ def graph_parcours(
edges[(s["formsemestre_id"], nid)].add(etudid)
diploma_nodes.append(nid)
#
- g = pydot.graph_from_edges(edges.keys())
+ g = scu.pydot.graph_from_edges(edges.keys())
for fid in isolated_nodes:
if not fid in connected_nodes:
- n = pydot.Node(name=fid)
+ n = scu.pydot.Node(name=fid)
g.add_node(n)
g.set("rankdir", "LR") # left to right
g.set_fontname("Helvetica")
@@ -1306,7 +1313,7 @@ def graph_parcours(
g.set_bgcolor("#fffff0") # ou 'transparent'
# titres des semestres:
for s in sems.values():
- n = pydot_get_node(g, s["formsemestre_id"])
+ n = scu.pydot_get_node(g, s["formsemestre_id"])
log("s['formsemestre_id'] = %s" % s["formsemestre_id"])
log("n=%s" % n)
log("get=%s" % g.get_node(s["formsemestre_id"]))
@@ -1324,31 +1331,31 @@ def graph_parcours(
s["annee_fin"][2:],
len(effectifs[s["formsemestre_id"]]),
)
- n.set("label", suppress_accents(label))
+ n.set("label", scu.suppress_accents(label))
n.set_fontname("Helvetica")
n.set_fontsize(8.0)
n.set_width(1.2)
n.set_shape("box")
n.set_URL("formsemestre_status?formsemestre_id=" + s["formsemestre_id"])
# semestre de depart en vert
- n = pydot_get_node(g, formsemestre_id)
+ n = scu.pydot_get_node(g, formsemestre_id)
n.set_color("green")
# demissions en rouge, octagonal
for nid in dem_nodes.values():
- n = pydot_get_node(g, nid)
+ n = scu.pydot_get_node(g, nid)
n.set_color("red")
n.set_shape("octagon")
n.set("label", "Dem.")
# NAR en rouge, Mcircle
for nid in nar_nodes.values():
- n = pydot_get_node(g, nid)
+ n = scu.pydot_get_node(g, nid)
n.set_color("red")
n.set_shape("Mcircle")
- n.set("label", NAR)
+ n.set("label", sco_codes_parcours.NAR)
# diplomes:
for nid in diploma_nodes:
- n = pydot_get_node(g, nid)
+ n = scu.pydot_get_node(g, nid)
n.set_color("red")
n.set_shape("ellipse")
n.set("label", "Diplome") # bug si accent (pas compris pourquoi)
@@ -1367,7 +1374,7 @@ def graph_parcours(
bubbles[src_id + ":" + dst_id] = etud_descr
e.set_URL("__xxxetudlist__?" + src_id + ":" + dst_id)
# Genere graphe
- f, path = tempfile.mkstemp(".gr")
+ _, path = tempfile.mkstemp(".gr")
g.write(path=path, format=format)
data = open(path, "r").read()
log("dot generated %d bytes in %s format" % (len(data), format))
@@ -1403,7 +1410,7 @@ def graph_parcours(
)
return (
'