##############################################################################
#
# 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] = 'manquant'
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 """créer une UE pour pouvoir ajouter des
modules"""
),
]
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(),
)