2020-09-26 16:19:37 +02:00
# -*- mode: python -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Gestion scolarite IUT
#
2021-01-01 17:51:08 +01:00
# Copyright (c) 1999 - 2021 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 semestre
"""
2021-06-17 00:08:37 +02:00
from flask import current_app
2021-07-09 10:26:31 +02:00
from flask import g
2021-07-29 16:31:15 +02:00
from flask import request
2021-07-09 10:26:31 +02:00
from flask import url_for
2021-07-29 16:31:15 +02:00
from flask_login import current_user
2020-09-26 16:19:37 +02:00
2021-08-29 19:57:32 +02:00
from app import log
2021-06-19 23:21:37 +02:00
import app . scodoc . sco_utils as scu
import app . scodoc . notesdb as ndb
from app . scodoc . sco_permissions import Permission
from app . scodoc . sco_exceptions import ScoValueError , ScoInvalidDateError
2021-08-21 17:07:44 +02:00
import sco_version
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_archives
from app . scodoc import sco_bulletins
from app . scodoc import sco_codes_parcours
from app . scodoc import sco_compute_moy
2021-07-19 19:53:01 +02:00
from app . scodoc import sco_cache
2021-06-19 23:21:37 +02:00
from app . scodoc import sco_edit_ue
from app . scodoc import sco_evaluations
from app . scodoc import sco_formations
from app . scodoc import sco_formsemestre
from app . scodoc import sco_formsemestre_edit
from app . scodoc import sco_formsemestre_inscriptions
from app . scodoc import sco_groups
from app . scodoc import sco_moduleimpl
from app . scodoc import sco_permissions_check
from app . scodoc import sco_preferences
2021-07-03 23:35:32 +02:00
from app . scodoc import sco_users
2021-06-19 23:21:37 +02:00
from app . scodoc . gen_tables import GenTable
from app . scodoc . sco_formsemestre_custommenu import formsemestre_custommenu_html
2020-09-26 16:19:37 +02:00
2021-08-21 00:24:51 +02:00
def _build_menu_stats ( formsemestre_id ) :
2021-09-13 19:36:53 +02:00
" Définition du menu ' Statistiques ' "
2020-09-26 16:19:37 +02:00
return [
{
" title " : " Statistiques... " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_report_counts " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Suivi de cohortes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_suivi_cohorte " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
} ,
{
" title " : " Graphe des parcours " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_graph_parcours " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-25 16:42:47 +02:00
" enabled " : True ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Codes des parcours " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_suivi_parcours " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
} ,
{
" title " : " Lycées d ' origine " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_etuds_lycees " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
} ,
{
" title " : ' Table " poursuite " ' ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_poursuite_report " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
} ,
{
" title " : " Documents Avis Poursuite Etudes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.pe_view_sem_recap " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
" enabled " : True ,
} ,
{
" title " : ' Table " débouchés " ' ,
" endpoint " : " notes.report_debouche_date " ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
} ,
{
" title " : " Estimation du coût de la formation " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " notes.formsemestre_estim_cost " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
} ,
]
2021-08-21 00:24:51 +02:00
def formsemestre_status_menubar ( sem ) :
2020-09-26 16:19:37 +02:00
""" HTML to render menubar """
formsemestre_id = sem [ " formsemestre_id " ]
if int ( sem [ " etat " ] ) :
change_lock_msg = " Verrouiller "
else :
change_lock_msg = " Déverrouiller "
2021-08-19 10:28:35 +02:00
F = sco_formations . formation_list ( args = { " formation_id " : sem [ " formation_id " ] } ) [ 0 ]
2020-09-26 16:19:37 +02:00
menuSemestre = [
{
" title " : " Tableau de bord " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_status " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " Tableau de bord du semestre " ,
} ,
{
" title " : " Voir la formation %(acronyme)s (v %(version)s ) " % F ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.ue_list " ,
" args " : { " formation_id " : sem [ " formation_id " ] } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " Tableau de bord du semestre " ,
} ,
{
" title " : " Modifier le semestre " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " notes.formsemestre_editwithmodules " ,
" args " : {
" formation_id " : sem [ " formation_id " ] ,
" formsemestre_id " : formsemestre_id ,
} ,
2020-09-26 16:19:37 +02:00
" enabled " : (
2021-07-29 16:31:15 +02:00
current_user . has_permission ( Permission . ScoImplement )
2021-08-22 13:24:36 +02:00
or ( current_user . id in sem [ " responsables " ] and sem [ " resp_can_edit " ] )
2020-09-26 16:19:37 +02:00
)
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " Modifie le contenu du semestre (modules) " ,
} ,
{
" title " : " Préférences du semestre " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.formsemestre_edit_preferences " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : (
2021-07-29 16:31:15 +02:00
current_user . has_permission ( Permission . ScoImplement )
2021-08-22 13:24:36 +02:00
or ( current_user . id in sem [ " responsables " ] and sem [ " resp_can_edit " ] )
2020-09-26 16:19:37 +02:00
)
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " Préférences du semestre " ,
} ,
{
" title " : " Réglages bulletins " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_edit_options " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-08-22 13:24:36 +02:00
" enabled " : ( current_user . id in sem [ " responsables " ] )
2021-07-29 16:31:15 +02:00
or current_user . has_permission ( Permission . ScoImplement ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " Change les options " ,
} ,
{
" title " : change_lock_msg ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_change_lock " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-08-22 13:24:36 +02:00
" enabled " : ( current_user . id in sem [ " responsables " ] )
2021-07-29 16:31:15 +02:00
or current_user . has_permission ( Permission . ScoImplement ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " " ,
} ,
{
" title " : " Description du semestre " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_description " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " " ,
} ,
{
" title " : " Vérifier absences aux évaluations " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_check_absences_html " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " " ,
} ,
{
" title " : " Lister tous les enseignants " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_enseignants_list " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " " ,
} ,
{
" title " : " Cloner ce semestre " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_clone " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoImplement ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " " ,
} ,
{
" title " : " Associer à une nouvelle version du programme " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_associate_new_version " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoChangeFormation )
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " " ,
} ,
{
" title " : " Supprimer ce semestre " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_delete " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoImplement ) ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " " ,
} ,
]
# debug :
2021-06-17 00:08:37 +02:00
if current_app . config [ " ENV " ] == " development " :
2020-09-26 16:19:37 +02:00
menuSemestre . append (
{
2021-07-07 10:01:36 +02:00
" title " : " Vérifier l ' intégrité " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.check_sem_integrity " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
}
)
menuInscriptions = [
{
" title " : " Voir les inscriptions aux modules " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.moduleimpl_inscriptions_stats " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
}
]
menuInscriptions + = [
{
" title " : " Passage des étudiants depuis d ' autres semestres " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_inscr_passage " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoEtudInscrit )
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Synchroniser avec étape Apogée " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_synchro_etuds " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoView )
2021-07-28 17:03:54 +02:00
and sco_preferences . get_preference ( " portal_url " )
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Inscrire un étudiant " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_inscription_with_modules_etud " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoEtudInscrit )
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Importer des étudiants dans ce semestre (table Excel) " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.form_students_import_excel " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoEtudInscrit )
2021-08-10 12:57:38 +02:00
and ( sem [ " etat " ] ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Import/export des données admission " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.form_students_import_infos_admissions " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoView ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Resynchroniser données identité " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.formsemestre_import_etud_admission " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : current_user . has_permission ( Permission . ScoEtudChangeAdr )
2021-07-28 17:03:54 +02:00
and sco_preferences . get_preference ( " portal_url " ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Exporter table des étudiants " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.groups_view " ,
2021-06-14 18:08:52 +02:00
" args " : {
2021-06-17 00:08:37 +02:00
" format " : " allxls " ,
2021-06-14 18:08:52 +02:00
" group_ids " : sco_groups . get_default_group (
2021-07-29 16:31:15 +02:00
formsemestre_id , fix_if_missing = True
2021-06-14 18:08:52 +02:00
) ,
} ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Vérifier inscriptions multiples " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_inscrits_ailleurs " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
]
menuGroupes = [
{
" title " : " Listes, photos, feuilles... " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.groups_view " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " Accès aux listes des groupes d ' étudiants " ,
} ,
{
" title " : " Créer/modifier les partitions... " ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.editPartitionForm " ,
2021-06-14 18:08:52 +02:00
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-06-21 10:17:16 +02:00
" enabled " : sco_groups . sco_permissions_check . can_change_groups (
2021-07-29 16:31:15 +02:00
formsemestre_id
2021-06-21 10:17:16 +02:00
) ,
2020-09-26 16:19:37 +02:00
} ,
]
# 1 item / partition:
2021-08-19 10:28:35 +02:00
partitions = sco_groups . get_partitions_list ( formsemestre_id , with_default = False )
2020-09-26 16:19:37 +02:00
submenu = [ ]
2021-01-17 22:31:28 +01:00
enabled = (
2021-07-29 16:31:15 +02:00
sco_groups . sco_permissions_check . can_change_groups ( formsemestre_id )
2021-06-21 10:17:16 +02:00
and partitions
2021-01-17 22:31:28 +01:00
)
2020-09-26 16:19:37 +02:00
for partition in partitions :
submenu . append (
{
" title " : " %s " % partition [ " partition_name " ] ,
2021-06-19 23:21:37 +02:00
" endpoint " : " scolar.affectGroups " ,
2021-06-14 18:08:52 +02:00
" args " : { " partition_id " : partition [ " partition_id " ] } ,
2020-09-26 16:19:37 +02:00
" enabled " : enabled ,
}
)
menuGroupes . append (
{ " title " : " Modifier les groupes " , " submenu " : submenu , " enabled " : enabled }
)
menuNotes = [
{
" title " : " Tableau des moyennes (et liens bulletins) " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_recapcomplet " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Saisie des notes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_status " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" enabled " : True ,
" helpmsg " : " Tableau de bord du semestre " ,
} ,
{
" title " : " Classeur PDF des bulletins " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_bulletins_pdf_choice " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
" helpmsg " : " PDF regroupant tous les bulletins " ,
} ,
{
" title " : " Envoyer à chaque étudiant son bulletin par e-mail " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_bulletins_mailetuds_choice " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-08-20 10:51:42 +02:00
" enabled " : sco_bulletins . can_send_bulletin_by_mail ( formsemestre_id ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Calendrier des évaluations " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_evaluations_cal " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Lister toutes les saisies de notes " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_list_saisies_notes " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
]
menuJury = [
{
" title " : " Voir les décisions du jury " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_pvjury " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Générer feuille préparation Jury " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.feuille_preparation_jury " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Saisie des décisions du jury " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_recapcomplet " ,
" args " : {
" formsemestre_id " : formsemestre_id ,
" modejury " : 1 ,
" hidemodules " : 1 ,
" hidebac " : 1 ,
" pref_override " : 0 ,
} ,
2021-07-29 16:31:15 +02:00
" enabled " : sco_permissions_check . can_validate_sem ( formsemestre_id ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Editer les PV et archiver les résultats " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_archive " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-07-29 16:31:15 +02:00
" enabled " : sco_permissions_check . can_edit_pv ( formsemestre_id ) ,
2020-09-26 16:19:37 +02:00
} ,
{
" title " : " Documents archivés " ,
2021-06-14 18:08:52 +02:00
" endpoint " : " notes.formsemestre_list_archives " ,
" args " : { " formsemestre_id " : formsemestre_id } ,
2021-08-20 10:51:42 +02:00
" enabled " : sco_archives . PVArchive . list_obj_archives ( formsemestre_id ) ,
2020-09-26 16:19:37 +02:00
} ,
]
2021-08-21 00:24:51 +02:00
menuStats = _build_menu_stats ( formsemestre_id )
2020-09-26 16:19:37 +02:00
H = [
# <table><tr><td>',
' <ul id= " sco_menu " > ' ,
2021-06-14 18:08:52 +02:00
htmlutils . make_menu ( " Semestre " , menuSemestre ) ,
htmlutils . make_menu ( " Inscriptions " , menuInscriptions ) ,
htmlutils . make_menu ( " Groupes " , menuGroupes ) ,
htmlutils . make_menu ( " Notes " , menuNotes ) ,
htmlutils . make_menu ( " Jury " , menuJury ) ,
htmlutils . make_menu ( " Statistiques " , menuStats ) ,
2021-08-21 00:24:51 +02:00
formsemestre_custommenu_html ( formsemestre_id ) ,
2020-09-26 16:19:37 +02:00
" </ul> " ,
#'</td></tr></table>'
]
return " \n " . join ( H )
2021-07-29 16:31:15 +02:00
def retreive_formsemestre_from_request ( ) :
2020-09-26 16:19:37 +02:00
""" Cherche si on a de quoi déduire le semestre affiché à partir des
2020-10-14 15:28:09 +02:00
arguments de la requête :
2020-09-26 16:19:37 +02:00
formsemestre_id ou moduleimpl ou evaluation ou group_id ou partition_id
"""
2021-07-29 16:31:15 +02:00
if request . method == " GET " :
args = request . args
elif request . method == " POST " :
args = request . form
else :
return None
2020-09-26 16:19:37 +02:00
# Search formsemestre
2021-07-29 16:31:15 +02:00
group_ids = args . get ( " group_ids " , [ ] )
if " formsemestre_id " in args :
formsemestre_id = args [ " formsemestre_id " ]
2021-08-16 22:41:09 +02:00
elif " moduleimpl_id " in args and args [ " moduleimpl_id " ] :
2021-08-20 01:09:55 +02:00
modimpl = sco_moduleimpl . do_moduleimpl_list ( moduleimpl_id = args [ " moduleimpl_id " ] )
2020-09-26 16:19:37 +02:00
if not modimpl :
return None # suppressed ?
modimpl = modimpl [ 0 ]
formsemestre_id = modimpl [ " formsemestre_id " ]
2021-07-29 16:31:15 +02:00
elif " evaluation_id " in args :
E = sco_evaluations . do_evaluation_list ( { " evaluation_id " : args [ " evaluation_id " ] } )
2020-09-26 16:19:37 +02:00
if not E :
return None # evaluation suppressed ?
E = E [ 0 ]
2021-08-20 01:09:55 +02:00
modimpl = sco_moduleimpl . do_moduleimpl_list ( moduleimpl_id = E [ " moduleimpl_id " ] ) [ 0 ]
2020-09-26 16:19:37 +02:00
formsemestre_id = modimpl [ " formsemestre_id " ]
2021-07-29 16:31:15 +02:00
elif " group_id " in args :
2021-08-19 10:28:35 +02:00
group = sco_groups . get_group ( args [ " group_id " ] )
2020-09-26 16:19:37 +02:00
formsemestre_id = group [ " formsemestre_id " ]
elif group_ids :
if group_ids :
2021-07-11 22:32:01 +02:00
if isinstance ( group_ids , str ) :
2020-09-26 16:19:37 +02:00
group_id = group_ids
else :
# prend le semestre du 1er groupe de la liste:
group_id = group_ids [ 0 ]
2021-08-19 10:28:35 +02:00
group = sco_groups . get_group ( group_id )
2020-09-26 16:19:37 +02:00
formsemestre_id = group [ " formsemestre_id " ]
2021-07-29 16:31:15 +02:00
elif " partition_id " in args :
2021-08-19 10:28:35 +02:00
partition = sco_groups . get_partition ( args [ " partition_id " ] )
2020-09-26 16:19:37 +02:00
formsemestre_id = partition [ " formsemestre_id " ]
else :
return None # no current formsemestre
return formsemestre_id
# Element HTML decrivant un semestre (barre de menu et infos)
2021-08-21 00:24:51 +02:00
def formsemestre_page_title ( ) :
2020-09-26 16:19:37 +02:00
""" Element HTML decrivant un semestre (barre de menu et infos)
Cherche dans REQUEST si un semestre est défini ( formsemestre_id ou moduleimpl ou evaluation ou group )
"""
2021-07-29 16:31:15 +02:00
formsemestre_id = retreive_formsemestre_from_request ( )
2020-09-26 16:19:37 +02:00
#
if not formsemestre_id :
return " "
try :
2021-09-13 19:36:53 +02:00
formsemestre_id = int ( formsemestre_id )
2021-08-19 10:28:35 +02:00
sem = sco_formsemestre . get_formsemestre ( formsemestre_id ) . copy ( )
2020-09-26 16:19:37 +02:00
except :
log ( " can ' t find formsemestre_id %s " % formsemestre_id )
return " "
2021-07-29 16:31:15 +02:00
fill_formsemestre ( sem )
2020-09-26 16:19:37 +02:00
H = [
""" <div class= " formsemestre_page_title " > """ ,
""" <div class= " infos " >
< span class = " semtitle " > < a class = " stdlink " title = " %(session_id)s " href = " %(notes_url)s /formsemestre_status?formsemestre_id= %(formsemestre_id)s " > % ( titre ) s < / a > < a title = " %(etape_apo_str)s " > % ( num_sem ) s < / a > % ( modalitestr ) s < / span > < span class = " dates " > < a title = " du %(date_debut)s au %(date_fin)s " > % ( mois_debut ) s - % ( mois_fin ) s < / a > < / span > < span class = " resp " > < a title = " %(nomcomplet)s " > % ( resp ) s < / a > < / span > < span class = " nbinscrits " > < a class = " discretelink " href = " %(notes_url)s /formsemestre_lists?formsemestre_id= %(formsemestre_id)s " > % ( nbinscrits ) d inscrits < / a > < / span > < span class = " lock " > % ( locklink ) s < / span > < span class = " eye " > % ( eyelink ) s < / span > < / div > """
% sem ,
2021-08-21 00:24:51 +02:00
formsemestre_status_menubar ( sem ) ,
2020-09-26 16:19:37 +02:00
""" </div> """ ,
]
return " \n " . join ( H )
2021-07-29 16:31:15 +02:00
def fill_formsemestre ( sem ) :
2020-10-14 15:28:09 +02:00
""" Add some useful fields to help display formsemestres """
2021-06-15 12:34:33 +02:00
notes_url = scu . NotesURL ( )
2020-09-26 16:19:37 +02:00
sem [ " notes_url " ] = notes_url
formsemestre_id = sem [ " formsemestre_id " ]
2021-08-10 12:57:38 +02:00
if not sem [ " etat " ] :
2020-10-14 15:28:09 +02:00
sem [
" locklink "
] = """ <a href= " %s /formsemestre_change_lock?formsemestre_id= %s " > %s </a> """ % (
notes_url ,
sem [ " formsemestre_id " ] ,
2021-01-17 22:31:28 +01:00
scu . icontag ( " lock_img " , border = " 0 " , title = " Semestre verrouillé " ) ,
2020-09-26 16:19:37 +02:00
)
else :
sem [ " locklink " ] = " "
2021-07-28 17:03:54 +02:00
if sco_preferences . get_preference ( " bul_display_publication " , formsemestre_id ) :
2021-08-11 00:36:07 +02:00
if sem [ " bul_hide_xml " ] :
2021-01-17 22:31:28 +01:00
eyeicon = scu . icontag ( " hide_img " , border = " 0 " , title = " Bulletins NON publiés " )
2020-09-26 16:19:37 +02:00
else :
2021-01-17 22:31:28 +01:00
eyeicon = scu . icontag ( " eye_img " , border = " 0 " , title = " Bulletins publiés " )
2020-09-26 16:19:37 +02:00
sem [ " eyelink " ] = (
""" <a href= " %s /formsemestre_change_publication_bul?formsemestre_id= %s " > %s </a> """
% ( notes_url , sem [ " formsemestre_id " ] , eyeicon )
)
else :
sem [ " eyelink " ] = " "
2021-08-19 10:28:35 +02:00
F = sco_formations . formation_list ( args = { " formation_id " : sem [ " formation_id " ] } ) [ 0 ]
2020-09-26 16:19:37 +02:00
sem [ " formation " ] = F
parcours = sco_codes_parcours . get_parcours_from_code ( F [ " type_parcours " ] )
if sem [ " semestre_id " ] != - 1 :
sem [ " num_sem " ] = " , %s %s " % ( parcours . SESSION_NAME , sem [ " semestre_id " ] )
else :
sem [ " num_sem " ] = " " # formation sans semestres
if sem [ " modalite " ] :
sem [ " modalitestr " ] = " en %s " % sem [ " modalite " ]
else :
sem [ " modalitestr " ] = " "
sem [ " etape_apo_str " ] = " Code étape Apogée: " + (
sco_formsemestre . formsemestre_etape_apo_str ( sem ) or " Pas de code étape "
)
2021-06-17 00:08:37 +02:00
inscrits = sco_formsemestre_inscriptions . do_formsemestre_inscription_list (
2021-08-19 10:28:35 +02:00
args = { " formsemestre_id " : formsemestre_id }
2020-09-26 16:19:37 +02:00
)
sem [ " nbinscrits " ] = len ( inscrits )
uresps = [
2021-07-03 23:35:32 +02:00
sco_users . user_info ( responsable_id ) for responsable_id in sem [ " responsables " ]
2020-09-26 16:19:37 +02:00
]
sem [ " resp " ] = " , " . join ( [ u [ " prenomnom " ] for u in uresps ] )
sem [ " nomcomplet " ] = " , " . join ( [ u [ " nomcomplet " ] for u in uresps ] )
# Description du semestre sous forme de table exportable
2021-08-21 00:24:51 +02:00
def formsemestre_description_table ( formsemestre_id , REQUEST = None , with_evals = False ) :
2020-09-26 16:19:37 +02:00
""" Description du semestre sous forme de table exportable
Liste des modules et de leurs coefficients
"""
2021-08-19 10:28:35 +02:00
sem = sco_formsemestre . get_formsemestre ( formsemestre_id )
2021-07-19 19:53:01 +02:00
nt = sco_cache . NotesTableCache . get ( formsemestre_id ) # > liste evaluations
2021-07-28 17:03:54 +02:00
use_ue_coefs = sco_preferences . get_preference ( " use_ue_coefs " , formsemestre_id )
2021-08-19 10:28:35 +02:00
F = sco_formations . formation_list ( args = { " formation_id " : sem [ " formation_id " ] } ) [ 0 ]
2020-09-26 16:19:37 +02:00
parcours = sco_codes_parcours . get_parcours_from_code ( F [ " type_parcours " ] )
2021-01-17 22:31:28 +01:00
Mlist = sco_moduleimpl . do_moduleimpl_withmodule_list (
2021-08-20 01:09:55 +02:00
formsemestre_id = formsemestre_id
2021-01-17 22:31:28 +01:00
)
2020-09-26 16:19:37 +02:00
R = [ ]
sum_coef = 0
sum_ects = 0
last_ue_id = None
for M in Mlist :
# Ligne UE avec ECTS:
ue = M [ " ue " ]
if ue [ " ue_id " ] != last_ue_id :
last_ue_id = ue [ " ue_id " ]
if ue [ " ects " ] is None :
ects_str = " - "
else :
sum_ects + = ue [ " ects " ]
ects_str = ue [ " ects " ]
ue_info = {
" UE " : ue [ " acronyme " ] ,
" ects " : ects_str ,
" Module " : ue [ " titre " ] ,
" _css_row_class " : " table_row_ue " ,
}
if use_ue_coefs :
ue_info [ " Coef. " ] = ue [ " coefficient " ]
ue_info [ " Coef._class " ] = " ue_coef "
R . append ( ue_info )
2021-01-17 22:31:28 +01:00
ModInscrits = sco_moduleimpl . do_moduleimpl_inscription_list (
2021-08-20 01:09:55 +02:00
moduleimpl_id = M [ " moduleimpl_id " ]
2020-09-26 16:19:37 +02:00
)
2020-12-24 01:00:41 +01:00
enseignants = " , " . join (
2021-07-03 23:35:32 +02:00
[ sco_users . user_info ( m [ " ens_id " ] , REQUEST ) [ " nomprenom " ] for m in M [ " ens " ] ]
2020-12-24 01:00:41 +01:00
)
2020-09-26 16:19:37 +02:00
l = {
" UE " : M [ " ue " ] [ " acronyme " ] ,
" Code " : M [ " module " ] [ " code " ] ,
" Module " : M [ " module " ] [ " abbrev " ] or M [ " module " ] [ " titre " ] ,
" _Module_class " : " scotext " ,
" Inscrits " : len ( ModInscrits ) ,
2021-07-03 23:35:32 +02:00
" Responsable " : sco_users . user_info ( M [ " responsable_id " ] ) [ " nomprenom " ] ,
2020-09-26 16:19:37 +02:00
" _Responsable_class " : " scotext " ,
2020-12-24 01:00:41 +01:00
" Enseignants " : enseignants ,
" _Enseignants_class " : " scotext " ,
2020-09-26 16:19:37 +02:00
" Coef. " : M [ " module " ] [ " coefficient " ] ,
# 'ECTS' : M['module']['ects'],
# Lien sur titre -> module
2021-08-15 22:08:38 +02:00
" _Module_target " : url_for (
" notes.moduleimpl_status " ,
scodoc_dept = g . scodoc_dept ,
moduleimpl_id = M [ " moduleimpl_id " ] ,
) ,
" _Code_target " : url_for (
" notes.moduleimpl_status " ,
scodoc_dept = g . scodoc_dept ,
moduleimpl_id = M [ " moduleimpl_id " ] ,
) ,
2020-09-26 16:19:37 +02:00
}
R . append ( l )
if M [ " module " ] [ " coefficient " ] :
sum_coef + = M [ " module " ] [ " coefficient " ]
if with_evals :
# Ajoute lignes pour evaluations
evals = nt . get_mod_evaluation_etat_list ( M [ " moduleimpl_id " ] )
evals . reverse ( ) # ordre chronologique
# Ajoute etat:
for e in evals :
# Cosmetic: conversions pour affichage
if e [ " etat " ] [ " evalcomplete " ] :
e [ " evalcomplete_str " ] = " Oui "
e [ " _evalcomplete_str_td_attrs " ] = ' style= " color: green; " '
else :
e [ " evalcomplete_str " ] = " Non "
e [ " _evalcomplete_str_td_attrs " ] = ' style= " color: red; " '
2021-08-11 00:36:07 +02:00
if e [ " publish_incomplete " ] :
2020-09-26 16:19:37 +02:00
e [ " publish_incomplete_str " ] = " Oui "
e [ " _publish_incomplete_str_td_attrs " ] = ' style= " color: green; " '
else :
e [ " publish_incomplete_str " ] = " Non "
e [ " _publish_incomplete_str_td_attrs " ] = ' style= " color: red; " '
R + = evals
sums = { " _css_row_class " : " moyenne sortbottom " , " ects " : sum_ects , " Coef. " : sum_coef }
R . append ( sums )
columns_ids = [ " UE " , " Code " , " Module " , " Coef. " ]
2021-07-28 17:03:54 +02:00
if sco_preferences . get_preference ( " bul_show_ects " , formsemestre_id ) :
2020-09-26 16:19:37 +02:00
columns_ids + = [ " ects " ]
2020-12-24 01:00:41 +01:00
columns_ids + = [ " Inscrits " , " Responsable " , " Enseignants " ]
2020-09-26 16:19:37 +02:00
if with_evals :
columns_ids + = [
" jour " ,
" description " ,
" coefficient " ,
" evalcomplete_str " ,
" publish_incomplete_str " ,
]
titles = { title : title for title in columns_ids }
titles [ " ects " ] = " ECTS "
titles [ " jour " ] = " Evaluation "
titles [ " description " ] = " "
titles [ " coefficient " ] = " Coef. éval. "
titles [ " evalcomplete_str " ] = " Complète "
titles [ " publish_incomplete_str " ] = " Toujours Utilisée "
2021-08-21 00:24:51 +02:00
title = " %s %s " % ( parcours . SESSION_NAME . capitalize ( ) , sem [ " titremois " ] )
2020-09-26 16:19:37 +02:00
return GenTable (
columns_ids = columns_ids ,
rows = R ,
titles = titles ,
2021-08-21 17:07:44 +02:00
origin = " Généré par %s le " % sco_version . SCONAME
+ scu . timedate_human_repr ( )
+ " " ,
2020-09-26 16:19:37 +02:00
caption = title ,
html_caption = title ,
html_class = " table_leftalign formsemestre_description " ,
2021-05-11 11:48:32 +02:00
base_url = " %s ?formsemestre_id= %s &with_evals= %s "
2020-09-26 16:19:37 +02:00
% ( REQUEST . URL0 , formsemestre_id , with_evals ) ,
page_title = title ,
2021-06-13 19:12:20 +02:00
html_title = html_sco_header . html_sem_header (
2021-08-20 10:51:42 +02:00
REQUEST , " Description du semestre " , sem , with_page_header = False
2020-09-26 16:19:37 +02:00
) ,
pdf_title = title ,
2021-07-28 17:03:54 +02:00
preferences = sco_preferences . SemPreferences ( formsemestre_id ) ,
2020-09-26 16:19:37 +02:00
)
def formsemestre_description (
2021-08-21 00:24:51 +02:00
formsemestre_id , format = " html " , with_evals = False , REQUEST = None
2020-09-26 16:19:37 +02:00
) :
""" Description du semestre sous forme de table exportable
Liste des modules et de leurs coefficients
"""
with_evals = int ( with_evals )
tab = formsemestre_description_table (
2021-08-21 00:24:51 +02:00
formsemestre_id , REQUEST , with_evals = with_evals
2020-09-26 16:19:37 +02:00
)
tab . html_before_table = """ <form name= " f " method= " get " action= " %s " >
< input type = " hidden " name = " formsemestre_id " value = " %s " > < / input >
< input type = " checkbox " name = " with_evals " value = " 1 " onchange = " document.f.submit() " """ % (
REQUEST . URL0 ,
formsemestre_id ,
)
if with_evals :
tab . html_before_table + = " checked "
tab . html_before_table + = " >indiquer les évaluations</input></form> "
2021-08-19 10:28:35 +02:00
return tab . make_page ( format = format , REQUEST = REQUEST )
2020-09-26 16:19:37 +02:00
2021-06-02 22:40:34 +02:00
# genere liste html pour accès aux groupes de ce semestre
2021-08-21 00:24:51 +02:00
def _make_listes_sem ( sem , REQUEST = None , with_absences = True ) :
2021-06-02 22:40:34 +02:00
# construit l'URL "destination"
# (a laquelle on revient apres saisie absences)
2021-07-26 16:52:38 +02:00
destination = url_for (
" notes.formsemestre_status " ,
scodoc_dept = g . scodoc_dept ,
formsemestre_id = sem [ " formsemestre_id " ] ,
2021-07-11 22:32:01 +02:00
)
2021-06-02 22:40:34 +02:00
#
H = [ ]
# pas de menu absences si pas autorise:
2021-07-29 16:31:15 +02:00
if with_absences and not current_user . has_permission ( Permission . ScoAbsChange ) :
2021-06-02 22:40:34 +02:00
with_absences = False
#
H . append (
' <h3>Listes de %(titre)s <span class= " infostitresem " >( %(mois_debut)s - %(mois_fin)s )</span></h3> '
% sem
)
formsemestre_id = sem [ " formsemestre_id " ]
# calcule dates 1er jour semaine pour absences
try :
if with_absences :
first_monday = sco_abs . ddmmyyyy ( sem [ " date_debut " ] ) . prev_monday ( )
2021-07-26 16:52:38 +02:00
form_abs_tmpl = f """
< td > < form action = " { url_for(
2021-07-09 10:26:31 +02:00
" absences.SignaleAbsenceGrSemestre " , scodoc_dept = g . scodoc_dept
2021-07-26 16:52:38 +02:00
) } " method= " get " >
< input type = " hidden " name = " datefin " value = " {sem['date_fin']} " / >
< input type = " hidden " name = " group_ids " value = " %(group_id)s " / >
< input type = " hidden " name = " destination " value = " {destination} " / >
< input type = " submit " value = " Saisir absences du " / >
< select name = " datedebut " class = " noprint " >
"""
2021-06-02 22:40:34 +02:00
date = first_monday
2021-08-21 00:24:51 +02:00
for jour in sco_abs . day_names ( ) :
2021-07-26 16:52:38 +02:00
form_abs_tmpl + = ' <option value= " %s " > %s </option> ' % ( date , jour )
2021-07-09 10:26:31 +02:00
date = date . next_day ( )
2021-07-26 16:52:38 +02:00
form_abs_tmpl + = """
< / select >
< a href = " %(url_etat)s " > état < / a >
< / form > < / td >
"""
2021-06-02 22:40:34 +02:00
else :
2021-07-26 16:52:38 +02:00
form_abs_tmpl = " "
2021-06-02 22:40:34 +02:00
except ScoInvalidDateError : # dates incorrectes dans semestres ?
2021-07-26 16:52:38 +02:00
form_abs_tmpl = " "
2021-06-02 22:40:34 +02:00
#
H . append ( ' <div id= " grouplists " > ' )
# Genere liste pour chaque partition (categorie de groupes)
2021-08-19 10:28:35 +02:00
for partition in sco_groups . get_partitions_list ( sem [ " formsemestre_id " ] ) :
2021-06-02 22:40:34 +02:00
if not partition [ " partition_name " ] :
H . append ( " <h4>Tous les étudiants</h4> " % partition )
else :
H . append ( " <h4>Groupes de %(partition_name)s </h4> " % partition )
2021-08-19 10:28:35 +02:00
groups = sco_groups . get_partition_groups ( partition )
2021-06-02 22:40:34 +02:00
if groups :
H . append ( " <table> " )
for group in groups :
2021-08-19 10:28:35 +02:00
n_members = len ( sco_groups . get_group_members ( group [ " group_id " ] ) )
2021-07-26 16:52:38 +02:00
group [ " url_etat " ] = url_for (
" absences.EtatAbsencesGr " ,
group_ids = group [ " group_id " ] ,
debut = sem [ " date_debut " ] ,
fin = sem [ " date_fin " ] ,
scodoc_dept = g . scodoc_dept ,
)
2021-06-02 22:40:34 +02:00
if group [ " group_name " ] :
group [ " label " ] = " groupe %(group_name)s " % group
else :
group [ " label " ] = " liste "
H . append (
2021-07-26 16:52:38 +02:00
f """
< tr class = " listegroupelink " >
< td >
< a href = " {
url_for ( " scolar.groups_view " ,
group_ids = group [ " group_id " ] ,
scodoc_dept = g . scodoc_dept ,
)
} " > {group["label"]} </a>
2021-06-02 22:40:34 +02:00
< / td > < td >
2021-07-26 16:52:38 +02:00
( < a href = " {
url_for ( " scolar.groups_view " ,
group_ids = group [ " group_id " ] ,
format = " xls " ,
scodoc_dept = g . scodoc_dept ,
)
} " >tableur</a>)
< a href = " {
url_for ( " scolar.groups_view " ,
curtab = " tab-photos " ,
group_ids = group [ " group_id " ] ,
etat = " I " ,
scodoc_dept = g . scodoc_dept ,
)
} " >Photos</a>
< / td >
< td > ( { n_members } étudiants ) < / td >
"""
2021-06-02 22:40:34 +02:00
)
if with_absences :
2021-07-26 16:52:38 +02:00
H . append ( form_abs_tmpl % group )
2021-06-02 22:40:34 +02:00
H . append ( " </tr> " )
H . append ( " </table> " )
else :
H . append ( ' <p class= " help indent " >Aucun groupe dans cette partition ' )
2021-07-29 16:31:15 +02:00
if sco_groups . sco_permissions_check . can_change_groups ( formsemestre_id ) :
2021-06-02 22:40:34 +02:00
H . append (
2021-08-16 08:33:12 +02:00
f """ (<a href= " { url_for ( " scolar.affectGroups " ,
scodoc_dept = g . scodoc_dept ,
partition_id = partition [ " partition_id " ] )
} " class= " stdlink " >créer</a>) " " "
2021-06-02 22:40:34 +02:00
)
H . append ( " </p> " )
2021-07-29 16:31:15 +02:00
if sco_groups . sco_permissions_check . can_change_groups ( formsemestre_id ) :
2021-06-02 22:40:34 +02:00
H . append (
2021-07-26 16:52:38 +02:00
f """ <h4><a
href = " {
url_for ( " scolar.editPartitionForm " ,
formsemestre_id = formsemestre_id ,
scodoc_dept = g . scodoc_dept ,
)
} " >Ajouter une partition</a></h4> " " "
2021-06-02 22:40:34 +02:00
)
H . append ( " </div> " )
return " \n " . join ( H )
2021-08-21 00:24:51 +02:00
def html_expr_diagnostic ( diagnostics ) :
2020-09-26 16:19:37 +02:00
""" Affiche messages d ' erreur des formules utilisateurs """
H = [ ]
H . append ( ' <div class= " ue_warning " >Erreur dans des formules utilisateurs:<ul> ' )
last_id , last_msg = None , None
for diag in diagnostics :
if " moduleimpl_id " in diag :
2021-01-17 22:31:28 +01:00
mod = sco_moduleimpl . do_moduleimpl_withmodule_list (
2021-08-20 01:09:55 +02:00
moduleimpl_id = diag [ " moduleimpl_id " ]
2020-09-26 16:19:37 +02:00
) [ 0 ]
H . append (
' <li>module <a href= " moduleimpl_status?moduleimpl_id= %s " > %s </a>: %s </li> '
% (
diag [ " moduleimpl_id " ] ,
mod [ " module " ] [ " abbrev " ] or mod [ " module " ] [ " code " ] or " ? " ,
diag [ " msg " ] ,
)
)
else :
if diag [ " ue_id " ] != last_id or diag [ " msg " ] != last_msg :
2021-08-20 01:09:55 +02:00
ue = sco_edit_ue . do_ue_list ( { " ue_id " : diag [ " ue_id " ] } ) [ 0 ]
2020-09-26 16:19:37 +02:00
H . append (
' <li>UE " %s " : %s </li> '
% ( ue [ " acronyme " ] or ue [ " titre " ] or " ? " , diag [ " msg " ] )
)
last_id , last_msg = diag [ " ue_id " ] , diag [ " msg " ]
H . append ( " </ul></div> " )
return " " . join ( H )
2021-08-21 00:24:51 +02:00
def formsemestre_status_head ( formsemestre_id = None , REQUEST = None , page_title = None ) :
2020-10-14 15:28:09 +02:00
""" En-tête HTML des pages " semestre " """
2020-09-26 16:19:37 +02:00
semlist = sco_formsemestre . do_formsemestre_list (
2021-08-19 10:28:35 +02:00
args = { " formsemestre_id " : formsemestre_id }
2020-09-26 16:19:37 +02:00
)
if not semlist :
raise ScoValueError ( " Session inexistante (elle a peut être été supprimée ?) " )
sem = semlist [ 0 ]
2021-08-19 10:28:35 +02:00
F = sco_formations . formation_list ( args = { " formation_id " : sem [ " formation_id " ] } ) [ 0 ]
2020-09-26 16:19:37 +02:00
parcours = sco_codes_parcours . get_parcours_from_code ( F [ " type_parcours " ] )
page_title = page_title or " Modules de "
H = [
2021-06-13 19:12:20 +02:00
html_sco_header . html_sem_header (
2021-08-20 10:51:42 +02:00
REQUEST , page_title , sem , with_page_header = False , with_h2 = False
2020-09-26 16:19:37 +02:00
) ,
2021-09-15 20:24:44 +02:00
f """ <table>
2020-09-26 16:19:37 +02:00
< tr > < td class = " fichetitre2 " > Formation : < / td > < td >
2021-09-15 20:24:44 +02:00
< a href = " { url_for( ' notes.ue_list ' , scodoc_dept=g.scodoc_dept, formation_id=F[ ' formation_id ' ])} "
class = " discretelink " title = " Formation {F['acronyme']} , v {F['version']} " > { F [ ' titre ' ] } < / a > """ ,
2020-09-26 16:19:37 +02:00
]
if sem [ " semestre_id " ] > = 0 :
H . append ( " , %s %s " % ( parcours . SESSION_NAME , sem [ " semestre_id " ] ) )
if sem [ " modalite " ] :
H . append ( " en %(modalite)s " % sem )
if sem [ " etapes " ] :
H . append (
" (étape <b><tt> %s </tt></b>) "
% ( sem [ " etapes_apo_str " ] or " - " )
)
H . append ( " </td></tr> " )
2021-07-29 10:19:00 +02:00
evals = sco_evaluations . do_evaluation_etat_in_sem ( formsemestre_id )
2020-09-26 16:19:37 +02:00
H . append (
' <tr><td class= " fichetitre2 " >Evaluations: </td><td> %(nb_evals_completes)s ok, %(nb_evals_en_cours)s en cours, %(nb_evals_vides)s vides '
% evals
)
if evals [ " last_modif " ] :
H . append (
" <em>(dernière note saisie le %s )</em> "
% evals [ " last_modif " ] . strftime ( " %d / % m/ % Y à % Hh % M " )
)
H . append ( " </td></tr> " )
if evals [ " attente " ] :
H . append (
""" <tr><td class= " fichetitre2 " ></td><td class= " redboldtext " >
Il y a des notes en attente ! Le classement des étudiants n ' a qu ' une valeur indicative .
< / td > < / tr > """
)
H . append ( " </table> " )
2021-08-11 00:36:07 +02:00
if sem [ " bul_hide_xml " ] :
2020-09-26 16:19:37 +02:00
H . append (
' <p class= " fontorange " ><em>Bulletins non publiés sur le portail</em></p> '
)
2021-08-21 00:24:51 +02:00
if sem [ " semestre_id " ] > = 0 and not sco_formsemestre . sem_une_annee ( sem ) :
2020-09-26 16:19:37 +02:00
H . append (
' <p class= " fontorange " ><em>Attention: ce semestre couvre plusieurs années scolaires !</em></p> '
)
2021-07-28 17:03:54 +02:00
# elif sco_preferences.get_preference( 'bul_display_publication', formsemestre_id):
2020-09-26 16:19:37 +02:00
# H.append('<p><em>Bulletins publiés sur le portail</em></p>')
return " " . join ( H )
2021-08-21 00:24:51 +02:00
def formsemestre_status ( formsemestre_id = None , REQUEST = None ) :
2020-09-26 16:19:37 +02:00
""" Tableau de bord semestre HTML """
# porté du DTML
2021-06-15 13:59:56 +02:00
cnx = ndb . GetDBConnexion ( )
2021-08-19 10:28:35 +02:00
sem = sco_formsemestre . get_formsemestre ( formsemestre_id )
2021-01-17 22:31:28 +01:00
Mlist = sco_moduleimpl . do_moduleimpl_withmodule_list (
2021-08-20 01:09:55 +02:00
formsemestre_id = formsemestre_id
2020-09-26 16:19:37 +02:00
)
2021-08-19 10:28:35 +02:00
# inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
2021-01-17 22:31:28 +01:00
# args={"formsemestre_id": formsemestre_id}
# )
2020-09-26 16:19:37 +02:00
prev_ue_id = None
2021-08-20 01:09:55 +02:00
can_edit = sco_formsemestre_edit . can_edit_sem ( REQUEST , formsemestre_id , sem = sem )
2020-09-26 16:19:37 +02:00
H = [
2021-07-29 16:31:15 +02:00
html_sco_header . sco_header ( page_title = " Semestre %s " % sem [ " titreannee " ] ) ,
2020-09-26 16:19:37 +02:00
' <div class= " formsemestre_status " > ' ,
formsemestre_status_head (
2021-08-21 00:24:51 +02:00
formsemestre_id = formsemestre_id , page_title = " Tableau de bord "
2020-09-26 16:19:37 +02:00
) ,
""" <p><b style= " font-size: 130 % " >Tableau de bord: </b><span class= " help " >cliquez sur un module pour saisir des notes</span></p> """ ,
]
2021-07-19 19:53:01 +02:00
nt = sco_cache . NotesTableCache . get ( formsemestre_id )
2020-09-26 16:19:37 +02:00
if nt . expr_diagnostics :
2021-08-21 00:24:51 +02:00
H . append ( html_expr_diagnostic ( nt . expr_diagnostics ) )
2020-09-26 16:19:37 +02:00
H . append (
"""
< p >
< table class = " formsemestre_status " >
< tr >
< th class = " formsemestre_status " > Code < / th >
< th class = " formsemestre_status " > Module < / th >
< th class = " formsemestre_status " > Inscrits < / th >
< th class = " resp " > Responsable < / th >
< th class = " evals " > Evaluations < / th > < / tr > """
)
2020-12-24 01:29:50 +01:00
mails_enseignants = set (
2021-08-22 13:24:36 +02:00
[ sco_users . user_info ( ens_id ) [ " email " ] for ens_id in sem [ " responsables " ] ]
2020-12-24 01:29:50 +01:00
) # adr. mail des enseignants
2020-09-26 16:19:37 +02:00
for M in Mlist :
Mod = M [ " module " ]
ModDescr = (
" Module "
+ M [ " module " ] [ " titre " ]
+ " , coef. "
+ str ( M [ " module " ] [ " coefficient " ] )
)
2021-07-03 23:35:32 +02:00
ModEns = sco_users . user_info ( M [ " responsable_id " ] ) [ " nomcomplet " ]
2020-09-26 16:19:37 +02:00
if M [ " ens " ] :
ModEns + = " (resp.), " + " , " . join (
2021-07-03 23:35:32 +02:00
[ sco_users . user_info ( e [ " ens_id " ] ) [ " nomcomplet " ] for e in M [ " ens " ] ]
2020-09-26 16:19:37 +02:00
)
2021-01-17 22:31:28 +01:00
ModInscrits = sco_moduleimpl . do_moduleimpl_inscription_list (
2021-08-20 01:09:55 +02:00
moduleimpl_id = M [ " moduleimpl_id " ]
2020-09-26 16:19:37 +02:00
)
2020-12-24 01:29:50 +01:00
mails_enseignants . add (
2021-07-03 23:35:32 +02:00
sco_users . user_info ( M [ " responsable_id " ] , REQUEST ) [ " email " ]
2020-12-24 01:29:50 +01:00
)
mails_enseignants | = set (
2021-07-03 23:35:32 +02:00
[ sco_users . user_info ( m [ " ens_id " ] , REQUEST ) [ " email " ] for m in M [ " ens " ] ]
2020-12-24 01:29:50 +01:00
)
2020-09-26 16:19:37 +02:00
ue = M [ " ue " ]
if prev_ue_id != ue [ " ue_id " ] :
prev_ue_id = ue [ " ue_id " ]
acronyme = ue [ " acronyme " ]
titre = ue [ " titre " ]
2021-07-28 17:03:54 +02:00
if sco_preferences . get_preference ( " use_ue_coefs " , formsemestre_id ) :
2020-09-26 16:19:37 +02:00
titre + = " <b>(coef. %s )</b> " % ( ue [ " coefficient " ] or 0.0 )
H . append (
""" <tr class= " formsemestre_status_ue " ><td colspan= " 4 " >
< span class = " status_ue_acro " > % s < / span >
< span class = " status_ue_title " > % s < / span >
< / td > < td > """
% ( acronyme , titre )
)
expr = sco_compute_moy . get_ue_expression (
formsemestre_id , ue [ " ue_id " ] , cnx , html_quote = True
)
if can_edit :
H . append (
2021-05-11 11:48:32 +02:00
' <a href= " edit_ue_expr?formsemestre_id= %s &ue_id= %s " > '
2020-09-26 16:19:37 +02:00
% ( formsemestre_id , ue [ " ue_id " ] )
)
H . append (
2021-01-17 22:31:28 +01:00
scu . icontag (
2020-09-26 16:19:37 +02:00
" formula " ,
title = " Mode calcul moyenne d ' UE " ,
style = " vertical-align:middle " ,
)
)
if can_edit :
H . append ( " </a> " )
if expr :
H . append (
""" <span class= " formula " title= " mode de calcul de la moyenne d ' UE " > %s </span> """
% expr
)
H . append ( " </td></tr> " )
2021-01-17 22:31:28 +01:00
if M [ " ue " ] [ " type " ] != sco_codes_parcours . UE_STANDARD :
2020-09-26 16:19:37 +02:00
fontorange = " fontorange " # style css additionnel
else :
fontorange = " "
2021-07-29 10:19:00 +02:00
etat = sco_evaluations . do_evaluation_etat_in_mod ( nt , M [ " moduleimpl_id " ] )
2020-09-26 16:19:37 +02:00
if (
etat [ " nb_evals_completes " ] > 0
and etat [ " nb_evals_en_cours " ] == 0
and etat [ " nb_evals_vides " ] == 0
) :
H . append ( ' <tr class= " formsemestre_status_green %s " > ' % fontorange )
else :
H . append ( ' <tr class= " formsemestre_status %s " > ' % fontorange )
H . append (
' <td class= " formsemestre_status_code " ><a href= " moduleimpl_status?moduleimpl_id= %s " title= " %s " class= " stdlink " > %s </a></td> '
% ( M [ " moduleimpl_id " ] , ModDescr , Mod [ " code " ] )
)
H . append (
' <td class= " scotext " ><a href= " moduleimpl_status?moduleimpl_id= %s " title= " %s " class= " formsemestre_status_link " > %s </a></td> '
% ( M [ " moduleimpl_id " ] , ModDescr , Mod [ " abbrev " ] or Mod [ " titre " ] )
)
H . append ( ' <td class= " formsemestre_status_inscrits " > %s </td> ' % len ( ModInscrits ) )
H . append (
' <td class= " resp scotext " ><a class= " discretelink " href= " moduleimpl_status?moduleimpl_id= %s " title= " %s " > %s </a></td> '
% (
M [ " moduleimpl_id " ] ,
ModEns ,
2021-07-03 23:35:32 +02:00
sco_users . user_info ( M [ " responsable_id " ] ) [ " prenomnom " ] ,
2020-09-26 16:19:37 +02:00
)
)
2021-01-17 22:31:28 +01:00
if Mod [ " module_type " ] == scu . MODULE_STANDARD :
2020-09-26 16:19:37 +02:00
H . append ( ' <td class= " evals " > ' )
nb_evals = (
etat [ " nb_evals_completes " ]
+ etat [ " nb_evals_en_cours " ]
+ etat [ " nb_evals_vides " ]
)
if nb_evals != 0 :
H . append (
' <a href= " moduleimpl_status?moduleimpl_id= %s " class= " formsemestre_status_link " > %s prévues, %s ok</a> '
% ( M [ " moduleimpl_id " ] , nb_evals , etat [ " nb_evals_completes " ] )
)
if etat [ " nb_evals_en_cours " ] > 0 :
H . append (
' , <span><a class= " redlink " href= " moduleimpl_status?moduleimpl_id= %s " title= " Il manque des notes " > %s en cours</a></span> '
% ( M [ " moduleimpl_id " ] , etat [ " nb_evals_en_cours " ] )
)
if etat [ " attente " ] :
H . append (
' <span><a class= " redlink " href= " moduleimpl_status?moduleimpl_id= %s " title= " Il y a des notes en attente " >[en attente]</a></span> '
% M [ " moduleimpl_id " ]
)
2021-01-17 22:31:28 +01:00
elif Mod [ " module_type " ] == scu . MODULE_MALUS :
2020-09-26 16:19:37 +02:00
nb_malus_notes = sum (
[
e [ " etat " ] [ " nb_notes " ]
for e in nt . get_mod_evaluation_etat_list ( M [ " moduleimpl_id " ] )
]
)
H . append (
""" <td class= " malus " >
< a href = " moduleimpl_status?moduleimpl_id= %s " class = " formsemestre_status_link " > malus ( % d notes ) < / a >
"""
% ( M [ " moduleimpl_id " ] , nb_malus_notes )
)
else :
raise ValueError ( " Invalid module_type " ) # a bug
H . append ( " </td></tr> " )
H . append ( " </table></p> " )
2021-07-28 17:03:54 +02:00
if sco_preferences . get_preference ( " use_ue_coefs " , formsemestre_id ) :
2020-09-26 16:19:37 +02:00
H . append (
"""
< p class = " infop " > utilise les coefficients d ' UE pour calculer la moyenne générale.</p>
"""
)
# --- LISTE DES ETUDIANTS
2021-06-13 18:29:53 +02:00
H + = [
' <div id= " groupes " > ' ,
2021-08-21 00:24:51 +02:00
_make_listes_sem ( sem , REQUEST ) ,
2021-06-13 18:29:53 +02:00
" </div> " ,
]
2020-12-24 01:29:50 +01:00
# --- Lien mail enseignants:
adrlist = list ( mails_enseignants - set ( [ " " ] ) )
if adrlist :
H . append (
' <p><a class= " stdlink " href= " mailto:?cc= %s " >Courrier aux %d enseignants du semestre</a></p> '
% ( " , " . join ( adrlist ) , len ( adrlist ) )
)
2021-07-29 10:19:00 +02:00
return " " . join ( H ) + html_sco_header . sco_footer ( )