ScolaSync  1.0
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
gestClasse.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 
4 ##
5 #
6 # Ce module permet de gérer des classes d'élèves. La classe
7 # AbstractGestClasse définit les fonctions minimales à implémenter
8 # pour chaque gestionnaire de classes.
9 #
10 
11 import xml.dom.minidom, copy
12 
14  ##
15  #
16  # le constructeur
17  # @param f le nom d'un fichier, ou un fichier ouvert en lecture
18  # qui contient les données permettant la gestion des classes d'un
19  # établissement scolaire
20  #
21  def __init__(self,f):
22  return
23 
24  ##
25  #
26  # @return une liste de noms de classes d'un établissement scolaire
27  #
28  def collectClasses(self):
29  return []
30 
31  ##
32  #
33  # @param cl une classe dans un établissement scolaire
34  # @return une liste d'élèves (sous forme d'objets)
35  #
36  def elevesDeClasse(self, cl):
37  return[]
38 
39  ##
40  #
41  # @param el un objet élève
42  # @return une chaîne unicode, unique dans l'établissement
43  #
44  def unique_name(self, el):
45  return "Cette fonction est abstraite, ne l'appelez pas ainsi."
46 
47  ##
48  #
49  # @param el un objet élève
50  # @return une chaîne unicode, pour nommer l'élève
51  #
52  def showable_name(self,el):
53  return "Cette fonction est abstraite, ne l'appelez pas ainsi."
54 
55 ##
56 #
57 # Une classe pour travailler avec des données Sconet
58 #
60 
61  ##
62  #
63  # Le constructeur
64  # @param f le nom d'un fichier, ou un fichier ouvert en lecture
65  #
66  def __init__(self, f):
67  AbstractGestClasse.__init__(self,f)
68  if type(f)==type(""):
69  f=open(f,"r")
70  self.donnees=xml.dom.minidom.parse(f)
71  self.makeCompact()
72 
73  ##
74  #
75  # removes useless thext nodes containing only spaces.
76  #
77  def makeCompact(self):
78  self.nullTexts={}
79  self.elementsWalk(self.donnees.documentElement, self.collectNullTexts)
80  for el in self.nullTexts.keys():
81  for e in self.nullTexts[el]:
82  el.removeChild(e)
83 
84  def collectNullTexts(self,el):
85  self.nullTexts[el]=[]
86  for e in el.childNodes:
87  if e.nodeType==e.TEXT_NODE and e.data.strip()=="":
88  self.nullTexts[el].append(e)
89 
90  ##
91  #
92  # @return the list of classes containg students
93  #
94  def collectClasses(self):
95  self.classes=set()
96  self.elementsWalk(self.donnees.documentElement, self.collectOneClass)
97  return self.classes
98 
99  ##
100  #
101  # @param className name of a school class
102  # @return list of "eleve" elements
103  #
104  def elevesDeClasse(self, className):
106  self.currentClassName=className
107  self.elementsWalk(self.donnees.documentElement, self.unIDEleveDeClasse)
108  ids=copy.copy(self.currentResult)
109  self.currentResult=[]
110  for i in ids:
111  self.currentID=i
112  self.elementsWalk(self.donnees.documentElement, self.eleveParID)
113  return copy.copy(self.currentResult)
114 
115  ##
116  #
117  # appends the "eleve" element to the list self.currentResult if
118  # self.currentID is matched
119  #
120  #
121  def eleveParID(self,el):
122  if el.nodeName.lower()=="eleve" and el.getAttribute("ELEVE_ID")==self.currentID:
123  self.currentResult.append(el)
124 
125  ##
126  #
127  # appends the ID of an "eleve" to self.currentResult if he belongs to
128  # the class self.currentClassName
129  # @param el an element
130  #
131  def unIDEleveDeClasse(self, el):
132  if el.nodeName.lower()=="structures_eleve":
133  structures=el.getElementsByTagName("STRUCTURE")
134  if len (structures) > 0:
135  if structures[0].getElementsByTagName("TYPE_STRUCTURE")[0].firstChild.data=="D":
136  if structures[0].getElementsByTagName("CODE_STRUCTURE")[0].firstChild.data==self.currentClassName:
137  idEleve=el.getAttribute("ELEVE_ID")
138  self.currentResult.append(idEleve)
139 
140  ##
141  #
142  # adds one class name to the set self.classes
143  # @param el an element
144  #
145  def collectOneClass(self,el):
146  if el.nodeName.lower()=="structure":
147  if el.getElementsByTagName("TYPE_STRUCTURE")[0].firstChild.data=="D":
148  self.classes.add(el.getElementsByTagName("CODE_STRUCTURE")[0].firstChild.data)
149 
150 
151  ##
152  #
153  # a unique name for an "eleve", based on a few fields and on the ID
154  # @param el en "eleve" element
155  # @param fields the fields used to build the result
156  # @retun a printable unique id
157  #
158  def unique_name(self, el, fields=["NOM", "PRENOM"]):
159  items=[]
160  for f in fields:
161  items.append(el.getElementsByTagName(f)[0].firstChild.data)
162  items.append(el.getAttribute("ELEVE_ID"))
163  return "_".join(items)
164 
165  ##
166  #
167  # @param el un objet élève
168  # @param fields les champs de donnée à exploiter
169  # @return une chaîne unicode, pour nommer l'élève
170  #
171  def showable_name(self,el, fields=["NOM", "PRENOM"]):
172  items=[]
173  for f in fields:
174  items.append(el.getElementsByTagName(f)[0].firstChild.data)
175  return " ".join(items)
176 
177 
178  ##
179  #
180  # implemente un parcour des éléments d'un arbre, pour y appliquer
181  # une procédure
182  # @param el un élément
183  # @param proc la procédure à appliquer (paramètres : l'élément)
184  #
185  def elementsWalk(self, el, proc):
186  proc(el)
187  for e in el.childNodes:
188  self.elementsWalk(e, proc)
189 
190  def __str__(self):
191  return self.donnees.toprettyxml(indent=" ",encoding="utf-8")
192 
193