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 # implémente un dialogue permettant de choisir des élèves
33 # les propriétés importantes sont self.ok, vrai si on doit prendre en
34 # compte la liste sélectionnée, et le contenu de la liste des sélectionnés,
35 # dont on peut récupérer les élèves un par un à l'aide de self.pop()
36 #
37 
39 
40  # le constructeur
41  # récupérer des données SCONET
42  # @param parent le widget parent
43  # @param gestionnaire le système censé gérer les données du fichier f
44  #
45 
46  def __init__(self, parent=None, gestionnaire=gestClasse.Sconet):
47  QDialog.__init__(self, parent=parent)
48  self.ok=None
49  self.ui=Ui_Dialog()
50  self.ui.setupUi(self)
51  self.prefs=db.readPrefs()
52  self.gestionnaire=gestionnaire
54  self.ui.listWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
55  self.ui.listWidget.setSortingEnabled(True)
56  self.ui.checkBoxNumero.setChecked(True)
57  self.ui.spinBoxNumero.setValue(1)
58  self.ui.spinBoxNumero.setEnabled(True)
59  self.ui.pushButtonFile.clicked.connect(self.fichierEleves)
60  self.ui.pushButton_replierArbre.clicked.connect(self.replie)
61  self.ui.pushButton_cocher.clicked.connect(self.coche)
62  self.ui.pushButton_decocher.clicked.connect(self.decoche)
63  self.ui.pushButton_addToList.clicked.connect(self.addToList)
64  self.ui.pushButton_delInList.clicked.connect(self.delInList)
65  self.ui.pushButton_OK.clicked.connect(self.valid)
66  self.ui.pushButton_Esc.clicked.connect(self.escape)
67  self.ui.checkBoxNumero.stateChanged.connect(self.checkNum)
68 
69 
71 
72  def fichierEleves(self):
73  caption="Choisissez un nouveau fichier de gestion des élèves"
74  dirname=os.path.dirname(self.prefs["schoolFile"])
75  newFile=QFileDialog.getOpenFileName (self, caption, dirname)
76  if os.path.exists(newFile):
77  self.prefs["schoolFile"]=newFile
78  db.writePrefs(self.prefs)
79  self.connecteGestionnaire(renew=True)
80  return
81 
82 
85 
86  def connecteGestionnaire(self, renew=False):
87  try:
88  self.ui.lineEditFile.setText(self.prefs["schoolFile"])
89  self.ui.treeView.connecteGestionnaire(self.prefs["schoolFile"],
90  self.gestionnaire,
91  renew=renew)
92  except Exception as err:
93  QMessageBox.warning(None,
94  QApplication.translate("Dialog","Échec à l'ouverture du fichier élèves",None),
95  QApplication.translate("Dialog","Le fichier {schoolfile} n'a pas pu être traité : {erreur}",None).format(schoolfile=self.prefs["schoolFile"], erreur=err))
96 
97  # fonction de rappel utilisée quand on coche/décoche la case pour
98  # prendre en compte le numéro
99  # @param state : l'état coché ou décoché
100  #
101 
102  def checkNum(self, state):
103  if state==Qt.Checked:
104  self.ui.spinBoxNumero.setEnabled(True)
105  else:
106  self.ui.spinBoxNumero.setEnabled(False)
107  return
108 
109 
111 
112  def replie(self):
113  self.ui.treeView.collapseAll()
114  return
115 
116 
118 
119  def coche(self):
120  for e in self.ui.treeView.expandedItems():
121  e.setCheckState(Qt.Checked)
122  return
123 
124 
126 
127  def decoche(self):
128  for e in self.ui.treeView.expandedItems():
129  e.setCheckState(Qt.Unchecked)
130  return
131 
132  # Met à jour l'icône du bouton d'activation dans l'application parente
133  # pour refléter la présence d'éléments dans la liste
134  #
135 
136  def updateParentIcon(self):
137  if self.parent():
138  self.parent().setAvailableNames(self.ui.listWidget.count() > 0)
139  return
140 
141 
143 
144  def addToList(self):
145  for n in self.listeUnique_Names():
146  if not self.ui.listWidget.findItems(n,Qt.MatchExactly):
147  self.ui.listWidget.addItem(n)
148  self.updateParentIcon()
149  return
150 
151 
153 
154  def delInList(self):
155  rows=[]
156  for i in self.ui.listWidget.selectedIndexes():
157  rows.append(i.row())
158  rows.sort(reverse=True)
159  for r in rows:
160  self.ui.listWidget.takeItem(r)
161  self.updateParentIcon()
162  return
163 
164  # renvoie et supprime le premier élément de la liste de noms;
165  # si cette liste est vide, renvoie None
166  # @return un nom pour un baladeur, sinon None
167  #
168 
169  def pop(self):
170  if self.ui.listWidget.count() == 0:
171  return
172  i=self.ui.listWidget.takeItem(0)
173  self.updateParentIcon()
174  data=i.data(Qt.DisplayRole)
175  return data
176 
177 
179 
180  def itemStrings(self):
181  itemList=self.ui.listWidget.findItems("*",Qt.MatchWrap | Qt.MatchWildcard)
182  l=[i.data(Qt.DisplayRole) for i in itemList]
183  l.sort()
184  return l
185 
186 
190 
191  def takeItem(self, item):
192  found=self.ui.listWidget.findItems(item,Qt.MatchExactly)
193  if len(found) > 0:
194  r=self.ui.listWidget.row(found[0])
195  i=self.ui.listWidget.takeItem(r)
196  self.updateParentIcon()
197  data=i.data(Qt.DisplayRole)
198  return data
199  return ""
200 
201 
203 
204  def valid(self):
205  self.ok=True
206  self.close()
207  return
208 
209  # Prend acte de l'abandon ; supprime les éléments de la liste et
210  # ferme le dialogue
211  #
212 
213  def escape(self):
214  while self.ui.listWidget.count() > 0:
215  self.ui.listWidget.takeItem(0)
216  self.updateParentIcon()
217  self.ok=False
218  self.close()
219  return
220 
221 
223 
224  def listeChoix(self):
225  return self.ui.treeView.checkedItems()
226 
227  def listeUnique_Names(self):
228  result=[]
229  for e in self.listeChoix():
230  prefixe=""
231  if self.ui.checkBoxNumero.isChecked():
232  n=self.ui.spinBoxNumero.value()
233  prefixe="%02d-" %n
234  self.ui.spinBoxNumero.setValue(n+1)
235  result.append(prefixe+e.unique_name)
236  return result
237 
238 if __name__=="__main__":
239  app=QApplication(sys.argv)
241  d.exec_()
242  print ("dialogue ok = %s" %d.ok)
243  i=d.pop()
244  while i:
245  print ("on a dépilé %s" %i)
246  i=d.pop()
247 
src.choixEleves.choixElevesDialog.__init__
def __init__(self, parent=None, gestionnaire=gestClasse.Sconet)
Definition: choixEleves.py:46
src.choixEleves.choixElevesDialog.valid
def valid(self)
Prend acte de la validation.
Definition: choixEleves.py:204
src.choixEleves.choixElevesDialog.fichierEleves
def fichierEleves(self)
choisit et ouvre un nouveau fichiers d'élèves
Definition: choixEleves.py:72
src.choixEleves.choixElevesDialog.listeChoix
def listeChoix(self)
Definition: choixEleves.py:224
src.choixEleves.choixElevesDialog.prefs
prefs
Definition: choixEleves.py:51
QDialog
src.choixEleves.choixElevesDialog.coche
def coche(self)
coche toutes les cases d'élèves visibles
Definition: choixEleves.py:119
src.choixEleves.choixElevesDialog.gestionnaire
gestionnaire
Definition: choixEleves.py:52
src.choixEleves.choixElevesDialog.pop
def pop(self)
Definition: choixEleves.py:169
src.choixEleves.choixElevesDialog.ok
ok
Definition: choixEleves.py:48
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:191
src.gestClasse.Sconet
Une classe pour travailler avec des données Sconet.
Definition: gestClasse.py:72
src.choixEleves.choixElevesDialog.ui
ui
Definition: choixEleves.py:49
src.choixEleves.choixElevesDialog.escape
def escape(self)
Definition: choixEleves.py:213
src.choixEleves.choixElevesDialog.listeUnique_Names
def listeUnique_Names(self)
Definition: choixEleves.py:227
src.choixEleves.choixElevesDialog
Definition: choixEleves.py:38
src.choixEleves.choixElevesDialog.updateParentIcon
def updateParentIcon(self)
Definition: choixEleves.py:136
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:144
src.choixEleves.choixElevesDialog.checkNum
def checkNum(self, state)
Definition: choixEleves.py:102
QtCore
src.choixEleves.choixElevesDialog.decoche
def decoche(self)
décoche toutes les cases d'élèves, visibles ou cachées
Definition: choixEleves.py:127
QtWidgets
src.choixEleves.choixElevesDialog.itemStrings
def itemStrings(self)
Definition: choixEleves.py:180
src.choixEleves.choixElevesDialog.delInList
def delInList(self)
retire les élèves de la liste quand ils y sont sélectionnés
Definition: choixEleves.py:154
src.choixEleves.choixElevesDialog.connecteGestionnaire
def connecteGestionnaire(self, renew=False)
met en place l'arbre des noms d'élèves
Definition: choixEleves.py:86
src.choixEleves.choixElevesDialog.replie
def replie(self)
replie toutes les classes du dialogue
Definition: choixEleves.py:112