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