prepajury

This commit is contained in:
Jean-Marie Place 2021-08-12 10:46:24 +02:00
parent 09d131a85d
commit a9a6b0a809
2 changed files with 1097 additions and 1082 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,318 +1,322 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################## ##############################################################################
# #
# Gestion scolarite IUT # Gestion scolarite IUT
# #
# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved. # Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. # (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
# Emmanuel Viennet emmanuel.viennet@viennet.net # Emmanuel Viennet emmanuel.viennet@viennet.net
# #
############################################################################## ##############################################################################
"""Feuille excel pour preparation des jurys """Feuille excel pour preparation des jurys
""" """
import time import time
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app.scodoc import sco_abs from app.scodoc import sco_abs
from app.scodoc import sco_groups from app.scodoc import sco_groups
from app.scodoc import sco_cache from app.scodoc import sco_cache
from app.scodoc import sco_excel from app.scodoc import sco_excel
from app.scodoc import sco_formsemestre from app.scodoc import sco_formsemestre
from app.scodoc import sco_parcours_dut from app.scodoc import sco_parcours_dut
from app.scodoc import sco_codes_parcours from app.scodoc import sco_codes_parcours
from app.scodoc import VERSION from app.scodoc import VERSION
from app.scodoc import sco_etud from app.scodoc import sco_etud
from app.scodoc import sco_preferences from app.scodoc import sco_preferences
from app.scodoc.sco_excel import ScoExcelSheet
def feuille_preparation_jury(context, formsemestre_id, REQUEST):
"Feuille excel pour preparation des jurys" def feuille_preparation_jury(context, formsemestre_id, REQUEST):
nt = sco_cache.NotesTableCache.get( "Feuille excel pour preparation des jurys"
formsemestre_id nt = sco_cache.NotesTableCache.get(
) # > get_etudids, get_etud_moy_gen, get_ues, get_etud_ue_status, get_etud_decision_sem, identdict, formsemestre_id
etudids = nt.get_etudids(sorted=True) # tri par moy gen ) # > get_etudids, get_etud_moy_gen, get_ues, get_etud_ue_status, get_etud_decision_sem, identdict,
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) etudids = nt.get_etudids(sorted=True) # tri par moy gen
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
etud_groups = sco_groups.formsemestre_get_etud_groupnames(context, formsemestre_id)
main_partition_id = sco_groups.formsemestre_get_main_partition( etud_groups = sco_groups.formsemestre_get_etud_groupnames(context, formsemestre_id)
context, formsemestre_id main_partition_id = sco_groups.formsemestre_get_main_partition(
)["partition_id"] context, formsemestre_id
)["partition_id"]
prev_moy_ue = scu.DictDefault(defaultvalue={}) # ue_code_s : { etudid : moy ue }
prev_ue_acro = {} # ue_code_s : acronyme (à afficher) prev_moy_ue = scu.DictDefault(defaultvalue={}) # ue_code_s : { etudid : moy ue }
prev_moy = {} # moyennes gen sem prec prev_ue_acro = {} # ue_code_s : acronyme (à afficher)
moy_ue = scu.DictDefault(defaultvalue={}) # ue_acro : moyennes { etudid : moy ue } prev_moy = {} # moyennes gen sem prec
ue_acro = {} # ue_code_s : acronyme (à afficher) moy_ue = scu.DictDefault(defaultvalue={}) # ue_acro : moyennes { etudid : moy ue }
moy = {} # moyennes gen ue_acro = {} # ue_code_s : acronyme (à afficher)
moy_inter = {} # moyenne gen. sur les 2 derniers semestres moy = {} # moyennes gen
code = {} # decision existantes s'il y en a moy_inter = {} # moyenne gen. sur les 2 derniers semestres
autorisations = {} code = {} # decision existantes s'il y en a
prev_code = {} # decisions sem prec autorisations = {}
assidu = {} prev_code = {} # decisions sem prec
parcours = {} # etudid : parcours, sous la forme S1, S2, S2, S3 assidu = {}
groupestd = {} # etudid : nom groupe principal parcours = {} # etudid : parcours, sous la forme S1, S2, S2, S3
nbabs = {} groupestd = {} # etudid : nom groupe principal
nbabsjust = {} nbabs = {}
for etudid in etudids: nbabsjust = {}
info = sco_etud.get_etud_info(etudid=etudid, filled=True) for etudid in etudids:
if not info: info = sco_etud.get_etud_info(etudid=etudid, filled=True)
continue # should not occur... if not info:
etud = info[0] continue # should not occur...
Se = sco_parcours_dut.SituationEtudParcours(context, etud, formsemestre_id) etud = info[0]
if Se.prev: Se = sco_parcours_dut.SituationEtudParcours(context, etud, formsemestre_id)
ntp = sco_cache.NotesTableCache.get( if Se.prev:
Se.prev["formsemestre_id"] ntp = sco_cache.NotesTableCache.get(
) # > get_ues, get_etud_ue_status, get_etud_moy_gen, get_etud_decision_sem Se.prev["formsemestre_id"]
for ue in ntp.get_ues(filter_sport=True): ) # > get_ues, get_etud_ue_status, get_etud_moy_gen, get_etud_decision_sem
ue_status = ntp.get_etud_ue_status(etudid, ue["ue_id"]) for ue in ntp.get_ues(filter_sport=True):
ue_code_s = ( ue_status = ntp.get_etud_ue_status(etudid, ue["ue_id"])
ue["ue_code"] + "_%s" % ntp.sem["semestre_id"] ue_code_s = (
) # code indentifiant l'UE ue["ue_code"] + "_%s" % ntp.sem["semestre_id"]
prev_moy_ue[ue_code_s][etudid] = ue_status["moy"] ) # code indentifiant l'UE
# prev_ue_acro[ue_code_s] = (ue['numero'], ue['acronyme']) prev_moy_ue[ue_code_s][etudid] = ue_status["moy"]
prev_ue_acro[ue_code_s] = (ue["numero"], ue["acronyme"], ue["titre"]) # prev_ue_acro[ue_code_s] = (ue['numero'], ue['acronyme'])
prev_moy[etudid] = ntp.get_etud_moy_gen(etudid) prev_ue_acro[ue_code_s] = (ue["numero"], ue["acronyme"], ue["titre"])
prev_decision = ntp.get_etud_decision_sem(etudid) prev_moy[etudid] = ntp.get_etud_moy_gen(etudid)
if prev_decision: prev_decision = ntp.get_etud_decision_sem(etudid)
prev_code[etudid] = prev_decision["code"] if prev_decision:
if prev_decision["compense_formsemestre_id"]: prev_code[etudid] = prev_decision["code"]
prev_code[etudid] += "+" # indique qu'il a servi a compenser if prev_decision["compense_formsemestre_id"]:
prev_code[etudid] += "+" # indique qu'il a servi a compenser
moy[etudid] = nt.get_etud_moy_gen(etudid)
for ue in nt.get_ues(filter_sport=True): moy[etudid] = nt.get_etud_moy_gen(etudid)
ue_status = nt.get_etud_ue_status(etudid, ue["ue_id"]) for ue in nt.get_ues(filter_sport=True):
ue_code_s = ue["ue_code"] + "_%s" % nt.sem["semestre_id"] ue_status = nt.get_etud_ue_status(etudid, ue["ue_id"])
moy_ue[ue_code_s][etudid] = ue_status["moy"] ue_code_s = ue["ue_code"] + "_%s" % nt.sem["semestre_id"]
# ue_acro[ue_code_s] = (ue['numero'], ue['acronyme']) moy_ue[ue_code_s][etudid] = ue_status["moy"]
ue_acro[ue_code_s] = (ue["numero"], ue["acronyme"], ue["titre"]) # ue_acro[ue_code_s] = (ue['numero'], ue['acronyme'])
ue_acro[ue_code_s] = (ue["numero"], ue["acronyme"], ue["titre"])
if Se.prev:
try: if Se.prev:
moy_inter[etudid] = (moy[etudid] + prev_moy[etudid]) / 2.0 try:
except: moy_inter[etudid] = (moy[etudid] + prev_moy[etudid]) / 2.0
pass except:
pass
decision = nt.get_etud_decision_sem(etudid)
if decision: decision = nt.get_etud_decision_sem(etudid)
code[etudid] = decision["code"] if decision:
if decision["compense_formsemestre_id"]: code[etudid] = decision["code"]
code[etudid] += "+" # indique qu'il a servi a compenser if decision["compense_formsemestre_id"]:
assidu[etudid] = {0: "Non", 1: "Oui"}.get(decision["assidu"], "") code[etudid] += "+" # indique qu'il a servi a compenser
aut_list = sco_parcours_dut.formsemestre_get_autorisation_inscription( assidu[etudid] = {0: "Non", 1: "Oui"}.get(decision["assidu"], "")
context, etudid, formsemestre_id aut_list = sco_parcours_dut.formsemestre_get_autorisation_inscription(
) context, etudid, formsemestre_id
autorisations[etudid] = ", ".join(["S%s" % x["semestre_id"] for x in aut_list]) )
# parcours: autorisations[etudid] = ", ".join(["S%s" % x["semestre_id"] for x in aut_list])
parcours[etudid] = Se.get_parcours_descr() # parcours:
# groupe principal (td) parcours[etudid] = Se.get_parcours_descr()
groupestd[etudid] = "" # groupe principal (td)
for s in etud["sems"]: groupestd[etudid] = ""
if s["formsemestre_id"] == formsemestre_id: for s in etud["sems"]:
groupestd[etudid] = etud_groups.get(etudid, {}).get( if s["formsemestre_id"] == formsemestre_id:
main_partition_id, "" groupestd[etudid] = etud_groups.get(etudid, {}).get(
) main_partition_id, ""
# absences: )
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem) # absences:
nbabs[etudid] = nbabs e_nbabs, e_nbabsjust = sco_abs.get_abs_count(etudid, sem)
nbabsjust[etudid] = nbabs - nbabsjust nbabs[etudid] = e_nbabs
nbabsjust[etudid] = e_nbabs - e_nbabsjust
# Codes des UE "semestre précédent":
ue_prev_codes = list(prev_moy_ue.keys()) # Codes des UE "semestre précédent":
ue_prev_codes.sort( ue_prev_codes = list(prev_moy_ue.keys())
key=lambda x, prev_ue_acro=prev_ue_acro: prev_ue_acro[ # pylint: disable=undefined-variable ue_prev_codes.sort(
x key=lambda x, prev_ue_acro=prev_ue_acro: prev_ue_acro[ # pylint: disable=undefined-variable
] x
) ]
# Codes des UE "semestre courant": )
ue_codes = list(moy_ue.keys()) # Codes des UE "semestre courant":
ue_codes.sort( ue_codes = list(moy_ue.keys())
key=lambda x, ue_acro=ue_acro: ue_acro[x] # pylint: disable=undefined-variable ue_codes.sort(
) key=lambda x, ue_acro=ue_acro: ue_acro[x] # pylint: disable=undefined-variable
)
sid = sem["semestre_id"]
sn = sp = "" sid = sem["semestre_id"]
if sid >= 0: sn = sp = ""
sn = "S%s" % sid if sid >= 0:
if prev_moy: # si qq chose dans precedent sn = "S%s" % sid
sp = "S%s" % (sid - 1) if prev_moy: # si qq chose dans precedent
sp = "S%s" % (sid - 1)
L = sco_excel.ScoExcelSheet(sheet_name="Prepa Jury %s" % sn)
L.append(["Feuille préparation Jury %s" % scu.unescape_html(sem["titreannee"])]) ws = sco_excel.ScoExcelSheet(sheet_name="Prepa Jury %s" % sn)
L.append([]) # empty line # génération des styles
style_bold = sco_excel.excel_make_style(size=10, bold=True)
titles = ["Rang"] style_center = sco_excel.excel_make_style(halign="center")
if sco_preferences.get_preference("prepa_jury_nip"): style_boldcenter = sco_excel.excel_make_style(bold=True, halign="center")
titles.append("NIP") style_moy = sco_excel.excel_make_style(
if sco_preferences.get_preference("prepa_jury_ine"): bold=True, halign="center", bgcolor=sco_excel.COLORS.LIGHT_YELLOW
titles.append("INE") )
titles += [ style_note = sco_excel.excel_make_style(halign="right")
"etudid", style_note_bold = sco_excel.excel_make_style(halign="right", bold=True)
"Civ.",
"Nom", # Première ligne
"Prénom", ws.append_single_cell_row(
"Naissance", "Feuille préparation Jury %s" % scu.unescape_html(sem["titreannee"]), style_bold
"Bac", )
"Spe", ws.append_blank_row()
"Rg Adm",
"Parcours", # Ligne de titre
"Groupe", titles = ["Rang"]
] if sco_preferences.get_preference("prepa_jury_nip"):
titles.append("NIP")
if prev_moy: # si qq chose dans precedent if sco_preferences.get_preference("prepa_jury_ine"):
titles += [prev_ue_acro[x][1] for x in ue_prev_codes] + [ titles.append("INE")
"Moy %s" % sp, titles += [
"Décision %s" % sp, "etudid",
] "Civ.",
titles += [ue_acro[x][1] for x in ue_codes] + ["Moy %s" % sn] "Nom",
if moy_inter: "Prénom",
titles += ["Moy %s-%s" % (sp, sn)] "Naissance",
titles += ["Abs", "Abs Injust."] "Bac",
if code: "Spe",
titles.append("Proposit. %s" % sn) "Rg Adm",
if autorisations: "Parcours",
titles.append("Autorisations") "Groupe",
# titles.append('Assidu') ]
L.append(titles) if prev_moy: # si qq chose dans precedent
style_bold = sco_excel.Excel_MakeStyle(bold=True) titles += [prev_ue_acro[x][1] for x in ue_prev_codes] + [
style_center = sco_excel.Excel_MakeStyle(halign="center") "Moy %s" % sp,
style_boldcenter = sco_excel.Excel_MakeStyle(bold=True, halign="center") "Décision %s" % sp,
style_moy = sco_excel.Excel_MakeStyle( ]
bold=True, halign="center", bgcolor="lightyellow" titles += [ue_acro[x][1] for x in ue_codes] + ["Moy %s" % sn]
) if moy_inter:
style_note = sco_excel.Excel_MakeStyle(halign="right") titles += ["Moy %s-%s" % (sp, sn)]
style_note_bold = sco_excel.Excel_MakeStyle(halign="right", bold=True) titles += ["Abs", "Abs Injust."]
if prev_moy: if code:
tit_prev_moy = "Moy " + sp titles.append("Proposit. %s" % sn)
col_prev_moy = titles.index(tit_prev_moy) if autorisations:
tit_moy = "Moy " + sn titles.append("Autorisations")
col_moy = titles.index(tit_moy) # titles.append('Assidu')
col_abs = titles.index("Abs") ws.append_row(ws.make_row(titles, style_boldcenter))
if prev_moy:
L.set_style(style_bold, li=0) tit_prev_moy = "Moy " + sp
L.set_style(style_boldcenter, li=2) col_prev_moy = titles.index(tit_prev_moy)
tit_moy = "Moy " + sn
def fmt(x): col_moy = titles.index(tit_moy)
"reduit les notes a deux chiffres" col_abs = titles.index("Abs")
x = scu.fmt_note(x, keep_numeric=False)
try: def fmt(x):
return float(x) "reduit les notes a deux chiffres"
except: x = scu.fmt_note(x, keep_numeric=False)
return x try:
return float(x)
i = 1 # numero etudiant except:
for etudid in etudids: return x
etud = nt.identdict[etudid]
l = [str(i)] i = 1 # numero etudiant
if sco_preferences.get_preference("prepa_jury_nip"): for etudid in etudids:
l.append(etud["code_nip"]) cells = []
if sco_preferences.get_preference("prepa_jury_ine"): etud = nt.identdict[etudid]
l.append(etud["code_ine"]) cells.append(ws.make_cell(str(i)))
l += [ if sco_preferences.get_preference("prepa_jury_nip"):
etudid, cells.append(ws.make_cell(etud["code_nip"]))
etud["civilite_str"], if sco_preferences.get_preference("prepa_jury_ine"):
sco_etud.format_nom(etud["nom"]), cells.append(ws.make_cell(["code_ine"]))
sco_etud.format_prenom(etud["prenom"]), cells += ws.make_row(
etud["date_naissance"], [
etud["bac"], etudid,
etud["specialite"], etud["civilite_str"],
etud["classement"], sco_etud.format_nom(etud["nom"]),
parcours[etudid], sco_etud.format_prenom(etud["prenom"]),
groupestd[etudid], etud["date_naissance"],
] etud["bac"],
co = len(l) etud["specialite"],
if prev_moy: etud["classement"],
for ue_acro in ue_prev_codes: parcours[etudid],
l.append(fmt(prev_moy_ue.get(ue_acro, {}).get(etudid, ""))) groupestd[etudid],
L.set_style(style_note, li=i + 2, co=co) ]
co += 1 )
l.append(fmt(prev_moy.get(etudid, ""))) co = len(cells)
l.append(prev_code.get(etudid, "")) if prev_moy:
# L.set_style(style_bold, li=i+2, co=col_prev_moy+1) # moy gen prev for ue_acro in ue_prev_codes:
# L.set_style(style_moy, li=i+2, co=col_prev_moy+2) # decision prev cells.append(
L.set_style(style_bold, li=i + 2, co=col_prev_moy) # moy gen prev ws.make_cell(
L.set_style(style_moy, li=i + 2, co=col_prev_moy + 1) # decision prev prev_moy_ue.get(ue_acro, {}).get(etudid, ""), style_note
co += 2 )
)
for ue_acro in ue_codes: co += 1
l.append(fmt(moy_ue.get(ue_acro, {}).get(etudid, ""))) cells.append(
L.set_style(style_note, li=i + 2, co=co) ws.make_cell(fmt(prev_moy.get(etudid, "")), style_bold)
co += 1 ) # moy gen prev
l.append(fmt(moy.get(etudid, ""))) cells.append(
# L.set_style(style_note_bold, li=i+2, co=col_moy+1) # moy gen ws.make_cell(prev_code.get(etudid, ""), style_moy)
L.set_style(style_note_bold, li=i + 2, co=col_moy) # moy gen ) # decision prev
co += 1 co += 2
if moy_inter:
l.append(fmt(moy_inter.get(etudid, ""))) for ue_acro in ue_codes:
L.set_style(style_note, li=i + 2, co=co) cells.append(
l.append(fmt(str(nbabs.get(etudid, "")))) ws.make_cell(moy_ue.get(ue_acro, {}).get(etudid, ""), style_note)
l.append(fmt(str(nbabsjust.get(etudid, "")))) )
if code: co += 1
l.append(code.get(etudid, "")) cells.append(ws.make_cell(moy.get(etudid, ""), style_note_bold)) # moy gen
if autorisations: co += 1
l.append(autorisations.get(etudid, "")) if moy_inter:
# l.append(assidu.get(etudid, '')) cells.append(ws.make_cell(moy_inter.get(etudid, ""), style_note))
L.append(l) cells.append(ws.make_cell(str(nbabs.get(etudid, "")), style_center))
i += 1 cells.append(ws.make_cell(str(nbabsjust.get(etudid, "")), style_center))
L.set_style(style_center, li=i + 1, co=col_abs) # absences if code:
L.set_style(style_center, li=i + 1, co=col_abs + 1) # absences injustifiées cells.append(ws.make_cell(code.get(etudid, ""), style_moy))
L.set_style(style_moy, li=i + 1, co=col_abs + 2) # décision semestre if autorisations.get(etudid, ""):
L.set_style(style_center, li=i + 1, co=col_abs + 3) # Autorisations cells.append(ws.make_row(autorisations.get(etudid, ""), style_center))
# # l.append(assidu.get(etudid, ''))
L.append([""]) ws.append_row(cells)
# Explications des codes i += 1
codes = list(sco_codes_parcours.CODES_EXPL.keys()) #
codes.sort() ws.append_blank_row()
L.append(["Explication des codes"]) # Explications des codes
for code in codes: codes = list(sco_codes_parcours.CODES_EXPL.keys())
L.append(["", "", "", code, sco_codes_parcours.CODES_EXPL[code]]) codes.sort()
L.append( ws.append_single_cell_row("Explication des codes")
[ for code in codes:
"", ws.append_row(
"", ws.make_row(["", "", "", code, sco_codes_parcours.CODES_EXPL[code]])
"", )
"ADM+", ws.append_row(
"indique que le semestre a déjà servi à en compenser un autre", ws.make_row(
] [
) "",
# UE : Correspondances acronyme et titre complet "",
L.append([""]) "",
L.append(["Titre des UE"]) "ADM+",
if prev_moy: "indique que le semestre a déjà servi à en compenser un autre",
for ue in ntp.get_ues(filter_sport=True): ]
L.append(["", "", "", ue["acronyme"], ue["titre"]]) )
for ue in nt.get_ues(filter_sport=True): )
L.append(["", "", "", ue["acronyme"], ue["titre"]]) # UE : Correspondances acronyme et titre complet
# ws.append_blank_row()
L.append([""]) ws.append_single_cell_row("Titre des UE")
L.append( if prev_moy:
[ for ue in ntp.get_ues(filter_sport=True):
"Préparé par %s le %s sur %s pour %s" ws.append_row(ws.make_row(["", "", "", ue["acronyme"], ue["titre"]]))
% ( for ue in nt.get_ues(filter_sport=True):
VERSION.SCONAME, ws.append_row(ws.make_row(["", "", "", ue["acronyme"], ue["titre"]]))
time.strftime("%d/%m/%Y"), #
REQUEST.BASE0, ws.append_blank_row()
REQUEST.AUTHENTICATED_USER, ws.append_single_cell_row(
) "Préparé par %s le %s sur %s pour %s"
] % (
) VERSION.SCONAME,
time.strftime("%d/%m/%Y"),
xls = L.gen_workbook() REQUEST.BASE0,
REQUEST.AUTHENTICATED_USER,
return sco_excel.sendExcelFile(REQUEST, xls, "PrepaJury%s.xls" % sn) )
)
xls = ws.generate_standalone()
return sco_excel.send_excel_file(REQUEST, xls, "PrepaJury%s.xlsx" % sn)