2020-09-26 16:19:37 +02:00
# -*- mode: python -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Gestion scolarite IUT
#
2023-01-02 13:16:27 +01:00
# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved.
2020-09-26 16:19:37 +02:00
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Emmanuel Viennet emmanuel.viennet@viennet.net
#
##############################################################################
""" Tableau de bord module
"""
2022-10-02 18:43:18 +02:00
import math
2021-01-17 22:31:28 +01:00
import time
2020-09-26 16:19:37 +02:00
2021-07-20 06:53:05 +02:00
from flask import g , url_for
2021-07-31 18:01:10 +02:00
from flask_login import current_user
2021-07-20 06:53:05 +02:00
2022-10-05 10:31:25 +02:00
from app import db
2021-12-19 11:08:03 +01:00
from app . auth . models import User
2022-02-10 15:29:51 +01:00
from app . comp import res_sem
2022-03-27 22:25:00 +02:00
from app . comp . res_compat import NotesTableCompat
2022-11-09 12:50:10 +01:00
from app . models import FormSemestre , ModuleImpl
2021-12-19 11:08:03 +01:00
from app . models . evaluations import Evaluation
2022-10-01 18:55:32 +02:00
from app . models . ues import UniteEns
2021-06-19 23:21:37 +02:00
import app . scodoc . sco_utils as scu
2022-10-15 10:27:00 +02:00
from app . scodoc . sco_codes_parcours import UE_SPORT
2022-01-11 22:44:03 +01:00
from app . scodoc . sco_exceptions import ScoInvalidIdType
2022-07-07 16:24:52 +02:00
from app . scodoc . sco_cursus_dut import formsemestre_has_decisions
2021-06-19 23:21:37 +02:00
from app . scodoc . sco_permissions import Permission
2021-01-17 22:31:28 +01:00
2021-06-19 23:21:37 +02:00
from app . scodoc import html_sco_header
from app . scodoc import htmlutils
from app . scodoc import sco_abs
from app . scodoc import sco_compute_moy
from app . scodoc import sco_edit_module
from app . scodoc import sco_evaluations
2021-11-12 22:17:46 +01:00
from app . scodoc import sco_evaluation_db
2021-06-19 23:21:37 +02:00
from app . scodoc import sco_formations
from app . scodoc import sco_formsemestre
from app . scodoc import sco_formsemestre_status
from app . scodoc import sco_groups
from app . scodoc import sco_moduleimpl
from app . scodoc import sco_permissions_check
2021-07-03 23:35:32 +02:00
from app . scodoc import sco_users
2020-09-26 16:19:37 +02:00
# ported from old DTML code in oct 2009
# menu evaluation dans moduleimpl
2022-12-17 03:33:04 +01:00
def moduleimpl_evaluation_menu ( evaluation_id , nbnotes = 0 ) - > str :
2020-09-26 16:19:37 +02:00
" Menu avec actions sur une evaluation "
2021-11-12 22:17:46 +01:00
E = sco_evaluation_db . do_evaluation_list ( { " evaluation_id " : evaluation_id } ) [ 0 ]
2021-10-15 14:00:51 +02:00
modimpl = sco_moduleimpl . moduleimpl_list ( moduleimpl_id = E [ " moduleimpl_id " ] ) [ 0 ]
2020-09-26 16:19:37 +02:00
2021-07-29 16:31:15 +02:00
group_id = sco_groups . get_default_group ( modimpl [ " formsemestre_id " ] )
2020-09-26 16:19:37 +02:00
if (
2021-06-19 23:21:37 +02:00
sco_permissions_check . can_edit_notes (
2021-09-18 13:42:19 +02:00
current_user , E [ " moduleimpl_id " ] , allow_ens = False
2020-09-26 16:19:37 +02:00
)
and nbnotes != 0
) :
sup_label = " Supprimer évaluation impossible (il y a des notes) "
else :
sup_label = " Supprimer évaluation "
menuEval = [
{
" title " : " Saisir notes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.saisie_notes " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2021-06-19 23:21:37 +02:00
" enabled " : sco_permissions_check . can_edit_notes (
2021-09-18 13:42:19 +02:00
current_user , E [ " moduleimpl_id " ]
2020-09-26 16:19:37 +02:00
) ,
} ,
{
" title " : " Modifier évaluation " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.evaluation_edit " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2021-06-19 23:21:37 +02:00
" enabled " : sco_permissions_check . can_edit_notes (
2021-09-18 13:42:19 +02:00
current_user , E [ " moduleimpl_id " ] , allow_ens = False
2020-09-26 16:19:37 +02:00
) ,
} ,
{
" title " : sup_label ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.evaluation_delete " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2020-09-26 16:19:37 +02:00
" enabled " : nbnotes == 0
2021-06-19 23:21:37 +02:00
and sco_permissions_check . can_edit_notes (
2021-09-18 13:42:19 +02:00
current_user , E [ " moduleimpl_id " ] , allow_ens = False
2020-09-26 16:19:37 +02:00
) ,
} ,
{
" title " : " Supprimer toutes les notes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.evaluation_suppress_alln " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2021-06-19 23:21:37 +02:00
" enabled " : sco_permissions_check . can_edit_notes (
2021-09-18 13:42:19 +02:00
current_user , E [ " moduleimpl_id " ] , allow_ens = False
2020-09-26 16:19:37 +02:00
) ,
} ,
{
" title " : " Afficher les notes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.evaluation_listenotes " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2020-09-26 16:19:37 +02:00
" enabled " : nbnotes > 0 ,
} ,
{
" title " : " Placement étudiants " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.placement_eval_selectetuds " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2021-09-18 14:21:15 +02:00
" enabled " : sco_permissions_check . can_edit_notes (
current_user , E [ " moduleimpl_id " ]
) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Absences ce jour " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " absences.EtatAbsencesDate " ,
" args " : {
2021-11-06 16:35:21 +01:00
" date " : E [ " jour " ] ,
2021-06-19 23:21:37 +02:00
" group_ids " : group_id ,
} ,
2020-09-26 16:19:37 +02:00
" enabled " : E [ " jour " ] ,
} ,
{
" title " : " Vérifier notes vs absents " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.evaluation_check_absences_html " ,
" args " : {
" evaluation_id " : evaluation_id ,
} ,
2020-09-26 16:19:37 +02:00
" enabled " : nbnotes > 0 and E [ " jour " ] ,
} ,
]
2021-01-17 22:31:28 +01:00
return htmlutils . make_menu ( " actions " , menuEval , alone = True )
2020-09-26 16:19:37 +02:00
2022-01-06 22:42:26 +01:00
def _ue_coefs_html ( coefs_lst ) - > str :
2021-12-02 21:16:14 +01:00
""" """
2022-01-06 22:42:26 +01:00
max_coef = max ( [ x [ 1 ] for x in coefs_lst ] ) if coefs_lst else 1.0
2021-12-02 21:16:14 +01:00
H = """
< div id = " modimpl_coefs " >
< div > Coefficients vers les UE < / div >
"""
2022-01-06 22:42:26 +01:00
if coefs_lst :
H + = (
f """
2021-12-02 21:16:14 +01:00
< div class = " coefs_histo " style = " --max: {max_coef} " >
2022-01-06 22:42:26 +01:00
"""
+ " \n " . join (
[
2022-01-25 10:45:13 +01:00
f """ <div style= " --coef: { coef } ;
{ ' background-color: ' + ue . color + ' ; ' if ue . color else ' ' }
" ><div> {coef} </div> {ue.acronyme} </div> " " "
2022-01-06 22:42:26 +01:00
for ue , coef in coefs_lst
]
)
+ " </div> "
2021-12-02 21:16:14 +01:00
)
else :
2022-01-06 22:42:26 +01:00
H + = """ <div class= " missing_value " >non définis</div> """
H + = " </div> "
2021-12-02 21:16:14 +01:00
return H
2021-09-27 10:20:10 +02:00
def moduleimpl_status ( moduleimpl_id = None , partition_id = None ) :
2020-09-26 16:19:37 +02:00
""" Tableau de bord module (liste des evaluations etc) """
2022-01-11 22:44:03 +01:00
if not isinstance ( moduleimpl_id , int ) :
raise ScoInvalidIdType ( " moduleimpl_id must be an integer ! " )
2022-06-24 03:34:52 +02:00
modimpl : ModuleImpl = ModuleImpl . query . get_or_404 ( moduleimpl_id )
2021-11-29 22:18:37 +01:00
M = modimpl . to_dict ( )
2022-04-29 08:17:04 +02:00
formsemestre_id = modimpl . formsemestre_id
2022-11-09 12:50:10 +01:00
formsemestre : FormSemestre = modimpl . formsemestre
2022-04-29 08:17:04 +02:00
Mod = sco_edit_module . module_list ( args = { " module_id " : modimpl . module_id } ) [ 0 ]
2021-08-19 10:28:35 +02:00
sem = sco_formsemestre . get_formsemestre ( formsemestre_id )
F = sco_formations . formation_list ( args = { " formation_id " : sem [ " formation_id " ] } ) [ 0 ]
2021-11-12 22:17:46 +01:00
mod_inscrits = sco_moduleimpl . do_moduleimpl_inscription_list (
2022-12-15 17:09:35 +01:00
moduleimpl_id = moduleimpl_id
2020-09-26 16:19:37 +02:00
)
2022-11-09 12:50:10 +01:00
nt : NotesTableCompat = res_sem . load_formsemestre_results ( formsemestre )
2022-02-10 15:29:51 +01:00
2022-12-15 17:09:35 +01:00
# mod_evals = sco_evaluation_db.do_evaluation_list({"moduleimpl_id": moduleimpl_id})
# mod_evals.sort(
# key=lambda x: (x["numero"], x["jour"], x["heure_debut"]), reverse=True
# )
# la plus RECENTE en tête
evaluations = modimpl . evaluations . order_by (
Evaluation . numero . desc ( ) ,
Evaluation . jour . desc ( ) ,
Evaluation . heure_debut . desc ( ) ,
) . all ( )
nb_evaluations = len ( evaluations )
2022-12-16 01:27:52 +01:00
max_poids = max (
[
max ( [ p . poids for p in e . ue_poids ] or [ 0 ] ) * ( e . coefficient or 0.0 )
for e in evaluations
]
2022-12-16 09:25:04 +01:00
or [ 0 ]
2022-12-16 01:27:52 +01:00
)
2020-09-26 16:19:37 +02:00
#
2022-04-28 07:06:01 +02:00
sem_locked = not sem [ " etat " ]
can_edit_evals = (
sco_permissions_check . can_edit_notes (
current_user , moduleimpl_id , allow_ens = sem [ " ens_can_edit_eval " ]
)
and not sem_locked
)
can_edit_notes = (
sco_permissions_check . can_edit_notes ( current_user , moduleimpl_id )
and not sem_locked
2020-09-26 16:19:37 +02:00
)
2021-10-12 16:05:50 +02:00
arrow_up , arrow_down , arrow_none = sco_groups . get_arrow_icons_tags ( )
2020-09-26 16:19:37 +02:00
#
2021-08-21 23:45:48 +02:00
module_resp = User . query . get ( M [ " responsable_id " ] )
2021-11-12 22:17:46 +01:00
mod_type_name = scu . MODULE_TYPE_NAMES [ Mod [ " module_type " ] ]
2020-09-26 16:19:37 +02:00
H = [
2021-12-11 10:57:06 +01:00
html_sco_header . sco_header (
page_title = f " { mod_type_name } { Mod [ ' code ' ] } { Mod [ ' titre ' ] } "
) ,
2021-11-12 22:17:46 +01:00
f """ <h2 class= " formsemestre " > { mod_type_name }
2022-02-01 11:37:05 +01:00
< tt > { Mod [ ' code ' ] } < / tt > { Mod [ ' titre ' ] }
{ " dans l ' UE " + modimpl . module . ue . acronyme if modimpl . module . module_type == scu . ModuleType . MALUS else " " }
< / h2 >
2021-11-12 22:17:46 +01:00
< div class = " moduleimpl_tableaubord moduleimpl_type_ {
scu . ModuleType ( Mod [ ' module_type ' ] ) . name . lower ( ) } " >
< table >
< tr >
< td class = " fichetitre2 " > Responsable : < / td > < td class = " redboldtext " >
{ module_resp . get_nomcomplet ( ) }
< span class = " blacktt " > ( { module_resp . user_name } ) < / span >
""" ,
2020-09-26 16:19:37 +02:00
]
try :
2021-09-27 10:20:10 +02:00
sco_moduleimpl . can_change_module_resp ( moduleimpl_id )
2020-09-26 16:19:37 +02:00
H . append (
""" <a class= " stdlink " href= " edit_moduleimpl_resp?moduleimpl_id= %s " >modifier</a> """
% moduleimpl_id
)
except :
pass
H . append ( """ </td><td> """ )
H . append (
2021-07-03 23:35:32 +02:00
" , " . join ( [ sco_users . user_info ( m [ " ens_id " ] ) [ " nomprenom " ] for m in M [ " ens " ] ] )
2020-09-26 16:19:37 +02:00
)
H . append ( """ </td><td> """ )
try :
2021-08-22 13:24:36 +02:00
sco_moduleimpl . can_change_ens ( moduleimpl_id )
2020-09-26 16:19:37 +02:00
H . append (
""" <a class= " stdlink " href= " edit_enseignants_form?moduleimpl_id= %s " >modifier les enseignants</a> """
% moduleimpl_id
)
except :
pass
H . append ( """ </td></tr> """ )
# 2ieme ligne: Semestre, Coef
H . append ( """ <tr><td class= " fichetitre2 " > """ )
if sem [ " semestre_id " ] > = 0 :
H . append ( """ Semestre: </td><td> %s """ % sem [ " semestre_id " ] )
else :
H . append ( """ </td><td> """ )
2022-04-28 07:06:01 +02:00
if sem_locked :
2021-01-17 22:31:28 +01:00
H . append ( scu . icontag ( " lock32_img " , title = " verrouillé " ) )
2021-12-02 21:16:14 +01:00
H . append ( """ </td><td class= " fichetitre2 " > """ )
2021-11-29 22:18:37 +01:00
if modimpl . module . is_apc ( ) :
2022-01-06 22:42:26 +01:00
H . append ( _ue_coefs_html ( modimpl . module . ue_coefs_list ( ) ) )
2021-11-29 22:18:37 +01:00
else :
2022-06-02 11:37:13 +02:00
H . append (
f """ Coef. dans le semestre: {
" non défini " if modimpl . module . coefficient is None else modimpl . module . coefficient
} """
)
2021-11-29 22:18:37 +01:00
H . append ( """ </td><td></td></tr> """ )
2020-09-26 16:19:37 +02:00
# 3ieme ligne: Formation
H . append (
""" <tr><td class= " fichetitre2 " >Formation: </td><td> %(titre)s </td></tr> """ % F
)
# Ligne: Inscrits
H . append (
""" <tr><td class= " fichetitre2 " >Inscrits: </td><td> %d étudiants """
2021-11-12 22:17:46 +01:00
% len ( mod_inscrits )
2020-09-26 16:19:37 +02:00
)
2021-07-31 18:01:10 +02:00
if current_user . has_permission ( Permission . ScoEtudInscrit ) :
2020-09-26 16:19:37 +02:00
H . append (
""" <a class= " stdlink " style= " margin-left:2em; " href= " moduleimpl_inscriptions_edit?moduleimpl_id= %s " >modifier</a> """
% M [ " moduleimpl_id " ]
)
H . append ( " </td></tr> " )
# Ligne: règle de calcul
2021-08-21 00:24:51 +02:00
has_expression = sco_compute_moy . moduleimpl_has_expression ( M )
2020-09-26 16:19:37 +02:00
if has_expression :
H . append (
' <tr><td class= " fichetitre2 " colspan= " 4 " >Règle de calcul: <span class= " formula " title= " mode de calcul de la moyenne du module " >moyenne=<tt> %s </tt></span> '
% M [ " computation_expr " ]
)
2022-08-04 09:06:58 +02:00
H . append ( """ <span class= " warning " >inutilisée dans cette version de ScoDoc """ )
if sco_moduleimpl . can_change_ens ( moduleimpl_id , raise_exc = False ) :
H . append (
f """ <a href= " {
url_for ( " notes.delete_moduleimpl_expr " , scodoc_dept = g . scodoc_dept ,
moduleimpl_id = moduleimpl_id )
} " class= " stdlink " >supprimer</a> " " "
)
H . append ( """ </span> """ )
2020-09-26 16:19:37 +02:00
H . append ( " </td></tr> " )
else :
H . append (
2022-01-30 22:03:14 +01:00
' <tr><td colspan= " 4 " > ' # <em title="mode de calcul de la moyenne du module">règle de calcul standard</em>'
2020-09-26 16:19:37 +02:00
)
2022-01-30 22:03:14 +01:00
# if sco_moduleimpl.can_change_ens(moduleimpl_id, raise_exc=False):
# H.append(
# f' (<a class="stdlink" href="edit_moduleimpl_expr?moduleimpl_id={moduleimpl_id}">changer</a>)'
# )
2020-09-26 16:19:37 +02:00
H . append ( " </td></tr> " )
H . append (
2022-12-15 17:09:35 +01:00
f """ <tr><td colspan= " 4 " ><span class= " moduleimpl_abs_link " ><a class= " stdlink "
href = " {
url_for ( " notes.view_module_abs " , scodoc_dept = g . scodoc_dept , moduleimpl_id = moduleimpl_id )
} " >Absences dans ce module</a></span> " " "
2020-09-26 16:19:37 +02:00
)
2021-01-02 22:07:38 +01:00
# Adapté à partir d'une suggestion de DS (Le Havre)
# Liens saisies absences seulement si permission et date courante dans le semestre
2022-11-09 12:50:10 +01:00
if (
current_user . has_permission ( Permission . ScoAbsChange )
and formsemestre . est_courant ( )
) :
2021-01-10 18:54:39 +01:00
datelundi = sco_abs . ddmmyyyy ( time . strftime ( " %d / % m/ % Y " ) ) . prev_monday ( )
2021-07-29 16:31:15 +02:00
group_id = sco_groups . get_default_group ( formsemestre_id )
2021-01-02 22:07:38 +01:00
H . append (
2021-07-20 06:53:05 +02:00
f """
2022-10-01 18:55:32 +02:00
< span class = " moduleimpl_abs_link " > < a class = " stdlink "
href = " { url_for( " absences . SignaleAbsenceGrHebdo " ,
2021-07-20 06:53:05 +02:00
scodoc_dept = g . scodoc_dept , formsemestre_id = formsemestre_id ,
moduleimpl_id = moduleimpl_id , datelundi = datelundi , group_ids = group_id ) } " >
Saisie Absences hebdo . < / a > < / span >
"""
2021-01-02 22:07:38 +01:00
)
H . append ( " </td></tr></table> " )
2020-09-26 16:19:37 +02:00
#
2022-12-17 21:27:14 +01:00
if not modimpl . check_apc_conformity ( nt ) :
2021-11-29 22:18:37 +01:00
H . append (
2022-01-06 22:42:26 +01:00
""" <div class= " warning conformite " >Les poids des évaluations de ce module ne sont
2022-10-01 18:55:32 +02:00
pas encore conformes au PN .
2021-11-29 22:18:37 +01:00
Ses notes ne peuvent pas être prises en compte dans les moyennes d ' UE.
2022-01-06 22:42:26 +01:00
< / div > """
2021-11-29 22:18:37 +01:00
)
#
2020-09-26 16:19:37 +02:00
if has_expression and nt . expr_diagnostics :
2021-08-21 00:24:51 +02:00
H . append ( sco_formsemestre_status . html_expr_diagnostic ( nt . expr_diagnostics ) )
2020-09-26 16:19:37 +02:00
#
2022-02-10 15:29:51 +01:00
if formsemestre_has_decisions ( formsemestre_id ) :
2020-09-26 16:19:37 +02:00
H . append (
""" <ul class= " tf-msg " ><li class= " tf-msg warning " >Décisions de jury saisies: seul le responsable du semestre peut saisir des notes (il devra modifier les décisions de jury).</li></ul> """
)
#
H . append (
""" <p><form name= " f " ><span style= " font-size:120 %% ; font-weight: bold; " > %d évaluations :</span>
< span style = " padding-left: 30px; " >
< input type = " hidden " name = " moduleimpl_id " value = " %s " / > """
2022-12-15 17:09:35 +01:00
% ( nb_evaluations , moduleimpl_id )
2020-09-26 16:19:37 +02:00
)
#
# Liste les noms de partitions
2021-08-19 10:28:35 +02:00
partitions = sco_groups . get_partitions_list ( sem [ " formsemestre_id " ] )
2020-09-26 16:19:37 +02:00
H . append (
2022-12-15 17:09:35 +01:00
""" Afficher les groupes
de & nbsp ; < select name = " partition_id " onchange = " document.f.submit(); " > """
2020-09-26 16:19:37 +02:00
)
2020-12-26 00:39:45 +01:00
been_selected = False
2020-09-26 16:19:37 +02:00
for partition in partitions :
2020-12-26 00:39:45 +01:00
if not partition_id and not been_selected :
selected = " selected "
been_selected = True
2020-09-26 16:19:37 +02:00
if partition [ " partition_id " ] == partition_id :
selected = " selected "
else :
selected = " "
name = partition [ " partition_name " ]
if name is None :
name = " Tous "
H . append (
""" <option value= " %s " %s > %s </option> """
% ( partition [ " partition_id " ] , selected , name )
)
H . append (
""" </select>
& nbsp ; & nbsp ; & nbsp ; & nbsp ;
< a class = " stdlink " href = " evaluation_listenotes?moduleimpl_id= %(moduleimpl_id)s " > Voir toutes les notes < / a >
< / span >
< / form >
< / p >
"""
% M
)
# -------- Tableau des evaluations
top_table_links = " "
2022-04-28 07:06:01 +02:00
if can_edit_evals :
top_table_links = f """ <a class= " stdlink " href= " {
url_for ( " notes.evaluation_create " , scodoc_dept = g . scodoc_dept , moduleimpl_id = M [ ' moduleimpl_id ' ] )
} " >Créer nouvelle évaluation</a>
2022-09-02 22:05:38 +02:00
"""
2022-12-15 17:09:35 +01:00
if nb_evaluations > 0 :
2022-09-02 22:05:38 +02:00
top_table_links + = f """
2022-04-28 07:06:01 +02:00
< a class = " stdlink " style = " margin-left:2em; " href = " {
2023-01-27 14:20:52 +01:00
url_for ( " notes.moduleimpl_evaluation_renumber " , scodoc_dept = g . scodoc_dept , moduleimpl_id = M [ ' moduleimpl_id ' ] ,
2022-04-28 07:06:01 +02:00
redirect = 1 )
} " >Trier par date</a>
"""
2022-12-15 17:09:35 +01:00
if nb_evaluations > 0 :
2020-09-26 16:19:37 +02:00
H . append (
' <div class= " moduleimpl_evaluations_top_links " > '
+ top_table_links
+ " </div> "
)
H . append ( """ <table class= " moduleimpl_evaluations " > """ )
2022-12-15 17:09:35 +01:00
eval_index = nb_evaluations - 1
2021-12-19 11:08:03 +01:00
first_eval = True
2022-12-15 17:09:35 +01:00
for evaluation in evaluations :
2022-10-01 18:55:32 +02:00
H . append (
_ligne_evaluation (
modimpl ,
2022-12-15 17:09:35 +01:00
evaluation ,
2022-10-01 18:55:32 +02:00
first_eval = first_eval ,
partition_id = partition_id ,
arrow_down = arrow_down ,
arrow_none = arrow_none ,
arrow_up = arrow_up ,
can_edit_evals = can_edit_evals ,
can_edit_notes = can_edit_notes ,
eval_index = eval_index ,
2022-12-15 17:09:35 +01:00
nb_evals = nb_evaluations ,
2022-10-02 18:43:18 +02:00
is_apc = nt . is_apc ,
2022-12-16 01:27:52 +01:00
max_poids = max_poids ,
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
)
2020-09-26 16:19:37 +02:00
eval_index - = 1
2022-10-01 18:55:32 +02:00
first_eval = False
#
H . append ( """ <tr><td colspan= " 8 " > """ )
if sem_locked :
H . append ( f """ { scu . icontag ( " lock32_img " ) } semestre verrouillé """ )
elif can_edit_evals :
H . append ( top_table_links )
H . append (
f """ </td></tr>
< / table >
< / div >
< ! - - LEGENDE - - >
< hr >
< h4 > Légende < / h4 >
< ul >
< li > { scu . icontag ( " edit_img " ) } : modifie description de l ' évaluation
( date , heure , coefficient , . . . )
< / li >
< li > { scu . icontag ( " notes_img " ) } : saisie des notes < / li >
< li > { scu . icontag ( " delete_img " ) } : indique qu ' il n ' y a aucune note
entrée ( cliquer pour supprimer cette évaluation )
< / li >
< li > { scu . icontag ( " status_orange_img " ) } : indique qu ' il manque
quelques notes dans cette évaluation
< / li >
< li > { scu . icontag ( " status_green_img " ) } : toutes les notes sont
entrées ( cliquer pour les afficher )
< / li >
< li > { scu . icontag ( " status_visible_img " ) } : indique que cette évaluation
sera mentionnée dans les bulletins au format " intermédiaire "
< / li >
< / ul >
< p > Rappel : seules les notes des évaluations complètement saisies
( affichées en vert ) apparaissent dans les bulletins .
< / p >
"""
)
H . append ( html_sco_header . sco_footer ( ) )
return " " . join ( H )
def _ligne_evaluation (
modimpl : ModuleImpl ,
2022-12-15 17:09:35 +01:00
evaluation : Evaluation ,
2022-10-01 18:55:32 +02:00
first_eval : bool = True ,
2022-12-16 01:27:52 +01:00
partition_id : int = None ,
2022-10-01 18:55:32 +02:00
arrow_down = None ,
arrow_none = None ,
arrow_up = None ,
can_edit_evals : bool = False ,
can_edit_notes : bool = False ,
eval_index : int = 0 ,
nb_evals : int = 0 ,
2022-12-16 01:27:52 +01:00
is_apc : bool = False ,
max_poids : float = 0.0 ,
2022-10-01 18:55:32 +02:00
) - > str :
""" Ligne <tr> décrivant une évaluation dans le tableau de bord moduleimpl. """
H = [ ]
2022-12-15 17:09:35 +01:00
# evaluation: Evaluation = Evaluation.query.get(eval_dict["evaluation_id"])
2022-10-01 18:55:32 +02:00
etat = sco_evaluations . do_evaluation_etat (
evaluation . id ,
partition_id = partition_id ,
select_first_partition = True ,
)
if evaluation . evaluation_type in (
scu . EVALUATION_RATTRAPAGE ,
scu . EVALUATION_SESSION2 ,
) :
tr_class = " mievr mievr_rattr "
else :
tr_class = " mievr "
tr_class_1 = " mievr "
if not first_eval :
H . append ( """ <tr><td colspan= " 8 " > </td></tr> """ )
tr_class_1 + = " mievr_spaced "
2023-01-26 14:49:04 +01:00
H . append (
f """ <tr class= " { tr_class_1 } mievr_tit " ><td class= " mievr_tit " colspan= " 8 " > """
)
2022-10-02 18:43:18 +02:00
coef = evaluation . coefficient
if is_apc :
2022-10-05 10:31:25 +02:00
if not evaluation . get_ue_poids_dict ( ) :
# Au cas où les poids par défaut n'existent pas encore:
if evaluation . set_default_poids ( ) :
db . session . commit ( )
2022-10-02 18:43:18 +02:00
coef * = sum ( evaluation . get_ue_poids_dict ( ) . values ( ) )
2022-10-15 10:27:00 +02:00
if modimpl . module . ue . type != UE_SPORT :
# Avertissement si coefs x poids nuls
if coef < scu . NOTES_PRECISION :
H . append ( """ <span class= " eval_warning_coef " >coef. nul !</span> """ )
elif is_apc :
2022-12-16 01:27:52 +01:00
# visualisation des poids (Hinton map)
H . append ( _evaluation_poids_html ( evaluation , max_poids ) )
2022-12-15 17:09:35 +01:00
H . append ( """ <div class= " evaluation_titre " > """ )
2022-10-01 18:55:32 +02:00
if evaluation . jour :
H . append (
f """ Le { evaluation . jour . strftime ( " %d / % m/ % Y " ) } { evaluation . descr_heure ( ) } """
)
else :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
f """ <a href= " { url_for ( " notes.evaluation_edit " ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " class= " mievr_evalnodate " >Évaluation sans date</a> " " "
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
H . append ( f " <em> { evaluation . description or ' ' } </em> " )
if evaluation . evaluation_type == scu . EVALUATION_RATTRAPAGE :
H . append (
""" <span class= " mievr_rattr " title= " remplace si meilleure note " >rattrapage</span> """
)
elif evaluation . evaluation_type == scu . EVALUATION_SESSION2 :
H . append (
""" <span class= " mievr_rattr " title= " remplace autres notes " >session 2</span> """
)
#
if etat [ " last_modif " ] :
H . append (
f """ <span class= " mievr_lastmodif " >(dernière modif le {
etat [ " last_modif " ] . strftime ( " %d / % m/ % Y à % Hh % M " ) } ) < / span > """
)
#
2022-10-02 18:43:18 +02:00
H . append (
2023-01-26 14:49:04 +01:00
f """
< / td >
< td class = " evaluation_order " >
2022-10-02 18:43:18 +02:00
< span class = " evalindex " title = " Indice dans les vecteurs (formules) " > {
eval_index : 2 } < / span >
< span class = " eval_arrows_chld " >
"""
)
2022-10-01 18:55:32 +02:00
# Fleches:
if eval_index != ( nb_evals - 1 ) and can_edit_evals :
H . append (
2023-01-27 14:20:52 +01:00
f """ <a href= " { url_for ( " notes.moduleimpl_evaluation_move " ,
2022-10-02 18:43:18 +02:00
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id , after = 0 )
} " class= " aud " > {arrow_up} </a> " " "
2022-10-01 18:55:32 +02:00
)
else :
H . append ( arrow_none )
if ( eval_index > 0 ) and can_edit_evals :
H . append (
2023-01-27 14:20:52 +01:00
f """ <a href= " { url_for ( " notes.moduleimpl_evaluation_move " ,
2022-10-02 18:43:18 +02:00
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id , after = 1 )
} " class= " aud " > {arrow_down} </a> " " "
2022-10-01 18:55:32 +02:00
)
else :
H . append ( arrow_none )
2020-09-26 16:19:37 +02:00
2022-10-01 18:55:32 +02:00
if etat [ " evalcomplete " ] :
etat_txt = """ (prise en compte) """
etat_descr = " notes utilisées dans les moyennes "
2023-01-09 00:09:18 +01:00
elif etat [ " evalattente " ] and not evaluation . publish_incomplete :
2023-01-08 22:53:33 +01:00
etat_txt = " (prise en compte, mais <b>notes en attente</b>) "
etat_descr = " il y a des notes en attente "
2022-12-15 17:09:35 +01:00
elif evaluation . publish_incomplete :
2022-10-01 18:55:32 +02:00
etat_txt = """ (prise en compte <b>immédiate</b>) """
etat_descr = (
" il manque des notes, mais la prise en compte immédiate a été demandée "
)
elif etat [ " nb_notes " ] != 0 :
etat_txt = " (<b>non</b> prise en compte) "
etat_descr = " il manque des notes "
else :
etat_txt = " "
if can_edit_evals and etat_txt :
2022-10-02 18:43:18 +02:00
etat_txt = f """ <a href= " { url_for ( " notes.evaluation_edit " ,
2022-10-01 18:55:32 +02:00
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " title= " { etat_descr } " > {etat_txt} </a> " " "
2020-09-26 16:19:37 +02:00
2022-10-01 18:55:32 +02:00
H . append (
2023-01-26 14:49:04 +01:00
f """ </span></span></td>
< / tr >
< tr class = " {tr_class} " >
< th class = " moduleimpl_evaluations " colspan = " 2 " > & nbsp ; < / th >
< th class = " moduleimpl_evaluations " > Durée < / th >
< th class = " moduleimpl_evaluations " > Coef . < / th >
< th class = " moduleimpl_evaluations " > Notes < / th >
< th class = " moduleimpl_evaluations " > Abs < / th >
< th class = " moduleimpl_evaluations " > N < / th >
< th class = " moduleimpl_evaluations " colspan = " 2 " > Moyenne { etat_txt } < / th >
< / tr >
< tr class = " {tr_class} " >
< td class = " mievr " > """
2022-10-01 18:55:32 +02:00
)
if can_edit_evals :
H . append (
f """ <a class= " smallbutton " href= " { url_for ( ' notes.evaluation_edit ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " > { scu.icontag( " edit_img " , alt= " modifier " , title= " Modifier informations " )}</a> " " "
)
if can_edit_notes :
H . append (
f """ <a class= " smallbutton " href= " { url_for ( ' notes.saisie_notes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " > { scu.icontag( " notes_img " , alt= " saisie notes " , title= " Saisie des notes " )}</a> " " "
)
if etat [ " nb_notes " ] == 0 :
2022-04-28 07:06:01 +02:00
if can_edit_evals :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
f """ <a class= " smallbutton " href= " { url_for ( ' notes.evaluation_delete ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " > " " "
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
H . append ( scu . icontag ( " delete_img " , alt = " supprimer " , title = " Supprimer " ) )
if can_edit_evals :
H . append ( """ </a> """ )
elif etat [ " evalcomplete " ] :
H . append (
f """ <a class= " smallbutton " href= " { url_for ( ' notes.evaluation_listenotes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " > { scu.icontag( " status_green_img " , title= " ok " )}</a> " " "
)
else :
if etat [ " evalattente " ] :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
f """ <a class= " smallbutton " href= " { url_for ( ' notes.evaluation_listenotes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " > { scu.icontag(
" status_greenorange_img " ,
file_format = " gif " ,
title = " notes en attente " ,
) } < / a > """
2020-09-26 16:19:37 +02:00
)
else :
H . append (
2022-10-01 18:55:32 +02:00
f """ <a class= " smallbutton " href= " { url_for ( ' notes.evaluation_listenotes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " > { scu.icontag( " status_orange_img " , title= " il manque des notes " )}</a> " " "
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
#
2022-12-15 17:09:35 +01:00
if evaluation . visibulletin :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
scu . icontag (
" status_visible_img " , title = " visible dans bulletins intermédiaires "
)
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
else :
H . append ( " " )
H . append ( ' </td><td class= " mievr_menu " > ' )
if can_edit_notes :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
moduleimpl_evaluation_menu (
evaluation . id ,
nbnotes = etat [ " nb_notes " ] ,
)
)
#
H . append (
2022-10-02 18:43:18 +02:00
f """ </td>
2022-12-15 17:09:35 +01:00
< td class = " mievr_dur " > { evaluation . descr_duree ( ) } < / td >
< td class = " rightcell mievr_coef " > { evaluation . coefficient : g } < / td >
2022-10-02 18:43:18 +02:00
"""
2022-10-01 18:55:32 +02:00
)
H . append (
2022-10-02 18:43:18 +02:00
f """
< td class = " rightcell mievr_nbnotes " > { etat [ " nb_notes " ] } / { etat [ " nb_inscrits " ] } < / td >
< td class = " rightcell mievr_coef " > { etat [ " nb_abs " ] } < / td >
< td class = " rightcell mievr_coef " > { etat [ " nb_neutre " ] } < / td >
2023-01-26 14:49:04 +01:00
< td class = " rightcell " colspan = " 2 " > """
2022-10-01 18:55:32 +02:00
% etat
)
if etat [ " moy " ] :
H . append (
2022-12-15 17:09:35 +01:00
f """ <b> { etat [ " moy " ] } / { evaluation . note_max : g } </b>
2022-10-02 18:43:18 +02:00
& nbsp ; ( < a class = " stdlink " href = " {
url_for ( ' notes.evaluation_listenotes ' ,
2022-10-01 18:55:32 +02:00
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " >afficher</a>) " " "
)
else :
H . append (
f """ <a class= " redlink " href= " { url_for ( ' notes.saisie_notes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id )
} " >saisir notes</a>
"""
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
H . append ( """ </td></tr> """ )
#
if etat [ " nb_notes " ] == 0 :
H . append ( f """ <tr class= " { tr_class } " ><td></td> """ )
if modimpl . module . is_apc ( ) :
2021-01-02 22:07:38 +01:00
H . append (
2023-01-26 14:49:04 +01:00
f """ <td colspan= " 8 " class= " eval_poids " > {
2022-10-01 18:55:32 +02:00
evaluation . get_ue_poids_str ( ) } < / td > """
2021-01-02 22:07:38 +01:00
)
2020-09-26 16:19:37 +02:00
else :
2023-01-26 14:49:04 +01:00
H . append ( ' <td colspan= " 8 " ></td> ' )
2022-10-01 18:55:32 +02:00
H . append ( """ </tr> """ )
else : # il y a deja des notes saisies
gr_moyennes = etat [ " gr_moyennes " ]
first_group = True
for gr_moyenne in gr_moyennes :
H . append ( f """ <tr class= " { tr_class } " ><td> </td> """ )
if first_group and modimpl . module . is_apc ( ) :
2021-12-19 11:08:03 +01:00
H . append (
2022-12-16 01:27:52 +01:00
f """ <td class= " eval_poids " colspan= " 4 " > {
2021-12-19 11:08:03 +01:00
evaluation . get_ue_poids_str ( ) } < / td > """
)
else :
2022-12-16 01:27:52 +01:00
H . append ( """ <td colspan= " 4 " ></td> """ )
2022-10-01 18:55:32 +02:00
first_group = False
if gr_moyenne [ " group_name " ] is None :
name = " Tous " # tous
else :
name = f """ Groupe { gr_moyenne [ " group_name " ] } """
2023-01-26 14:49:04 +01:00
H . append (
f """ <td colspan= " 2 " class= " mievr_grtit " > { name } </td>
< td colspan = " 2 " > """
)
2022-10-01 18:55:32 +02:00
if gr_moyenne [ " gr_nb_notes " ] > 0 :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
f """ { gr_moyenne [ " gr_moy " ] } (<a href= " {
url_for ( ' notes.evaluation_listenotes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id ,
tf_submitted = 1 , * * { ' group_ids:list ' : gr_moyenne [ " group_id " ] } )
} " > {gr_moyenne["gr_nb_notes"]} notes</a> " " "
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
if gr_moyenne [ " gr_nb_att " ] > 0 :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-02 18:43:18 +02:00
f """ , <span class= " redboldtext " > {
gr_moyenne [ " gr_nb_att " ] } en attente < / span > """
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
H . append ( """ ) """ )
if gr_moyenne [ " group_id " ] in etat [ " gr_incomplets " ] :
H . append ( """ [<font color= " red " > """ )
2022-04-28 07:06:01 +02:00
if can_edit_notes :
2020-09-26 16:19:37 +02:00
H . append (
2022-10-01 18:55:32 +02:00
f """ <a class= " redlink " href= " { url_for ( ' notes.saisie_notes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id ,
* * { ' group_ids:list ' : gr_moyenne [ " group_id " ] } )
} " >incomplet</a></font>] " " "
2020-09-26 16:19:37 +02:00
)
2022-10-01 18:55:32 +02:00
else :
H . append ( """ incomplet</font>] """ )
else :
H . append ( """ <span class= " redboldtext " > """ )
if can_edit_notes :
H . append (
f """ <a class= " redlink " href= " { url_for ( ' notes.saisie_notes ' ,
scodoc_dept = g . scodoc_dept , evaluation_id = evaluation . id ,
* * { ' group_ids:list ' : gr_moyenne [ " group_id " ] } )
2022-10-03 11:07:43 +02:00
} " > " " "
2022-10-01 18:55:32 +02:00
)
H . append ( " pas de notes " )
if can_edit_notes :
H . append ( """ </a> """ )
H . append ( " </span> " )
H . append ( """ </td></tr> """ )
return " \n " . join ( H )
2022-10-02 18:43:18 +02:00
2022-12-16 01:27:52 +01:00
def _evaluation_poids_html ( evaluation : Evaluation , max_poids : float = 0.0 ) - > str :
""" graphe html (Hinton map) montrant les poids x coef de l ' évaluation """
2022-10-03 09:04:04 +02:00
ue_poids = evaluation . get_ue_poids_dict ( sort = True ) # { ue_id : poids }
2022-10-02 18:43:18 +02:00
if not ue_poids :
2022-12-17 03:33:04 +01:00
return " "
2022-10-02 18:43:18 +02:00
if max_poids < scu . NOTES_PRECISION :
2022-12-17 03:33:04 +01:00
return " "
2022-10-02 18:43:18 +02:00
H = (
""" <div class= " evaluation_poids " > """
+ " \n " . join (
[
2022-10-03 11:07:43 +02:00
f """ <div title= " poids vers { ue . acronyme } : { poids : g } " >
2022-12-16 01:27:52 +01:00
< div style = " --size: { math.sqrt(poids*(evaluation.coefficient or 0.)/max_poids*144)}px;
2022-10-03 11:07:43 +02:00
{ ' background-color: ' + ue . color + ' ; ' if ue . color else ' ' }
" ></div>
< / div > """
2022-10-02 18:43:18 +02:00
for ue , poids in (
( UniteEns . query . get ( ue_id ) , poids )
for ue_id , poids in ue_poids . items ( )
)
]
)
+ " </div> "
)
return H