# -*- mode: python -*- # -*- coding: utf-8 -*- ############################################################################## # # Gestion scolarite IUT # # Copyright (c) 1999 - 2021 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 # ############################################################################## """Synchronisation des listes d'étudiants avec liste portail (Apogée) """ import time import pprint import sco_utils as scu from sco_permissions import ScoEtudInscrit from sco_exceptions import ScoValueError from notesdb import ScoDocCursor from notes_log import log import sco_portal_apogee import sco_inscr_passage import scolars import sco_groups import sco_news, sco_excel import sco_formsemestre import sco_formsemestre_inscriptions import sco_formsemestre_status from sco_news import NEWS_INSCR, NEWS_NOTE, NEWS_FORM, NEWS_SEM, NEWS_MISC # Clés utilisées pour la synchro EKEY_APO = "nip" EKEY_SCO = "code_nip" EKEY_NAME = "code NIP" def formsemestre_synchro_etuds( context, formsemestre_id, etuds=[], # liste des codes NIP des etudiants a inscrire (ou deja inscrits) inscrits_without_key=[], # codes etudid des etudiants sans code NIP a laisser inscrits anneeapogee=None, submitted=False, dialog_confirmed=False, export_cat_xls=None, read_only=False, # Affiche sans permettre modifications REQUEST=None, ): """Synchronise les étudiants de ce semestre avec ceux d'Apogée. On a plusieurs cas de figure: L'étudiant peut être 1- présent dans Apogée et inscrit dans le semestre ScoDoc (etuds_ok) 2- dans Apogée, dans ScoDoc, mais pas inscrit dans le semestre (etuds_noninscrits) 3- dans Apogée et pas dans ScoDoc (a_importer) 4- inscrit dans le semestre ScoDoc, mais pas trouvé dans Apogée (sur la base du code NIP) Que faire ? Cas 1: rien à faire Cas 2: inscrire dans le semestre Cas 3: importer l'étudiant (le créer) puis l'inscrire à ce semestre. Cas 4: lister les etudiants absents d'Apogée (indiquer leur code NIP...) - présenter les différents cas - l'utilisateur valide (cocher les étudiants à importer/inscrire) - go etuds: apres selection par utilisateur, la liste des etudiants selectionnes que l'on va importer/inscrire """ log("formsemestre_synchro_etuds: formsemestre_id=%s" % formsemestre_id) sem = sco_formsemestre.get_formsemestre(context, formsemestre_id) sem["etape_apo_str"] = sco_formsemestre.formsemestre_etape_apo_str(sem) # Write access ? authuser = REQUEST.AUTHENTICATED_USER if not authuser.has_permission(ScoEtudInscrit, context): read_only = True if read_only: submitted = False dialog_confirmed = False # -- check lock if sem["etat"] != "1": raise ScoValueError("opération impossible: semestre verrouille") if not sem["etapes"]: raise ScoValueError( """opération impossible: ce semestre n'a pas de code étape (voir "Modifier ce semestre") """ % sem ) header = context.sco_header(REQUEST, page_title="Synchronisation étudiants") footer = context.sco_footer(REQUEST) base_url = "%s?formsemestre_id=%s" % (REQUEST.URL0, formsemestre_id) if anneeapogee: base_url += "&anneeapogee=%s" % anneeapogee if anneeapogee == None: # année d'inscription par défaut anneeapogee = str( scu.annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]) ) if type(etuds) == type(""): etuds = etuds.split(",") # vient du form de confirmation if type(inscrits_without_key) == type(""): inscrits_without_key = inscrits_without_key.split(",") ( etuds_by_cat, a_importer, a_inscrire, inscrits_set, inscrits_without_key_all, etudsapo_ident, ) = list_synch(context, sem, anneeapogee=anneeapogee) if export_cat_xls: filename = export_cat_xls xls = build_page( context, sem, etuds_by_cat, anneeapogee, export_cat_xls=export_cat_xls, base_url=base_url, read_only=read_only, ) return sco_excel.sendExcelFile(REQUEST, xls, filename + ".xls") H = [header] if not submitted: H += build_page( context, sem, etuds_by_cat, anneeapogee, base_url=base_url, read_only=read_only, ) else: etuds_set = set(etuds) a_importer = a_importer.intersection(etuds_set) a_desinscrire = inscrits_set - etuds_set log("inscrits_without_key_all=%s" % set(inscrits_without_key_all)) log("inscrits_without_key=%s" % inscrits_without_key) a_desinscrire_without_key = set(inscrits_without_key_all) - set( inscrits_without_key ) log("a_desinscrire_without_key=%s" % a_desinscrire_without_key) inscrits_ailleurs = set(sco_inscr_passage.list_inscrits_date(context, sem)) a_inscrire = a_inscrire.intersection(etuds_set) if not dialog_confirmed: # Confirmation if a_importer: H.append("

Etudiants à importer et inscrire :

    ") for key in a_importer: H.append("
  1. %(fullname)s
  2. " % etudsapo_ident[key]) H.append("
") if a_inscrire: H.append("

Etudiants à inscrire :

    ") for key in a_inscrire: H.append("
  1. %(fullname)s
  2. " % etudsapo_ident[key]) H.append("
") a_inscrire_en_double = inscrits_ailleurs.intersection(a_inscrire) if a_inscrire_en_double: H.append("

dont étudiants déjà inscrits:

    ") for key in a_inscrire_en_double: H.append( '
  1. %(fullname)s
  2. ' % etudsapo_ident[key] ) H.append("
") if a_desinscrire or a_desinscrire_without_key: H.append("

Etudiants à désinscrire :

    ") for key in a_desinscrire: etud = context.getEtudInfo(filled=1, code_nip=key)[0] H.append('
  1. %(nomprenom)s
  2. ' % etud) for etudid in a_desinscrire_without_key: etud = inscrits_without_key_all[etudid] scolars.format_etud_ident(etud) H.append('
  3. %(nomprenom)s
  4. ' % etud) H.append("
") if not a_importer and not a_inscrire and not a_desinscrire: H.append("""

Il n'y a rien à modifier !

""") H.append( context.confirmDialog( dest_url="formsemestre_synchro_etuds", add_headers=False, cancel_url="formsemestre_synchro_etuds?formsemestre_id=" + formsemestre_id, OK="Effectuer l'opération", REQUEST=REQUEST, parameters={ "formsemestre_id": formsemestre_id, "etuds": ",".join(etuds), "inscrits_without_key": ",".join(inscrits_without_key), "submitted": 1, "anneeapogee": anneeapogee, }, ) ) else: # OK, do it # Conversions des listes de codes NIP en listes de codes etudid def nip2etudid(code_nip): etud = context.getEtudInfo(code_nip=code_nip)[0] return etud["etudid"] etudids_a_inscrire = [nip2etudid(x) for x in a_inscrire] etudids_a_desinscrire = [nip2etudid(x) for x in a_desinscrire] etudids_a_desinscrire += a_desinscrire_without_key # do_import_etuds_from_portal( context, sem, a_importer, etudsapo_ident, REQUEST ) sco_inscr_passage.do_inscrit(context, sem, etudids_a_inscrire, REQUEST) sco_inscr_passage.do_desinscrit( context, sem, etudids_a_desinscrire, REQUEST ) H.append( """

Opération effectuée