1
0
forked from ScoDoc/ScoDoc

pylinting

This commit is contained in:
IDK 2021-02-01 23:54:46 +01:00
parent a4173e1877
commit 1576a64ccd
13 changed files with 205 additions and 210 deletions

View File

@ -35,7 +35,6 @@ import pprint
from sco_zope import * # pylint: disable=unused-wildcard-import from sco_zope import * # pylint: disable=unused-wildcard-import
# --------------- # ---------------
# from sco_utils import *
import sco_utils as scu import sco_utils as scu
import notesdb as ndb import notesdb as ndb
from notes_log import log, sendAlarm from notes_log import log, sendAlarm

View File

@ -30,8 +30,15 @@
import sys import sys
import traceback import traceback
import time, string, glob, re import time
import urllib, urllib2, cgi, xml import string
import glob
import re
import urllib
import urllib2
import cgi
import xml
import jaxml
try: try:
from cStringIO import StringIO from cStringIO import StringIO
@ -41,7 +48,7 @@ from zipfile import ZipFile
import thread import thread
import psycopg2 import psycopg2
from sco_zope import * from sco_zope import * # pylint: disable=unused-wildcard-import
# --------------- # ---------------
@ -53,12 +60,40 @@ log("restarting...")
log("ZScolar home=%s" % file_path) log("ZScolar home=%s" % file_path)
from sco_utils import * import sco_utils as scu
import notesdb import notesdb as ndb
from notesdb import *
from scolog import logdb from scolog import logdb
from sco_permissions import (
ScoAbsChange,
ScoView,
ScoEnsView,
ScoImplement,
ScoChangeFormation,
ScoChangePreferences,
ScoObservateur,
ScoEtudAddAnnotations,
ScoEtudInscrit,
ScoEtudChangeGroups,
ScoEtudChangeAdr,
ScoEtudSupprAnnotations,
ScoEditAllEvals,
ScoEditAllNotes,
ScoEditFormationTags,
ScoEditApo,
ScoSuperAdmin,
)
import sco_permissions
from sco_exceptions import (
AccessDenied,
ScoException,
ScoValueError,
ScoInvalidDateError,
ScoLockedFormError,
ScoGenError,
)
from TrivialFormulator import TrivialFormulator, tf_error_message
import scolars import scolars
import sco_codes_parcours
import sco_preferences import sco_preferences
import sco_formations import sco_formations
from scolars import ( from scolars import (
@ -110,9 +145,9 @@ import sco_dump_db
from VERSION import SCOVERSION, SCONEWS from VERSION import SCOVERSION, SCONEWS
if hasattr(CONFIG, "ABSOLUTE_URL") and CONFIG.ABSOLUTE_URL: if hasattr(scu.CONFIG, "ABSOLUTE_URL") and scu.CONFIG.ABSOLUTE_URL:
log("ScoDoc: ABSOLUTE_URL='%s'" % CONFIG.ABSOLUTE_URL) log("ScoDoc: ABSOLUTE_URL='%s'" % scu.CONFIG.ABSOLUTE_URL)
log("ScoDoc: using encoding %s" % SCO_ENCODING) log("ScoDoc: using encoding %s" % scu.SCO_ENCODING)
# import essai_cas # import essai_cas
@ -197,8 +232,10 @@ class ZScolar(ObjectManager, PropertyManager, RoleManager, Item, Persistent, Imp
H.append(r) H.append(r)
ok = False ok = False
for permission in Sco_Default_Permissions.keys(): for permission in sco_permissions.Sco_Default_Permissions.keys():
roles = [r + DeptId for r in Sco_Default_Permissions[permission]] roles = [
r + DeptId for r in sco_permissions.Sco_Default_Permissions[permission]
]
roles.append("Manager") roles.append("Manager")
log("granting '%s' to %s" % (permission, roles)) log("granting '%s' to %s" % (permission, roles))
try: try:
@ -271,7 +308,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
# raise ValueError("essai exception") # raise ValueError("essai exception")
# raise ScoValueError('essai exception !', dest_url='totoro', REQUEST=REQUEST) # raise ScoValueError('essai exception !', dest_url='totoro', REQUEST=REQUEST)
# cursor = cnx.cursor(cursor_factory=ScoDocCursor) # cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
# cursor.execute("select * from notes_formations") # cursor.execute("select * from notes_formations")
# b += str(cursor.fetchall()) # b += str(cursor.fetchall())
# b = self.Notes.gloups() # b = self.Notes.gloups()
@ -306,7 +343,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
authuser = REQUEST.AUTHENTICATED_USER authuser = REQUEST.AUTHENTICATED_USER
for p in scoperms: for p in scoperms:
permname, value = p[:2] permname, _ = p[:2]
b += "<p>" + permname + " : " b += "<p>" + permname + " : "
if authuser.has_permission(permname, self): if authuser.has_permission(permname, self):
b += "yes" b += "yes"
@ -330,7 +367,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
# absolute_url is the classic Zope method # absolute_url is the classic Zope method
# The avoid the burden of configuring a proxy zope object, we offer # The avoid the burden of configuring a proxy zope object, we offer
# a custom configuration via scodoc_config # a custom configuration via scodoc_config
return CONFIG.ABSOLUTE_URL or self.absolute_url() return scu.CONFIG.ABSOLUTE_URL or self.absolute_url()
security.declareProtected(ScoView, "sco_header") security.declareProtected(ScoView, "sco_header")
sco_header = html_sco_header.sco_header sco_header = html_sco_header.sco_header
@ -349,7 +386,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
return self._db_cnx_string return self._db_cnx_string
security.declareProtected(ScoSuperAdmin, "GetDBConnexion") security.declareProtected(ScoSuperAdmin, "GetDBConnexion")
GetDBConnexion = notesdb.GetDBConnexion GetDBConnexion = ndb.GetDBConnexion
# A enlever après re-ecriture de ZEntreprises.py # A enlever après re-ecriture de ZEntreprises.py
security.declareProtected(ScoView, "TrivialFormulator") security.declareProtected(ScoView, "TrivialFormulator")
@ -395,7 +432,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
<p>&copy; Emmanuel Viennet 1997-2021</p> <p>&copy; Emmanuel Viennet 1997-2021</p>
<p>Version %s (subversion %s)</p> <p>Version %s (subversion %s)</p>
""" """
% (SCOVERSION, get_svn_version(file_path)) % (SCOVERSION, scu.get_svn_version(file_path))
] ]
H.append( H.append(
'<p>Logiciel libre écrit en <a href="http://www.python.org">Python</a>.</p><p>Utilise <a href="http://www.reportlab.org/">ReportLab</a> pour générer les documents PDF, et <a href="http://sourceforge.net/projects/pyexcelerator">pyExcelerator</a> pour le traitement des documents Excel.</p>' '<p>Logiciel libre écrit en <a href="http://www.python.org">Python</a>.</p><p>Utilise <a href="http://www.reportlab.org/">ReportLab</a> pour générer les documents PDF, et <a href="http://sourceforge.net/projects/pyexcelerator">pyExcelerator</a> pour le traitement des documents Excel.</p>'
@ -403,7 +440,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
H.append("<h2>Dernières évolutions</h2>" + SCONEWS) H.append("<h2>Dernières évolutions</h2>" + SCONEWS)
H.append( H.append(
'<div class="about-logo">' '<div class="about-logo">'
+ icontag("borgne_img") + scu.icontag("borgne_img")
+ " <em>Au pays des aveugles...</em></div>" + " <em>Au pays des aveugles...</em></div>"
) )
d = "" d = ""
@ -417,12 +454,12 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
if format == "html" or format == "pdf": if format == "html" or format == "pdf":
raise ScoValueError(msg) raise ScoValueError(msg)
elif format == "xml": elif format == "xml":
REQUEST.RESPONSE.setHeader("content-type", XML_MIMETYPE) REQUEST.RESPONSE.setHeader("content-type", scu.XML_MIMETYPE)
doc = jaxml.XML_document(encoding=SCO_ENCODING) doc = jaxml.XML_document(encoding=scu.SCO_ENCODING)
doc.error(msg=msg) doc.error(msg=msg)
return repr(doc) return repr(doc)
elif format == "json": elif format == "json":
REQUEST.RESPONSE.setHeader("content-type", JSON_MIMETYPE) REQUEST.RESPONSE.setHeader("content-type", scu.JSON_MIMETYPE)
return "undefined" # XXX voir quoi faire en cas d'erreur json return "undefined" # XXX voir quoi faire en cas d'erreur json
else: else:
raise ValueError("ScoErrorResponse: invalid format") raise ValueError("ScoErrorResponse: invalid format")
@ -517,7 +554,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
page_title="Opérations sur %(nomprenom)s" % etud, page_title="Opérations sur %(nomprenom)s" % etud,
html_title="<h2>Opérations effectuées sur l'étudiant %(nomprenom)s</h2>" html_title="<h2>Opérations effectuées sur l'étudiant %(nomprenom)s</h2>"
% etud, % etud,
filename="log_" + make_filename(etud["nomprenom"]), filename="log_" + scu.make_filename(etud["nomprenom"]),
html_next_section='<ul><li><a href="ficheEtud?etudid=%(etudid)s">fiche de %(nomprenom)s</a></li></ul>' html_next_section='<ul><li><a href="ficheEtud?etudid=%(etudid)s">fiche de %(nomprenom)s</a></li></ul>'
% etud, % etud,
preferences=self.get_preferences(), preferences=self.get_preferences(),
@ -530,7 +567,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
def listScoLog(self, etudid): def listScoLog(self, etudid):
"liste des operations effectuees sur cet etudiant" "liste des operations effectuees sur cet etudiant"
cnx = self.GetDBConnexion() cnx = self.GetDBConnexion()
cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute( cursor.execute(
"select * from scolog where etudid=%(etudid)s ORDER BY DATE DESC", "select * from scolog where etudid=%(etudid)s ORDER BY DATE DESC",
{"etudid": etudid}, {"etudid": etudid},
@ -545,7 +582,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
def rssnews(self, REQUEST=None): def rssnews(self, REQUEST=None):
"rss feed" "rss feed"
REQUEST.RESPONSE.setHeader("content-type", XML_MIMETYPE) REQUEST.RESPONSE.setHeader("content-type", scu.XML_MIMETYPE)
return sco_news.scolar_news_summary_rss( return sco_news.scolar_news_summary_rss(
self, "Nouvelles de " + self.get_preference("DeptName"), self.ScoURL() self, "Nouvelles de " + self.get_preference("DeptName"), self.ScoURL()
) )
@ -851,13 +888,13 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
"emailperso": "", "emailperso": "",
"error": "code etudiant inconnu", "error": "code etudiant inconnu",
} }
return sendResult( return scu.sendResult(
REQUEST, d, name="etudiant", format=format, force_outer_xml_tag=False REQUEST, d, name="etudiant", format=format, force_outer_xml_tag=False
) )
d = {} d = {}
etud = etuds[0] etud = etuds[0]
self.fillEtudsInfo([etud]) self.fillEtudsInfo([etud])
etud["date_naissance_iso"] = DateDMYtoISO(etud["date_naissance"]) etud["date_naissance_iso"] = ndb.DateDMYtoISO(etud["date_naissance"])
for a in ( for a in (
"etudid", "etudid",
"code_nip", "code_nip",
@ -885,8 +922,8 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
"codelycee", "codelycee",
"date_naissance_iso", "date_naissance_iso",
): ):
d[a] = quote_xml_attr(etud[a]) d[a] = scu.quote_xml_attr(etud[a])
d["photo_url"] = quote_xml_attr(sco_photos.etud_photo_url(self, etud)) d["photo_url"] = scu.quote_xml_attr(sco_photos.etud_photo_url(self, etud))
sem = etud["cursem"] sem = etud["cursem"]
if sem: if sem:
@ -895,10 +932,10 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
{ {
"current": "1", "current": "1",
"formsemestre_id": sem["formsemestre_id"], "formsemestre_id": sem["formsemestre_id"],
"date_debut": DateDMYtoISO(sem["date_debut"]), "date_debut": ndb.DateDMYtoISO(sem["date_debut"]),
"date_fin": DateDMYtoISO(sem["date_fin"]), "date_fin": ndb.DateDMYtoISO(sem["date_fin"]),
"etat": quote_xml_attr(sem["ins"]["etat"]), "etat": scu.quote_xml_attr(sem["ins"]["etat"]),
"groupes": quote_xml_attr( "groupes": scu.quote_xml_attr(
etud["groupes"] etud["groupes"]
), # slt pour semestre courant ), # slt pour semestre courant
} }
@ -910,14 +947,14 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
d["insemestre"].append( d["insemestre"].append(
{ {
"formsemestre_id": sem["formsemestre_id"], "formsemestre_id": sem["formsemestre_id"],
"date_debut": DateDMYtoISO(sem["date_debut"]), "date_debut": ndb.DateDMYtoISO(sem["date_debut"]),
"date_fin": DateDMYtoISO(sem["date_fin"]), "date_fin": ndb.DateDMYtoISO(sem["date_fin"]),
"etat": quote_xml_attr(sem["ins"]["etat"]), "etat": scu.quote_xml_attr(sem["ins"]["etat"]),
} }
) )
log("etud_info (%gs)" % (time.time() - t0)) log("etud_info (%gs)" % (time.time() - t0))
return sendResult( return scu.sendResult(
REQUEST, d, name="etudiant", format=format, force_outer_xml_tag=False REQUEST, d, name="etudiant", format=format, force_outer_xml_tag=False
) )
@ -960,7 +997,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
def _descr_situation_etud(self, etudid, ne=""): def _descr_situation_etud(self, etudid, ne=""):
"""chaine decrivant la situation actuelle de l'etudiant""" """chaine decrivant la situation actuelle de l'etudiant"""
cnx = self.GetDBConnexion() cnx = self.GetDBConnexion()
cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute( cursor.execute(
"select I.formsemestre_id, I.etat from notes_formsemestre_inscription I, notes_formsemestre S where etudid=%(etudid)s and S.formsemestre_id = I.formsemestre_id and date_debut < now() and date_fin > now() order by S.date_debut desc;", "select I.formsemestre_id, I.etat from notes_formsemestre_inscription I, notes_formsemestre S where etudid=%(etudid)s and S.formsemestre_id = I.formsemestre_id and date_debut < now() and date_fin > now() order by S.date_debut desc;",
{"etudid": etudid}, {"etudid": etudid},
@ -1350,7 +1387,6 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
operation_method="", operation_method="",
): ):
"Formulaire démission ou défaillance Etudiant" "Formulaire démission ou défaillance Etudiant"
cnx = self.GetDBConnexion()
etud = self.getEtudInfo(etudid=etudid, filled=1, REQUEST=REQUEST)[0] etud = self.getEtudInfo(etudid=etudid, filled=1, REQUEST=REQUEST)[0]
sem = sco_formsemestre.get_formsemestre(self, formsemestre_id) sem = sco_formsemestre.get_formsemestre(self, formsemestre_id)
if sem["etat"] != "1": if sem["etat"] != "1":
@ -1374,7 +1410,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
"""<form action="%s" method="get"> """<form action="%s" method="get">
<b>Date de la %s (J/M/AAAA):&nbsp;</b> <b>Date de la %s (J/M/AAAA):&nbsp;</b>
""" """
% (operation_method, strlower(operation_name)) % (operation_method, scu.strlower(operation_name))
) )
H.append( H.append(
""" """
@ -1410,7 +1446,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
etudid, etudid,
formsemestre_id, formsemestre_id,
event_date=event_date, event_date=event_date,
etat_new=DEF, etat_new=sco_codes_parcours.DEF,
operation_method="defailleEtudiant", operation_method="defailleEtudiant",
event_type="DEFAILLANCE", event_type="DEFAILLANCE",
REQUEST=REQUEST, REQUEST=REQUEST,
@ -1488,7 +1524,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
dialog_confirmed=dialog_confirmed, dialog_confirmed=dialog_confirmed,
args=args, args=args,
operation_name="défaillance", operation_name="défaillance",
etat_current=DEF, etat_current=sco_codes_parcours.DEF,
etat_new="I", etat_new="I",
operation_method="cancelDef", operation_method="cancelDef",
event_type="DEFAILLANCE", event_type="DEFAILLANCE",
@ -1544,7 +1580,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
args=ins, formsemestre_id=formsemestre_id args=ins, formsemestre_id=formsemestre_id
) )
logdb(REQUEST, cnx, method=operation_method, etudid=etudid) logdb(REQUEST, cnx, method=operation_method, etudid=etudid)
cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute( cursor.execute(
"delete from scolar_events where etudid=%(etudid)s and formsemestre_id=%(formsemestre_id)s and event_type='" "delete from scolar_events where etudid=%(etudid)s and formsemestre_id=%(formsemestre_id)s and event_type='"
+ event_type + event_type
@ -1572,7 +1608,6 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
"Le formulaire HTML" "Le formulaire HTML"
H = [self.sco_header(REQUEST, init_jquery_ui=True)] H = [self.sco_header(REQUEST, init_jquery_ui=True)]
F = self.sco_footer(REQUEST) F = self.sco_footer(REQUEST)
AUTHENTICATED_USER = REQUEST.AUTHENTICATED_USER
etudid = REQUEST.form.get("etudid", None) etudid = REQUEST.form.get("etudid", None)
cnx = self.GetDBConnexion() cnx = self.GetDBConnexion()
descr = [] descr = []
@ -1607,12 +1642,14 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
# recuperation infos Apogee # recuperation infos Apogee
# Si on a le code NIP, fait juste une requete, sinon tente de rechercher par nom # Si on a le code NIP, fait juste une requete, sinon tente de rechercher par nom
# (la recherche par nom ne fonctionne plus à Paris 13) # (la recherche par nom ne fonctionne plus à Paris 13)
code_nip = initvalues.get("code_nip", "") # XXX A terminer
if code_nip: # code_nip = initvalues.get("code_nip", "")
try: # if code_nip:
info = sco_portal_apogee.get_etud_apogee(self, code_nip) # try:
except ValueError: # infos = sco_portal_apogee.get_etud_apogee(self, code_nip)
pass # XXX a terminer # except ValueError:
# infos = None
# pass # XXX a terminer
nom = REQUEST.form.get("nom", None) nom = REQUEST.form.get("nom", None)
if nom is None: if nom is None:
nom = initvalues.get("nom", None) nom = initvalues.get("nom", None)
@ -1675,7 +1712,11 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
("nom_usuel", {"size": 25, "title": "Nom usuel", "allow_null": True}), ("nom_usuel", {"size": 25, "title": "Nom usuel", "allow_null": True}),
( (
"prenom", "prenom",
{"size": 25, "title": "Prénom", "allow_null": CONFIG.ALLOW_NULL_PRENOM}, {
"size": 25,
"title": "Prénom",
"allow_null": scu.CONFIG.ALLOW_NULL_PRENOM,
},
), ),
( (
"sexe", "sexe",
@ -1776,7 +1817,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
{ {
"input_type": "menu", "input_type": "menu",
"title": "Voie d'admission", "title": "Voie d'admission",
"allowed_values": TYPES_ADMISSION, "allowed_values": scu.TYPES_ADMISSION,
}, },
), ),
( (
@ -2009,7 +2050,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
"billet_absence", "billet_absence",
"identite", "identite",
] ]
cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
for table in tables: for table in tables:
cursor.execute("delete from %s where etudid=%%(etudid)s" % table, etud) cursor.execute("delete from %s where etudid=%%(etudid)s" % table, etud)
cnx.commit() cnx.commit()
@ -2030,7 +2071,7 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
XXX A re-écrire pour API 2: prendre liste dans l'étape et vérifier à partir de cela. XXX A re-écrire pour API 2: prendre liste dans l'étape et vérifier à partir de cela.
""" """
etat = etat or None etat = etat or None
members, group, group_tit, sem, nbdem = sco_groups.get_group_infos( members, group, _, sem, _ = sco_groups.get_group_infos(
self, group_id, etat=etat self, group_id, etat=etat
) )
formsemestre_id = group["formsemestre_id"] formsemestre_id = group["formsemestre_id"]
@ -2136,8 +2177,8 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
% ( % (
REQUEST.URL0, REQUEST.URL0,
formsemestre_id, formsemestre_id,
strnone(group_id), scu.strnone(group_id),
strnone(etat), scu.strnone(etat),
formsemestre_id, formsemestre_id,
) )
) )
@ -2155,8 +2196,8 @@ UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span
% ( % (
REQUEST.URL0, REQUEST.URL0,
formsemestre_id, formsemestre_id,
strnone(group_id), scu.strnone(group_id),
strnone(etat), scu.strnone(etat),
formsemestre_id, formsemestre_id,
) )
) )
@ -2335,7 +2376,6 @@ Les champs avec un astérisque (*) doivent être présents (nulls non autorisés
def form_students_import_infos_admissions(self, REQUEST, formsemestre_id=None): def form_students_import_infos_admissions(self, REQUEST, formsemestre_id=None):
"formulaire import xls" "formulaire import xls"
sem = sco_formsemestre.get_formsemestre(self.Notes, formsemestre_id)
authuser = REQUEST.AUTHENTICATED_USER authuser = REQUEST.AUTHENTICATED_USER
F = self.sco_footer(REQUEST) F = self.sco_footer(REQUEST)
if not authuser.has_permission(ScoEtudInscrit, self): if not authuser.has_permission(ScoEtudInscrit, self):
@ -2505,7 +2545,6 @@ Les champs avec un astérisque (*) doivent être présents (nulls non autorisés
def stat_bac(self, formsemestre_id): def stat_bac(self, formsemestre_id):
"Renvoie statistisques sur nb d'etudiants par bac" "Renvoie statistisques sur nb d'etudiants par bac"
cnx = self.GetDBConnexion() cnx = self.GetDBConnexion()
sem = sco_formsemestre.get_formsemestre(self, formsemestre_id)
ins = self.Notes.do_formsemestre_inscription_list( ins = self.Notes.do_formsemestre_inscription_list(
args={"formsemestre_id": formsemestre_id} args={"formsemestre_id": formsemestre_id}
) )
@ -2641,16 +2680,16 @@ def manage_addZScolarForm(context, DeptId, REQUEST=None):
# default connexion string # default connexion string
if not db_cnx_string: if not db_cnx_string:
db_name = "SCO" + DeptId.upper() db_name = "SCO" + DeptId.upper()
db_user = SCO_DEFAULT_SQL_USER db_user = scu.SCO_DEFAULT_SQL_USER
db_cnx_string = "user=%s dbname=%s port=%s" % ( db_cnx_string = "user=%s dbname=%s port=%s" % (
db_user, db_user,
db_name, db_name,
SCO_DEFAULT_SQL_PORT, scu.SCO_DEFAULT_SQL_PORT,
) )
# vérifie que la bd existe et possede le meme nom de dept. # vérifie que la bd existe et possede le meme nom de dept.
try: try:
cnx = psycopg2.connect(db_cnx_string) cnx = psycopg2.connect(db_cnx_string)
cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute("select * from sco_prefs where name='DeptName'") cursor.execute("select * from sco_prefs where name='DeptName'")
except: except:
return _simple_error_page( return _simple_error_page(

View File

@ -30,12 +30,14 @@
# conçu et développé par Cléo Baras (IUT de Grenoble) # conçu et développé par Cléo Baras (IUT de Grenoble)
############################################################################## ##############################################################################
import os
import codecs import codecs
import re import re
import scolars import scolars
import pe_jurype, pe_tagtable, pe_tools import pe_jurype, pe_tagtable, pe_tools
from sco_utils import * import sco_utils as scu
from notes_log import log
import scolars import scolars
import pe_jurype, pe_tagtable, pe_tools import pe_jurype, pe_tagtable, pe_tools
@ -55,7 +57,7 @@ def get_code_latex_from_modele(fichier):
vers le modele : attention pas de vérification du format d'encodage vers le modele : attention pas de vérification du format d'encodage
Le fichier doit donc etre enregistré avec le même codage que ScoDoc (utf-8) Le fichier doit donc etre enregistré avec le même codage que ScoDoc (utf-8)
""" """
fid_latex = codecs.open(fichier, "r", encoding=SCO_ENCODING) fid_latex = codecs.open(fichier, "r", encoding=scu.SCO_ENCODING)
un_avis_latex = fid_latex.read() un_avis_latex = fid_latex.read()
fid_latex.close() fid_latex.close()
return un_avis_latex return un_avis_latex
@ -72,7 +74,7 @@ def get_code_latex_from_scodoc_preference(
template_latex = context.get_preference(champ, formsemestre_id) template_latex = context.get_preference(champ, formsemestre_id)
# Conversion du template en unicode: # Conversion du template en unicode:
if template_latex: if template_latex:
template_latex = template_latex.decode(SCO_ENCODING) template_latex = template_latex.decode(scu.SCO_ENCODING)
else: else:
template_latex = u"" # EV: preference non définie (None) template_latex = u"" # EV: preference non définie (None)
@ -119,10 +121,14 @@ def comp_latex_parcourstimeline(etudiant, promo, taille=17):
\\end{parcourstimeline} \\end{parcourstimeline}
""" """
reslatex = codelatexDebut reslatex = codelatexDebut
reslatex = reslatex.replace("**debut**", etudiant["entree"].decode(SCO_ENCODING))
reslatex = reslatex.replace("**fin**", str(etudiant["promo"]).decode(SCO_ENCODING))
reslatex = reslatex.replace( reslatex = reslatex.replace(
"**nbreSemestres**", str(etudiant["nbSemestres"]).decode(SCO_ENCODING) "**debut**", etudiant["entree"].decode(scu.SCO_ENCODING)
)
reslatex = reslatex.replace(
"**fin**", str(etudiant["promo"]).decode(scu.SCO_ENCODING)
)
reslatex = reslatex.replace(
"**nbreSemestres**", str(etudiant["nbSemestres"]).decode(scu.SCO_ENCODING)
) )
# Tri du parcours par ordre croissant : de la forme descr, nom sem date-date # Tri du parcours par ordre croissant : de la forme descr, nom sem date-date
parcours = etudiant["parcours"][::-1] # EV: XXX je ne comprend pas ce commentaire ? parcours = etudiant["parcours"][::-1] # EV: XXX je ne comprend pas ce commentaire ?
@ -179,7 +185,7 @@ def get_code_latex_avis_etudiant(
# Recherche des tags dans le fichier # Recherche des tags dans le fichier
tags_latex = get_tags_latex(code) tags_latex = get_tags_latex(code)
if DEBUG: if DEBUG:
print("Les tags" + str(tags_latex)) log("Les tags" + str(tags_latex))
# Interprète et remplace chaque tags latex par les données numériques de l'étudiant (y compris les # Interprète et remplace chaque tags latex par les données numériques de l'étudiant (y compris les
# tags "macros" tels que parcourstimeline # tags "macros" tels que parcourstimeline
@ -210,14 +216,13 @@ def get_code_latex_avis_etudiant(
# Les tags "simples": par ex. nom, prenom, sexe, ... # Les tags "simples": par ex. nom, prenom, sexe, ...
else: else:
if tag_latex in donnees_etudiant: if tag_latex in donnees_etudiant:
valeur = donnees_etudiant[tag_latex].decode(SCO_ENCODING) valeur = donnees_etudiant[tag_latex].decode(scu.SCO_ENCODING)
elif tag_latex in prefs: # les champs **NomResponsablePE**, ... elif tag_latex in prefs: # les champs **NomResponsablePE**, ...
valeur = pe_tools.escape_for_latex(prefs[tag_latex]).decode( valeur = pe_tools.escape_for_latex(prefs[tag_latex]).decode(
SCO_ENCODING scu.SCO_ENCODING
) )
# Gestion des pb d'encodage XXX debug # Gestion des pb d'encodage XXX debug
# print(tag_latex, valeur)
assert isinstance(tag_latex, unicode) assert isinstance(tag_latex, unicode)
assert isinstance(valeur, unicode) assert isinstance(valeur, unicode)
@ -244,7 +249,7 @@ def get_annotation_PE(context, etudid, tag_annotation_pe):
exp = re.compile(r"^" + tag_annotation_pe) exp = re.compile(r"^" + tag_annotation_pe)
for a in annotations: for a in annotations:
commentaire = unescape_html(a["comment"]).decode(SCO_ENCODING) commentaire = scu.unescape_html(a["comment"]).decode(scu.SCO_ENCODING)
if exp.match(commentaire): # tag en début de commentaire ? if exp.match(commentaire): # tag en début de commentaire ?
a["comment_u"] = commentaire # unicode, HTML non quoté a["comment_u"] = commentaire # unicode, HTML non quoté
annotationsPE.append( annotationsPE.append(
@ -282,7 +287,6 @@ def str_from_syntheseJury(donnees_etudiant, aggregat, groupe, tag_scodoc, champ)
for chp in champ for chp in champ
] ]
else: # champ = str à priori else: # champ = str à priori
# print(champ)
valeur = DONNEE_MANQUANTE valeur = DONNEE_MANQUANTE
if ( if (
(aggregat in donnees_etudiant) (aggregat in donnees_etudiant)
@ -316,7 +320,6 @@ def str_from_syntheseJury(donnees_etudiant, aggregat, groupe, tag_scodoc, champ)
else: else:
valeur = u"%s" % donnees_numeriques[indice_champ] valeur = u"%s" % donnees_numeriques[indice_champ]
# print(valeur)
return valeur return valeur
@ -339,7 +342,7 @@ def get_bilanParTag(donnees_etudiant, groupe="groupe"):
lignes = [] lignes = []
valeurs = {"note": [], "rang": []} valeurs = {"note": [], "rang": []}
for (indice_aggregat, (aggregat, intitule, ordre)) in enumerate(entete): for (indice_aggregat, (aggregat, intitule, _)) in enumerate(entete):
# print("> " + aggregat) # print("> " + aggregat)
# listeTags = jury.get_allTagForAggregat(aggregat) # les tags de l'aggrégat # listeTags = jury.get_allTagForAggregat(aggregat) # les tags de l'aggrégat
listeTags = [ listeTags = [
@ -366,25 +369,20 @@ def get_bilanParTag(donnees_etudiant, groupe="groupe"):
("\\textit{" + rang + "}") if note else "" ("\\textit{" + rang + "}") if note else ""
) # rang masqué si pas de notes ) # rang masqué si pas de notes
# pprint.pprint(valeurs)
# print(len(entete))
code_latex = u"\\begin{tabular}{|c|" + "|c" * (len(entete)) + "|}\n" code_latex = u"\\begin{tabular}{|c|" + "|c" * (len(entete)) + "|}\n"
code_latex += u"\\hline \n" code_latex += u"\\hline \n"
code_latex += ( code_latex += (
u" & " u" & "
+ " & ".join( + " & ".join(["\\textbf{" + intitule + "}" for (agg, intitule, _) in entete])
["\\textbf{" + intitule + "}" for (agg, intitule, ordre) in entete]
)
+ " \\\\ \n" + " \\\\ \n"
) )
code_latex += u"\\hline" code_latex += u"\\hline"
code_latex += u"\\hline \n" code_latex += u"\\hline \n"
for (i, ligne_val) in enumerate(valeurs["note"]): for (i, ligne_val) in enumerate(valeurs["note"]):
titre = lignes[i] # règle le pb d'encodage titre = lignes[i] # règle le pb d'encodage
# print titre, ligne_val
code_latex += ( code_latex += (
u"\\textbf{" u"\\textbf{"
+ titre.decode(SCO_ENCODING) + titre.decode(scu.SCO_ENCODING)
+ u"} & " + u"} & "
+ " & ".join(ligne_val) + " & ".join(ligne_val)
+ u"\\\\ \n" + u"\\\\ \n"
@ -412,9 +410,11 @@ def get_avis_poursuite_par_etudiant(
if pe_tools.PE_DEBUG: if pe_tools.PE_DEBUG:
pe_tools.pe_print(jury.syntheseJury[etudid]["nom"] + " " + etudid) pe_tools.pe_print(jury.syntheseJury[etudid]["nom"] + " " + etudid)
sexe = jury.syntheseJury[etudid]["sexe"].decode(SCO_ENCODING) sexe = jury.syntheseJury[etudid]["sexe"].decode(scu.SCO_ENCODING)
nom = jury.syntheseJury[etudid]["nom"].replace(" ", "-").decode(SCO_ENCODING) nom = jury.syntheseJury[etudid]["nom"].replace(" ", "-").decode(scu.SCO_ENCODING)
prenom = jury.syntheseJury[etudid]["prenom"].replace(" ", "-").decode(SCO_ENCODING) prenom = (
jury.syntheseJury[etudid]["prenom"].replace(" ", "-").decode(scu.SCO_ENCODING)
)
nom_fichier = ( nom_fichier = (
u"avis_poursuite_" u"avis_poursuite_"
@ -460,11 +460,11 @@ def get_templates_from_distrib(template="avis"):
if template in ["avis", "footer"]: if template in ["avis", "footer"]:
# pas de preference pour le template: utilise fichier du serveur # pas de preference pour le template: utilise fichier du serveur
p = os.path.join(SCO_SRCDIR, pe_local_tmpl) p = os.path.join(scu.SCO_SRCDIR, pe_local_tmpl)
if os.path.exists(p): if os.path.exists(p):
template_latex = get_code_latex_from_modele(p) template_latex = get_code_latex_from_modele(p)
else: else:
p = os.path.join(SCO_SRCDIR, pe_default_tmpl) p = os.path.join(scu.SCO_SRCDIR, pe_default_tmpl)
if os.path.exists(p): if os.path.exists(p):
template_latex = get_code_latex_from_modele(p) template_latex = get_code_latex_from_modele(p)
else: else:
@ -534,7 +534,9 @@ def table_syntheseAnnotationPE(context, syntheseJury, tag_annotation_pe):
annotationPE = get_annotation_PE( annotationPE = get_annotation_PE(
context, etudid, tag_annotation_pe=tag_annotation_pe context, etudid, tag_annotation_pe=tag_annotation_pe
) )
row["Annotation PE"] = annotationPE.encode(SCO_ENCODING) if annotationPE else "" row["Annotation PE"] = (
annotationPE.encode(scu.SCO_ENCODING) if annotationPE else ""
)
rows.append(row) rows.append(row)
T = GenTable( T = GenTable(

View File

@ -42,6 +42,7 @@ Created on Fri Sep 9 09:15:05 2016
# a l'edition d'un jury de poursuites d'etudes # a l'edition d'un jury de poursuites d'etudes
# ---------------------------------------------------------- # ----------------------------------------------------------
import os
try: try:
from cStringIO import StringIO from cStringIO import StringIO
@ -54,10 +55,9 @@ from zipfile import ZipFile, BadZipfile
import pprint import pprint
from gen_tables import GenTable, SeqGenTable from gen_tables import GenTable, SeqGenTable
import sco_utils as scu
import sco_codes_parcours # sco_codes_parcours.NEXT -> sem suivant import sco_codes_parcours # sco_codes_parcours.NEXT -> sem suivant
import sco_report import sco_report
from sco_utils import *
import pe_tagtable, pe_tools, pe_avislatex, pe_semestretag, pe_settag import pe_tagtable, pe_tools, pe_avislatex, pe_semestretag, pe_settag
@ -450,15 +450,15 @@ class JuryPE:
end="", end="",
) )
if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2: # if pe_tools.PE_DEBUG and pe_tools.PE_DEBUG >= 2:
print # print
# ------------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------------
def est_un_etudiant_reoriente_ou_demissionnaire(self, etudid): def est_un_etudiant_reoriente_ou_demissionnaire(self, etudid):
"""Renvoie True si l'étudiant est réorienté (NAR) ou démissionnaire (DEM)""" """Renvoie True si l'étudiant est réorienté (NAR) ou démissionnaire (DEM)"""
reponse = False reponse = False
etud = self.get_cache_etudInfo_d_un_etudiant(self.context, etudid) etud = self.get_cache_etudInfo_d_un_etudiant(self.context, etudid)
(code, parcours) = sco_report.get_codeparcoursetud(self.context.Notes, etud) (_, parcours) = sco_report.get_codeparcoursetud(self.context.Notes, etud)
if ( if (
len(set(sco_codes_parcours.CODES_SEM_REO.keys()) & set(parcours.values())) len(set(sco_codes_parcours.CODES_SEM_REO.keys()) & set(parcours.values()))
> 0 > 0
@ -862,13 +862,13 @@ class JuryPE:
def get_dateEntree(self, etudid): def get_dateEntree(self, etudid):
"""Renvoie l'année d'entrée de l'étudiant à l'IUT""" """Renvoie l'année d'entrée de l'étudiant à l'IUT"""
etudinfo = self.ETUDINFO_DICT[etudid] # etudinfo = self.ETUDINFO_DICT[etudid]
semDeb = self.get_semestresDUT_d_un_etudiant(etudid)[-1] # le 1er sem à l'IUT semDeb = self.get_semestresDUT_d_un_etudiant(etudid)[-1] # le 1er sem à l'IUT
return semDeb["annee_debut"] return semDeb["annee_debut"]
def get_parcoursIUT(self, etudid): def get_parcoursIUT(self, etudid):
"""Renvoie une liste d'infos sur les semestres du parcours d'un étudiant""" """Renvoie une liste d'infos sur les semestres du parcours d'un étudiant"""
etudinfo = self.ETUDINFO_DICT[etudid] # etudinfo = self.ETUDINFO_DICT[etudid]
sems = self.get_semestresDUT_d_un_etudiant(etudid) sems = self.get_semestresDUT_d_un_etudiant(etudid)
infos = [] infos = []
@ -1073,7 +1073,7 @@ class JuryPE:
if mode == "singlesheet" if mode == "singlesheet"
else "%s " % (sem) else "%s " % (sem)
) )
row[champ + "note"] = fmt_note(resgroupe[0]) row[champ + "note"] = scu.fmt_note(resgroupe[0])
row[champ + "class groupe"] = "%s / %s" % ( row[champ + "class groupe"] = "%s / %s" % (
resgroupe[2], resgroupe[2],
resgroupe[3], resgroupe[3],
@ -1083,11 +1083,12 @@ class JuryPE:
respromo[3], respromo[3],
) )
row[champ + "min/moy/max groupe"] = "%s / %s / %s" % tuple( row[champ + "min/moy/max groupe"] = "%s / %s / %s" % tuple(
fmt_note(x) scu.fmt_note(x)
for x in (resgroupe[6], resgroupe[4], resgroupe[5]) for x in (resgroupe[6], resgroupe[4], resgroupe[5])
) )
row[champ + "min/moy/max promo"] = "%s / %s / %s" % tuple( row[champ + "min/moy/max promo"] = "%s / %s / %s" % tuple(
fmt_note(x) for x in (respromo[6], respromo[4], respromo[5]) scu.fmt_note(x)
for x in (respromo[6], respromo[4], respromo[5])
) )
rows.append(row) rows.append(row)

View File

@ -35,8 +35,10 @@ Created on Fri Sep 9 09:15:05 2016
@author: barasc @author: barasc
""" """
import notes_table
import datetime import datetime
from notes_log import log
import notes_table
import sco_codes_parcours import sco_codes_parcours
import sco_tag_module import sco_tag_module
import sco_utils import sco_utils
@ -57,7 +59,7 @@ class SemestreTag(pe_tagtable.TableTag):
Attributs supplémentaires : Attributs supplémentaires :
- inscrlist/identdict: étudiants inscrits hors démissionnaires ou défaillants - inscrlist/identdict: étudiants inscrits hors démissionnaires ou défaillants
- _tagdict : Dictionnaire résumant les tags et les modules du semestre auxquels ils sont liés - _tagdict : Dictionnaire résumant les tags et les modules du semestre auxquels ils sont liés
- _sum_coeff_semestre : la somme des coeffs du semestre
Attributs hérités de TableTag : Attributs hérités de TableTag :
- nom : - nom :
@ -136,8 +138,7 @@ class SemestreTag(pe_tagtable.TableTag):
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
def get_etudids(self): def get_etudids(self):
"""Renvoie la liste des etud_id des étudiants inscrits au semestre """Renvoie la liste des etud_id des étudiants inscrits au semestre"""
"""
return [etud["etudid"] for etud in self.inscrlist] return [etud["etudid"] for etud in self.inscrlist]
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -227,7 +228,7 @@ class SemestreTag(pe_tagtable.TableTag):
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
def get_noteEtCoeff_modimpl(self, modimpl_id, etudid, profondeur=2): def get_noteEtCoeff_modimpl(self, modimpl_id, etudid, profondeur=2):
""" Renvoie un couple donnant la note et le coeff normalisé d'un étudiant à un module d'id modimpl_id. """Renvoie un couple donnant la note et le coeff normalisé d'un étudiant à un module d'id modimpl_id.
La note et le coeff sont extraits : La note et le coeff sont extraits :
1) soit des données du semestre en normalisant le coefficient par rapport à la somme des coefficients des modules du semestre, 1) soit des données du semestre en normalisant le coefficient par rapport à la somme des coefficients des modules du semestre,
2) soit des données des UE précédemment capitalisées, en recherchant un module de même CODE que le modimpl_id proposé, 2) soit des données des UE précédemment capitalisées, en recherchant un module de même CODE que le modimpl_id proposé,
@ -316,7 +317,7 @@ class SemestreTag(pe_tagtable.TableTag):
donnant -pour un tag donné- les note, coeff et ponderation de chaque modimpl à prendre en compte dans donnant -pour un tag donné- les note, coeff et ponderation de chaque modimpl à prendre en compte dans
le calcul de la moyenne du tag. le calcul de la moyenne du tag.
Les notes et coeff_norm sont extraits grâce à SemestreTag.get_noteEtCoeff_modimpl (donc dans semestre courant ou UE capitalisée). Les notes et coeff_norm sont extraits grâce à SemestreTag.get_noteEtCoeff_modimpl (donc dans semestre courant ou UE capitalisée).
Les pondérations sont celles déclarées avec le tag (cf. _tagdict). """ Les pondérations sont celles déclarées avec le tag (cf. _tagdict)."""
notes = [] notes = []
coeffs_norm = [] coeffs_norm = []
@ -382,7 +383,7 @@ class SemestreTag(pe_tagtable.TableTag):
+ ( + (
"%1.5f" % (coeff * self.somme_coeffs) "%1.5f" % (coeff * self.somme_coeffs)
if coeff != None and isinstance(coeff, float) if coeff != None and isinstance(coeff, float)
else str(coeff * self._sum_coeff_semestre) else "???" # str(coeff * self._sum_coeff_semestre) # voir avec Cléo
) )
+ delim + delim
) )
@ -477,8 +478,9 @@ def get_moduleimpl(nt, modimpl_id):
] # la liste de id des modules (modimpl_id) ] # la liste de id des modules (modimpl_id)
if modimpl_id not in modimplids: if modimpl_id not in modimplids:
if SemestreTag.DEBUG: if SemestreTag.DEBUG:
print "SemestreTag.get_moduleimpl( %s ) : le modimpl recherche n'existe pas" % ( log(
modimpl_id "SemestreTag.get_moduleimpl( %s ) : le modimpl recherche n'existe pas"
% (modimpl_id)
) )
return None return None
return nt._modimpls[modimplids.index(modimpl_id)] return nt._modimpls[modimplids.index(modimpl_id)]

View File

@ -27,9 +27,7 @@
"""Exportation des résultats des étudiants vers Apogée. """Exportation des résultats des étudiants vers Apogée.
EXPERIMENTAL / PRECAUTIONS ! Ce code a été au départ inspiré par les travaux de Damien Mascré, scodoc2apogee (en Java).
Code inspiré par les travaux de Damien Mascré, scodoc2apogee (en Java).
A utiliser en fin de semestre, après les jury. A utiliser en fin de semestre, après les jury.
@ -81,6 +79,13 @@ XXX A vérifier:
AJAC car 1 sem. validé et pas de NAR AJAC car 1 sem. validé et pas de NAR
""" """
import collections
from types import FloatType
import re
import time
import datetime
import os
from cStringIO import StringIO from cStringIO import StringIO
from zipfile import ZipFile from zipfile import ZipFile
import pprint import pprint
@ -90,6 +95,10 @@ try:
except: except:
chardet_detect = None chardet_detect = None
import sco_utils as scu
import notesdb as ndb
from notes_log import log
from sco_exceptions import ScoValueError, FormatError
import sco_formsemestre import sco_formsemestre
from sco_formsemestre import ApoEtapeVDI from sco_formsemestre import ApoEtapeVDI
import sco_formsemestre_status import sco_formsemestre_status
@ -98,8 +107,6 @@ import sco_codes_parcours
from sco_codes_parcours import code_semestre_validant from sco_codes_parcours import code_semestre_validant
from sco_codes_parcours import ATT, ATB, ADM, ADC, ADJ, ATJ, ATB, AJ, CMP, NAR, RAT, DEF from sco_codes_parcours import ATT, ATB, ADM, ADC, ADJ, ATJ, ATB, AJ, CMP, NAR, RAT, DEF
from gen_tables import GenTable from gen_tables import GenTable
from notesdb import *
from sco_utils import *
APO_PORTAL_ENCODING = ( APO_PORTAL_ENCODING = (
"utf8" # encodage du fichier CSV Apogée (était 'ISO-8859-1' avant jul. 2016) "utf8" # encodage du fichier CSV Apogée (était 'ISO-8859-1' avant jul. 2016)
@ -347,10 +354,10 @@ class ApoEtud(dict):
for col_id in apo_data.col_ids[:4]: for col_id in apo_data.col_ids[:4]:
self.new_cols[col_id] = self.cols[col_id] self.new_cols[col_id] = self.cols[col_id]
def unassociated_codes(self, apo_data): # def unassociated_codes(self, apo_data):
"list of apo elements for this student without a value in ScoDoc" # "list of apo elements for this student without a value in ScoDoc"
codes = set([apo_data.cols[col_id].code for col_id in apo_data.col_ids]) # codes = set([apo_data.cols[col_id].code for col_id in apo_data.col_ids])
return codes - set(sco_elts) # return codes - set(sco_elts)
def search_elt_in_sem(self, context, code, sem, cur_sem, autre_sem): def search_elt_in_sem(self, context, code, sem, cur_sem, autre_sem):
""" """
@ -749,7 +756,7 @@ class ApoData:
if not data: if not data:
raise FormatError("Fichier Apogée vide !") raise FormatError("Fichier Apogée vide !")
data_utf8 = data.decode(APO_INPUT_ENCODING).encode(SCO_ENCODING) data_utf8 = data.decode(APO_INPUT_ENCODING).encode(scu.SCO_ENCODING)
f = StringIOFileLineWrapper(data_utf8) # pour traiter comme un fichier f = StringIOFileLineWrapper(data_utf8) # pour traiter comme un fichier
# check that we are at the begining of Apogee CSV # check that we are at the begining of Apogee CSV
line = f.readline().strip() line = f.readline().strip()
@ -1023,7 +1030,7 @@ def _apo_read_cols(f):
line = f.readline().strip(" " + APO_NEWLINE) line = f.readline().strip(" " + APO_NEWLINE)
fs = line.split(APO_SEP) fs = line.split(APO_SEP)
if fs[0] != "apoL_a01_code": if fs[0] != "apoL_a01_code":
raise FormatError("invalid line: %s (expecting apoL_a01_code)"(line, i)) raise FormatError("invalid line: %s (expecting apoL_a01_code)" % line)
col_keys = fs col_keys = fs
while True: # skip premiere partie (apoL_a02_nom, ...) while True: # skip premiere partie (apoL_a02_nom, ...)
@ -1046,7 +1053,9 @@ def _apo_read_cols(f):
raise FormatError("duplicate column definition: %s" % col_id) raise FormatError("duplicate column definition: %s" % col_id)
m = re.match(r"^apoL_c([0-9]{4})$", col_id) m = re.match(r"^apoL_c([0-9]{4})$", col_id)
if not m: if not m:
raise FormatError("invalid column id: %s (expecting apoL_c%04d)"(line, i)) raise FormatError(
"invalid column id: %s (expecting apoL_c%04d)" % (line, col_id)
)
if int(m.group(1)) != i: if int(m.group(1)) != i:
raise FormatError("invalid column id: %s for index %s" % (col_id, i)) raise FormatError("invalid column id: %s for index %s" % (col_id, i))
@ -1281,7 +1290,7 @@ def export_csv_to_apogee(
) )
log(logf.getvalue()) # sortie aussi sur le log ScoDoc log(logf.getvalue()) # sortie aussi sur le log ScoDoc
csv_data = f.getvalue().decode(SCO_ENCODING).encode(APO_OUTPUT_ENCODING) csv_data = f.getvalue().decode(scu.SCO_ENCODING).encode(APO_OUTPUT_ENCODING)
# Write data to ZIP # Write data to ZIP
dest_zip.writestr(csv_filename, csv_data) dest_zip.writestr(csv_filename, csv_data)

View File

@ -46,7 +46,10 @@ de la forme %(XXX)s sont remplacées par la valeur de XXX, pour XXX dans:
Balises img: actuellement interdites. Balises img: actuellement interdites.
""" """
import traceback, re import datetime
import traceback
import re
import jaxml
import sco_utils as scu import sco_utils as scu
import sco_formsemestre import sco_formsemestre

View File

@ -217,7 +217,7 @@ def ue_edit(context, ue_id=None, create=False, formation_id=None, REQUEST=None):
REQUEST, REQUEST,
) )
else: else:
ue_id = do_ue_edit(context, tf[2]) do_ue_edit(context, tf[2])
return REQUEST.RESPONSE.redirect( return REQUEST.RESPONSE.redirect(
REQUEST.URL1 + "/ue_list?formation_id=" + formation_id REQUEST.URL1 + "/ue_list?formation_id=" + formation_id
) )

View File

@ -84,10 +84,10 @@ def formsemestre_load_ics(context, sem):
return cal return cal
def formsemestre_edt_groups_used(context, sem): # def formsemestre_edt_groups_used(context, sem):
"""L'ensemble des groupes EDT utilisés dans l'emplois du temps publié""" # """L'ensemble des groupes EDT utilisés dans l'emploi du temps publié"""
cal = formsemestre_load_ics(context, sem) # cal = formsemestre_load_ics(context, sem)
return {e["X-GROUP-ID"].decode("utf8") for e in events} # return {e["X-GROUP-ID"].decode("utf8") for e in events}
def get_edt_transcodage_groups(context, formsemestre_id): def get_edt_transcodage_groups(context, formsemestre_id):

View File

@ -31,8 +31,8 @@ Contribution M. Salomon, UFC / IUT DE BELFORT-MONTBÉLIARD, 2016
""" """
from notesdb import * import sco_utils as scu
from sco_utils import * import notesdb as ndb
from notes_log import log from notes_log import log
import scolars import scolars
import sco_formsemestre import sco_formsemestre
@ -260,7 +260,6 @@ def do_placement(context, REQUEST):
if None in [g["group_name"] for g in groups]: # tous les etudiants if None in [g["group_name"] for g in groups]: # tous les etudiants
getallstudents = True getallstudents = True
gr_title = "tous"
gr_title_filename = "tous" gr_title_filename = "tous"
else: else:
getallstudents = False getallstudents = False
@ -273,7 +272,7 @@ def do_placement(context, REQUEST):
M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0] M = sco_moduleimpl.do_moduleimpl_list(context, moduleimpl_id=E["moduleimpl_id"])[0]
Mod = context.do_module_list(args={"module_id": M["module_id"]})[0] Mod = context.do_module_list(args={"module_id": M["module_id"]})[0]
sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"]) sem = sco_formsemestre.get_formsemestre(context, M["formsemestre_id"])
evalname = "%s-%s" % (Mod["code"], DateDMYtoISO(E["jour"])) evalname = "%s-%s" % (Mod["code"], ndb.DateDMYtoISO(E["jour"]))
if E["description"]: if E["description"]:
evaltitre = E["description"] evaltitre = E["description"]
else: else:

View File

@ -136,11 +136,17 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
# Codes des UE "semestre précédent": # Codes des UE "semestre précédent":
ue_prev_codes = prev_moy_ue.keys() ue_prev_codes = prev_moy_ue.keys()
ue_prev_codes.sort( ue_prev_codes.sort(
lambda x, y, prev_ue_acro=prev_ue_acro: cmp(prev_ue_acro[x], prev_ue_acro[y]) lambda x, y, prev_ue_acro=prev_ue_acro: cmp( # pylint: disable=undefined-variable
prev_ue_acro[x], prev_ue_acro[y]
)
) )
# Codes des UE "semestre courant": # Codes des UE "semestre courant":
ue_codes = moy_ue.keys() ue_codes = moy_ue.keys()
ue_codes.sort(lambda x, y, ue_acro=ue_acro: cmp(ue_acro[x], ue_acro[y])) ue_codes.sort(
lambda x, y, ue_acro=ue_acro: cmp( # pylint: disable=undefined-variable
ue_acro[x], ue_acro[y]
)
)
sid = sem["semestre_id"] sid = sem["semestre_id"]
sn = sp = "" sn = sp = ""

View File

@ -1242,7 +1242,7 @@ def graph_parcours(
dem_nodes = {} # formsemestre_id : noeud pour demissionnaires dem_nodes = {} # formsemestre_id : noeud pour demissionnaires
nar_nodes = {} # formsemestre_id : noeud pour NAR nar_nodes = {} # formsemestre_id : noeud pour NAR
for etud in etuds: for etud in etuds:
nxt = None nxt = {}
etudid = etud["etudid"] etudid = etud["etudid"]
for s in etud["sems"]: # du plus recent au plus ancien for s in etud["sems"]: # du plus recent au plus ancien
nt = context._getNotesCache().get_NotesTable( nt = context._getNotesCache().get_NotesTable(

View File

@ -385,8 +385,8 @@ def _listeappel_photos_pdf(context, groups_infos, REQUEST):
sem = groups_infos.formsemestre # suppose 1 seul semestre sem = groups_infos.formsemestre # suppose 1 seul semestre
PHOTOWIDTH = 2 * cm PHOTOWIDTH = 2 * cm
COLWIDTH = 3.6 * cm # COLWIDTH = 3.6 * cm
ROWS_PER_PAGE = 26 # XXX should be in ScoDoc preferences # ROWS_PER_PAGE = 26 # XXX should be in ScoDoc preferences
StyleSheet = styles.getSampleStyleSheet() StyleSheet = styles.getSampleStyleSheet()
report = StringIO() # in-memory document, no disk file report = StringIO() # in-memory document, no disk file
@ -460,71 +460,6 @@ def _listeappel_photos_pdf(context, groups_infos, REQUEST):
return sendPDFFile(REQUEST, data, filename) return sendPDFFile(REQUEST, data, filename)
objects = []
StyleSheet = styles.getSampleStyleSheet()
report = StringIO() # in-memory document, no disk file
filename = ("trombino-%s.pdf" % ng).replace(
" ", "_"
) # XXX should sanitize this filename
objects.append(
Paragraph(SU("Liste " + sem["titreannee"] + " " + ng), StyleSheet["Heading3"])
)
PHOTOWIDTH = 3 * cm
COLWIDTH = 3.6 * cm
L = [] # cells
n = 0
currow = []
for t in T:
n = n + 1
img = _get_etud_platypus_image(context, t, image_width=2 * cm)
currow += [
Paragraph(
SU(
scolars.format_sexe(t["sexe"])
+ " "
+ scolars.format_prenom(t["prenom"])
+ " "
+ scolars.format_nom(t["nom"])
),
StyleSheet["Normal"],
),
"", # empty cell (signature ou autre info a remplir sur papier)
img,
]
if not L:
table = Paragraph(SU("Aucune photo à exporter !"), StyleSheet["Normal"])
else:
table = Table(
L,
colWidths=[COLWIDTH] * 7,
style=TableStyle(
[
("VALIGN", (0, 0), (-1, -1), "TOP"),
("GRID", (0, 0), (2, -1), 0.25, colors.grey),
("GRID", (2, 0), (-1, -1), 0.25, colors.red), # <<<
]
),
)
objects.append(table)
# Réduit sur une page
objects = [KeepInFrame(0, 0, objects, mode="shrink")]
# --- Build document
document = BaseDocTemplate(report)
document.addPageTemplates(
ScolarsPageTemplate(
document,
context=context,
preferences=context.get_preferences(sem["formsemestre_id"]),
)
)
document.build(objects)
data = report.getvalue()
return sendPDFFile(REQUEST, data, filename)
# --------------------- Upload des photos de tout un groupe # --------------------- Upload des photos de tout un groupe
def photos_generate_excel_sample(context, group_ids=[], REQUEST=None): def photos_generate_excel_sample(context, group_ids=[], REQUEST=None):
@ -614,7 +549,7 @@ def photos_import_files(
def callback(context, etud, data, filename, REQUEST): def callback(context, etud, data, filename, REQUEST):
sco_photos.store_photo(context, etud, data, REQUEST) sco_photos.store_photo(context, etud, data, REQUEST)
r = zip_excel_import_files( zip_excel_import_files(
context, xlsfile, zipfile, REQUEST, callback, filename_title, page_title context, xlsfile, zipfile, REQUEST, callback, filename_title, page_title
) )
return REQUEST.RESPONSE.redirect(back_url + "&amp;head_message=photos%20 importees") return REQUEST.RESPONSE.redirect(back_url + "&amp;head_message=photos%20 importees")
@ -638,7 +573,7 @@ def zip_excel_import_files(
exceldata = xlsfile.read() exceldata = xlsfile.read()
if not exceldata: if not exceldata:
raise ScoValueError("Fichier excel vide ou invalide") raise ScoValueError("Fichier 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 if not data: # probably a bug
raise ScoValueError("Fichier excel vide !") raise ScoValueError("Fichier excel vide !")
# on doit avoir une colonne etudid et une colonne filename_title ('fichier_photo') # on doit avoir une colonne etudid et une colonne filename_title ('fichier_photo')