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 #
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
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)
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 
Une classe pour travailler avec des données Sconet.
Definition: gestClasse.py:79
def takeItem(self, item)
retire un item de la liste et le renvoie (pourvu qu'il y existe)
Definition: choixEleves.py:205
def valid(self)
Prend acte de la validation.
Definition: choixEleves.py:219
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
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
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
def __init__
le constructeur récupérer des données SCONET
Definition: choixEleves.py:48
implémente un dialogue permettant de choisir des élèves les propriétés importantes sont self...
Definition: choixEleves.py:39
def fichierEleves(self)
choisit et ouvre un nouveau fichiers d'élèves
Definition: choixEleves.py:75
def replie(self)
replie toutes les classes du dialogue
Definition: choixEleves.py:118
def connecteGestionnaire
met en place l'arbre des noms d'élèves
Definition: choixEleves.py:90
def escape(self)
Prend acte de l'abandon ; supprime les éléments de la liste et ferme le dialogue. ...
Definition: choixEleves.py:229
def decoche(self)
décoche toutes les cases d'élèves, visibles ou cachées
Definition: choixEleves.py:135
def coche(self)
coche toutes les cases d'élèves visibles
Definition: choixEleves.py:126
def delInList(self)
retire les élèves de la liste quand ils y sont sélectionnés
Definition: choixEleves.py:165
def addToList(self)
ajoute les élèves cochés dans la liste (s'ils n'y sont pas déjà)
Definition: choixEleves.py:154