ScoDoc/app/scodoc/sco_modalites.py

119 lines
3.7 KiB
Python
Raw Permalink 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
#
##############################################################################
"""Modalites des semestres
La "modalite" est utilisee pour organiser les listes de semestres sur la page d'accueil.
2023-12-31 23:04:06 +01:00
Elle n'est pas utilisée pour les parcours, ni pour rien d'autre
2020-09-26 16:19:37 +02:00
(c'est donc un attribut "cosmétique").
"""
import collections
import app.scodoc.notesdb as ndb
2021-08-29 19:57:32 +02:00
from app import log
from app.models import FormSemestre
2020-09-26 16:19:37 +02:00
def list_formsemestres_modalites(formsemestres: list[FormSemestre]) -> list[dict]:
2021-01-01 18:40:47 +01:00
"""Liste ordonnée des modalités présentes dans ces formsemestres"""
2020-09-26 16:19:37 +02:00
modalites = {}
for formsemestre in formsemestres:
if formsemestre.modalite not in modalites:
m = do_modalite_list(args={"modalite": formsemestre.modalite})[0]
2020-09-26 16:19:37 +02:00
modalites[m["modalite"]] = m
2021-07-09 17:47:06 +02:00
modalites = list(modalites.values())
2020-09-26 16:19:37 +02:00
modalites.sort(key=lambda x: x["numero"])
return modalites
def group_formsemestres_by_modalite(
formsemestres: list[FormSemestre],
) -> dict[str, list[FormSemestre]]:
"""Given the list of formsemestre, group them by modalite,
2020-09-26 16:19:37 +02:00
sorted in each one by semestre id and date
"""
sems_by_mod = collections.defaultdict(list)
modalites = list_formsemestres_modalites(formsemestres)
sems_by_mod = {
modalite["modalite"]: [
formsemestre
for formsemestre in formsemestres
if formsemestre.modalite == modalite["modalite"]
]
for modalite in modalites
}
2020-09-26 16:19:37 +02:00
# tri dans chaque modalité par indice de semestre et date debut
for modalite in modalites:
sems_by_mod[modalite["modalite"]].sort(
key=lambda x: (
x.semestre_id if x.semestre_id > 0 else -1000 * x.semestre_id,
x.date_debut,
)
)
2020-09-26 16:19:37 +02:00
return sems_by_mod, modalites
# ------ Low level interface (database) ------
2021-01-28 23:02:18 +01:00
_modaliteEditor = ndb.EditableTable(
2020-09-26 16:19:37 +02:00
"notes_form_modalites",
"form_modalite_id",
("form_modalite_id", "modalite", "titre", "numero"),
sortkey="numero",
2021-01-28 23:02:18 +01:00
output_formators={"numero": ndb.int_null_is_zero},
2020-09-26 16:19:37 +02:00
)
def do_modalite_list(*args, **kw):
2021-01-01 18:40:47 +01:00
"""Liste des modalites"""
2021-06-15 13:59:56 +02:00
cnx = ndb.GetDBConnexion()
2020-09-26 16:19:37 +02:00
return _modaliteEditor.list(cnx, *args, **kw)
def do_modalite_create(args):
2020-09-26 16:19:37 +02:00
"create a modalite"
2021-06-15 13:59:56 +02:00
cnx = ndb.GetDBConnexion()
2020-09-26 16:19:37 +02:00
r = _modaliteEditor.create(cnx, args)
return r
def do_modalite_delete(oid):
2020-09-26 16:19:37 +02:00
"delete a modalite"
2021-06-15 13:59:56 +02:00
cnx = ndb.GetDBConnexion()
2020-09-26 16:19:37 +02:00
log("do_modalite_delete: form_modalite_id=%s" % oid)
_modaliteEditor.delete(cnx, oid)
def do_modalite_edit(*args, **kw): # unused
2020-09-26 16:19:37 +02:00
"edit a modalite"
2021-06-15 13:59:56 +02:00
cnx = ndb.GetDBConnexion()
2020-09-26 16:19:37 +02:00
# check
_ = do_modalite_list({"form_modalite_id": args[0]["form_modalite_id"]})[0]
2020-09-26 16:19:37 +02:00
_modaliteEditor.edit(cnx, *args, **kw)