-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Ajoute un panneau pour filtrer l'école dans le gestionnaire de conso.
- Loading branch information
Jérôme Lebleu
committed
Jun 30, 2017
1 parent
ea46556
commit 8ca2db2
Showing
2 changed files
with
341 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,259 @@ | ||
#!/usr/bin/env python | ||
# -*- coding: utf-8 -*- | ||
#----------------------------------------------------------- | ||
# Application : Noethys, gestion multi-activités | ||
# Site internet : www.noethys.com | ||
# Auteurs: Ivan LUCAS, Cliss XXI | ||
# Copyright: (c) 2010-11 Ivan LUCAS | ||
# (c) 2017 Cliss XXI | ||
# Licence: Licence GNU GPL | ||
#----------------------------------------------------------- | ||
|
||
import datetime | ||
|
||
import wx | ||
import wx.lib.agw.hypertreelist as HTL | ||
from wx.lib.agw.customtreectrl import EVT_TREE_ITEM_CHECKED | ||
|
||
import Chemins # noqa | ||
import GestionDB | ||
from Utils import UTILS_Dates | ||
from Utils.UTILS_Traduction import _ | ||
|
||
|
||
class CTRL(HTL.HyperTreeList): | ||
def __init__(self, parent): | ||
HTL.HyperTreeList.__init__(self, parent, -1) | ||
self.parent = parent | ||
self.date = None | ||
self.dictEcoles = {} | ||
self.MAJenCours = False | ||
self.cocherParDefaut = True | ||
self.cocheInconnue = True | ||
self.cochesActives = {} | ||
self.cochesEcolesActives = set() | ||
|
||
self.SetBackgroundColour(wx.WHITE) | ||
self.SetAGWWindowStyleFlag( | ||
HTL.TR_NO_HEADER | wx.TR_HIDE_ROOT | wx.TR_HAS_BUTTONS | | ||
wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.TR_FULL_ROW_HIGHLIGHT | ||
) | ||
self.EnableSelectionVista(True) | ||
|
||
self.SetToolTipString(_(u"Cochez les écoles et classes à afficher")) | ||
|
||
# Création des colonnes | ||
self.AddColumn(_(u"Ecole/classe")) | ||
self.SetColumnWidth(0, 420) | ||
|
||
# Binds | ||
self.Bind(EVT_TREE_ITEM_CHECKED, self.OnCheckItem) | ||
|
||
def SetDate(self, date=None): | ||
self.date = date | ||
self.MAJ() | ||
|
||
def SetCocherParDefaut(self, etat=True): | ||
self.cocherParDefaut = etat | ||
|
||
def OnCheckItem(self, event): | ||
if self.MAJenCours is False: | ||
item = event.GetItem() | ||
data = self.GetPyData(item) | ||
# Active ou non les branches enfants | ||
if data["type"] == "ecole": | ||
if self.IsItemChecked(item): | ||
self.EnableChildren(item, True) | ||
self.cochesEcolesActives.add(data["ID"]) | ||
else: | ||
self.EnableChildren(item, False) | ||
self.cochesEcolesActives.discard(data["ID"]) | ||
elif data["type"] == "classe": | ||
cochesGroupes = self.cochesActives[data["IDecole"]] | ||
if self.IsItemChecked(item): | ||
cochesGroupes.add(data["ID"]) | ||
else: | ||
cochesGroupes.discard(data["ID"]) | ||
else: | ||
self.cocheInconnue = self.IsItemChecked(item) | ||
# Envoie les données aux contrôle parent | ||
if hasattr(self.parent, "MAJecoles"): | ||
self.parent.MAJecoles() | ||
|
||
def Cocher(self, etat=True): | ||
self.MAJenCours = True | ||
item = self.root | ||
for index in range(0, self.GetChildrenCount(self.root)): | ||
item = self.GetNext(item) | ||
self.CheckItem(item, etat) | ||
self.MAJenCours = False | ||
|
||
def CocheListeTout(self): | ||
self.Cocher(True) | ||
|
||
def CocheListeRien(self): | ||
self.Cocher(False) | ||
|
||
def MAJ(self): | ||
""" Met à jour (redessine) tout le contrôle """ | ||
self.dictEcoles = self.Importation() | ||
self.MAJenCours = True | ||
self.DeleteAllItems() | ||
self.root = self.AddRoot(_(u"Racine")) | ||
self.Remplissage() | ||
self.MAJenCours = False | ||
|
||
def Importation(self): | ||
dictEcoles = {} | ||
if not self.date: | ||
return dictEcoles | ||
|
||
# Récupération des écoles disponibles le jour sélectionné | ||
DB = GestionDB.DB() | ||
req = """SELECT ecoles.IDecole, ecoles.nom, | ||
classes.IDclasse, classes.nom, classes.niveaux, | ||
classes.date_debut, classes.date_fin | ||
FROM scolarite | ||
LEFT JOIN ecoles ON ecoles.IDecole = scolarite.IDecole | ||
LEFT JOIN classes ON classes.IDclasse = scolarite.IDclasse | ||
WHERE scolarite.IDclasse IS NOT NULL | ||
AND scolarite.date_debut<='{0}' AND scolarite.date_fin>='{0}' | ||
GROUP BY scolarite.IDclasse;""".format(self.date) | ||
DB.ExecuterReq(req) | ||
listeDonnees = DB.ResultatReq() | ||
DB.Close() | ||
|
||
for (IDecole, nomEcole, IDclasse, nomClasse, niveaux, | ||
date_debut, date_fin) in listeDonnees: | ||
if date_debut is not None: | ||
date_debut = UTILS_Dates.DateEngEnDateDD(date_debut) | ||
if date_fin is not None: | ||
date_fin = UTILS_Dates.DateEngEnDateDD(date_fin) | ||
|
||
# Mémorisation de l'école | ||
if IDecole not in dictEcoles: | ||
dictEcoles[IDecole] = {"nom": nomEcole, "classes": []} | ||
|
||
# Mémorisation de la classe | ||
dictEcoles[IDecole]["classes"].append({ | ||
"IDclasse": IDclasse, | ||
"nom": nomClasse, | ||
"date_debut": date_debut, | ||
"date_fin": date_fin | ||
}) | ||
|
||
return dictEcoles | ||
|
||
def Remplissage(self): | ||
# Tri des écoles par nom | ||
listeEcoles = [] | ||
for IDecole, dictEcole in self.dictEcoles.iteritems(): | ||
listeEcoles.append((dictEcole["nom"], IDecole)) | ||
listeEcoles.sort() | ||
|
||
# Remplissage | ||
for nomEcole, IDecole in listeEcoles: | ||
dictEcole = self.dictEcoles[IDecole] | ||
|
||
# Initialise l'état des coches pour l'école | ||
if IDecole not in self.cochesActives: | ||
if self.cocherParDefaut is True: | ||
self.cochesEcolesActives.add(IDecole) | ||
self.cochesActives[IDecole] = set([ | ||
d["IDclasse"] for d in dictEcole["classes"] | ||
]) | ||
else: | ||
self.cochesActives[IDecole] = set() | ||
|
||
# Niveau Ecole | ||
niveauEcole = self.AppendItem(self.root, nomEcole, ct_type=1) | ||
self.SetPyData(niveauEcole, { | ||
"type": "ecole", | ||
"ID": IDecole, | ||
"nom": nomEcole | ||
}) | ||
self.SetItemBold(niveauEcole, True) | ||
|
||
# Niveau Classes | ||
for dictClasse in dictEcole["classes"]: | ||
IDclasse = dictClasse["IDclasse"] | ||
nomClasse = dictClasse["nom"] | ||
label = u"{0} (du {1} au {2})".format( | ||
nomClasse, | ||
UTILS_Dates.DateEngFr(dictClasse["date_debut"]), | ||
UTILS_Dates.DateEngFr(dictClasse["date_fin"]), | ||
) | ||
niveauClasse = self.AppendItem(niveauEcole, label, ct_type=1) | ||
self.SetPyData(niveauClasse, { | ||
"type": "classe", | ||
"ID": IDclasse, | ||
"nom": nomClasse, | ||
"IDecole": IDecole, | ||
}) | ||
|
||
if IDclasse in self.cochesActives[IDecole]: | ||
self.CheckItem(niveauClasse) | ||
|
||
# Coche l'école et active ses classes | ||
if IDecole in self.cochesEcolesActives: | ||
self.CheckItem(niveauEcole) | ||
self.EnableChildren(niveauEcole, True) | ||
else: | ||
self.EnableChildren(niveauEcole, False) | ||
|
||
# Ajoute une entrée pour les enfants dont la scolarité est inconnue | ||
item = self.AppendItem(self.root, u"Scolarité inconnue", ct_type=1) | ||
self.SetPyData(item, {"type": "inconnu"}) | ||
if self.cocheInconnue: | ||
self.CheckItem(item) | ||
|
||
self.ExpandAllChildren(self.root) | ||
|
||
def GetCoches(self, typeTemp="ecole"): | ||
listeCoches = [] | ||
item = self.root | ||
for index in range(0, self.GetChildrenCount(self.root)): | ||
item = self.GetNext(item) | ||
if self.IsItemChecked(item) and self.IsItemEnabled(item): | ||
data = self.GetPyData(item) | ||
if data["type"] == typeTemp: | ||
listeCoches.append(data["ID"]) | ||
return listeCoches | ||
|
||
def GetListeEcoles(self): | ||
return self.GetCoches(typeTemp="ecole") | ||
|
||
def GetListeClasses(self): | ||
return self.GetCoches(typeTemp="classe") | ||
|
||
def GetScolariteInconnue(self): | ||
item = self.GetLastChild(self.root) | ||
return self.IsItemChecked(item) and self.IsItemEnabled(item) | ||
|
||
def GetDictEcoles(self): | ||
return self.dictEcoles | ||
|
||
|
||
class MyFrame(wx.Frame): | ||
def __init__(self, *args, **kwds): | ||
wx.Frame.__init__(self, *args, **kwds) | ||
panel = wx.Panel(self, -1) | ||
sizer_1 = wx.BoxSizer(wx.VERTICAL) | ||
sizer_1.Add(panel, 1, wx.ALL | wx.EXPAND) | ||
self.SetSizer(sizer_1) | ||
self.ctrl = CTRL(panel) | ||
self.ctrl.MAJ() | ||
sizer_2 = wx.BoxSizer(wx.VERTICAL) | ||
sizer_2.Add(self.ctrl, 1, wx.ALL | wx.EXPAND, 4) | ||
panel.SetSizer(sizer_2) | ||
self.Layout() | ||
self.CentreOnScreen() | ||
|
||
|
||
if __name__ == '__main__': | ||
app = wx.App(0) | ||
frame_1 = MyFrame(None, -1, _(u"TEST"), size=(800, 400)) | ||
frame_1.ctrl.SetDate(datetime.datetime.now()) | ||
app.SetTopWindow(frame_1) | ||
frame_1.Show() | ||
app.MainLoop() |
Oops, something went wrong.