ScolaSync: Fichier source de src/choixEleves.py

ScolaSync 5.1 |

choixEleves.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/python
2
3 licence={}
4 licence['en']="""
5 file choixEleves.py
6 this file is part of the project scolasync
7
8 Copyright (C) 2012 Georges Khaznadar <georgesk@ofset.org>
9
10 This program is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version3 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 """
23
24 import gestClasse
25 from PyQt5.QtWidgets import *
26 from PyQt5.QtCore import *
27 from Ui_choixEleves import Ui_Dialog
28 import db
29 import sys, os.path
30
31
32 ##
33 #
34 # implémente un dialogue permettant de choisir des élèves
35 # les propriétés importantes sont self.ok, vrai si on doit prendre en
36 # compte la liste sélectionnée, et le contenu de la liste des sélectionnés,
37 # dont on peut récupérer les élèves un par un à l'aide de self.pop()
38 #
39 class choixElevesDialog(QDialog):
40
41 ##
42 #
43 # le constructeur
44 # récupérer des données SCONET
45 # @param parent le widget parent
46 # @param gestionnaire le système censé gérer les données du fichier f
47 #
48 def __init__(self, parent=None, gestionnaire=gestClasse.Sconet):
49 QDialog.__init__(self, parent=parent)
50 self.ok=None
51 self.ui=Ui_Dialog()
52 self.ui.setupUi(self)
53 self.prefs=db.readPrefs()
54 self.gestionnaire=gestionnaire
55 self.connecteGestionnaire()
56 self.ui.listWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
57 self.ui.listWidget.setSortingEnabled(True)
58 self.ui.checkBoxNumero.setChecked(True)
59 self.ui.spinBoxNumero.setValue(1)
60 self.ui.spinBoxNumero.setEnabled(True)
61 self.ui.pushButtonFile.clicked.connect(self.fichierEleves)
62 self.ui.pushButton_replierArbre.clicked.connect(self.replie)
63 self.ui.pushButton_cocher.clicked.connect(self.coche)
64 self.ui.pushButton_decocher.clicked.connect(self.decoche)
65 self.ui.pushButton_addToList.clicked.connect(self.addToList)
66 self.ui.pushButton_delInList.clicked.connect(self.delInList)
67 self.ui.pushButton_OK.clicked.connect(self.valid)
68 self.ui.pushButton_Esc.clicked.connect(self.escape)
69 self.ui.checkBoxNumero.stateChanged.connect(self.checkNum)
70
71 ##
72 #
73 # choisit et ouvre un nouveau fichiers d'élèves
74 #
75 def fichierEleves(self):
76 caption="Choisissez un nouveau fichier de gestion des élèves"
77 dirname=os.path.dirname(self.prefs["schoolFile"])
78 newFile=QFileDialog.getOpenFileName (self, caption, dirname)
79 if os.path.exists(newFile):
80 self.prefs["schoolFile"]=newFile
81 db.writePrefs(self.prefs)
82 self.connecteGestionnaire(renew=True)
83 return
84
85 ##
86 #
87 # met en place l'arbre des noms d'élèves
88 # @param renew vrai si on veut vider tout l'arbre et recommencer
89 #
90 def connecteGestionnaire(self, renew=False):
91 try:
92 self.ui.lineEditFile.setText(self.prefs["schoolFile"])
93 self.ui.treeView.connecteGestionnaire(self.prefs["schoolFile"],
94 self.gestionnaire,
95 renew=renew)
96 except Exception as err:
97 QMessageBox.warning(None,
98 QApplication.translate("Dialog","Échec à l'ouverture du fichier élèves",None),
99 QApplication.translate("Dialog","Le fichier {schoolfile} n'a pas pu être traité : {erreur}",None).format(schoolfile=self.prefs["schoolFile"], erreur=err))
100
101 ##
102 #
103 # fonction de rappel utilisée quand on coche/décoche la case pour
104 # prendre en compte le numéro
105 # @param state : l'état coché ou décoché
106 #
107 def checkNum(self, state):
108 if state==Qt.Checked:
109 self.ui.spinBoxNumero.setEnabled(True)
110 else:
111 self.ui.spinBoxNumero.setEnabled(False)
112 return
113
114 ##
115 #
116 # replie toutes les classes du dialogue
117 #
118 def replie(self):
119 self.ui.treeView.collapseAll()
120 return
121
122 ##
123 #
124 # coche toutes les cases d'élèves visibles
125 #
126 def coche(self):
127 for e in self.ui.treeView.expandedItems():
128 e.setCheckState(Qt.Checked)
129 return
130
131 ##
132 #
133 # décoche toutes les cases d'élèves, visibles ou cachées
134 #
135 def decoche(self):
136 for e in self.ui.treeView.expandedItems():
137 e.setCheckState(Qt.Unchecked)
138 return
139
140 ##
141 #
142 # Met à jour l'icône du bouton d'activation dans l'application parente
143 # pour refléter la présence d'éléments dans la liste
144 #
145 def updateParentIcon(self):
146 if self.parent():
147 self.parent().setAvailableNames(self.ui.listWidget.count() > 0)
148 return
149
150 ##
151 #
152 # ajoute les élèves cochés dans la liste (s'ils n'y sont pas déjà)
153 #
154 def addToList(self):
155 for n in self.listeUnique_Names():
156 if not self.ui.listWidget.findItems(n,Qt.MatchExactly):
157 self.ui.listWidget.addItem(n)
158 self.updateParentIcon()
159 return
160
161 ##
162 #
163 # retire les élèves de la liste quand ils y sont sélectionnés
164 #
165 def delInList(self):
166 rows=[]
167 for i in self.ui.listWidget.selectedIndexes():
168 rows.append(i.row())
169 rows.sort(reverse=True)
170 for r in rows:
171 self.ui.listWidget.takeItem(r)
172 self.updateParentIcon()
173 return
174
175 ##
176 #
177 # renvoie et supprime le premier élément de la liste de noms;
178 # si cette liste est vide, renvoie None
179 # @return un nom pour un baladeur, sinon None
180 #
181 def pop(self):
182 if self.ui.listWidget.count() == 0:
183 return
184 i=self.ui.listWidget.takeItem(0)
185 self.updateParentIcon()
186 data=i.data(Qt.DisplayRole)
187 return data
188
189 ##
190 #
191 # @return une liste des chaînes contenues dans les items
192 #
193 def itemStrings(self):
194 itemList=self.ui.listWidget.findItems("*",Qt.MatchWrap | Qt.MatchWildcard)
195 l=[i.data(Qt.DisplayRole) for i in itemList]
196 l.sort()
197 return l
198
199 ##
200 #
201 # retire un item de la liste et le renvoie (pourvu qu'il y existe)
202 # @param une chaîne donnant le texte d'un item à trouver
203 # @return un nom pour un baladeur, sinon None
204 #
205 def takeItem(self, item):
206 found=self.ui.listWidget.findItems(item,Qt.MatchExactly)
207 if len(found) > 0:
208 r=self.ui.listWidget.row(found[0])
209 i=self.ui.listWidget.takeItem(r)
210 self.updateParentIcon()
211 data=i.data(Qt.DisplayRole)
212 return data
213 return ""
214
215 ##
216 #
217 # Prend acte de la validation
218 #
219 def valid(self):
220 self.ok=True
221 self.close()
222 return
223
224 ##
225 #
226 # Prend acte de l'abandon ; supprime les éléments de la liste et
227 # ferme le dialogue
228 #
229 def escape(self):
230 while self.ui.listWidget.count() > 0:
231 self.ui.listWidget.takeItem(0)
232 self.updateParentIcon()
233 self.ok=False
234 self.close()
235 return
236
237 ##
238 #
239 # @return la liste de QStandardItems sélectionnés
240 #
241 def listeChoix(self):
242 return self.ui.treeView.checkedItems()
243
244 def listeUnique_Names(self):
245 result=[]
246 for e in self.listeChoix():
247 prefixe=""
248 if self.ui.checkBoxNumero.isChecked():
249 n=self.ui.spinBoxNumero.value()
250 prefixe="%02d-" %n
251 self.ui.spinBoxNumero.setValue(n+1)
252 result.append(prefixe+e.unique_name)
253 return result
254
255 if __name__=="__main__":
256 app=QApplication(sys.argv)
257 d=choixElevesDialog(gestionnaire=gestClasse.Sconet)
258 d.exec_()
259 print ("dialogue ok = %s" %d.ok)
260 i=d.pop()
261 while i:
262 print ("on a dépilé %s" %i)
263 i=d.pop()
264
src.gestClasse.Sconet
Une classe pour travailler avec des données Sconet.
Definition: gestClasse.py:79
QtCore
QtWidgets
src.choixEleves.choixElevesDialog.takeItem
def takeItem(self, item)
retire un item de la liste et le renvoie (pourvu qu'il y existe)
Definition: choixEleves.py:205
QDialog
src.choixEleves.choixElevesDialog.valid
def valid(self)
Prend acte de la validation.
Definition: choixEleves.py:219
src.choixEleves.choixElevesDialog.checkNum
def checkNum(self, state)
fonction de rappel utilisée quand on coche/décoche la case pour prendre en compte le numéro ...
Definition: choixEleves.py:107
src.choixEleves.choixElevesDialog.updateParentIcon
def updateParentIcon(self)
Met à jour l'icône du bouton d'activation dans l'application parente pour refléter la présence d'élém...
Definition: choixEleves.py:145
src.choixEleves.choixElevesDialog.listeUnique_Names
def listeUnique_Names(self)
Definition: choixEleves.py:244
src.choixEleves.choixElevesDialog.ui
ui
Definition: choixEleves.py:51
src.choixEleves.choixElevesDialog.itemStrings
def itemStrings(self)
Definition: choixEleves.py:193
src.choixEleves.choixElevesDialog.pop
def pop(self)
renvoie et supprime le premier élément de la liste de noms; si cette liste est vide, renvoie None
Definition: choixEleves.py:181
src.choixEleves.choixElevesDialog.ok
ok
Definition: choixEleves.py:50
src.choixEleves.choixElevesDialog.__init__
def __init__
le constructeur récupérer des données SCONET
Definition: choixEleves.py:48
src.choixEleves.choixElevesDialog
implémente un dialogue permettant de choisir des élèves les propriétés importantes sont self...
Definition: choixEleves.py:39
src.choixEleves.choixElevesDialog.fichierEleves
def fichierEleves(self)
choisit et ouvre un nouveau fichiers d'élèves
Definition: choixEleves.py:75
src.choixEleves.choixElevesDialog.replie
def replie(self)
replie toutes les classes du dialogue
Definition: choixEleves.py:118
src.choixEleves.choixElevesDialog.connecteGestionnaire
def connecteGestionnaire
met en place l'arbre des noms d'élèves
Definition: choixEleves.py:90
src.choixEleves.choixElevesDialog.gestionnaire
gestionnaire
Definition: choixEleves.py:54
src.choixEleves.choixElevesDialog.escape
def escape(self)
Prend acte de l'abandon ; supprime les éléments de la liste et ferme le dialogue. ...
Definition: choixEleves.py:229
src.choixEleves.choixElevesDialog.decoche
def decoche(self)
décoche toutes les cases d'élèves, visibles ou cachées
Definition: choixEleves.py:135
src.choixEleves.choixElevesDialog.coche
def coche(self)
coche toutes les cases d'élèves visibles
Definition: choixEleves.py:126
src.choixEleves.choixElevesDialog.delInList
def delInList(self)
retire les élèves de la liste quand ils y sont sélectionnés
Definition: choixEleves.py:165
src.choixEleves.choixElevesDialog.addToList
def addToList(self)
ajoute les élèves cochés dans la liste (s'ils n'y sont pas déjà)
Definition: choixEleves.py:154
src.choixEleves.choixElevesDialog.prefs
prefs
Definition: choixEleves.py:53
src.choixEleves.choixElevesDialog.listeChoix
def listeChoix(self)
Definition: choixEleves.py:241