forked from ScoDoc/ScoDoc
Ordre des modules et UE (edition PN et poids)
This commit is contained in:
parent
aeb0d67f38
commit
478688fe49
@ -51,11 +51,13 @@ def df_load_module_coefs(formation_id: int, semestre_idx: int = None) -> pd.Data
|
||||
|
||||
Si semestre_idx None, prend toutes les UE de la formation.
|
||||
"""
|
||||
ues = UniteEns.query.filter_by(formation_id=formation_id).filter(
|
||||
UniteEns.type != sco_codes_parcours.UE_SPORT
|
||||
ues = (
|
||||
UniteEns.query.filter_by(formation_id=formation_id)
|
||||
.filter(UniteEns.type != sco_codes_parcours.UE_SPORT)
|
||||
.order_by(UniteEns.semestre_idx, UniteEns.numero, UniteEns.acronyme)
|
||||
)
|
||||
modules = Module.query.filter_by(formation_id=formation_id).order_by(
|
||||
Module.semestre_id, Module.numero
|
||||
Module.semestre_id, Module.module_type.desc(), Module.numero, Module.code
|
||||
)
|
||||
if semestre_idx is not None:
|
||||
ues = ues.filter_by(semestre_idx=semestre_idx)
|
||||
|
@ -1,6 +1,5 @@
|
||||
"""ScoDoc 9 models : Modules
|
||||
"""
|
||||
from typing import Any
|
||||
|
||||
from app import db
|
||||
from app.models import APO_CODE_STR_LEN
|
||||
|
@ -50,10 +50,10 @@ def html_edit_formation_apc(
|
||||
parcours = formation.get_parcours()
|
||||
assert parcours.APC_SAE
|
||||
ressources = formation.modules.filter_by(module_type=ModuleType.RESSOURCE).order_by(
|
||||
Module.semestre_id, Module.numero
|
||||
Module.semestre_id, Module.numero, Module.code
|
||||
)
|
||||
saes = formation.modules.filter_by(module_type=ModuleType.SAE).order_by(
|
||||
Module.semestre_id, Module.numero
|
||||
Module.semestre_id, Module.numero, Module.code
|
||||
)
|
||||
if semestre_idx is None:
|
||||
semestre_ids = range(1, parcours.NB_SEM + 1)
|
||||
@ -61,7 +61,7 @@ def html_edit_formation_apc(
|
||||
semestre_ids = [semestre_idx]
|
||||
other_modules = formation.modules.filter(
|
||||
Module.module_type != ModuleType.SAE, Module.module_type != ModuleType.RESSOURCE
|
||||
)
|
||||
).order_by(Module.semestre_id, Module.module_type, Module.numero, Module.code)
|
||||
arrow_up, arrow_down, arrow_none = sco_groups.get_arrow_icons_tags()
|
||||
|
||||
icons = {
|
||||
|
@ -31,9 +31,12 @@
|
||||
import flask
|
||||
from flask import g, url_for, request
|
||||
|
||||
from app import db
|
||||
from app import log
|
||||
from app.models.modules import Module
|
||||
|
||||
import app.scodoc.notesdb as ndb
|
||||
import app.scodoc.sco_utils as scu
|
||||
from app import log
|
||||
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message
|
||||
from app.scodoc.sco_exceptions import ScoValueError, ScoLockedFormError
|
||||
|
||||
@ -311,39 +314,54 @@ def invalidate_sems_in_formation(formation_id):
|
||||
) # > formation modif.
|
||||
|
||||
|
||||
def module_move(module_id, after=0, redirect=1):
|
||||
def objects_renumber(obj_list) -> None:
|
||||
"fixe les numeros des objets de la liste pour ne pas changer son ordre"
|
||||
log(f"objects_renumber {obj_list}")
|
||||
for i, obj in enumerate(obj_list):
|
||||
obj.numero = i
|
||||
db.session.add(obj)
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def module_move(module_id, after=0, redirect=True):
|
||||
"""Move before/after previous one (decrement/increment numero)"""
|
||||
module = sco_edit_module.module_list({"module_id": module_id})[0]
|
||||
redirect = int(redirect)
|
||||
redirect = bool(redirect)
|
||||
module = Module.query.get_or_404(module_id)
|
||||
after = int(after) # 0: deplace avant, 1 deplace apres
|
||||
if after not in (0, 1):
|
||||
raise ValueError('invalid value for "after"')
|
||||
formation_id = module["formation_id"]
|
||||
others = sco_edit_module.module_list({"matiere_id": module["matiere_id"]})
|
||||
# log('others=%s' % others)
|
||||
if len(others) > 1:
|
||||
idx = [p["module_id"] for p in others].index(module_id)
|
||||
# log('module_move: after=%s idx=%s' % (after, idx))
|
||||
raise ValueError(f'invalid value for "after" ({after})')
|
||||
if module.formation.is_apc():
|
||||
# pas de matières, mais on prend tous les modules de même type de la formation
|
||||
query = Module.query.filter_by(
|
||||
semestre_id=module.semestre_id,
|
||||
formation=module.formation,
|
||||
module_type=module.module_type,
|
||||
)
|
||||
else:
|
||||
query = Module.query.filter_by(matiere=module.matiere)
|
||||
modules = query.order_by(Module.numero, Module.code).all()
|
||||
if len({o.numero for o in modules}) != len(modules):
|
||||
# il y a des numeros identiques !
|
||||
objects_renumber(modules)
|
||||
if len(modules) > 1:
|
||||
idx = [m.id for m in modules].index(module.id)
|
||||
neigh = None # object to swap with
|
||||
if after == 0 and idx > 0:
|
||||
neigh = others[idx - 1]
|
||||
elif after == 1 and idx < len(others) - 1:
|
||||
neigh = others[idx + 1]
|
||||
if neigh: #
|
||||
# swap numero between partition and its neighbor
|
||||
# log('moving module %s' % module_id)
|
||||
cnx = ndb.GetDBConnexion()
|
||||
module["numero"], neigh["numero"] = neigh["numero"], module["numero"]
|
||||
if module["numero"] == neigh["numero"]:
|
||||
neigh["numero"] -= 2 * after - 1
|
||||
sco_edit_module._moduleEditor.edit(cnx, module)
|
||||
sco_edit_module._moduleEditor.edit(cnx, neigh)
|
||||
|
||||
neigh = modules[idx - 1]
|
||||
elif after == 1 and idx < len(modules) - 1:
|
||||
neigh = modules[idx + 1]
|
||||
if neigh: # échange les numéros
|
||||
module.numero, neigh.numero = neigh.numero, module.numero
|
||||
db.session.add(module)
|
||||
db.session.add(neigh)
|
||||
db.session.commit()
|
||||
# redirect to ue_list page:
|
||||
if redirect:
|
||||
return flask.redirect(
|
||||
url_for(
|
||||
"notes.ue_table", scodoc_dept=g.scodoc_dept, formation_id=formation_id
|
||||
"notes.ue_table",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
formation_id=module.formation.id,
|
||||
)
|
||||
)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user