forked from ScoDoc/DocScoDoc
pylinting
This commit is contained in:
parent
a4173e1877
commit
1576a64ccd
@ -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
|
||||||
|
163
ZScolar.py
163
ZScolar.py
@ -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>© Emmanuel Viennet 1997-2021</p>
|
<p>© 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): </b>
|
<b>Date de la %s (J/M/AAAA): </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(
|
||||||
|
@ -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(
|
||||||
|
21
pe_jurype.py
21
pe_jurype.py
@ -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)
|
||||||
|
|
||||||
|
@ -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)]
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
@ -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):
|
||||||
|
@ -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:
|
||||||
|
@ -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 = ""
|
||||||
|
@ -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(
|
||||||
|
@ -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 + "&head_message=photos%20 importees")
|
return REQUEST.RESPONSE.redirect(back_url + "&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')
|
||||||
|
Loading…
Reference in New Issue
Block a user