ScoDoc/app/scodoc/html_sidebar.py

266 lines
9.8 KiB
Python
Raw Normal View History

2020-09-26 16:19:37 +02:00
# -*- mode: python -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Gestion scolarite IUT
#
2023-12-31 23:04:06 +01:00
# Copyright (c) 1999 - 2024 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
#
##############################################################################
"""
Génération de la "sidebar" (marge gauche des pages HTML)
"""
2021-09-16 10:09:17 +02:00
from flask import render_template, url_for
from flask import g, request
from flask_login import current_user
2020-09-26 16:19:37 +02:00
from app import db
2024-02-03 23:25:05 +01:00
from app.models import Evaluation, GroupDescr, Identite, ModuleImpl, Partition
import app.scodoc.sco_utils as scu
from app.scodoc import sco_preferences
from app.scodoc.sco_permissions import Permission
2022-01-11 22:44:03 +01:00
from sco_version import SCOVERSION
2020-09-26 16:19:37 +02:00
def retreive_formsemestre_from_request() -> int:
"""Cherche si on a de quoi déduire le semestre affiché à partir des
arguments de la requête:
formsemestre_id ou moduleimpl ou evaluation ou group_id ou partition_id
Returns None si pas défini.
"""
if request.method == "GET":
args = request.args
elif request.method == "POST":
args = request.form
else:
return None
formsemestre_id = None
# Search formsemestre
group_ids = args.get("group_ids", [])
if "formsemestre_id" in args:
formsemestre_id = args["formsemestre_id"]
elif "moduleimpl_id" in args and args["moduleimpl_id"]:
modimpl = db.session.get(ModuleImpl, args["moduleimpl_id"])
if not modimpl:
return None # suppressed ?
formsemestre_id = modimpl.formsemestre_id
elif "evaluation_id" in args:
evaluation = db.session.get(Evaluation, args["evaluation_id"])
if not evaluation:
return None # evaluation suppressed ?
formsemestre_id = evaluation.moduleimpl.formsemestre_id
elif "group_id" in args:
group = db.session.get(GroupDescr, args["group_id"])
if not group:
return None
formsemestre_id = group.partition.formsemestre_id
elif group_ids:
if isinstance(group_ids, str):
group_ids = group_ids.split(",")
group_id = group_ids[0]
group = db.session.get(GroupDescr, group_id)
if not group:
return None
formsemestre_id = group.partition.formsemestre_id
elif "partition_id" in args:
partition = db.session.get(Partition, args["partition_id"])
if not partition:
return None
formsemestre_id = partition.formsemestre_id
if formsemestre_id is None:
return None # no current formsemestre
try:
return int(formsemestre_id)
except ValueError:
return None # no current formsemestre
def sidebar_common():
"partie commune à toutes les sidebar"
2021-12-22 13:13:01 +01:00
home_link = url_for("scodoc.index", scodoc_dept=g.scodoc_dept)
2020-09-26 16:19:37 +02:00
H = [
2022-01-11 22:44:03 +01:00
f"""<a class="scodoc_title" href="{home_link}">ScoDoc {SCOVERSION}</a><br>
2021-12-22 13:13:01 +01:00
<a href="{home_link}" class="sidebar">Accueil</a> <br>
2021-07-29 16:48:27 +02:00
<div id="authuser"><a id="authuserlink" href="{
2023-12-05 21:04:38 +01:00
url_for("users.user_info_page",
scodoc_dept=g.scodoc_dept, user_name=current_user.user_name)
2021-07-29 16:48:27 +02:00
}">{current_user.user_name}</a>
<br><a id="deconnectlink" href="{url_for("auth.logout")}">déconnexion</a>
2021-07-29 16:48:27 +02:00
</div>
{sidebar_dept()}
<h2 class="insidebar">Scolarité</h2>
<a href="{
url_for("scolar.index_html", scodoc_dept=g.scodoc_dept)
}" class="sidebar">Semestres</a> <br>
<a href="{
url_for("notes.index_html", scodoc_dept=g.scodoc_dept)
}" class="sidebar">Formations</a> <br>
2021-07-29 16:48:27 +02:00
"""
2020-09-26 16:19:37 +02:00
]
if current_user.has_permission(Permission.AbsChange):
H.append(
f""" <a href="{
url_for("assiduites.bilan_dept", scodoc_dept=g.scodoc_dept)
}" class="sidebar">Assiduité</a> <br> """
)
if current_user.has_permission(
Permission.UsersAdmin
) or current_user.has_permission(Permission.UsersView):
2020-09-26 16:19:37 +02:00
H.append(
f"""<a href="{
url_for("users.index_html", scodoc_dept=g.scodoc_dept)
}" class="sidebar">Utilisateurs</a> <br>"""
2020-09-26 16:19:37 +02:00
)
if current_user.has_permission(Permission.EditPreferences):
2020-09-26 16:19:37 +02:00
H.append(
2023-12-05 21:04:38 +01:00
f"""<a href="{url_for("scolar.edit_preferences", scodoc_dept=g.scodoc_dept)}"
class="sidebar">Paramétrage</a> <br>"""
2020-09-26 16:19:37 +02:00
)
return "".join(H)
2022-06-09 07:39:58 +02:00
def sidebar(etudid: int = None):
2020-09-26 16:19:37 +02:00
"Main HTML page sidebar"
# rewritten from legacy DTML code
2023-06-30 15:34:50 +02:00
from app.scodoc import sco_assiduites
from app.scodoc import sco_etud
2021-09-10 21:12:59 +02:00
params = {}
2020-09-26 16:19:37 +02:00
2021-09-10 21:12:59 +02:00
H = [
2024-04-07 19:52:22 +02:00
f"""
<!-- sidebar py -->
<div class="sidebar">
2021-09-10 21:12:59 +02:00
{ sidebar_common() }
<div class="box-chercheetud">Chercher étudiant:<br>
<form method="get" id="form-chercheetud"
action="{url_for('scolar.search_etud_in_dept', scodoc_dept=g.scodoc_dept) }">
<div><input type="text" size="12" class="in-expnom" name="expnom" spellcheck="false"></input></div>
2021-09-10 21:12:59 +02:00
</form></div>
<div class="etud-insidebar">
"""
]
# ---- Il y-a-t-il un etudiant selectionné ?
2022-06-09 07:39:58 +02:00
etudid = etudid if etudid is not None else g.get("etudid", None)
if etudid is None:
if request.method == "GET":
etudid = request.args.get("etudid", None)
elif request.method == "POST":
etudid = request.form.get("etudid", None)
2022-06-09 07:39:58 +02:00
if etudid is not None:
2024-02-03 23:25:05 +01:00
etud = Identite.get_etud(etudid)
2020-09-26 16:19:37 +02:00
# compte les absences du semestre en cours
H.append(
2024-02-03 23:25:05 +01:00
f"""<h2 id="insidebar-etud"><a href="{
url_for(
"scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etudid
)
}" class="sidebar">
<font color="#FF0000">{etud.civilite_str} {etud.nom_disp()}</font></a>
</h2>
<b>Absences</b>"""
2020-09-26 16:19:37 +02:00
)
2024-02-03 23:25:05 +01:00
inscription = etud.inscription_courante()
if inscription:
formsemestre = inscription.formsemestre
2024-03-01 12:40:05 +01:00
nbabsnj, nbabsjust, _ = sco_assiduites.formsemestre_get_assiduites_count(
2024-02-03 23:25:05 +01:00
etudid, formsemestre
)
2020-09-26 16:19:37 +02:00
H.append(
2024-02-03 23:25:05 +01:00
f"""<span title="absences du {
formsemestre.date_debut.strftime(scu.DATE_FMT)
2024-02-03 23:25:05 +01:00
} au {
formsemestre.date_fin.strftime(scu.DATE_FMT)
}" data-tooltip>({
2024-02-03 23:25:05 +01:00
sco_preferences.get_preference("assi_metrique", None)})
2024-03-01 16:04:16 +01:00
<br>{nbabsjust:1g} J., {nbabsnj:1g} N.J.</span>"""
2020-09-26 16:19:37 +02:00
)
H.append("<ul>")
if current_user.has_permission(Permission.AbsChange):
# essaie de conserver le semestre actuellement en vue
cur_formsemestre_id = retreive_formsemestre_from_request()
2020-09-26 16:19:37 +02:00
H.append(
2021-09-10 21:12:59 +02:00
f"""
2024-02-03 23:25:05 +01:00
<li><a href="{
url_for('assiduites.ajout_assiduite_etud',
scodoc_dept=g.scodoc_dept, etudid=etudid)
}">Ajouter</a></li>
<li><a href="{
url_for('assiduites.ajout_justificatif_etud',
scodoc_dept=g.scodoc_dept, etudid=etudid,
formsemestre_id=cur_formsemestre_id,
)
}">Justifier</a></li>
2020-09-26 16:19:37 +02:00
"""
)
if sco_preferences.get_preference("handle_billets_abs"):
2020-09-26 16:19:37 +02:00
H.append(
2024-02-03 23:25:05 +01:00
f"""<li><a href="{
url_for('absences.billets_etud',
scodoc_dept=g.scodoc_dept, etudid=etudid)
}">Billets</a></li>"""
2020-09-26 16:19:37 +02:00
)
H.append(
2021-09-10 21:12:59 +02:00
f"""
2023-12-12 03:05:31 +01:00
<li><a href="{ url_for('assiduites.calendrier_assi_etud',
scodoc_dept=g.scodoc_dept, etudid=etudid)
}">Calendrier</a></li>
<li><a href="{ url_for('assiduites.bilan_etud',
scodoc_dept=g.scodoc_dept, etudid=etudid)
}" title="Les pages bilan et liste ont été fusionnées">Liste/Bilan</a></li>
2021-09-10 21:12:59 +02:00
</ul>
2020-09-26 16:19:37 +02:00
"""
)
else:
pass # H.append("(pas d'étudiant en cours)")
# ---------
2021-08-22 19:30:58 +02:00
H.append("</div>") # /etud-insidebar
2020-09-26 16:19:37 +02:00
# Logo
H.append(
2021-09-10 21:12:59 +02:00
f"""<div class="logo-insidebar">
2023-12-05 21:04:38 +01:00
<div class="sidebar-bottom"><a href="{
url_for( 'scodoc.about', scodoc_dept=g.scodoc_dept )
}" class="sidebar">À propos</a><br>
<a href="{ scu.SCO_USER_MANUAL }" target="_blank" rel="noopener" class="sidebar">Aide</a>
2021-09-10 21:12:59 +02:00
</div></div>
2021-09-15 22:13:04 +02:00
<div class="logo-logo">
<a href="{ url_for( 'scodoc.about', scodoc_dept=g.scodoc_dept ) }">
{ scu.icontag("scologo_img", no_size=True) }</a>
2021-09-10 21:12:59 +02:00
</div>
2023-12-05 21:04:38 +01:00
</div>
2021-09-10 21:12:59 +02:00
<!-- end of sidebar -->
"""
2021-08-22 19:30:58 +02:00
)
2020-09-26 16:19:37 +02:00
return "".join(H)
def sidebar_dept():
2021-01-01 18:40:47 +01:00
"""Partie supérieure de la marge de gauche"""
2021-09-16 10:09:17 +02:00
return render_template(
"sidebar_dept.j2",
2021-09-16 10:09:17 +02:00
prefs=sco_preferences.SemPreferences(),
)