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