ScolaSync  1.0
gestClasse.py
Aller à la documentation de ce fichier.
00001 #!/usr/bin/python
00002 # -*- coding: utf-8 -*-
00003 
00004 ##
00005 # 
00006 # Ce module permet de gérer des classes d'élèves. La classe
00007 # AbstractGestClasse définit les fonctions minimales à implémenter
00008 # pour chaque gestionnaire de classes.
00009 # 
00010 
00011 import xml.dom.minidom, copy
00012 
00013 class AbstractGestClasse:
00014     ##
00015     # 
00016     #         le constructeur
00017     #         @param f le nom d'un fichier, ou un fichier ouvert en lecture
00018     #         qui contient les données permettant la gestion des classes d'un
00019     #         établissement scolaire
00020     #         
00021     def __init__(self,f):
00022         return
00023 
00024     ##
00025     # 
00026     #         @return une liste de noms de classes d'un établissement scolaire
00027     #         
00028     def collectClasses(self):
00029         return []
00030 
00031     ##
00032     # 
00033     #         @param cl une classe dans un établissement scolaire
00034     #         @return une liste d'élèves (sous forme d'objets)
00035     #         
00036     def elevesDeClasse(self, cl):
00037         return[]
00038 
00039     ##
00040     # 
00041     #         @param el un objet élève
00042     #         @return une chaîne unicode, unique dans l'établissement
00043     #         
00044     def unique_name(self, el):
00045         return "Cette fonction est abstraite, ne l'appelez pas ainsi."
00046 
00047     ##
00048     # 
00049     #         @param el un objet élève
00050     #         @return une chaîne unicode, pour nommer l'élève
00051     #         
00052     def showable_name(self,el):
00053         return "Cette fonction est abstraite, ne l'appelez pas ainsi."
00054 
00055 ##
00056 # 
00057 #     Une classe pour travailler avec des données Sconet
00058 #     
00059 class Sconet(AbstractGestClasse):
00060 
00061     ##
00062     # 
00063     #         Le constructeur
00064     #         @param f le nom d'un fichier, ou un fichier ouvert en lecture
00065     #         
00066     def __init__(self, f):
00067         AbstractGestClasse.__init__(self,f)
00068         if type(f)==type(""):
00069             f=open(f,"r")
00070         self.donnees=xml.dom.minidom.parse(f)
00071         self.makeCompact()
00072 
00073     ##
00074     # 
00075     #         removes useless thext nodes containing only spaces.
00076     #         
00077     def makeCompact(self):
00078         self.nullTexts={}
00079         self.elementsWalk(self.donnees.documentElement, self.collectNullTexts)
00080         for el in self.nullTexts.keys():
00081             for e in self.nullTexts[el]:
00082                 el.removeChild(e)
00083 
00084     def collectNullTexts(self,el):
00085         self.nullTexts[el]=[]
00086         for e in el.childNodes:
00087             if e.nodeType==e.TEXT_NODE and e.data.strip()=="":
00088                 self.nullTexts[el].append(e)
00089 
00090     ##
00091     # 
00092     #         @return the list of classes containg students
00093     #         
00094     def collectClasses(self):
00095         self.classes=set()
00096         self.elementsWalk(self.donnees.documentElement, self.collectOneClass)
00097         return self.classes
00098 
00099     ##
00100     # 
00101     #         @param className name of a school class
00102     #         @return list of "eleve" elements
00103     #         
00104     def elevesDeClasse(self, className):
00105         self.currentResult=[]
00106         self.currentClassName=className
00107         self.elementsWalk(self.donnees.documentElement, self.unIDEleveDeClasse)
00108         ids=copy.copy(self.currentResult)
00109         self.currentResult=[]
00110         for i in ids:
00111             self.currentID=i
00112             self.elementsWalk(self.donnees.documentElement, self.eleveParID)
00113         return copy.copy(self.currentResult)
00114 
00115     ##
00116     # 
00117     #         appends the "eleve" element to the list self.currentResult if
00118     #         self.currentID is matched
00119     # 
00120     #         
00121     def eleveParID(self,el):
00122         if  el.nodeName.lower()=="eleve" and el.getAttribute("ELEVE_ID")==self.currentID:
00123             self.currentResult.append(el)
00124 
00125     ##
00126     # 
00127     #         appends the ID of an "eleve" to self.currentResult if he belongs to
00128     #         the class self.currentClassName
00129     #         @param el an element
00130     #         
00131     def unIDEleveDeClasse(self, el):
00132         if  el.nodeName.lower()=="structures_eleve":
00133             structures=el.getElementsByTagName("STRUCTURE")
00134             if len (structures) > 0:
00135                 if structures[0].getElementsByTagName("TYPE_STRUCTURE")[0].firstChild.data=="D":
00136                     if structures[0].getElementsByTagName("CODE_STRUCTURE")[0].firstChild.data==self.currentClassName:
00137                         idEleve=el.getAttribute("ELEVE_ID")
00138                         self.currentResult.append(idEleve)
00139 
00140     ##
00141     # 
00142     #         adds one class name to the set self.classes
00143     #         @param el an element
00144     #         
00145     def collectOneClass(self,el):
00146         if el.nodeName.lower()=="structure":
00147             if el.getElementsByTagName("TYPE_STRUCTURE")[0].firstChild.data=="D":
00148                 self.classes.add(el.getElementsByTagName("CODE_STRUCTURE")[0].firstChild.data)
00149 
00150 
00151     ##
00152     # 
00153     #         a unique name for an "eleve", based on a few fields and on the ID
00154     #         @param el en "eleve" element
00155     #         @param fields the fields used to build the result
00156     #         @retun a printable unique id
00157     #         
00158     def unique_name(self, el, fields=["NOM", "PRENOM"]):
00159         items=[]
00160         for f in fields:
00161             items.append(el.getElementsByTagName(f)[0].firstChild.data)
00162         items.append(el.getAttribute("ELEVE_ID"))
00163         return "_".join(items)
00164 
00165     ##
00166     # 
00167     #         @param el un objet élève
00168     #         @param fields les champs de donnée à exploiter
00169     #         @return une chaîne unicode, pour nommer l'élève
00170     #         
00171     def showable_name(self,el, fields=["NOM", "PRENOM"]):
00172         items=[]
00173         for f in fields:
00174             items.append(el.getElementsByTagName(f)[0].firstChild.data)
00175         return " ".join(items)
00176 
00177 
00178     ##
00179     # 
00180     #         implemente un parcour des éléments d'un arbre, pour y appliquer
00181     #         une procédure
00182     #         @param el un élément
00183     #         @param proc la procédure à appliquer (paramètres : l'élément)
00184     #         
00185     def elementsWalk(self, el, proc):
00186         proc(el)
00187         for e in el.childNodes:
00188             self.elementsWalk(e, proc)
00189 
00190     def __str__(self):
00191         return self.donnees.toprettyxml(indent="  ",encoding="utf-8")
00192 
00193 
 Tout Classes Espaces de nommage Fichiers Fonctions Variables