forked from ScoDoc/ScoDoc
228 lines
7.6 KiB
Python
228 lines
7.6 KiB
Python
##############################################################################
|
|
#
|
|
# ScoDoc
|
|
#
|
|
# Copyright (c) 1999 - 2024 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
|
|
#
|
|
##############################################################################
|
|
|
|
"""Édition formation APC (BUT)
|
|
"""
|
|
|
|
from flask.templating import render_template
|
|
|
|
from app import db
|
|
from app.models import UniteEns, Matiere, Module, FormSemestre, ModuleImpl
|
|
from app.models.validations import ScolarFormSemestreValidation
|
|
from app.scodoc import codes_cursus
|
|
import app.scodoc.sco_utils as scu
|
|
from app.scodoc import sco_groups
|
|
from app.scodoc.sco_utils import ModuleType
|
|
|
|
|
|
def html_edit_formation_apc(
|
|
formation,
|
|
semestre_idx=None,
|
|
editable=True,
|
|
tag_editable=True,
|
|
):
|
|
"""Formulaire html pour visualisation ou édition d'une formation APC.
|
|
- Les UEs
|
|
- Les ressources
|
|
- Les SAÉs
|
|
"""
|
|
from app.but import cursus_but
|
|
|
|
cursus = formation.get_cursus()
|
|
assert cursus.APC_SAE
|
|
|
|
ressources = formation.modules.filter_by(module_type=ModuleType.RESSOURCE).order_by(
|
|
Module.semestre_id, Module.numero, Module.code
|
|
)
|
|
saes = formation.modules.filter_by(module_type=ModuleType.SAE).order_by(
|
|
Module.semestre_id, Module.numero, Module.code
|
|
)
|
|
if semestre_idx is None:
|
|
semestre_ids = range(1, cursus.NB_SEM + 1)
|
|
else:
|
|
semestre_ids = [semestre_idx]
|
|
other_modules = formation.modules.filter(
|
|
Module.module_type.is_distinct_from(ModuleType.SAE),
|
|
Module.module_type.is_distinct_from(ModuleType.RESSOURCE),
|
|
).order_by(
|
|
Module.semestre_id, Module.module_type.desc(), Module.numero, Module.code
|
|
)
|
|
|
|
ues_by_sem = {}
|
|
ects_by_sem = {}
|
|
for s_idx in semestre_ids:
|
|
ues_by_sem[s_idx] = (
|
|
formation.ues.filter_by(semestre_idx=s_idx)
|
|
.order_by(UniteEns.semestre_idx, UniteEns.numero, UniteEns.acronyme)
|
|
.all()
|
|
)
|
|
ects = [ue.ects for ue in ues_by_sem[s_idx] if ue.type != codes_cursus.UE_SPORT]
|
|
if None in ects:
|
|
ects_by_sem[s_idx] = '<span class="missing_ue_ects">manquant</span>'
|
|
else:
|
|
ects_by_sem[s_idx] = f"{sum(ects):g}"
|
|
|
|
arrow_up, arrow_down, arrow_none = sco_groups.get_arrow_icons_tags()
|
|
|
|
icons = {
|
|
"arrow_up": arrow_up,
|
|
"arrow_down": arrow_down,
|
|
"arrow_none": arrow_none,
|
|
"delete": scu.icontag(
|
|
"delete_small_img",
|
|
title="Supprimer (module inutilisé)",
|
|
alt="supprimer",
|
|
),
|
|
"delete_disabled": scu.icontag(
|
|
"delete_small_dis_img",
|
|
title="Suppression impossible (utilisé dans des semestres)",
|
|
),
|
|
}
|
|
|
|
html_ue_warning = {
|
|
semestre_idx: cursus_but.formation_semestre_niveaux_warning(
|
|
formation, semestre_idx
|
|
)
|
|
for semestre_idx in semestre_ids
|
|
}
|
|
|
|
H = [
|
|
render_template(
|
|
"pn/form_ues.j2",
|
|
codes_cursus=codes_cursus,
|
|
ects_by_sem=ects_by_sem,
|
|
editable=editable,
|
|
formation=formation,
|
|
html_ue_warning=html_ue_warning,
|
|
icons=icons,
|
|
scu=scu,
|
|
semestre_ids=semestre_ids,
|
|
tag_editable=tag_editable,
|
|
ues_by_sem=ues_by_sem,
|
|
),
|
|
]
|
|
for s_idx in semestre_ids:
|
|
ressources_in_sem = ressources.filter_by(semestre_id=s_idx)
|
|
saes_in_sem = saes.filter_by(semestre_id=s_idx)
|
|
other_modules_in_sem = other_modules.filter_by(semestre_id=s_idx)
|
|
matiere_parent = Matiere.query.filter(
|
|
Matiere.ue_id == UniteEns.id,
|
|
UniteEns.formation_id == formation.id,
|
|
UniteEns.semestre_idx == s_idx,
|
|
UniteEns.type != codes_cursus.UE_SPORT,
|
|
).first()
|
|
H += [
|
|
(
|
|
render_template(
|
|
"pn/form_mods.j2",
|
|
formation=formation,
|
|
titre=f"Ressources du S{s_idx}",
|
|
create_element_msg="créer une nouvelle ressource",
|
|
# matiere_parent=matiere_parent,
|
|
modules=ressources_in_sem,
|
|
module_type=ModuleType.RESSOURCE,
|
|
editable=editable,
|
|
tag_editable=tag_editable,
|
|
icons=icons,
|
|
scu=scu,
|
|
semestre_id=s_idx,
|
|
)
|
|
if len(ues_by_sem[s_idx]) > 0
|
|
else ""
|
|
),
|
|
(
|
|
render_template(
|
|
"pn/form_mods.j2",
|
|
formation=formation,
|
|
titre=f"Situations d'Apprentissage et d'Évaluation (SAÉs) S{s_idx}",
|
|
create_element_msg="créer une nouvelle SAÉ",
|
|
# matiere_parent=matiere_parent,
|
|
modules=saes_in_sem,
|
|
module_type=ModuleType.SAE,
|
|
editable=editable,
|
|
tag_editable=tag_editable,
|
|
icons=icons,
|
|
scu=scu,
|
|
semestre_id=s_idx,
|
|
)
|
|
if len(ues_by_sem[s_idx]) > 0
|
|
else ""
|
|
),
|
|
(
|
|
render_template(
|
|
"pn/form_mods.j2",
|
|
formation=formation,
|
|
titre=f"Autres modules (non BUT) du S{s_idx}",
|
|
create_element_msg="créer un nouveau module",
|
|
modules=other_modules_in_sem,
|
|
module_type=ModuleType.STANDARD,
|
|
editable=editable,
|
|
tag_editable=tag_editable,
|
|
icons=icons,
|
|
scu=scu,
|
|
semestre_id=s_idx,
|
|
)
|
|
if len(ues_by_sem[s_idx]) > 0
|
|
else """<span class="warning">créer une UE pour pouvoir ajouter des
|
|
modules</span>"""
|
|
),
|
|
]
|
|
|
|
return "\n".join(H)
|
|
|
|
|
|
def html_ue_infos(ue):
|
|
"""Page d'information sur une UE"""
|
|
from app.views import ScoData
|
|
|
|
formsemestres = (
|
|
db.session.query(FormSemestre)
|
|
.filter(
|
|
ue.id == Module.ue_id,
|
|
Module.id == ModuleImpl.module_id,
|
|
FormSemestre.id == ModuleImpl.formsemestre_id,
|
|
)
|
|
.all()
|
|
)
|
|
nb_etuds_valid_ue = ScolarFormSemestreValidation.query.filter_by(
|
|
ue_id=ue.id
|
|
).count()
|
|
can_safely_be_suppressed = (
|
|
(nb_etuds_valid_ue == 0)
|
|
and (len(formsemestres) == 0)
|
|
and ue.modules.count() == 0
|
|
and ue.matieres.count() == 0
|
|
)
|
|
titre = f"UE {ue.acronyme} {ue.titre or ''}"
|
|
return render_template(
|
|
"pn/ue_infos.j2",
|
|
title=titre, # titre html de la page
|
|
titre=titre, # dans la page
|
|
ue=ue,
|
|
formsemestres=formsemestres,
|
|
nb_etuds_valid_ue=nb_etuds_valid_ue,
|
|
can_safely_be_suppressed=can_safely_be_suppressed,
|
|
sco=ScoData(),
|
|
)
|