# -*- mode: python -*- # -*- coding: utf-8 -*- ############################################################################## # # Gestion scolarite IUT # # Copyright (c) 1999 - 2020 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 # ############################################################################## """Opérations d'inscriptions aux modules (interface pour gérer options ou parcours) """ from notesdb import * from sco_utils import * from notes_log import log from scolog import logdb from notes_table import * import sco_formsemestre from sco_formsemestre_status import makeMenu import sco_groups def moduleimpl_inscriptions_edit( context, moduleimpl_id, etuds=[], submitted=False, REQUEST=None ): """Formulaire inscription des etudiants a ce module * Gestion des inscriptions Nom TD TA TP (triable) [x] M. XXX YYY - - - ajouter TD A, TD B, TP 1, TP 2 ... supprimer TD A, TD B, TP 1, TP 2 ... * Si pas les droits: idem en readonly """ M = context.do_moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] formsemestre_id = M["formsemestre_id"] mod = context.do_module_list(args={"module_id": M["module_id"]})[0] sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) # -- check lock if sem["etat"] != "1": raise ScoValueError("opération impossible: semestre verrouille") header = context.sco_header( REQUEST, page_title="Inscription au module", init_qtip=True, javascripts=["js/etud_info.js"], ) footer = context.sco_footer(REQUEST) H = [ header, """
Cette page permet d'éditer les étudiants inscrits à ce module (ils doivent évidemment être inscrits au semestre). Les étudiants cochés sont (ou seront) inscrits. Vous pouvez facilement inscrire ou désinscrire tous les étudiants d'un groupe à l'aide des menus "Ajouter" et "Enlever".
Aucune modification n'est prise en compte tant que l'on n'appuie pas sur le bouton "Appliquer les modifications".
""" % (moduleimpl_id, mod["titre"], mod["code"]), ] # Liste des inscrits à ce semestre inscrits = context.Notes.do_formsemestre_inscription_listinscrits(formsemestre_id) for ins in inscrits: etuds_info = context.getEtudInfo(etudid=ins["etudid"], filled=1) if not etuds_info: log( "moduleimpl_inscriptions_edit: incoherency for etudid=%s !" % ins["etudid"] ) raise ScoValueError( "Etudiant %s inscrit mais inconnu dans la base !!!!!" % ins["etudid"] ) ins["etud"] = etuds_info[0] inscrits.sort(lambda x, y: cmp(x["etud"]["nom"], y["etud"]["nom"])) in_m = context.do_moduleimpl_inscription_list(moduleimpl_id=M["moduleimpl_id"]) in_module = set([x["etudid"] for x in in_m]) # partitions = sco_groups.get_partitions_list(context, formsemestre_id) # if not submitted: H.append( """""" ) H.append("""""") else: # SUBMISSION # inscrit a ce module tous les etuds selectionnes context.do_moduleimpl_inscrit_etuds( moduleimpl_id, formsemestre_id, etuds, reset=True, REQUEST=REQUEST ) REQUEST.RESPONSE.redirect( "moduleimpl_status?moduleimpl_id=%s" % (moduleimpl_id) ) # H.append(footer) return "\n".join(H) def _make_menu_old_xxx(context, partitions, title="", check="true"): H = [ """ ") return "".join(H) def _make_menu(context, partitions, title="", check="true"): """Menu with list of all groups""" items = [ { "title" : "Tous", "attr" : "onclick=\"group_select('', -1, %s)\"" % check } ] p_idx = 0 for partition in partitions: if partition["partition_name"] != None: p_idx += 1 for group in sco_groups.get_partition_groups(context, partition): items.append( { "title" : "%s %s" % (partition["partition_name"], group["group_name"]), "attr" : "onclick=\"group_select('%s', %s, %s)\"" % ( group["group_name"], p_idx, check) } ) return 'UE | Code | Inscrits | |
---|---|---|---|
%s | %s | %s | %s |
UE | Code | Module |
---|---|---|
%s | %s | %s |
Cette page décrit les inscriptions actuelles. Vous pouvez changer (si vous en avez le droit) les inscrits dans chaque module en cliquant sur la ligne du module.
Note: la déinscription d'un module ne perd pas les notes. Ainsi, si l'étudiant est ensuite réinscrit au même module, il retrouvera ses notes.
""" ) H.append(context.sco_footer(REQUEST)) return "\n".join(H) def descr_inscrs_module( context, sem, moduleimpl_id, set_all, partitions, partitions_etud_groups ): """returns All, nb_inscrits, descr All true si tous inscrits """ ins = context.do_moduleimpl_inscription_list(moduleimpl_id=moduleimpl_id) set_m = set([x["etudid"] for x in ins]) # ens. des inscrits au module non_inscrits = set_all - set_m if len(non_inscrits) == 0: return True, len(ins), "" # tous inscrits if len(non_inscrits) <= 7: # seuil arbitraire return False, len(ins), "tous sauf " + _fmt_etud_set(context, non_inscrits) # Cherche les groupes: gr = [] # [ ( partition_name , [ group_names ] ) ] for partition in partitions: grp = [] # groupe de cette partition for group in sco_groups.get_partition_groups(context, partition): members = sco_groups.get_group_members(context, group["group_id"]) set_g = set([m["etudid"] for m in members]) if set_g.issubset(set_m): grp.append(group["group_name"]) set_m = set_m - set_g gr.append((partition["partition_name"], grp)) # d = [] for (partition_name, grp) in gr: if grp: d.append("groupes de %s: %s" % (partition_name, ", ".join(grp))) r = [] if d: r.append(", ".join(d)) if set_m: r.append(_fmt_etud_set(context, set_m)) # return False, len(ins), " et ".join(r) def _fmt_etud_set(context, ins, max_list_size=7): # max_list_size est le nombre max de noms d'etudiants listés # au delà, on indique juste le nombre, sans les noms. if len(ins) > max_list_size: return "%d étudiants" % len(ins) etuds = [] for etudid in ins: etuds.append(context.getEtudInfo(etudid=etudid, filled=True)[0]) etuds.sort(lambda x, y: cmp(x["nom"], y["nom"])) return ", ".join( [ '%(nomprenom)s' % etud for etud in etuds ] ) def get_etuds_with_capitalized_ue(context, formsemestre_id): """For each UE, computes list of students capitalizing the UE. returns { ue_id : [ { infos } ] } """ UECaps = DictDefault(defaultvalue=[]) nt = context._getNotesCache().get_NotesTable( context, formsemestre_id ) # > get_ues, get_etud_ue_status inscrits = context.do_formsemestre_inscription_list( args={"formsemestre_id": formsemestre_id} ) ues = nt.get_ues() for ue in ues: for etud in inscrits: status = nt.get_etud_ue_status(etud["etudid"], ue["ue_id"]) if status["was_capitalized"]: UECaps[ue["ue_id"]].append( { "etudid": etud["etudid"], "ue_status": status, "is_ins": is_inscrit_ue( context, etud["etudid"], formsemestre_id, ue["ue_id"] ), } ) return UECaps def is_inscrit_ue(context, etudid, formsemestre_id, ue_id): """Modules de cette UE dans ce semestre auxquels l'étudiant est inscrit. """ r = SimpleDictFetch( context, """SELECT mod.* FROM notes_moduleimpl mi, notes_modules mod, notes_formsemestre sem, notes_moduleimpl_inscription i WHERE sem.formsemestre_id = %(formsemestre_id)s AND mi.formsemestre_id = sem.formsemestre_id AND mod.module_id = mi.module_id AND mod.ue_id = %(ue_id)s AND i.moduleimpl_id = mi.moduleimpl_id AND i.etudid = %(etudid)s ORDER BY mod.numero """, {"etudid": etudid, "formsemestre_id": formsemestre_id, "ue_id": ue_id}, ) return r def do_etud_desinscrit_ue(context, etudid, formsemestre_id, ue_id, REQUEST=None): """Desincrit l'etudiant de tous les modules de cette UE dans ce semestre. """ cnx = context.GetDBConnexion() cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor.execute( """DELETE FROM notes_moduleimpl_inscription WHERE moduleimpl_inscription_id IN ( SELECT i.moduleimpl_inscription_id FROM notes_moduleimpl mi, notes_modules mod, notes_formsemestre sem, notes_moduleimpl_inscription i WHERE sem.formsemestre_id = %(formsemestre_id)s AND mi.formsemestre_id = sem.formsemestre_id AND mod.module_id = mi.module_id AND mod.ue_id = %(ue_id)s AND i.moduleimpl_id = mi.moduleimpl_id AND i.etudid = %(etudid)s ) """, {"etudid": etudid, "formsemestre_id": formsemestre_id, "ue_id": ue_id}, ) if REQUEST: logdb( REQUEST, cnx, method="etud_desinscrit_ue", etudid=etudid, msg="desinscription UE %s" % ue_id, commit=False, ) context._inval_cache( formsemestre_id=formsemestre_id ) # > desinscription etudiant des modules def do_etud_inscrit_ue(context, etudid, formsemestre_id, ue_id, REQUEST=None): """Incrit l'etudiant de tous les modules de cette UE dans ce semestre. """ # Verifie qu'il est bien inscrit au semestre insem = context.do_formsemestre_inscription_list( args={"formsemestre_id": formsemestre_id, "etudid": etudid} ) if not insem: raise ScoValueError("%s n'est pas inscrit au semestre !" % etudid) cnx = context.GetDBConnexion() cursor = cnx.cursor(cursor_factory=ScoDocCursor) cursor.execute( """SELECT mi.moduleimpl_id FROM notes_moduleimpl mi, notes_modules mod, notes_formsemestre sem WHERE sem.formsemestre_id = %(formsemestre_id)s AND mi.formsemestre_id = sem.formsemestre_id AND mod.module_id = mi.module_id AND mod.ue_id = %(ue_id)s """, {"formsemestre_id": formsemestre_id, "ue_id": ue_id}, ) res = cursor.dictfetchall() for moduleimpl_id in [x["moduleimpl_id"] for x in res]: context.do_moduleimpl_inscription_create( {"moduleimpl_id": moduleimpl_id, "etudid": etudid}, REQUEST=REQUEST, formsemestre_id=formsemestre_id, )