Code source de parcoursup.ordreappel.AlgoOrdreAppel

#!/usr/bin/env python3
# -*- coding: utf-8; mode: python -*-
""" AlgoOrdreAppel, pour https://github.com/Naereen/ParcourSup.py.

- Auteurs : Lilian Besson, Bastien Trotobas et al, (C) 2018.
- Adresse : https://github.com/Naereen/ParcourSup.py
- Licence : MIT License (http://lbesson.mit-license.org).
"""
__author__ = "Lilian Besson, Bastien Trotobas et al"
__version__ = "0.2.1"

import xml.etree.ElementTree as ET
from pprint import pprint  # DEBUG
from typing import Dict, List

try:
    from GroupeClassement import GroupeClassement
    from VoeuClasse import typeCandidat_vers_str
except ImportError:
    from .GroupeClassement import GroupeClassement
    from .VoeuClasse import typeCandidat_vers_str


#: En mode débug, on affiche juste le résultat, on n'écrase pas les fichiers de tests.
# DEBUG = True
DEBUG = False


[docs]class AlgoOrdreAppel(object): """ Stocke les entrées et sorties de l'algorithme de calcul d'ordre d'appel. """
[docs] def __init__(self, groupesClassements: List[GroupeClassement]): """ Stocke la liste non-vide de classements.""" assert groupesClassements, f"Erreur : {self.__class__.__name__} le paramètre groupesClassements doit être non vide, et pas {groupesClassements}..." # DEBUG liste_C_GP_COD = [ga.C_GP_COD for ga in groupesClassements] nombres_C_GP_COD = len(liste_C_GP_COD) nombres_differents_C_GP_COD = len(set(liste_C_GP_COD)) assert nombres_C_GP_COD == nombres_differents_C_GP_COD, f"Erreur : {self.__class__.__name__} les différents groupesClassements doivent avoir un C_GP_COD tous différents (ici il y a en {nombres_C_GP_COD} mais seulement {nombres_differents_C_GP_COD} différents..." # DEBUG self.groupesClassements = groupesClassements self.ordresAppel = dict()
[docs] def calculeOrdresAppels(self) -> None: """ Calcule l'ordre d'appels de chaque groupes de classements.""" for ga in self.groupesClassements: self.ordresAppel[ga.C_GP_COD] = ga.calculerOrdreAppel()
# --- Exporte vers des arbres XML ou un dictionnaire JSON
[docs] def exporteEntree_XML(self) -> ET.Element: """ Converti l'entrée en un arbre XML.""" racine = ET.Element('algoOrdreAppelEntree') groupesXML = ET.Element('groupesClassements') for groupe in self.groupesClassements: ET.SubElement(groupesXML, 'C_GP_COD').text = str(groupe.C_GP_COD) ET.SubElement(groupesXML, 'tauxMinBoursiersPourcents').text = str(groupe.tauxMinBoursiersPourcents) ET.SubElement(groupesXML, 'tauxMinResidentsPourcents').text = str(groupe.tauxMinResidentsPourcents) for voeu in groupe.voeuxClasses: voeuXML = ET.Element('voeuxClasses') ET.SubElement(voeuXML, 'typeCandidat').text = typeCandidat_vers_str(voeu.typeCandidat) ET.SubElement(voeuXML, 'G_CN_COD').text = str(voeu.G_CN_COD) ET.SubElement(voeuXML, 'rang').text = str(voeu.rang) groupesXML.append(voeuXML) racine.append(groupesXML) return racine
[docs] def exporteEntree_JSON(self) -> Dict: """ Converti l'entrée en un dictionnaire.""" racine = { 'algoOrdreAppelEntree': { 'groupesClassements': [ { 'C_GP_COD': groupe.C_GP_COD, 'tauxMinBoursiersPourcents': groupe.tauxMinBoursiersPourcents, 'tauxMinResidentsPourcents': groupe.tauxMinResidentsPourcents, 'voeuxClasses': [ { 'typeCandidat': typeCandidat_vers_str(voeu.typeCandidat), 'G_CN_COD': voeu.G_CN_COD, 'rang': voeu.rang, } for voeu in groupe.voeuxClasses ] } for groupe in self.groupesClassements ] } } if DEBUG: pprint(racine) # DEBUG return racine
[docs] def exporteSortie_XML(self) -> ET.Element: """ Converti les résultats de la sortie en un arbre XML.""" racine = ET.Element('algoOrdreAppelSortie') ordresXML = ET.Element('ordresAppel') for numero, ordre in enumerate(self.ordresAppel.values()): ordreXML = ET.Element('entry') key = ET.Element('key') key.text = str(numero) ordreXML.append(key) value = ET.Element('value') for voeu in ordre: voeuXML = ET.Element('voeux') ET.SubElement(voeuXML, 'typeCandidat').text = typeCandidat_vers_str(voeu.typeCandidat) ET.SubElement(voeuXML, 'G_CN_COD').text = str(voeu.G_CN_COD) ET.SubElement(voeuXML, 'rang').text = str(voeu.rang) value.append(voeuXML) ordreXML.append(value) ordresXML.append(ordreXML) racine.append(ordresXML) return racine
[docs] def exporteSortie_JSON(self) -> Dict: """ Converti les résultats de la sortie en un dictionnaire.""" racine = { 'algoOrdreAppelSortie': { 'ordresAppel': [ { 'key': numero, 'voeux': [ { 'typeCandidat': typeCandidat_vers_str(voeu.typeCandidat), 'G_CN_COD': voeu.G_CN_COD, 'rang': voeu.rang, } for voeu in ordre ] } for numero, ordre in enumerate(self.ordresAppel.values()) ] } } if DEBUG: pprint(racine) # DEBUG return racine