ScolaSync  5.1
gestClasse.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/python
2 
3 ##
4 #
5 # Ce module permet de gérer des classes d'élèves. La classe
6 # AbstractGestClasse définit les fonctions minimales à implémenter
7 # pour chaque gestionnaire de classes.
8 #
9 
10 licence={}
11 licence['en']="""
12  file gestClasse.py
13  this file is part of the project scolasync
14 
15  Copyright (C) 2012 Georges Khaznadar <georgesk@ofset.org>
16 
17  This program is free software: you can redistribute it and/or modify
18  it under the terms of the GNU General Public License as published by
19  the Free Software Foundation, either version3 of the License, or
20  (at your option) any later version.
21 
22  This program is distributed in the hope that it will be useful,
23  but WITHOUT ANY WARRANTY; without even the implied warranty of
24  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  GNU General Public License for more details.
26 
27  You should have received a copy of the GNU General Public License
28  along with this program. If not, see <http://www.gnu.org/licenses/>.
29 """
30 
31 import xml.dom.minidom, copy
32 
34  ##
35  #
36  # le constructeur
37  # @param f le nom d'un fichier, ou un fichier ouvert en lecture
38  # qui contient les données permettant la gestion des classes d'un
39  # établissement scolaire
40  #
41  def __init__(self,f):
42  return
43 
44  ##
45  #
46  # @return une liste de noms de classes d'un établissement scolaire
47  #
48  def collectClasses(self):
49  return []
50 
51  ##
52  #
53  # @param cl une classe dans un établissement scolaire
54  # @return une liste d'élèves (sous forme d'objets)
55  #
56  def elevesDeClasse(self, cl):
57  return[]
58 
59  ##
60  #
61  # @param el un objet élève
62  # @return une chaîne unicode, unique dans l'établissement
63  #
64  def unique_name(self, el):
65  return "Cette fonction est abstraite, ne l'appelez pas ainsi."
66 
67  ##
68  #
69  # @param el un objet élève
70  # @return une chaîne unicode, pour nommer l'élève
71  #
72  def showable_name(self,el):
73  return "Cette fonction est abstraite, ne l'appelez pas ainsi."
74 
75 ##
76 #
77 # Une classe pour travailler avec des données Sconet
78 #
80 
81  ##
82  #
83  # Le constructeur
84  # @param f le nom d'un fichier, ou un fichier ouvert en lecture
85  #
86  def __init__(self, f):
87  AbstractGestClasse.__init__(self,f)
88  if type(f)==type(""):
89  try:
90  # python3 way
91  file=open(f, "r", encoding="iso-8859-1")
92  except:
93  # former way
94  file=open(f, "r")
95  self.donnees=xml.dom.minidom.parse(f)
96  self.makeCompact()
97 
98  ##
99  #
100  # removes useless thext nodes containing only spaces.
101  #
102  def makeCompact(self):
103  self.nullTexts={}
104  self.elementsWalk(self.donnees.documentElement, self.collectNullTexts)
105  for el in self.nullTexts.keys():
106  for e in self.nullTexts[el]:
107  el.removeChild(e)
108 
109  def collectNullTexts(self,el):
110  self.nullTexts[el]=[]
111  for e in el.childNodes:
112  if e.nodeType==e.TEXT_NODE and e.data.strip()=="":
113  self.nullTexts[el].append(e)
114 
115  ##
116  #
117  # @return the list of classes containg students
118  #
119  def collectClasses(self):
120  self.classes=set()
121  self.elementsWalk(self.donnees.documentElement, self.collectOneClass)
122  return self.classes
123 
124  ##
125  #
126  # @param className name of a school class
127  # @return list of "eleve" elements
128  #
129  def elevesDeClasse(self, className):
131  self.currentClassName=className
132  self.elementsWalk(self.donnees.documentElement, self.unIDEleveDeClasse)
133  ids=copy.copy(self.currentResult)
134  self.currentResult=[]
135  for i in ids:
136  self.currentID=i
137  self.elementsWalk(self.donnees.documentElement, self.eleveParID)
138  return copy.copy(self.currentResult)
139 
140  ##
141  #
142  # appends the "eleve" element to the list self.currentResult if
143  # self.currentID is matched
144  #
145  #
146  def eleveParID(self,el):
147  if el.nodeName.lower()=="eleve" and el.getAttribute("ELEVE_ID")==self.currentID:
148  self.currentResult.append(el)
149 
150  ##
151  #
152  # appends the ID of an "eleve" to self.currentResult if he belongs to
153  # the class self.currentClassName
154  # @param el an element
155  #
156  def unIDEleveDeClasse(self, el):
157  if el.nodeName.lower()=="structures_eleve":
158  structures=el.getElementsByTagName("STRUCTURE")
159  if len (structures) > 0:
160  if structures[0].getElementsByTagName("TYPE_STRUCTURE")[0].firstChild.data=="D":
161  if structures[0].getElementsByTagName("CODE_STRUCTURE")[0].firstChild.data==self.currentClassName:
162  idEleve=el.getAttribute("ELEVE_ID")
163  self.currentResult.append(idEleve)
164 
165  ##
166  #
167  # adds one class name to the set self.classes
168  # @param el an element
169  #
170  def collectOneClass(self,el):
171  if el.nodeName.lower()=="structure":
172  if el.getElementsByTagName("TYPE_STRUCTURE")[0].firstChild.data=="D":
173  self.classes.add(el.getElementsByTagName("CODE_STRUCTURE")[0].firstChild.data)
174 
175 
176  ##
177  #
178  # a unique name for an "eleve", based on a few fields and on the ID
179  # @param el en "eleve" element
180  # @param fields the fields used to build the result
181  # @retun a printable unique id
182  #
183  def unique_name(self, el, fields=["NOM", "PRENOM"]):
184  items=[]
185  for f in fields:
186  items.append(el.getElementsByTagName(f)[0].firstChild.data)
187  items.append(el.getAttribute("ELEVE_ID"))
188  return "_".join(items)
189 
190  ##
191  #
192  # @param el un objet élève
193  # @param fields les champs de donnée à exploiter
194  # @return une chaîne unicode, pour nommer l'élève
195  #
196  def showable_name(self,el, fields=["NOM", "PRENOM"]):
197  items=[]
198  for f in fields:
199  items.append(el.getElementsByTagName(f)[0].firstChild.data)
200  return " ".join(items)
201 
202 
203  ##
204  #
205  # implemente un parcour des éléments d'un arbre, pour y appliquer
206  # une procédure
207  # @param el un élément
208  # @param proc la procédure à appliquer (paramètres : l'élément)
209  #
210  def elementsWalk(self, el, proc):
211  proc(el)
212  for e in el.childNodes:
213  self.elementsWalk(e, proc)
214 
215  def __str__(self):
216  return self.donnees.toprettyxml(indent=" ",encoding="utf-8")
217 
Une classe pour travailler avec des données Sconet.
Definition: gestClasse.py:79
def __init__(self, f)
le constructeur
Definition: gestClasse.py:41
def unique_name(self, el, fields=["NOM", PRENOM)
a unique name for an "eleve", based on a few fields and on the ID
Definition: gestClasse.py:183
def elevesDeClasse(self, className)
Definition: gestClasse.py:129
def eleveParID(self, el)
appends the "eleve" element to the list self.currentResult if self.currentID is matched ...
Definition: gestClasse.py:146
def elementsWalk(self, el, proc)
implemente un parcour des éléments d'un arbre, pour y appliquer une procédure
Definition: gestClasse.py:210
def makeCompact(self)
removes useless thext nodes containing only spaces.
Definition: gestClasse.py:102
def showable_name(self, el, fields=["NOM", PRENOM)
Definition: gestClasse.py:196
def collectClasses(self)
Definition: gestClasse.py:119
def collectNullTexts(self, el)
Definition: gestClasse.py:109
def collectOneClass(self, el)
adds one class name to the set self.classes
Definition: gestClasse.py:170
def __init__(self, f)
Le constructeur.
Definition: gestClasse.py:86
def unIDEleveDeClasse(self, el)
appends the ID of an "eleve" to self.currentResult if he belongs to the class self.currentClassName
Definition: gestClasse.py:156