ScolaSync  1.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 import gestClasse
26 from PyQt4.QtGui import *
27 from PyQt4.QtCore import *
28 from Ui_choixEleves import Ui_Dialog
29 import db
30 import sys, os.path
31 
32 
33 ##
34 #
35 # implémente un dialogue permettant de choisir des élèves
36 # les propriétés importantes sont self.ok, vrai si on doit prendre en
37 # compte la liste sélectionnée, et le contenu de la liste des sélectionnés,
38 # dont on peut récupérer les élèves un par un à l'aide de self.pop()
39 #
41 
42  ##
43  #
44  # le constructeur
45  # récupérer des données SCONET
46  # @param parent le widget parent
47  # @param gestionnaire le système censé gérer les données du fichier f
48  #
49  def __init__(self, parent=None, gestionnaire=gestClasse.Sconet):
50  QDialog.__init__(self, parent=parent)
51  self.ok=None
52  self.ui=Ui_Dialog()
53  self.ui.setupUi(self)
54  self.prefs=db.readPrefs()
55  self.gestionnaire=gestionnaire
57  self.ui.listWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
58  self.ui.listWidget.setSortingEnabled(True)
59  self.ui.checkBoxNumero.setChecked(True)
60  self.ui.spinBoxNumero.setValue(1)
61  self.ui.spinBoxNumero.setEnabled(True)
62  self.connect(self.ui.pushButtonFile, SIGNAL('clicked()'), self.fichierEleves)
63  self.connect(self.ui.pushButton_replierArbre, SIGNAL("clicked()"), self.replie)
64  self.connect(self.ui.pushButton_cocher, SIGNAL("clicked()"), self.coche)
65  self.connect(self.ui.pushButton_decocher, SIGNAL("clicked()"), self.decoche)
66  self.connect(self.ui.pushButton_addToList, SIGNAL("clicked()"), self.addToList)
67  self.connect(self.ui.pushButton_delInList, SIGNAL("clicked()"), self.delInList)
68  self.connect(self.ui.pushButton_OK, SIGNAL("clicked()"), self.valid)
69  self.connect(self.ui.pushButton_Esc, SIGNAL("clicked()"), self.escape)
70  self.connect(self.ui.checkBoxNumero, SIGNAL("stateChanged(int)"), self.checkNum)
71 
72  ##
73  #
74  # choisit et ouvre un nouveau fichiers d'élèves
75  #
76  def fichierEleves(self):
77  caption="Choisissez un nouveau fichier de gestion des élèves"
78  dirname=os.path.dirname(self.prefs["schoolFile"])
79  newFile=QFileDialog.getOpenFileName (self, caption, dirname)
80  if os.path.exists(newFile):
81  self.prefs["schoolFile"]="%s" %newFile.toUtf8()
82  db.writePrefs(self.prefs)
83  self.connecteGestionnaire(renew=True)
84  return
85 
86  ##
87  #
88  # met en place l'arbre des noms d'élèves
89  # @param renew vrai si on veut vider tout l'arbre et recommencer
90  #
91  def connecteGestionnaire(self, renew=False):
92  try:
93  self.ui.lineEditFile.setText(self.prefs["schoolFile"])
94  self.ui.treeView.connecteGestionnaire(self.prefs["schoolFile"],
95  self.gestionnaire,
96  renew=renew)
97  except:
98  QMessageBox.warning(None,
99  QApplication.translate("Dialog","Échec à l'ouverture du fichier élèves",None, QApplication.UnicodeUTF8),
100  QApplication.translate("Dialog","Le fichier %1 n'a pas pu être traité",None, QApplication.UnicodeUTF8).arg(self.prefs["schoolFile"]))
101 
102  ##
103  #
104  # fonction de rappel utilisée quand on coche/décoche la case pour
105  # prendre en compte le numéro
106  # @param state : l'état coché ou décoché
107  #
108  def checkNum(self, state):
109  if state==Qt.Checked:
110  self.ui.spinBoxNumero.setEnabled(True)
111  else:
112  self.ui.spinBoxNumero.setEnabled(False)
113  return
114 
115  ##
116  #
117  # replie toutes les classes du dialogue
118  #
119  def replie(self):
120  self.ui.treeView.collapseAll()
121  return
122 
123  ##
124  #
125  # coche toutes les cases d'élèves visibles
126  #
127  def coche(self):
128  for e in self.ui.treeView.expandedItems():
129  e.setCheckState(Qt.Checked)
130  return
131 
132  ##
133  #
134  # décoche toutes les cases d'élèves, visibles ou cachées
135  #
136  def decoche(self):
137  for e in self.ui.treeView.expandedItems():
138  e.setCheckState(Qt.Unchecked)
139  return
140 
141  ##
142  #
143  # Met à jour l'icône du bouton d'activation dans l'application parente
144  # pour refléter la présence d'éléments dans la liste
145  #
146  def updateParentIcon(self):
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 (QString) pour un baladeur, sinon None
180  #
181  def pop(self):
182  if self.count() == 0:
183  return
184  i=self.ui.listWidget.takeItem(0)
185  self.updateParentIcon()
186  return i.data(Qt.DisplayRole).toString()
187 
188  ##
189  #
190  # @return une liste des chaînes contenues dans les items
191  #
192  def itemStrings(self):
193  itemList=self.ui.listWidget.findItems(QString("*"),Qt.MatchWrap | Qt.MatchWildcard)
194  l=[i.data(Qt.DisplayRole).toString() for i in itemList]
195  l.sort()
196  return l
197 
198  ##
199  #
200  # retire un item de la liste et le renvoie (pourvu qu'il y existe)
201  # @param une chaîne donnant le texte d'un item à trouver
202  # @return un nom (QString) pour un baladeur, sinon None
203  #
204  def takeItem(self, item):
205  found=self.ui.listWidget.findItems(item,Qt.MatchExactly)
206  if len(found) > 0:
207  r=self.ui.listWidget.row(found[0])
208  i=self.ui.listWidget.takeItem(r)
209  self.updateParentIcon()
210  return i.data(Qt.DisplayRole).toString()
211  return QString()
212 
213  ##
214  #
215  # Prend acte de la validation
216  #
217  def valid(self):
218  self.ok=True
219  self.close()
220  return
221 
222  ##
223  #
224  # Prend acte de l'abandon ; supprime les éléments de la liste et
225  # ferme le dialogue
226  #
227  def escape(self):
228  while self.ui.listWidget.count() > 0:
229  self.ui.listWidget.takeItem(0)
230  self.updateParentIcon()
231  self.ok=False
232  self.close()
233  return
234 
235  ##
236  #
237  # @return la liste de QStandardItems sélectionnés
238  #
239  def listeChoix(self):
240  return self.ui.treeView.checkedItems()
241 
242  def listeUnique_Names(self):
243  result=[]
244  for e in self.listeChoix():
245  prefixe=QString()
246  if self.ui.checkBoxNumero.isChecked():
247  n=self.ui.spinBoxNumero.value()
248  prefixe=QString("%1-").arg(n,fieldWidth=2,fillChar=QChar("0"))
249  self.ui.spinBoxNumero.setValue(n+1)
250  result.append(prefixe+e.unique_name)
251  return result
252 
253 if __name__=="__main__":
254  app=QApplication(sys.argv)
255  d=choixElevesDialog("../exemples/SCONET_test.xml", gestionnaire=gestClasse.Sconet)
256  d.exec_()
257  print "dialogue ok =", d.ok
258  i=d.pop()
259  while i:
260  print (u"on a dépilé %s" %i).encode("utf-8")
261  i=d.pop()
262 
263