# -*- mode: python -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Gestion scolarite IUT
#
# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
#
# 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
#
##############################################################################
"""ScoDoc ficheEtud
Fiche description d'un étudiant et de son parcours
"""
import sco_utils as scu
import notesdb as ndb
from notes_log import log
import scolars
import sco_bac
import sco_photos
import sco_groups
import sco_formsemestre
from scolars import format_telephone, format_pays, make_etud_args
import sco_formsemestre_status
import htmlutils
from sco_bulletins import etud_descr_situation_semestre
import sco_parcours_dut
import sco_codes_parcours
from sco_formsemestre_validation import formsemestre_recap_parcours_table
import sco_archives_etud
import sco_report
from sco_permissions import (
ScoEtudChangeGroups,
ScoEtudInscrit,
ScoImplement,
ScoEtudChangeAdr,
)
from sco_exceptions import ScoValueError
def _menuScolarite(context, authuser, sem, etudid):
"""HTML pour menu "scolarite" pour un etudiant dans un semestre.
Le contenu du menu depend des droits de l'utilisateur et de l'état de l'étudiant.
"""
locked = sem["etat"] != "1"
if locked:
lockicon = scu.icontag("lock32_img", title="verrouillé", border="0")
return lockicon # no menu
if not authuser.has_permission(
ScoEtudInscrit, context
) and not authuser.has_permission(ScoEtudChangeGroups, context):
return "" # no menu
ins = sem["ins"]
args = {"etudid": etudid, "formsemestre_id": ins["formsemestre_id"]}
if ins["etat"] != "D":
dem_title = "Démission"
dem_url = (
"formDem?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s" % args
)
else:
dem_title = "Annuler la démission"
dem_url = (
"doCancelDem?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s"
% args
)
# Note: seul un etudiant inscrit (I) peut devenir défaillant.
if ins["etat"] != sco_codes_parcours.DEF:
def_title = "Déclarer défaillance"
def_url = (
"formDef?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s" % args
)
elif ins["etat"] == sco_codes_parcours.DEF:
def_title = "Annuler la défaillance"
def_url = (
"doCancelDef?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s"
% args
)
def_enabled = (
(ins["etat"] != "D")
and authuser.has_permission(ScoEtudInscrit, context)
and not locked
)
items = [
# { 'title' : 'Changer de groupe',
# 'url' : 'formChangeGroup?etudid=%s&formsemestre_id=%s' % (etudid,ins['formsemestre_id']),
# 'enabled' : authuser.has_permission(ScoEtudChangeGroups,context) and not locked,
# },
{
"title": dem_title,
"url": dem_url,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
{
"title": "Validation du semestre (jury)",
"url": "Notes/formsemestre_validation_etud_form?etudid=%(etudid)s&formsemestre_id=%(formsemestre_id)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
{"title": def_title, "url": def_url, "enabled": def_enabled},
{
"title": "Inscrire à un module optionnel (ou au sport)",
"url": "Notes/formsemestre_inscription_option?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
{
"title": "Désinscrire (en cas d'erreur)",
"url": "Notes/formsemestre_desinscription?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context) and not locked,
},
{
"title": "Inscrire à un autre semestre",
"url": "Notes/formsemestre_inscription_with_modules_form?etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoEtudInscrit, context),
},
{
"title": "Enregistrer un semestre effectué ailleurs",
"url": "Notes/formsemestre_ext_create_form?formsemestre_id=%(formsemestre_id)s&etudid=%(etudid)s"
% args,
"enabled": authuser.has_permission(ScoImplement, context),
},
]
return htmlutils.make_menu(
"Scolarité", items, css_class="direction_etud", alone=True
)
def ficheEtud(context, etudid=None, REQUEST=None):
"fiche d'informations sur un etudiant"
authuser = REQUEST.AUTHENTICATED_USER
cnx = context.GetDBConnexion()
if etudid and REQUEST:
# la sidebar est differente s'il y a ou pas un etudid
# voir html_sidebar.sidebar()
REQUEST.form["etudid"] = etudid
args = make_etud_args(etudid=etudid, REQUEST=REQUEST)
etuds = scolars.etudident_list(cnx, args)
if not etuds:
log("ficheEtud: etudid=%s REQUEST.form=%s" % (etudid, REQUEST.form))
raise ScoValueError("Etudiant inexistant !")
etud = etuds[0]
etudid = etud["etudid"]
context.fillEtudsInfo([etud])
#
info = etud
info["ScoURL"] = context.ScoURL()
info["authuser"] = authuser
info["info_naissance"] = info["date_naissance"]
if info["lieu_naissance"]:
info["info_naissance"] += " à " + info["lieu_naissance"]
if info["dept_naissance"]:
info["info_naissance"] += " (%s)" % info["dept_naissance"]
info["etudfoto"] = sco_photos.etud_photo_html(context, etud, REQUEST=REQUEST)
if (
(not info["domicile"])
and (not info["codepostaldomicile"])
and (not info["villedomicile"])
):
info["domicile"] = "inconnue"
if info["paysdomicile"]:
pays = format_pays(info["paysdomicile"])
if pays:
info["paysdomicile"] = "(%s)" % pays
else:
info["paysdomicile"] = ""
if info["telephone"] or info["telephonemobile"]:
info["telephones"] = "
%s %s" % (
info["telephonestr"],
info["telephonemobilestr"],
)
else:
info["telephones"] = ""
# e-mail:
if info["email_default"]:
info["emaillink"] = ", ".join(
[
'%s' % (m, m)
for m in [etud["email"], etud["emailperso"]]
if m
]
)
else:
info["emaillink"] = "(pas d'adresse e-mail)"
# champs dependant des permissions
if authuser.has_permission(ScoEtudChangeAdr, context):
info["modifadresse"] = (
'modifier adresse'
% etudid
)
else:
info["modifadresse"] = ""
# Groupes:
sco_groups.etud_add_group_infos(context, info, info["cursem"])
# Parcours de l'étudiant
if info["sems"]:
info["last_formsemestre_id"] = info["sems"][0]["formsemestre_id"]
else:
info["last_formsemestre_id"] = ""
sem_info = {}
for sem in info["sems"]:
if sem["ins"]["etat"] != "I":
descr, _ = etud_descr_situation_semestre(
context.Notes,
etudid,
sem["formsemestre_id"],
info["ne"],
show_date_inscr=False,
)
grlink = '%s' % descr["situation"]
else:
group = sco_groups.get_etud_main_group(context, etudid, sem)
if group["partition_name"]:
gr_name = group["group_name"]
else:
gr_name = "tous"
grlink = (
'groupe %s'
% (group["group_id"], gr_name)
)
# infos ajoutées au semestre dans le parcours (groupe, menu)
menu = _menuScolarite(context, authuser, sem, etudid)
if menu:
sem_info[sem["formsemestre_id"]] = (
"
" + grlink + " | " + menu + " |
Etudiant%s non inscrit%s" % (info["ne"], info["ne"])] if authuser.has_permission(ScoEtudInscrit, context): l.append( 'inscrire' % (context.ScoURL(), etudid) ) l.append("") info["liste_inscriptions"] = "\n".join(l) info["link_bul_pdf"] = "" # Liste des annotations alist = [] annos = scolars.etud_annotations_list(cnx, args={"etudid": etudid}) for a in annos: if not context.canSuppressAnnotation(a["id"], REQUEST): a["dellink"] = "" else: a[ "dellink" ] = '
Bac | Année | Rg | Math | Physique | Anglais | Français |
---|---|---|---|---|---|---|
%(bac)s (%(specialite)s) | %(annee_bac)s | %(classement)s | %(math)s | %(physique)s | %(anglais)s | %(francais)s |
%(nomprenom)s (%(inscription)s)%(emaillink)s | %(etudfoto)s |
Situation : | %(situation)s |
Né%(ne)s le : | %(info_naissance)s |
Adresse : |
%(adm_data)s
%(fichiers_archive_htm)s
%(debouche_html)s
%(tit_anno)s
code NIP: %(code_nip)s
"""
header = context.sco_header(
REQUEST,
page_title="Fiche étudiant %(prenom)s %(nom)s" % info,
cssstyles=["libjs/jQuery-tagEditor/jquery.tag-editor.css"],
javascripts=[
"libjs/jinplace-1.2.1.min.js",
"js/ue_list.js",
"libjs/jQuery-tagEditor/jquery.tag-editor.min.js",
"libjs/jQuery-tagEditor/jquery.caret.min.js",
"js/recap_parcours.js",
"js/etud_debouche.js",
],
)
return header + tmpl % info + context.sco_footer(REQUEST)
def menus_etud(context, REQUEST=None):
"""Menu etudiant (operations sur l'etudiant)"""
if not REQUEST.form.has_key("etudid"):
return ""
authuser = REQUEST.AUTHENTICATED_USER
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
menuEtud = [
{
"title": etud["nomprenom"],
"url": "ficheEtud?etudid=%(etudid)s" % etud,
"enabled": True,
"helpmsg": "Fiche étudiant",
},
{
"title": "Changer la photo",
"url": "formChangePhoto?etudid=%(etudid)s" % etud,
"enabled": authuser.has_permission(ScoEtudChangeAdr, context),
},
{
"title": "Changer les données identité/admission",
"url": "etudident_edit_form?etudid=%(etudid)s" % etud,
"enabled": authuser.has_permission(ScoEtudInscrit, context),
},
{
"title": "Supprimer cet étudiant...",
"url": "etudident_delete?etudid=%(etudid)s" % etud,
"enabled": authuser.has_permission(ScoEtudInscrit, context),
},
{
"title": "Voir le journal...",
"url": "showEtudLog?etudid=%(etudid)s" % etud,
"enabled": True,
},
]
return htmlutils.make_menu(
"Etudiant", menuEtud, base_url=context.absolute_url() + "/", alone=True
)
def etud_info_html(context, etudid, with_photo="1", REQUEST=None, debug=False):
"""An HTML div with basic information and links about this etud.
Used for popups information windows.
"""
try:
context = context.Notes
except:
pass
# log('etud_info_html: %s' % REQUEST.QUERY_STRING)
formsemestre_id = sco_formsemestre_status.retreive_formsemestre_from_request(
context, REQUEST
)
# log('etud_info_html: formsemestre_id=%s' % formsemestre_id)
with_photo = int(with_photo)
etud = context.getEtudInfo(filled=1, REQUEST=REQUEST)[0]
photo_html = sco_photos.etud_photo_html(
context, etud, title="fiche de " + etud["nom"], REQUEST=REQUEST
)
# experimental: may be too slow to be here
etud["codeparcours"], etud["decisions_jury"] = sco_report.get_codeparcoursetud(
context.Notes, etud, prefix="S", separator=", "
)
bac = sco_bac.Baccalaureat(etud["bac"], etud["specialite"])
etud["bac_abbrev"] = bac.abbrev()
H = (
"""%(nomprenom)s Bac: %(bac_abbrev)s
%(codeparcours)s
"""
% etud
)
# Informations sur l'etudiant dans le semestre courant:
sem = None
if formsemestre_id: # un semestre est spécifié par la page
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
elif etud["cursem"]: # le semestre "en cours" pour l'étudiant
sem = etud["cursem"]
if sem:
groups = sco_groups.get_etud_groups(context, etudid, sem)
grc = sco_groups.listgroups_abbrev(groups)
H += 'En S%d: %s ' % (sem["semestre_id"], grc)
H += " |