Merge pull request 'adaptation export feuille de préparation jury' (#97) from jmplace/ScoDoc-Lille:prepajury_pr into ScoDoc8

Reviewed-on: viennet/ScoDoc#97
This commit is contained in:
Emmanuel Viennet 2021-08-13 12:27:02 +02:00
commit 72d5904c4c
2 changed files with 115 additions and 99 deletions

View File

@ -136,8 +136,13 @@ class ScoExcelBook:
self.sheets = [] # list of sheets
def create_sheet(self, sheet_name="feuille", default_style=None):
"""Crée une nouvelle feuille dans ce classeur
sheet_name -- le nom de la feuille
default_style -- le style par défaut
"""
sheet = ScoExcelSheet(sheet_name, default_style)
self.sheets.append(sheet)
return sheet
def generate(self):
"""génération d'un stream binaire représentant la totalité du classeur.
@ -161,6 +166,8 @@ def excel_make_style(
halign=None,
valign=None,
format_number=None,
font_name="Arial",
size=10,
):
"""Contruit un style.
Les couleurs peuvent être spécfiées soit par une valeur de COLORS,
@ -169,30 +176,32 @@ def excel_make_style(
bgcolor -- la couleur de fond
halign -- alignement horizontal ("left", "right", "center")
valign -- alignement vertical ("top", "bottom", "center")
format_number -- formattage du contenu ("general", "@", ...)
format_number -- formattage du contenu ("General", "@", ...)
font_name -- police
size -- taille de police
"""
style = {}
font = Font(name="Arial", bold=bold, italic=italic, color=color.value)
font = Font(name=font_name, bold=bold, italic=italic, color=color.value, size=size)
style["font"] = font
if bgcolor:
style["fill"] = PatternFill(fill_type="solid", bgColor=bgcolor.value)
style["fill"] = PatternFill(fill_type="solid", fgColor=bgcolor.value)
if halign or valign:
al = Alignment()
if halign:
al.horz = {
al.horizontal = {
"left": "left",
"right": "right",
"center": "center",
}[halign]
if valign:
al.vert = {
al.vertical = {
"top": "top",
"bottom": "bottom",
"center": "center",
}[valign]
style["alignment"] = al
if format_number is None:
style["format_number"] = "general"
style["format_number"] = "General"
else:
style["format_number"] = format_number
return style
@ -244,9 +253,11 @@ class ScoExcelSheet:
def make_cell(self, value: any = None, style=None):
"""Construit une cellule.
value -- contenu de la cellule (texte ou numérique)
style -- style par défaut de la feuille si non spécifié
style -- style par défaut (dictionnaire cf. excel_make_style) de la feuille si non spécifié
"""
cell = WriteOnlyCell(self.ws, value or "")
# if style is not None and "fill" in style:
# toto()
if style is None:
style = self.default_style
if "font" in style:
@ -261,7 +272,7 @@ class ScoExcelSheet:
cell.alignment = style["alignment"]
return cell
def make_row(self, values: list, style):
def make_row(self, values: list, style=None):
return [self.make_cell(value, style) for value in values]
def append_single_cell_row(self, value: any, style=None):
@ -437,7 +448,7 @@ def excel_feuille_saisie(e, titreannee, description, lines):
}
style_notes = {
"font": font_bold,
"number_format": "general",
"number_format": "General",
"fill": fill_light_yellow,
"border": border_top,
}

View File

@ -40,6 +40,7 @@ from app.scodoc import sco_codes_parcours
from app.scodoc import VERSION
from app.scodoc import sco_etud
from app.scodoc import sco_preferences
from app.scodoc.sco_excel import ScoExcelSheet
def feuille_preparation_jury(context, formsemestre_id, REQUEST):
@ -59,7 +60,7 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
prev_ue_acro = {} # ue_code_s : acronyme (à afficher)
prev_moy = {} # moyennes gen sem prec
moy_ue = scu.DictDefault(defaultvalue={}) # ue_acro : moyennes { etudid : moy ue }
ue_acro = {} # ue_code_s : acronyme (à afficher)
ue_acro = {} # ue_code_s : acronyme (à afficher)
moy = {} # moyennes gen
moy_inter = {} # moyenne gen. sur les 2 derniers semestres
code = {} # decision existantes s'il y en a
@ -129,9 +130,9 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
main_partition_id, ""
)
# absences:
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem)
nbabs[etudid] = nbabs
nbabsjust[etudid] = nbabs - nbabsjust
e_nbabs, e_nbabsjust = sco_abs.get_abs_count(etudid, sem)
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())
@ -153,10 +154,26 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
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"])])
L.append([]) # empty line
ws = sco_excel.ScoExcelSheet(sheet_name="Prepa Jury %s" % sn)
# génération des styles
style_bold = sco_excel.excel_make_style(size=10, bold=True)
style_center = sco_excel.excel_make_style(halign="center")
style_boldcenter = sco_excel.excel_make_style(bold=True, halign="center")
style_moy = sco_excel.excel_make_style(
bold=True, halign="center", bgcolor=sco_excel.COLORS.LIGHT_YELLOW
)
style_note = sco_excel.excel_make_style(halign="right", format_number="General")
style_note_bold = sco_excel.excel_make_style(
halign="right", bold=True, format_number="General"
)
# Première ligne
ws.append_single_cell_row(
"Feuille préparation Jury %s" % scu.unescape_html(sem["titreannee"]), style_bold
)
ws.append_blank_row()
# Ligne de titre
titles = ["Rang"]
if sco_preferences.get_preference("prepa_jury_nip"):
titles.append("NIP")
@ -174,7 +191,6 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
"Parcours",
"Groupe",
]
if prev_moy: # si qq chose dans precedent
titles += [prev_ue_acro[x][1] for x in ue_prev_codes] + [
"Moy %s" % sp,
@ -189,15 +205,7 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
if autorisations:
titles.append("Autorisations")
# titles.append('Assidu')
L.append(titles)
style_bold = sco_excel.excel_make_style(bold=True)
style_center = sco_excel.excel_make_style(halign="center")
style_boldcenter = sco_excel.excel_make_style(bold=True, halign="center")
style_moy = sco_excel.excel_make_style(
bold=True, halign="center", bgcolor="lightyellow"
)
style_note = sco_excel.excel_make_style(halign="right")
style_note_bold = sco_excel.excel_make_style(halign="right", bold=True)
ws.append_row(ws.make_row(titles, style_boldcenter))
if prev_moy:
tit_prev_moy = "Moy " + sp
col_prev_moy = titles.index(tit_prev_moy)
@ -205,9 +213,6 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
col_moy = titles.index(tit_moy)
col_abs = titles.index("Abs")
L.set_style(style_bold, li=0)
L.set_style(style_boldcenter, li=2)
def fmt(x):
"reduit les notes a deux chiffres"
x = scu.fmt_note(x, keep_numeric=False)
@ -218,101 +223,101 @@ def feuille_preparation_jury(context, formsemestre_id, REQUEST):
i = 1 # numero etudiant
for etudid in etudids:
cells = []
etud = nt.identdict[etudid]
l = [str(i)]
cells.append(ws.make_cell(str(i)))
if sco_preferences.get_preference("prepa_jury_nip"):
l.append(etud["code_nip"])
cells.append(ws.make_cell(etud["code_nip"]))
if sco_preferences.get_preference("prepa_jury_ine"):
l.append(etud["code_ine"])
l += [
etudid,
etud["civilite_str"],
sco_etud.format_nom(etud["nom"]),
sco_etud.format_prenom(etud["prenom"]),
etud["date_naissance"],
etud["bac"],
etud["specialite"],
etud["classement"],
parcours[etudid],
groupestd[etudid],
]
co = len(l)
cells.append(ws.make_cell(["code_ine"]))
cells += ws.make_row(
[
etudid,
etud["civilite_str"],
sco_etud.format_nom(etud["nom"]),
sco_etud.format_prenom(etud["prenom"]),
etud["date_naissance"],
etud["bac"],
etud["specialite"],
etud["classement"],
parcours[etudid],
groupestd[etudid],
]
)
co = len(cells)
if prev_moy:
for ue_acro in ue_prev_codes:
l.append(fmt(prev_moy_ue.get(ue_acro, {}).get(etudid, "")))
L.set_style(style_note, li=i + 2, co=co)
cells.append(
ws.make_cell(
fmt(prev_moy_ue.get(ue_acro, {}).get(etudid, "")), style_note
)
)
co += 1
l.append(fmt(prev_moy.get(etudid, "")))
l.append(prev_code.get(etudid, ""))
# L.set_style(style_bold, li=i+2, co=col_prev_moy+1) # moy gen prev
# L.set_style(style_moy, li=i+2, co=col_prev_moy+2) # decision prev
L.set_style(style_bold, li=i + 2, co=col_prev_moy) # moy gen prev
L.set_style(style_moy, li=i + 2, co=col_prev_moy + 1) # decision prev
cells.append(
ws.make_cell(fmt(prev_moy.get(etudid, "")), style_bold)
) # moy gen prev
cells.append(
ws.make_cell(fmt(prev_code.get(etudid, "")), style_moy)
) # decision prev
co += 2
for ue_acro in ue_codes:
l.append(fmt(moy_ue.get(ue_acro, {}).get(etudid, "")))
L.set_style(style_note, li=i + 2, co=co)
cells.append(
ws.make_cell(fmt(moy_ue.get(ue_acro, {}).get(etudid, "")), style_note)
)
co += 1
l.append(fmt(moy.get(etudid, "")))
# L.set_style(style_note_bold, li=i+2, co=col_moy+1) # moy gen
L.set_style(style_note_bold, li=i + 2, co=col_moy) # moy gen
cells.append(ws.make_cell(fmt(moy.get(etudid, "")), style_note_bold)) # moy gen
co += 1
if moy_inter:
l.append(fmt(moy_inter.get(etudid, "")))
L.set_style(style_note, li=i + 2, co=co)
l.append(fmt(str(nbabs.get(etudid, ""))))
l.append(fmt(str(nbabsjust.get(etudid, ""))))
cells.append(ws.make_cell(fmt(moy_inter.get(etudid, "")), style_note))
cells.append(ws.make_cell(str(nbabs.get(etudid, "")), style_center))
cells.append(ws.make_cell(str(nbabsjust.get(etudid, "")), style_center))
if code:
l.append(code.get(etudid, ""))
if autorisations:
l.append(autorisations.get(etudid, ""))
cells.append(ws.make_cell(code.get(etudid, ""), style_moy))
cells.append(ws.make_cell(autorisations.get(etudid, ""), style_moy))
# l.append(assidu.get(etudid, ''))
L.append(l)
ws.append_row(cells)
i += 1
L.set_style(style_center, li=i + 1, co=col_abs) # absences
L.set_style(style_center, li=i + 1, co=col_abs + 1) # absences injustifiées
L.set_style(style_moy, li=i + 1, co=col_abs + 2) # décision semestre
L.set_style(style_center, li=i + 1, co=col_abs + 3) # Autorisations
#
L.append([""])
ws.append_blank_row()
# Explications des codes
codes = list(sco_codes_parcours.CODES_EXPL.keys())
codes.sort()
L.append(["Explication des codes"])
ws.append_single_cell_row("Explication des codes")
for code in codes:
L.append(["", "", "", code, sco_codes_parcours.CODES_EXPL[code]])
L.append(
[
"",
"",
"",
"ADM+",
"indique que le semestre a déjà servi à en compenser un autre",
]
ws.append_row(
ws.make_row(["", "", "", code, sco_codes_parcours.CODES_EXPL[code]])
)
ws.append_row(
ws.make_row(
[
"",
"",
"",
"ADM+",
"indique que le semestre a déjà servi à en compenser un autre",
]
)
)
# UE : Correspondances acronyme et titre complet
L.append([""])
L.append(["Titre des UE"])
ws.append_blank_row()
ws.append_single_cell_row("Titre des UE")
if prev_moy:
for ue in ntp.get_ues(filter_sport=True):
L.append(["", "", "", ue["acronyme"], ue["titre"]])
ws.append_row(ws.make_row(["", "", "", ue["acronyme"], ue["titre"]]))
for ue in nt.get_ues(filter_sport=True):
L.append(["", "", "", ue["acronyme"], ue["titre"]])
ws.append_row(ws.make_row(["", "", "", ue["acronyme"], ue["titre"]]))
#
L.append([""])
L.append(
[
"Préparé par %s le %s sur %s pour %s"
% (
VERSION.SCONAME,
time.strftime("%d/%m/%Y"),
REQUEST.BASE0,
REQUEST.AUTHENTICATED_USER,
)
]
ws.append_blank_row()
ws.append_single_cell_row(
"Préparé par %s le %s sur %s pour %s"
% (
VERSION.SCONAME,
time.strftime("%d/%m/%Y"),
REQUEST.BASE0,
REQUEST.AUTHENTICATED_USER,
)
)
xls = ws.generate_standalone()
xls = L.gen_workbook()
return sco_excel.send_excel_file(REQUEST, xls, f"PrepaJury{sn}{scu.XLSX_SUFFIX}")
return sco_excel.send_excel_file(REQUEST, xls, "PrepaJury%s.xlsx" % sn)