ScolaSync: Fichier source de src/gestClasse.py

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
33 class AbstractGestClasse:
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 #
79 class Sconet(AbstractGestClasse):
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):
130 self.currentResult=[]
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
src.gestClasse.Sconet
Une classe pour travailler avec des données Sconet.
Definition: gestClasse.py:79
src.gestClasse.AbstractGestClasse.__init__
def __init__(self, f)
le constructeur
Definition: gestClasse.py:41
src.gestClasse.Sconet.unique_name
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
src.gestClasse.AbstractGestClasse.collectClasses
def collectClasses(self)
Definition: gestClasse.py:48
src.gestClasse.Sconet.currentID
currentID
Definition: gestClasse.py:136
src.gestClasse.AbstractGestClasse
Definition: gestClasse.py:33
src.gestClasse.Sconet.__str__
def __str__(self)
Definition: gestClasse.py:215
src.gestClasse.Sconet.elevesDeClasse
def elevesDeClasse(self, className)
Definition: gestClasse.py:129
src.gestClasse.Sconet.eleveParID
def eleveParID(self, el)
appends the "eleve" element to the list self.currentResult if self.currentID is matched ...
Definition: gestClasse.py:146
src.gestClasse.Sconet.classes
classes
Definition: gestClasse.py:120
src.gestClasse.AbstractGestClasse.unique_name
def unique_name(self, el)
Definition: gestClasse.py:64
src.gestClasse.Sconet.elementsWalk
def elementsWalk(self, el, proc)
implemente un parcour des éléments d'un arbre, pour y appliquer une procédure
Definition: gestClasse.py:210
src.gestClasse.Sconet.makeCompact
def makeCompact(self)
removes useless thext nodes containing only spaces.
Definition: gestClasse.py:102
src.gestClasse.Sconet.showable_name
def showable_name(self, el, fields=["NOM", PRENOM)
Definition: gestClasse.py:196
src.gestClasse.Sconet.currentClassName
currentClassName
Definition: gestClasse.py:131
src.gestClasse.Sconet.donnees
donnees
Definition: gestClasse.py:95
src.gestClasse.Sconet.nullTexts
nullTexts
Definition: gestClasse.py:103
src.gestClasse.Sconet.collectClasses
def collectClasses(self)
Definition: gestClasse.py:119
src.gestClasse.Sconet.collectNullTexts
def collectNullTexts(self, el)
Definition: gestClasse.py:109
src.gestClasse.Sconet.currentResult
currentResult
Definition: gestClasse.py:130
src.gestClasse.Sconet.collectOneClass
def collectOneClass(self, el)
adds one class name to the set self.classes
Definition: gestClasse.py:170
src.gestClasse.AbstractGestClasse.elevesDeClasse
def elevesDeClasse(self, cl)
Definition: gestClasse.py:56
src.gestClasse.Sconet.__init__
def __init__(self, f)
Le constructeur.
Definition: gestClasse.py:86
src.gestClasse.Sconet.unIDEleveDeClasse
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
src.gestClasse.AbstractGestClasse.showable_name
def showable_name(self, el)
Definition: gestClasse.py:72