예제 #1
0
 def __init__(self, parent, IDpersonne=None):
     wx.Panel.__init__(self, parent, id=-1, style=wx.TAB_TRAVERSAL)
     self.IDpersonne = IDpersonne
     
     # Choix décoration
     self.label_decoration = wx.StaticText(self, -1, _(u"Cadre de décoration :"), style=wx.ALIGN_RIGHT)
     listeCadres = FonctionsPerso.GetListeCadresPhotos()
     self.combobox_decoration = wx.Choice(self, -1, choices=listeCadres)
     
     # Recherche du cadre de décoration attribué à la personne
     cadrePhoto, textePhoto = CTRL_Photo.GetCadreEtTexte(self.IDpersonne)
     if cadrePhoto != None and cadrePhoto != "" :
         self.combobox_decoration.SetStringSelection(cadrePhoto)
     else:
         self.combobox_decoration.SetSelection(0)
     
     # Saisie du texte personnalisé
     self.label_texte_perso = wx.StaticText(self, -1, _(u"Texte personnalisé :"), style=wx.ALIGN_RIGHT)
     self.texte_perso = wx.TextCtrl(self, -1, textePhoto)
     
     # Layout
     grid_sizer_base = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)
     grid_sizer_base.Add(self.label_decoration, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)
     grid_sizer_base.Add(self.combobox_decoration, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)
     grid_sizer_base.Add(self.label_texte_perso, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 0)
     grid_sizer_base.Add(self.texte_perso, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 0)
     grid_sizer_base.AddGrowableCol(3)
     self.SetSizer(grid_sizer_base)
     self.Layout()
     
     # Binds
     self.Bind(wx.EVT_CHOICE, self.OnChoixDecoration, self.combobox_decoration)
     self.Bind(wx.EVT_TEXT, self.OnTextePerso, self.texte_perso)
예제 #2
0
    def Initialisation(self):
        # Importation des individus
        listeActivites = self.interface.dictProcedure["parametres"][
            "activites"]
        if listeActivites != None:
            if len(listeActivites) == 0: conditionActivites = "()"
            elif len(listeActivites) == 1:
                conditionActivites = "(%d)" % listeActivites[0]
            else:
                conditionActivites = str(tuple(listeActivites))
            req = """SELECT individus.IDindividu, IDcivilite, nom, prenom 
                        FROM individus 
                        LEFT JOIN inscriptions ON inscriptions.IDindividu = individus.IDindividu
                        WHERE inscriptions.statut='ok' AND inscriptions.IDactivite IN %s
                        AND (date_desinscription IS NULL OR date_desinscription>='%s')
                        GROUP BY individus.IDindividu
                        ORDER BY nom, prenom;""" % (conditionActivites,
                                                    self.interface.date)
        else:
            req = """SELECT IDindividu, IDcivilite, nom, prenom FROM individus ORDER BY nom, prenom;"""
        DB = GestionDB.DB()
        DB.ExecuterReq(req)
        listeIndividus = DB.ResultatReq()
        DB.Close()

        # liste images
        self.dictPhotos = {}
        taillePhoto = 64
        il = wx.ImageList(taillePhoto, taillePhoto, True)
        for IDindividu, IDcivilite, nom, prenom in listeIndividus:
            nomFichier = Chemins.GetStaticPath(
                "Images/128x128/%s" % DICT_CIVILITES[IDcivilite]["nomImage"])
            IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu,
                                               nomFichier=nomFichier,
                                               taillePhoto=(taillePhoto,
                                                            taillePhoto),
                                               qualite=100)
            img = il.Add(bmp)
            self.dictPhotos[IDindividu] = img
        self.AssignImageList(il, wx.IMAGE_LIST_SMALL)

        self.InsertColumn(0,
                          _(u"Nom de l'individu"),
                          width=400,
                          format=ULC.ULC_FORMAT_LEFT)

        # Création des items
        index = 0
        for IDindividu, IDcivilite, nom, prenom in listeIndividus:
            label = u"  %s %s" % (nom, prenom)
            self.InsertImageStringItem(index, label,
                                       self.dictPhotos[IDindividu])
            self.SetItemData(index, IDindividu)
            self.SetItemFont(index, wx.Font(12, wx.SWISS, wx.NORMAL,
                                            wx.NORMAL))

            index += 1

        self.Bind(ULC.EVT_LIST_ITEM_ACTIVATED, self.Valider)
예제 #3
0
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, name="panel_resume")
        self.parent = parent

        self.barreTitre_resume = FonctionsPerso.BarreTitre(
            self, _(u"Détail de la sélection"),
            _(u"Détail de la sélection"))

        # Contrôles
        self.bitmap_photo = CTRL_Photo.CTRL_Photo(self, style=wx.SUNKEN_BORDER)
        self.bitmap_photo.SetPhoto(
            IDindividu=None,
            nomFichier=Chemins.GetStaticPath("Images/128x128/Personne.png"),
            taillePhoto=(128, 128))

        self.resume_L1 = wx.StaticText(self, -1, "")
        self.resume_L2 = wx.StaticText(self, -1, "")
        self.resume_L3 = wx.StaticText(self, -1, "")
        self.resume_L4 = wx.StaticText(self, -1, "")
        self.resume_L5 = wx.StaticText(self, -1, "")
        self.resume_L6 = wx.StaticText(self, -1, "")
        #self.tree_ctrl_resume = TreeCtrlCategories(self)

        # Propriétés
        self.SetBackgroundColour((214, 223, 247))
        self.resume_L1.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))

        # Layout
        grid_sizer_base = wx.FlexGridSizer(rows=2, cols=1, vgap=0, hgap=0)
        grid_sizer_base.Add(self.barreTitre_resume, 0, wx.EXPAND, 0)

        grid_sizer_resume = wx.FlexGridSizer(rows=1, cols=3, vgap=0, hgap=0)
        grid_sizer_texte = wx.FlexGridSizer(rows=9, cols=1, vgap=0, hgap=0)
        grid_sizer_resume.Add(self.bitmap_photo, 0, wx.ALL | wx.EXPAND, 10)
        grid_sizer_texte.Add(self.resume_L1, 0, 0, 0)
        grid_sizer_texte.Add((5, 5), 0, wx.EXPAND, 0)
        grid_sizer_texte.Add(self.resume_L2, 0, 0, 0)
        grid_sizer_texte.Add((5, 5), 0, wx.EXPAND, 0)
        grid_sizer_texte.Add(self.resume_L3, 0, 0, 0)
        grid_sizer_texte.Add(self.resume_L4, 0, 0, 0)
        grid_sizer_texte.Add((5, 5), 0, wx.EXPAND, 0)
        grid_sizer_texte.Add(self.resume_L5, 0, 0, 0)
        grid_sizer_texte.Add(self.resume_L6, 0, 0, 0)
        grid_sizer_resume.Add(grid_sizer_texte, 1, wx.ALL | wx.EXPAND, 10)
        #grid_sizer_resume.Add(self.tree_ctrl_resume, 1, wx.ALL|wx.EXPAND, 10)
        grid_sizer_resume.AddGrowableCol(1)

        grid_sizer_base.Add(grid_sizer_resume, 0, wx.EXPAND, 0)
        grid_sizer_base.AddGrowableRow(1)
        grid_sizer_base.AddGrowableCol(0)
        self.SetSizer(grid_sizer_base)

        self.Bind(wx.EVT_SIZE, self.OnSize)
예제 #4
0
    def __init__(self, parent):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           style=wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX
                           | wx.MINIMIZE_BOX)
        self.parent = parent
        self.dictDonnees = {}

        # Nom
        self.staticbox_generalites_staticbox = wx.StaticBox(
            self, -1, _(u"Généralités"))
        self.label_nom = wx.StaticText(self, -1, _(u"Nom de l'individu :"))
        self.ctrl_nom = wx.TextCtrl(self, -1, "")
        self.ctrl_nom.SetMinSize((200, -1))
        self.label_description = wx.StaticText(self, -1, _(u"Description :"))
        self.ctrl_description = wx.TextCtrl(self, -1, "")

        # Photo
        self.staticbox_photo_staticbox = wx.StaticBox(self, -1, _(u"Photo"))
        self.ctrl_photo = CTRL_Photo.CTRL_Photo(self,
                                                modeBase64=True,
                                                style=wx.SUNKEN_BORDER)
        self.ctrl_photo.SetMinSize((128, 128))

        # Commandes
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png")
        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self, texte=_(u"Ok"), cheminImage="Images/32x32/Valider.png")
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self,
            id=wx.ID_CANCEL,
            texte=_(u"Annuler"),
            cheminImage="Images/32x32/Annuler.png")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
예제 #5
0
    def Impression(self, listeActivites, listePeriodes):
        # Création du PDF
        self.taille_page = A4
        self.orientation = "PORTRAIT"
        if self.orientation == "PORTRAIT" :
            self.hauteur_page = self.taille_page[1]
            self.largeur_page = self.taille_page[0]
        else:
            self.hauteur_page = self.taille_page[0]
            self.largeur_page = self.taille_page[1]
        
        # Création des conditions pour les requêtes SQL
        conditionsPeriodes = GetSQLdates(listePeriodes)
        
        if len(listeActivites) == 0 : conditionActivites = "()"
        elif len(listeActivites) == 1 : conditionActivites = "(%d)" % listeActivites[0]
        else : conditionActivites = str(tuple(listeActivites))
                                    
        # Récupération des individus grâce à leurs consommations
        self.EcritStatusBar(_(u"Recherche des individus..."))
        DB = GestionDB.DB() 
        req = """SELECT individus.IDindividu, IDcivilite, nom, prenom, date_naiss
        FROM consommations 
        LEFT JOIN individus ON individus.IDindividu = consommations.IDindividu
        WHERE etat IN ("reservation", "present")
        AND IDactivite IN %s AND %s
        GROUP BY individus.IDindividu
        ORDER BY nom, prenom
        ;""" % (conditionActivites, conditionsPeriodes)
        DB.ExecuterReq(req)
        listeIndividus = DB.ResultatReq()
        DB.Close() 
        if len(listeIndividus) == 0 :
            dlg = wx.MessageDialog(self, _(u"Aucun individu n'a été trouvé avec les paramètres spécifiés !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.EcritStatusBar(u"")
            return

        dictIndividus = {}
        listeIDindividus = []
        
        dictAnniversaires = {} 
        
        self.EcritStatusBar(_(u"Recherche des dates de naissance..."))
        for IDindividu, IDcivilite, nom, prenom, date_naiss in listeIndividus :
            if date_naiss != None : 
                date_naiss = DateEngEnDateDD(date_naiss)
                age = GetAge(date_naiss)
                jour = date_naiss.day
                mois = date_naiss.month
                
                # Mémorisation de l'individu
                dictIndividus[IDindividu] = { 
                    "IDcivilite" : IDcivilite, "nom" : nom, "prenom" : prenom, 
                    "age" : age, "date_naiss" : date_naiss,
                    }
                
                # Mémorisation du IDindividu
                if dictAnniversaires.has_key(mois) == False : 
                    dictAnniversaires[mois] = {} 
                if dictAnniversaires[mois].has_key(jour) == False : 
                    dictAnniversaires[mois][jour] = []
                dictAnniversaires[mois][jour].append(IDindividu)
                
                if IDindividu not in listeIDindividus :
                    listeIDindividus.append(IDindividu) 
                
        # Récupération des photos individuelles
        dictPhotos = {}
        taillePhoto = 128
        if self.ctrl_photos.GetSelection() == 0 : tailleImageFinal = 16
        if self.ctrl_photos.GetSelection() == 1 : tailleImageFinal = 32
        if self.ctrl_photos.GetSelection() == 2 : tailleImageFinal = 64
        if self.check_photos.GetValue() == True :
            index = 0
            for IDindividu in listeIDindividus :
                self.EcritStatusBar(_(u"Recherche des photos... %d/%d") % (index, len(listeIDindividus)))
                IDcivilite = dictIndividus[IDindividu]["IDcivilite"]
                nomFichier = Chemins.GetStaticPath("Images/128x128/%s" % DICT_CIVILITES[IDcivilite]["nomImage"])
                IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu, nomFichier=nomFichier, taillePhoto=(taillePhoto, taillePhoto), qualite=100)
                
                # Création de la photo dans le répertoire Temp
                nomFichier = UTILS_Fichiers.GetRepTemp(fichier="photoTmp%d.jpg" % IDindividu)
                bmp.SaveFile(nomFichier, type=wx.BITMAP_TYPE_JPEG)
                img = Image(nomFichier, width=tailleImageFinal, height=tailleImageFinal)
                dictPhotos[IDindividu] = img
                
                index += 1
            
        # ---------------- Création du PDF -------------------
        self.EcritStatusBar(_(u"Création du PDF...")) 
        
        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("ANNIVERSAIRES", "pdf")
        if sys.platform.startswith("win") : nomDoc = nomDoc.replace("/", "\\")
        doc = BaseDocTemplate(nomDoc, pagesize=(self.largeur_page, self.hauteur_page), topMargin=30, bottomMargin=30, showBoundary=False)
        doc.addPageTemplates(MyPageTemplate(pageSize=(self.largeur_page, self.hauteur_page)))
        story = []
                        
        # Mois
        listeMois = dictAnniversaires.keys()
        listeMois.sort() 
        for numMois in listeMois :
            
            # Mémorise le numéro de mois pour le titre de la page
            nomMois = LISTE_NOMS_MOIS[numMois-1]
            story.append(DocAssign("numMois", numMois))

            # Jours
            dictJours = dictAnniversaires[numMois]
            listeJours = dictJours.keys() 
            listeJours.sort() 
            for numJour in listeJours :                                
                # Initialisation du tableau
                dataTableau = []
                largeursColonnes = []
                                    
                # Recherche des entêtes de colonnes :
                if self.check_photos.GetValue() == True :
                    largeursColonnes.append(tailleImageFinal+6)
                
                # Colonne nom de l'individu
                largeursColonnes.append(LARGEUR_COLONNE-sum(largeursColonnes))
                
                # Label numéro de jour
                ligne = []
                ligne.append(str(numJour))
                if self.check_photos.GetValue() == True :
                    ligne.append(u"")
                dataTableau.append(ligne)
                
                # Individus
                listeIndividus = dictAnniversaires[numMois][numJour]
                
                for IDindividu in listeIndividus :
                    ligne = []
                    
                    # Photo
                    if self.check_photos.GetValue() == True and IDindividu in dictPhotos :
                        img = dictPhotos[IDindividu]
                        ligne.append(img)
                    
                    # Nom
                    nom = dictIndividus[IDindividu]["nom"]
                    prenom = dictIndividus[IDindividu]["prenom"]
                    ligne.append(u"%s %s" % (nom, prenom))
                    
                    # Ajout de la ligne individuelle dans le tableau
                    dataTableau.append(ligne)
             
                couleurFondJour = (0.8, 0.8, 1) # Vert -> (0.5, 1, 0.2)
                couleurFondTableau = (1, 1, 1)
                
                style = TableStyle([
                        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), # Centre verticalement toutes les cases
                        ('BACKGROUND', (0,0), (-1,-1), couleurFondTableau), # Donne la couleur de fond du titre de groupe
                        
                        ('FONT',(0,0),(-1,-1), "Helvetica", 7), # Donne la police de caract. + taille de police 
                        ('GRID', (0,0), (-1,-1), 0.25, colors.black), # Crée la bordure noire pour tout le tableau
                        ('ALIGN', (0,1), (-1,-1), 'CENTRE'), # Centre les cases
                        
                        ('SPAN',(0,0),(-1,0)), # Fusionne les lignes du haut pour faire le titre du groupe
                        ('FONT',(0,0),(0,0), "Helvetica-Bold", 10), # Donne la police de caract. + taille de police du titre de groupe
                        ('BACKGROUND', (0,0), (-1,0), couleurFondJour), # Donne la couleur de fond du titre de groupe
                        
                        ])
                    
                # Création du tableau
                tableau = Table(dataTableau, largeursColonnes)
                tableau.setStyle(style)
                story.append(tableau)
                story.append(Spacer(0, 10))
                    
            # Saut de page après un mois
            story.append(PageBreak())
            
        # Enregistrement du PDF
        doc.build(story)
        
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
        
        self.EcritStatusBar(u"") 
예제 #6
0
    def __init__(self, parent, IDindividu=None, dictInfosNouveau={}):
        wx.Dialog.__init__(self,
                           parent,
                           id=-1,
                           name="fiche_individu",
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.IDindividu = IDindividu
        self.dictInfosNouveau = dictInfosNouveau
        self.nouvelleFiche = False

        # Adapte taille Police pour Linux
        from Utils import UTILS_Linux
        UTILS_Linux.AdaptePolice(self)

        if IDindividu == None and len(self.dictInfosNouveau) > 0:
            self.nouvelleFiche = True
            # Création de l'IDindividu
            self.CreateIDindividu()
            # Création du rattachement à la famille
            self.RattacherIndividu(self.dictInfosNouveau["IDfamille"],
                                   self.dictInfosNouveau["IDcategorie"],
                                   self.dictInfosNouveau["titulaire"])

        # Recherche des familles rattachées
        if self.IDindividu != None:
            self.dictFamillesRattachees = self.GetFamillesRattachees()
        else:
            self.dictFamillesRattachees = {}

        self.ctrl_ID = wx.StaticText(
            self, -1,
            _(u"Rattaché à aucune famille | ID : %d") % self.IDindividu)
        self.ctrl_ligne = wx.StaticLine(self, -1)
        self.ctrl_nom = wx.StaticText(self, -1, _(u"NOM, Prénom"))
        self.ctrl_datenaiss = wx.StaticText(self, -1,
                                            _(u"Date de naissance inconnue"))
        self.ctrl_adresse = wx.StaticText(self, -1,
                                          _(u"Lieu de résidence inconnu"))
        couleurFond = self.ctrl_adresse.GetBackgroundColour(
        )  #wx.SystemSettings.GetColour(30)
        self.ctrl_liens = CTRL_header_rattachement(
            self, couleurFond=couleurFond
        )  #wx.StaticText(self, -1, _(u"Aucun rattachement"))
        self.ctrl_photo = CTRL_Photo.CTRL_Photo(self, style=wx.SUNKEN_BORDER)
        self.ctrl_photo.SetPhoto(
            IDindividu=None,
            nomFichier=Chemins.GetStaticPath("Images/128x128/Personne.png"),
            taillePhoto=(128, 128),
            qualite=100)
        self.ctrl_notebook = Notebook(
            self,
            IDindividu=self.IDindividu,
            dictFamillesRattachees=self.dictFamillesRattachees)

        self.bouton_ok = CTRL_Bouton_image.CTRL(
            self, texte=_(u"Ok"), cheminImage="Images/32x32/Valider.png")
        self.bouton_annuler = CTRL_Bouton_image.CTRL(
            self, texte=_(u"Annuler"), cheminImage="Images/32x32/Annuler.png")
        self.bouton_options = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Options"),
            cheminImage="Images/32x32/Configuration2.png")
        self.bouton_outils = CTRL_Bouton_image.CTRL(
            self,
            texte=_(u"Outils"),
            cheminImage="Images/32x32/Configuration.png")
        self.bouton_aide = CTRL_Bouton_image.CTRL(
            self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOptions, self.bouton_options)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOutils, self.bouton_outils)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        # Importation des données
        ##        if self.nouvelleFiche == False :
        ##            listePages = ("identite", "coords")
        ##            for codePage in listePages :
        ##                self.ctrl_notebook.GetPage(codePage).MAJ()

        self.ctrl_notebook.GetPageAvecCode("identite").MAJ()
        self.ctrl_notebook.GetPageAvecCode("coords").MAJ()

        # Saisie des infos par défaut pour la nouvelle fiche
        if self.nouvelleFiche == True:
            pageIdentite = self.ctrl_notebook.GetPageAvecCode("identite")
            pageIdentite.SetValeursDefaut(
                self.dictInfosNouveau["nom"],
                self.dictInfosNouveau["prenom"],
                self.dictInfosNouveau["IDcategorie"],
            )
            pageIdentite.majEffectuee = True
            # Si c'est un nouveau contact, on se met sur adresse manuelle
            if self.dictInfosNouveau["IDcategorie"] == 3:
                pageCoords = self.ctrl_notebook.GetPageAvecCode("coords")
                pageCoords.radio_adresse_manuelle.SetValue(True)
                pageCoords.OnRadioAdresse(None)
            # On met à jour les pages spéciales autre que "Identité"


##            listePages = ("liens", "coords")
##            for codePage in listePages :
##                page = self.ctrl_notebook.GetPageAvecCode(codePage)
##                page.MAJ()
##                page.majEffectuee = True

# Mise à jour du header
        self.MAJtexteRattachementHeader()

        # MAJ de l'onglet Informations
        self.ctrl_notebook.GetPageAvecCode("informations").MAJ()
    def OnBoutonOk(self, event):
        dictParametres = self.ctrl_notebook.GetParametres()

        # Récupération et vérification des données
        listeActivites = dictParametres["liste_activites"]
        if len(listeActivites) == 0 :
            self.ctrl_notebook.AffichePage("generalites")
            dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement cocher au moins une activité !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        # Récupération et vérification des données
        listeGroupes = dictParametres["liste_groupes"]
        if len(dictParametres["liste_groupes"]) == 0 :
            self.ctrl_notebook.AffichePage("generalites")
            dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement cocher au moins un groupe !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        # Vérification qu'il y a des colonnes
        if not dictParametres["colonnes"]:
            dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement créer au moins une colonne !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        # Recherche les catégories utilisées
        liste_categories_utilisees = []
        for nom_categorie, categories in dictParametres["colonnes"]:
            for IDcategorie in UTILS_Texte.ConvertStrToListe(categories):
                if IDcategorie not in liste_categories_utilisees :
                    liste_categories_utilisees.append(IDcategorie)

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.lib.pagesizes import A4
        from reportlab.lib import colors
        from reportlab.lib.styles import ParagraphStyle
        
        self.taille_page = A4
        if dictParametres["orientation"] == "portrait" :
            self.hauteur_page = self.taille_page[1]
            self.largeur_page = self.taille_page[0]
        else:
            self.hauteur_page = self.taille_page[0]
            self.largeur_page = self.taille_page[1]
        
        # Création des conditions pour les requêtes SQL
        conditionsPeriodes = GetSQLdates(dictParametres["liste_periodes"])
        
        if len(listeActivites) == 0 : conditionActivites = "()"
        elif len(listeActivites) == 1 : conditionActivites = "(%d)" % listeActivites[0]
        else : conditionActivites = str(tuple(listeActivites))
        
        if len(listeGroupes) == 0 : conditionGroupes = "()"
        elif len(listeGroupes) == 1 : conditionGroupes = "(%d)" % listeGroupes[0]
        else : conditionGroupes = str(tuple(listeGroupes))
                
        # Récupération des noms des groupes
        dictGroupes = dictParametres["dict_groupes"]
        dictActivites = dictParametres["dict_activites"]

        DB = GestionDB.DB()

        # ------------ MODE PRESENTS ---------------------------------

        if dictParametres["mode"] == "presents" :

            # Récupération de la liste des groupes ouverts sur cette période
            req = """SELECT IDouverture, IDactivite, IDunite, IDgroupe
            FROM ouvertures 
            WHERE ouvertures.IDactivite IN %s AND %s
            AND IDgroupe IN %s
            ; """ % (conditionActivites, conditionsPeriodes, conditionGroupes)
            DB.ExecuterReq(req)
            listeOuvertures = DB.ResultatReq()
            dictOuvertures = {}
            for IDouverture, IDactivite, IDunite, IDgroupe in listeOuvertures :
                if (IDactivite in dictOuvertures) == False :
                    dictOuvertures[IDactivite] = []
                if IDgroupe not in dictOuvertures[IDactivite] :
                    dictOuvertures[IDactivite].append(IDgroupe)

            # Récupération des individus grâce à leurs consommations
            req = """SELECT individus.IDindividu, IDactivite, IDgroupe,
            IDcivilite, nom, prenom, date_naiss
            FROM consommations 
            LEFT JOIN individus ON individus.IDindividu = consommations.IDindividu
            WHERE consommations.etat IN ("reservation", "present")
            AND IDactivite IN %s AND %s
            GROUP BY individus.IDindividu, IDactivite, IDgroupe
            ORDER BY nom, prenom
            ;""" % (conditionActivites, conditionsPeriodes)
            DB.ExecuterReq(req)
            listeIndividus = DB.ResultatReq()


        # ------------ MODE INSCRITS ---------------------------------

        if dictParametres["mode"] == "inscrits" :

            dictOuvertures = {}
            for IDgroupe, dictGroupe in dictGroupes.items() :
                IDactivite = dictGroupe["IDactivite"]
                if (IDactivite in dictOuvertures) == False :
                    dictOuvertures[IDactivite] = []
                if IDgroupe not in dictOuvertures[IDactivite] :
                    dictOuvertures[IDactivite].append(IDgroupe)

            # Récupération des individus grâce à leurs consommations
            req = """SELECT individus.IDindividu, IDactivite, IDgroupe,
            IDcivilite, nom, prenom, date_naiss
            FROM individus 
            LEFT JOIN inscriptions ON inscriptions.IDindividu = individus.IDindividu
            WHERE inscriptions.statut='ok' AND IDactivite IN %s
            GROUP BY individus.IDindividu, IDactivite, IDgroupe
            ORDER BY nom, prenom
            ;""" % conditionActivites
            DB.ExecuterReq(req)
            listeIndividus = DB.ResultatReq()


        # Analyse des individus
        dictIndividus = {}
        listeIDindividus = []
        for IDindividu, IDactivite, IDgroupe, IDcivilite, nom, prenom, date_naiss in listeIndividus:
            if date_naiss != None: date_naiss = UTILS_Dates.DateEngEnDateDD(date_naiss)
            age = self.GetAge(date_naiss)

            # Mémorisation de l'individu
            dictIndividus[IDindividu] = {
                "IDcivilite": IDcivilite, "nom": nom, "prenom": prenom,
                "age": age, "date_naiss": date_naiss, "IDgroupe": IDgroupe, "IDactivite": IDactivite,
            }

            # Mémorisation du IDindividu
            if IDindividu not in listeIDindividus:
                listeIDindividus.append(IDindividu)


        # Dict Informations médicales
        req = """SELECT IDprobleme, IDindividu, IDtype, intitule, date_debut, date_fin, description, traitement_medical,
        description_traitement, date_debut_traitement, date_fin_traitement, eviction, date_debut_eviction, date_fin_eviction
        FROM problemes_sante 
        WHERE diffusion_listing_enfants=1
        ;"""
        DB.ExecuterReq(req)
        listeInformations = DB.ResultatReq()
        DB.Close()
        dictInfosMedicales = {}
        for IDprobleme, IDindividu, IDtype, intitule, date_debut, date_fin, description, traitement_medical, description_traitement, date_debut_traitement, date_fin_traitement, eviction, date_debut_eviction, date_fin_eviction in listeInformations :
            if (IDindividu in dictInfosMedicales) == False :
                dictInfosMedicales[IDindividu] = []
            dictTemp = {
                "IDprobleme" : IDprobleme, "IDcategorie" : IDtype, "intitule" : intitule, "date_debut" : date_debut,
                "date_fin" : date_fin, "description" : description, "traitement_medical" : traitement_medical, "description_traitement" : description_traitement, 
                "date_debut_traitement" : date_debut_traitement, "date_fin_traitement" : date_fin_traitement, "eviction" : eviction, 
                "date_debut_eviction" : date_debut_eviction, "date_fin_eviction" : date_fin_eviction, 
                }
            dictInfosMedicales[IDindividu].append(dictTemp)
        
        # Récupération des photos individuelles
        dictPhotos = {}
        taillePhoto = 128
        if dictParametres["afficher_photos"] == "petite" : tailleImageFinal = 16
        if dictParametres["afficher_photos"] == "moyenne" : tailleImageFinal = 32
        if dictParametres["afficher_photos"] == "grande" : tailleImageFinal = 64
        if dictParametres["afficher_photos"] != "non" :
            for IDindividu in listeIDindividus :
                IDcivilite = dictIndividus[IDindividu]["IDcivilite"]
                nomFichier = Chemins.GetStaticPath("Images/128x128/%s" % DICT_CIVILITES[IDcivilite]["nomImage"])
                IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu, nomFichier=nomFichier, taillePhoto=(taillePhoto, taillePhoto), qualite=100)
                
                # Création de la photo dans le répertoire Temp
                nomFichier = UTILS_Fichiers.GetRepTemp(fichier="photoTmp%d.jpg" % IDindividu)
                bmp.SaveFile(nomFichier, type=wx.BITMAP_TYPE_JPEG)
                img = Image(nomFichier, width=tailleImageFinal, height=tailleImageFinal)
                dictPhotos[IDindividu] = img
            
        # ---------------- Création du PDF -------------------
        
        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("LISTE_INFORMATIONS_MEDICALES", "pdf")
        if sys.platform.startswith("win") : nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, pagesize=(self.largeur_page, self.hauteur_page), topMargin=30, bottomMargin=30)
        story = []
        
        largeurContenu = self.largeur_page - 75
        
        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ( (largeurContenu-100, 100) )
            dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
            dataTableau.append( (_(u"Informations médicales"), _(u"%s\nEdité le %s") % (UTILS_Organisateur.GetNom(), dateDuJour)) )
            style = TableStyle([
                    ('BOX', (0,0), (-1,-1), 0.25, colors.black), 
                    ('VALIGN', (0,0), (-1,-1), 'TOP'), 
                    ('ALIGN', (0,0), (0,0), 'LEFT'), 
                    ('FONT',(0,0),(0,0), "Helvetica-Bold", 16), 
                    ('ALIGN', (1,0), (1,0), 'RIGHT'), 
                    ('FONT',(1,0),(1,0), "Helvetica", 6), 
                    ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0,20))       
        
        # Insère un header
        Header() 
        
        # Activités
        for IDactivite in listeActivites :

            # Groupes
            if IDactivite in dictOuvertures :
                nbreGroupes = len(dictOuvertures[IDactivite])
                indexGroupe = 1
                for IDgroupe in dictOuvertures[IDactivite] :
                    nomGroupe = dictGroupes[IDgroupe]["nom"]
                    if isinstance(dictActivites[IDactivite], dict):
                        nomActivite = dictActivites[IDactivite]["nom"]
                    else:
                        nomActivite = dictActivites[IDactivite]

                    # Initialisation du tableau
                    dataTableau = []
                    largeursColonnes = []
                    labelsColonnes = []
                                        
                    # Recherche des entêtes de colonnes :
                    if dictParametres["afficher_photos"] != "non" :
                        labelsColonnes.append(_(u"Photo"))
                        largeursColonnes.append(tailleImageFinal+6)
                        
                    labelsColonnes.append(_(u"Nom - prénom"))
                    if dictParametres["largeur_colonne_nom"] == "automatique" :
                        largeursColonnes.append(120)
                    else :
                        largeursColonnes.append(int(dictParametres["largeur_colonne_nom"]))

                    if dictParametres["afficher_age"] == True :
                        labelsColonnes.append(_(u"Âge"))
                        if dictParametres["largeur_colonne_age"] == "automatique":
                            largeursColonnes.append(20)
                        else:
                            largeursColonnes.append(int(dictParametres["largeur_colonne_age"]))

                    # Calcule la largeur restante
                    largeurRestante = largeurContenu - sum(largeursColonnes)

                    # Calcul des largeurs de colonnes
                    largeurColonnes = largeurRestante * 1.0 / len(dictParametres["colonnes"])
                    for nom_categorie, categories in dictParametres["colonnes"]:
                        labelsColonnes.append(nom_categorie)
                        largeursColonnes.append(largeurColonnes)

                    # Création de l'entete de groupe
                    ligne = [u"%s - %s" % (nomActivite, nomGroupe),]
                    for x in range(0, len(labelsColonnes)-1):
                        ligne.append("")
                    dataTableau.append(ligne)
        
                    # Création des entêtes
                    ligne = []
                    for label in labelsColonnes :
                        ligne.append(label)
                    dataTableau.append(ligne)
                    
                    # --------- Création des lignes -----------
                            
                    # Création d'une liste temporaire pour le tri
                    listeIndividus = []
                    if IDactivite in dictOuvertures :
                        if IDgroupe in dictOuvertures[IDactivite] :
                            for IDindividu in listeIDindividus :
                                dictIndividu = dictIndividus[IDindividu]
                                if dictIndividu["IDgroupe"] == IDgroupe :
                                    valeursTri = (IDindividu, dictIndividu["nom"], dictIndividu["prenom"], dictIndividu["age"])
                                    
                                    # + Sélection uniquement des individus avec infos
                                    if dictParametres["individus_avec_infos"] == False or (dictParametres["individus_avec_infos"] == True and IDindividu in dictInfosMedicales ) :
                                        listeIndividus.append(valeursTri)
                    
                    if dictParametres["tri"] == "nom" : paramTri = 1 # Nom
                    if dictParametres["tri"] == "prenom" : paramTri = 2 # Prénom
                    if dictParametres["tri"] == "age" : paramTri = 3 # Age
                    if dictParametres["ordre"] == "croissant" :
                        ordreDecroissant = False
                    else:
                        ordreDecroissant = True
                    listeIndividus = sorted(listeIndividus, key=operator.itemgetter(paramTri), reverse=ordreDecroissant)
                    
                    # Récupération des lignes individus
                    for IDindividu, nom, prenom, age in listeIndividus :
                        dictIndividu = dictIndividus[IDindividu]
                        
                        ligne = []
                        
                        # Photo
                        if dictParametres["afficher_photos"] != "non" and IDindividu in dictPhotos :
                            img = dictPhotos[IDindividu]
                            ligne.append(img)
                        
                        # Nom
                        ligne.append(u"%s %s" % (nom, prenom))
                        
                        # Age
                        if dictParametres["afficher_age"] == True :
                            if age != None :
                                ligne.append(age)
                            else:
                                ligne.append("")
                        
                        # Informations médicales
                        paraStyle = ParagraphStyle(name="infos",
                                    fontName="Helvetica",
                                    fontSize=7,
                                    leading=8,
                                    spaceAfter=2,
                                    )

                        # Création des colonnes
                        has_infos = False
                        for nom_categorie, categories in dictParametres["colonnes"]:
                            liste_categories = UTILS_Texte.ConvertStrToListe(categories)

                            case = []
                            # Recherche s'il y a une info médicale dans cette case
                            if IDindividu in dictInfosMedicales:
                                for infoMedicale in dictInfosMedicales[IDindividu] :
                                    IDcategorie = infoMedicale["IDcategorie"]

                                    if IDcategorie in liste_categories or (0 in liste_categories and IDcategorie not in liste_categories_utilisees) :

                                        intitule = infoMedicale["intitule"]
                                        description = infoMedicale["description"]
                                        traitement = infoMedicale["traitement_medical"]
                                        description_traitement = infoMedicale["description_traitement"]
                                        date_debut_traitement = infoMedicale["date_debut_traitement"]
                                        date_fin_traitement = infoMedicale["date_fin_traitement"]

                                        # Intitulé et description
                                        if description != None and description != "":
                                            texteInfos = u"<b>%s</b> : %s" % (intitule, description)
                                        else:
                                            texteInfos = u"%s" % intitule
                                        if len(texteInfos) > 0 and texteInfos[-1] != ".": texteInfos += u"."
                                        # Traitement médical
                                        if traitement == 1 and description_traitement != None and description_traitement != "":
                                            texteDatesTraitement = u""
                                            if date_debut_traitement != None and date_fin_traitement != None:
                                                texteDatesTraitement = _(u" du %s au %s") % (UTILS_Dates.DateEngFr(date_debut_traitement), UTILS_Dates.DateEngFr(date_fin_traitement))
                                            if date_debut_traitement != None and date_fin_traitement == None:
                                                texteDatesTraitement = _(u" à partir du %s") % UTILS_Dates.DateEngFr(date_debut_traitement)
                                            if date_debut_traitement == None and date_fin_traitement != None:
                                                texteDatesTraitement = _(u" jusqu'au %s") % UTILS_Dates.DateEngFr(date_fin_traitement)
                                            texteInfos += _(u"Traitement%s : %s.") % (texteDatesTraitement, description_traitement)

                                        # Création du paragraphe
                                        case.append(Paragraph(texteInfos, paraStyle))
                                        has_infos = True

                            # Ajoute la case à la ligne
                            ligne.append(case)

                        # Ajout de la ligne individuelle dans le tableau
                        if dictParametres["individus_avec_infos"] == False or (dictParametres["individus_avec_infos"] == True and has_infos == True):
                            dataTableau.append(ligne)
                    
                    # Création des lignes vierges
                    for x in range(0, dictParametres["nbre_lignes_vierges"]):
                        ligne = []
                        for col in labelsColonnes :
                            ligne.append("")
                        dataTableau.append(ligne)
                                                
                    # Style du tableau
                    couleur_fond_entetes = UTILS_Divers.ConvertCouleurWXpourPDF(dictParametres["couleur_fond_entetes"])
                    
                    style = TableStyle([
                            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), # Centre verticalement toutes les cases
                            
                            ('FONT',(0,0),(-1,-1), "Helvetica", 7), # Donne la police de caract. + taille de police 
                            ('GRID', (0,0), (-1,-1), 0.25, colors.black), # Crée la bordure noire pour tout le tableau
                            ('ALIGN', (0,1), (-2,-1), 'CENTRE'), # Centre les cases
                            
                            ('ALIGN', (0,1), (-1,1), 'CENTRE'), # Ligne de labels colonne alignée au centre
                            ('FONT',(0,1),(-1,1), "Helvetica", 6), # Donne la police de caract. + taille de police des labels
                            
                            ('SPAN',(0,0),(-1,0)), # Fusionne les lignes du haut pour faire le titre du groupe
                            ('FONT',(0,0),(0,0), "Helvetica-Bold", 10), # Donne la police de caract. + taille de police du titre de groupe
                            ('BACKGROUND', (0,0), (-1,0), couleur_fond_entetes), # Donne la couleur de fond du titre de groupe
                            
                            ])
                        
                       
                    # Création du tableau
                    tableau = Table(dataTableau, largeursColonnes)
                    tableau.setStyle(style)
                    story.append(tableau)
                    story.append(Spacer(0,20))
                    
                    # Saut de page après un groupe
                    if dictParametres["saut_page_groupe"] == True :
                        story.append(PageBreak())
                        # Insère un header
                        if indexGroupe < nbreGroupes :
                            Header() 
                    
                    indexGroupe += 1
            
        # Enregistrement du PDF
        doc.build(story)
        
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
예제 #8
0
    def OnBoutonOk(self, event):
        # Récupération et vérification des données
        listePeriodes = self.ctrl_calendrier.GetDatesSelections()

        listeActivites = self.ctrl_activites.GetListeActivites()
        if len(listeActivites) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement cocher au moins une activité !"
                  ), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        listeGroupes = self.ctrl_groupes.GetListeGroupes()
        if len(listeGroupes) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez obligatoirement cocher au moins un groupe !"),
                _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.pagesizes import A4
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

        self.taille_page = A4
        self.orientation = "PAYSAGE"
        if self.orientation == "PORTRAIT":
            self.hauteur_page = self.taille_page[1]
            self.largeur_page = self.taille_page[0]
        else:
            self.hauteur_page = self.taille_page[0]
            self.largeur_page = self.taille_page[1]

        # Création des conditions pour les requêtes SQL
        conditionsPeriodes = GetSQLdates(listePeriodes)

        if len(listeActivites) == 0: conditionActivites = "()"
        elif len(listeActivites) == 1:
            conditionActivites = "(%d)" % listeActivites[0]
        else:
            conditionActivites = str(tuple(listeActivites))

        if len(listeGroupes) == 0: conditionGroupes = "()"
        elif len(listeGroupes) == 1:
            conditionGroupes = "(%d)" % listeGroupes[0]
        else:
            conditionGroupes = str(tuple(listeGroupes))

        # Récupération des noms des groupes
        dictGroupes = self.ctrl_groupes.GetDictGroupes()

        # Récupération des noms d'activités
        dictActivites = self.ctrl_activites.GetDictActivites()

        # Récupération de la liste des groupes ouverts sur cette période
        DB = GestionDB.DB()
        req = """SELECT IDouverture, IDactivite, IDunite, IDgroupe
        FROM ouvertures 
        WHERE ouvertures.IDactivite IN %s AND %s
        AND IDgroupe IN %s
        ; """ % (conditionActivites, conditionsPeriodes, conditionGroupes)
        DB.ExecuterReq(req)
        listeOuvertures = DB.ResultatReq()
        dictOuvertures = {}
        for IDouverture, IDactivite, IDunite, IDgroupe in listeOuvertures:
            if dictOuvertures.has_key(IDactivite) == False:
                dictOuvertures[IDactivite] = []
            if IDgroupe not in dictOuvertures[IDactivite]:
                dictOuvertures[IDactivite].append(IDgroupe)

        # Récupération des individus grâce à leurs consommations
        DB = GestionDB.DB()
        req = """SELECT individus.IDindividu, IDactivite, IDgroupe, etat,
        IDcivilite, nom, prenom, date_naiss
        FROM consommations 
        LEFT JOIN individus ON individus.IDindividu = consommations.IDindividu
        WHERE etat IN ("reservation", "present")
        AND IDactivite IN %s AND %s
        GROUP BY individus.IDindividu
        ORDER BY nom, prenom
        ;""" % (conditionActivites, conditionsPeriodes)
        DB.ExecuterReq(req)
        listeIndividus = DB.ResultatReq()
        dictIndividus = {}
        listeIDindividus = []

        for IDindividu, IDactivite, IDgroupe, etat, IDcivilite, nom, prenom, date_naiss in listeIndividus:
            if date_naiss != None: date_naiss = DateEngEnDateDD(date_naiss)
            age = self.GetAge(date_naiss)

            # Mémorisation de l'individu
            dictIndividus[IDindividu] = {
                "IDcivilite": IDcivilite,
                "nom": nom,
                "prenom": prenom,
                "age": age,
                "date_naiss": date_naiss,
                "IDgroupe": IDgroupe,
                "IDactivite": IDactivite,
            }

            # Mémorisation du IDindividu
            if IDindividu not in listeIDindividus:
                listeIDindividus.append(IDindividu)

        # Dict Informations médicales
        req = """SELECT IDprobleme, IDindividu, IDtype, intitule, date_debut, date_fin, description, traitement_medical,
        description_traitement, date_debut_traitement, date_fin_traitement, eviction, date_debut_eviction, date_fin_eviction
        FROM problemes_sante 
        WHERE diffusion_listing_enfants=1
        ;"""
        DB.ExecuterReq(req)
        listeInformations = DB.ResultatReq()
        DB.Close()
        dictInfosMedicales = {}
        for IDprobleme, IDindividu, IDtype, intitule, date_debut, date_fin, description, traitement_medical, description_traitement, date_debut_traitement, date_fin_traitement, eviction, date_debut_eviction, date_fin_eviction in listeInformations:
            if dictInfosMedicales.has_key(IDindividu) == False:
                dictInfosMedicales[IDindividu] = []
            dictTemp = {
                "IDprobleme": IDprobleme,
                "IDtype": IDtype,
                "intitule": intitule,
                "date_debut": date_debut,
                "date_fin": date_fin,
                "description": description,
                "traitement_medical": traitement_medical,
                "description_traitement": description_traitement,
                "date_debut_traitement": date_debut_traitement,
                "date_fin_traitement": date_fin_traitement,
                "eviction": eviction,
                "date_debut_eviction": date_debut_eviction,
                "date_fin_eviction": date_fin_eviction,
            }
            dictInfosMedicales[IDindividu].append(dictTemp)

        # Récupération des photos individuelles
        dictPhotos = {}
        taillePhoto = 128
        if self.ctrl_taille_photos.GetSelection() == 0: tailleImageFinal = 16
        if self.ctrl_taille_photos.GetSelection() == 1: tailleImageFinal = 32
        if self.ctrl_taille_photos.GetSelection() == 2: tailleImageFinal = 64
        if self.checkbox_photos.GetValue() == True:
            for IDindividu in listeIDindividus:
                IDcivilite = dictIndividus[IDindividu]["IDcivilite"]
                nomFichier = Chemins.GetStaticPath(
                    "Images/128x128/%s" %
                    DICT_CIVILITES[IDcivilite]["nomImage"])
                IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu,
                                                   nomFichier=nomFichier,
                                                   taillePhoto=(taillePhoto,
                                                                taillePhoto),
                                                   qualite=100)

                # Création de la photo dans le répertoire Temp
                nomFichier = UTILS_Fichiers.GetRepTemp(
                    fichier="photoTmp%d.jpg" % IDindividu)
                bmp.SaveFile(nomFichier, type=wx.BITMAP_TYPE_JPEG)
                img = Image(nomFichier,
                            width=tailleImageFinal,
                            height=tailleImageFinal)
                dictPhotos[IDindividu] = img

        # ---------------- Création du PDF -------------------

        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc(
            "LISTE_INFORMATIONS_MEDICALES", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc,
                                pagesize=(self.largeur_page,
                                          self.hauteur_page),
                                topMargin=30,
                                bottomMargin=30)
        story = []

        largeurContenu = self.largeur_page - 75  #520

        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ((largeurContenu - 100, 100))
            dateDuJour = DateEngFr(str(datetime.date.today()))
            dataTableau.append(
                (_(u"Informations médicales"), _(u"%s\nEdité le %s") %
                 (UTILS_Organisateur.GetNom(), dateDuJour)))
            style = TableStyle([
                ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ('VALIGN', (0, 0), (-1, -1), 'TOP'),
                ('ALIGN', (0, 0), (0, 0), 'LEFT'),
                ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
                ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
                ('FONT', (1, 0), (1, 0), "Helvetica", 6),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 20))

        # Insère un header
        Header()

        # Activités
        for IDactivite in listeActivites:
            nomActivite = dictActivites[IDactivite]["nom"]
            # Groupes
            if dictOuvertures.has_key(IDactivite):
                nbreGroupes = len(dictOuvertures[IDactivite])
                indexGroupe = 1
                for IDgroupe in dictOuvertures[IDactivite]:
                    nomGroupe = dictGroupes[IDgroupe]["nom"]

                    # Initialisation du tableau
                    dataTableau = []
                    largeursColonnes = []
                    labelsColonnes = []

                    # Recherche des entêtes de colonnes :
                    if self.checkbox_photos.GetValue() == True:
                        labelsColonnes.append(_(u"Photo"))
                        largeursColonnes.append(tailleImageFinal + 6)

                    labelsColonnes.append(_(u"Nom - prénom"))
                    largeursColonnes.append(120)

                    if self.checkbox_age.GetValue() == True:
                        labelsColonnes.append(_(u"Âge"))
                        largeursColonnes.append(20)

                    # Calcule la largeur restante
                    largeurRestante = largeurContenu - sum(largeursColonnes)

                    labelsColonnes.append(_(u"Informations alimentaires"))
                    largeursColonnes.append(largeurRestante / 2.0)

                    labelsColonnes.append(_(u"Informations diverses"))
                    largeursColonnes.append(largeurRestante / 2.0)

                    # Création de l'entete de groupe
                    ligne = [
                        nomGroupe,
                    ]
                    for x in range(0, len(labelsColonnes) - 1):
                        ligne.append("")
                    dataTableau.append(ligne)

                    # Création des entêtes
                    ligne = []
                    for label in labelsColonnes:
                        ligne.append(label)
                    dataTableau.append(ligne)

                    # --------- Création des lignes -----------

                    # Création d'une liste temporaire pour le tri
                    listeIndividus = []
                    if dictOuvertures.has_key(IDactivite):
                        if IDgroupe in dictOuvertures[IDactivite]:
                            for IDindividu in listeIDindividus:
                                dictIndividu = dictIndividus[IDindividu]
                                if dictIndividu["IDgroupe"] == IDgroupe:
                                    valeursTri = (IDindividu,
                                                  dictIndividu["nom"],
                                                  dictIndividu["prenom"],
                                                  dictIndividu["age"])

                                    # + Sélection uniquement des individus avec infos
                                    if self.checkbox_nonvides.GetValue(
                                    ) == False or (
                                            self.checkbox_nonvides.GetValue()
                                            == True and dictInfosMedicales.
                                            has_key(IDindividu)):
                                        listeIndividus.append(valeursTri)

                    if self.ctrl_tri.GetSelection() == 0: paramTri = 1  # Nom
                    if self.ctrl_tri.GetSelection() == 1:
                        paramTri = 2  # Prénom
                    if self.ctrl_tri.GetSelection() == 2: paramTri = 3  # Age
                    if self.ctrl_ordre.GetSelection() == 0:
                        ordreDecroissant = False
                    else:
                        ordreDecroissant = True
                    listeIndividus = sorted(listeIndividus,
                                            key=operator.itemgetter(paramTri),
                                            reverse=ordreDecroissant)

                    # Récupération des lignes individus
                    for IDindividu, nom, prenom, age in listeIndividus:
                        dictIndividu = dictIndividus[IDindividu]

                        ligne = []

                        # Photo
                        if self.checkbox_photos.GetValue(
                        ) == True and IDindividu in dictPhotos:
                            img = dictPhotos[IDindividu]
                            ligne.append(img)

                        # Nom
                        ligne.append(u"%s %s" % (nom, prenom))

                        # Age
                        if self.checkbox_age.GetValue() == True:
                            if age != None:
                                ligne.append(age)
                            else:
                                ligne.append("")

                        # Informations médicales
                        paraStyle = ParagraphStyle(
                            name="infos",
                            fontName="Helvetica",
                            fontSize=7,
                            leading=8,
                            spaceAfter=2,
                        )

                        listeInfosAlim = []
                        listeInfosDivers = []
                        if dictInfosMedicales.has_key(IDindividu):
                            for infoMedicale in dictInfosMedicales[IDindividu]:
                                intitule = infoMedicale["intitule"]
                                description = infoMedicale["description"]
                                traitement = infoMedicale["traitement_medical"]
                                description_traitement = infoMedicale[
                                    "description_traitement"]
                                date_debut_traitement = infoMedicale[
                                    "date_debut_traitement"]
                                date_fin_traitement = infoMedicale[
                                    "date_fin_traitement"]
                                IDtype = infoMedicale["IDtype"]
                                # Intitulé et description
                                if description != None and description != "":
                                    texteInfos = u"<b>%s</b> : %s" % (
                                        intitule, description)
                                else:
                                    texteInfos = u"%s" % intitule
                                if len(texteInfos
                                       ) > 0 and texteInfos[-1] != ".":
                                    texteInfos += u"."
                                # Traitement médical
                                if traitement == 1 and description_traitement != None and description_traitement != "":
                                    texteDatesTraitement = u""
                                    if date_debut_traitement != None and date_fin_traitement != None:
                                        texteDatesTraitement = _(
                                            u" du %s au %s"
                                        ) % (DateEngFr(date_debut_traitement),
                                             DateEngFr(date_fin_traitement))
                                    if date_debut_traitement != None and date_fin_traitement == None:
                                        texteDatesTraitement = _(
                                            u" à partir du %s") % DateEngFr(
                                                date_debut_traitement)
                                    if date_debut_traitement == None and date_fin_traitement != None:
                                        texteDatesTraitement = _(
                                            u" jusqu'au %s") % DateEngFr(
                                                date_fin_traitement)
                                    texteInfos += _(u"Traitement%s : %s.") % (
                                        texteDatesTraitement,
                                        description_traitement)

                                # Création du paragraphe
                                img = DICT_TYPES_INFOS[IDtype]["img"]
                                p = ParagraphAndImage(
                                    Paragraph(texteInfos, paraStyle),
                                    Image(Chemins.GetStaticPath(
                                        "Images/16x16/%s" % img),
                                          width=8,
                                          height=8),
                                    xpad=1,
                                    ypad=0,
                                    side="left")
                                if infoMedicale["IDtype"] == 2:
                                    listeInfosAlim.append(p)
                                else:
                                    listeInfosDivers.append(p)

                            ligne.append(listeInfosAlim)
                            ligne.append(listeInfosDivers)

                        # Ajout de la ligne individuelle dans le tableau
                        dataTableau.append(ligne)

                    # Création des lignes vierges
                    if self.checkbox_lignes_vierges.GetValue() == True:
                        for x in range(
                                0,
                                self.ctrl_nbre_lignes.GetSelection() + 1):
                            ligne = []
                            for col in labelsColonnes:
                                ligne.append("")
                            dataTableau.append(ligne)

                    # Style du tableau
                    colPremiere = 1
                    if self.checkbox_photos.GetValue() == True:
                        colPremiere += 1
                    if self.checkbox_age.GetValue() == True:
                        colPremiere += 1

                    couleurFond = (0.8, 0.8, 1)  # Vert -> (0.5, 1, 0.2)

                    style = TableStyle([
                        ('VALIGN', (0, 0), (-1, -1),
                         'MIDDLE'),  # Centre verticalement toutes les cases
                        ('FONT', (0, 0), (-1, -1), "Helvetica",
                         7),  # Donne la police de caract. + taille de police 
                        ('GRID', (0, 0), (-1, -1), 0.25, colors.black
                         ),  # Crée la bordure noire pour tout le tableau
                        ('ALIGN', (0, 1), (-2, -1),
                         'CENTRE'),  # Centre les cases
                        ('ALIGN', (0, 1), (-1, 1), 'CENTRE'
                         ),  # Ligne de labels colonne alignée au centre
                        (
                            'FONT', (0, 1), (-1, 1), "Helvetica", 6
                        ),  # Donne la police de caract. + taille de police des labels
                        (
                            'SPAN', (0, 0), (-1, 0)
                        ),  # Fusionne les lignes du haut pour faire le titre du groupe
                        (
                            'FONT', (0, 0), (0, 0), "Helvetica-Bold", 10
                        ),  # Donne la police de caract. + taille de police du titre de groupe
                        ('BACKGROUND', (0, 0), (-1, 0), couleurFond
                         ),  # Donne la couleur de fond du titre de groupe
                    ])

                    # Création du tableau
                    tableau = Table(dataTableau, largeursColonnes)
                    tableau.setStyle(style)
                    story.append(tableau)
                    story.append(Spacer(0, 20))

                    # Saut de page après un groupe
                    if self.checkbox_page_groupe.GetValue() == True:
                        story.append(PageBreak())
                        # Insère un header
                        if indexGroupe < nbreGroupes:
                            Header()

                    indexGroupe += 1

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)

        self.MemoriserParametres()
예제 #9
0
    def __init__(self,
                 parent,
                 IDfamille=None,
                 dictIndividus={},
                 listeSelectionIndividus=[],
                 selectionTous=False):
        ULC.UltimateListCtrl.__init__(self,
                                      parent,
                                      -1,
                                      agwStyle=wx.LC_ICON | wx.LC_ALIGN_LEFT)
        self.parent = parent
        self.IDfamille = IDfamille
        self.dictIndividus = dictIndividus

        ##        self.EnableSelectionVista(True)
        self.SetFirstGradientColour(None)
        self.SetSecondGradientColour(None)  #"#316AC5")
        self.EnableSelectionGradient(True)

        # Création de la liste d'individus à afficher
        listeIndividus = []
        for IDindividu, dictIndividu in self.dictIndividus.items():
            nbreInscriptions = len(dictIndividu["inscriptions"])
            age = dictIndividu["age"]
            prenom = dictIndividu["prenom"]
            if nbreInscriptions > 0:
                listeIndividus.append((prenom, IDindividu))
        listeIndividus.sort()

        # liste images
        self.dictPhotos = {}
        taillePhoto = 64
        il = wx.ImageList(taillePhoto, taillePhoto, True)
        for age, IDindividu in listeIndividus:
            dictIndividu = self.dictIndividus[IDindividu]
            IDcivilite = dictIndividu["IDcivilite"]
            nom = dictIndividu["nom"]
            prenom = dictIndividu["prenom"]
            nomFichier = Chemins.GetStaticPath(
                "Images/128x128/%s" % DICT_CIVILITES[IDcivilite]["nomImage"])
            IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu,
                                               nomFichier=nomFichier,
                                               taillePhoto=(taillePhoto,
                                                            taillePhoto),
                                               qualite=100)
            img = il.Add(bmp)
            self.dictPhotos[IDindividu] = img
        self.AssignImageList(il, wx.IMAGE_LIST_NORMAL)

        # Création des items
        index = 0
        for age, IDindividu in listeIndividus:
            dictIndividu = self.dictIndividus[IDindividu]
            IDcivilite = dictIndividu["IDcivilite"]
            nom = dictIndividu["nom"]
            prenom = dictIndividu["prenom"]
            label = prenom
            if label == "":
                label = " "
            self.InsertImageStringItem(index, label,
                                       self.dictPhotos[IDindividu])
            self.SetItemData(index, IDindividu)
            if IDindividu in listeSelectionIndividus or selectionTous == True:
                self.Select(index)
            self.SetDisabledTextColour(wx.Colour(255, 0, 0))
            index += 1

##        self.Bind(ULC.EVT_LIST_ITEM_LEFT_CLICK, self.OnSelect)
##        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSelect)
##        self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnDeselect)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
예제 #10
0
    def __init__(self, listePersonnes=[], dictAffichage={}):
        """ Imprime les photos """
        self.listePersonnes = listePersonnes
        
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib import colors
        from reportlab.lib.pagesizes import A4, portrait, landscape
        from reportlab.lib.utils import ImageReader
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]
        self.inch = inch
        
        modesPage = {
            0 : { "orientation" : "portrait", "tailleImageTmp" : 3000, "tailleImageFinal" : 450, "nbreColonnes" : 1, "padding" : 20, "taille_nom" : 34, "taille_texte" : 18 },
            1 : { "orientation" : "paysage", "tailleImageTmp" : 2000, "tailleImageFinal" : 310, "nbreColonnes" : 2, "padding" : 20, "taille_nom" : 20, "taille_texte" : 12 },
            2 : { "orientation" : "portrait", "tailleImageTmp" : 2000, "tailleImageFinal" : 230, "nbreColonnes" : 2, "padding" : 10, "taille_nom" : 18, "taille_texte" : 10 },
            3 : { "orientation" : "portrait", "tailleImageTmp" : 2000, "tailleImageFinal" : 150, "nbreColonnes" : 3, "padding" : 5, "taille_nom" : 14, "taille_texte" : 8 },
            4 : { "orientation" : "portrait", "tailleImageTmp" : 2000, "tailleImageFinal" : 110, "nbreColonnes" : 4, "padding" : 5, "taille_nom" : 10, "taille_texte" : 7 },
            5 : { "orientation" : "portrait", "tailleImageTmp" : 2000, "tailleImageFinal" : 90, "nbreColonnes" : 5, "padding" : 4, "taille_nom" : 9, "taille_texte" : 6 },
            }
        
        modePage = dictAffichage["disposition_page"]
        nbreCopies = dictAffichage["nbre_copies"]
        parametres = modesPage[modePage]
        tailleImageTmp = parametres["tailleImageTmp"]
        tailleImageFinal = parametres["tailleImageFinal"]
        nbreColonnes = parametres["nbreColonnes"]
        orientation = parametres["orientation"]
        padding = parametres["padding"]
        taille_nom = parametres["taille_nom"]
        taille_texte = parametres["taille_texte"]
        
        # Initialisation du PDF
        if orientation == "portrait" : 
            taillePage = portrait(A4)
        else:
            taillePage = landscape(A4)
        nomDoc = UTILS_Fichiers.GetRepTemp("photoPersonnes.pdf")
        if "win" in sys.platform : nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, pagesize=taillePage)
        story = []

        # Style du tableau
        styleTemp = [
                            #('GRID', (0,0), (-1,-1), 0.25, colors.black), # Crée la bordure noire pour tout le tableau
                            ('VALIGN', (0,0), (-1,-1), 'TOP'), # Centre verticalement toutes les cases
                            ('ALIGN', (0,0), (-1,-1), 'CENTRE'), # Colonne ID centrée
                            ]
        
##        if dictAffichage["couleur_fond"] != None :
##            styleTemp.append(('BACKGROUND', (0, 0), (-1, -1), colors.black))
        
        # Nbre de copies
        if nbreCopies > 1 :
            self.listePersonnesTmp = []
            for donnees in self.listePersonnes :
                for x in range(0, nbreCopies) :
                    self.listePersonnesTmp.append(donnees)
            self.listePersonnes = self.listePersonnesTmp
        
        self.listePersonnesTmp = []
        dictPhotos = {}
        for IDpersonne, nom, prenom, bmp in self.listePersonnes :
            IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDpersonne, taillePhoto=(tailleImageTmp, tailleImageTmp), qualite=100)
            if bmp != None :
                # Création de la photo dans le répertoire Temp
                nomFichier = UTILS_Fichiers.GetRepTemp("photoTmp%d.jpg" % IDpersonne)
                bmp.SaveFile(nomFichier, type=wx.BITMAP_TYPE_JPEG)
                img = Image(nomFichier, width=tailleImageFinal, height=tailleImageFinal)
                dictPhotos[IDpersonne] = img
                self.listePersonnesTmp.append((IDpersonne, nom, prenom))
                
        if len(self.listePersonnesTmp) == 0 :
            dlg = wx.MessageDialog(None, _(u"Il n'existe aucune photo pour la ou les personnes sélectionnées !"), _(u"Mot de passe erroné"), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            return
            
        # Création des largeurs de colonnes
        largeursColonnes = []
        for numCol in range(0, nbreColonnes) :
            largeursColonnes.append(tailleImageFinal + (padding*2))
        
        # Calcul du nbre de lignes du tableau
        nbreLignes = (len(self.listePersonnesTmp) * 1.0) / nbreColonnes 
        if int(nbreLignes) != nbreLignes : 
            nbreLignes = int(nbreLignes) + 1
        else:
            nbreLignes = int(nbreLignes)
            
        # Création du tableau vide
        dataTableau = []
        for numLigne in range(0, nbreLignes*3):
            ligne = []
            for numCol in range(0, nbreColonnes):
                ligne.append("")
            dataTableau.append(ligne)
        
        # Remplissage du tableau
        index = 0
        numCol = 0
        numLigne = 0
        for IDpersonne, nom, prenom in self.listePersonnesTmp :
            dataTableau[numLigne][numCol] = dictPhotos[IDpersonne]
            dataTableau[numLigne+1][numCol] = prenom
            dataTableau[numLigne+2][numCol] = FonctionsPerso.RecupTextePhotoPersonne(IDpersonne)
            
            # Style des photos
            styleTemp.append(('TOPPADDING', (0, numLigne), (-1, numLigne), padding))
            styleTemp.append(('BOTTOMPADDING', (0, numLigne), (-1, numLigne), padding))
            # Style du nom
            styleTemp.append(('FONT',(0, numLigne+1),(-1, numLigne+1), "Helvetica-Bold", taille_nom))
            # Style du texte personnalisé
            styleTemp.append(('FONT',(0, numLigne+2),(-1, numLigne+2), "Helvetica", taille_texte))
            styleTemp.append(('BOTTOMPADDING', (0, numLigne+2), (-1, numLigne+2), padding))
            # Style de la bordure de la carte
            if dictAffichage["bordure"] == True :
                styleTemp.append(('BOX', (numCol, numLigne), (numCol, numLigne+2), 0.25, colors.black))
            
            index += 1
            if numCol < nbreColonnes-1 :
                numCol += 1
            else:
                numCol = 0
                numLigne += 3
        
        style = TableStyle(styleTemp)
        
        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0,20))
            
        # Enregistrement du PDF
        doc.build(story)
        
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
예제 #11
0
 def RecuperePhoto(self, IDpersonne):
     IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDpersonne, taillePhoto=(self.tailleImages, self.tailleImages), qualite=50)
     if bmp == None :
         # Crée une image vide
         bmp = self.CreationPhotoVide(self.tailleImages)
     return bmp
예제 #12
0
    def __init__(self, parent, titre=_(u"Fiche individuelle"), IDpersonne=0):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           name="FicheIndividuelle",
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER
                           | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
        self.IDpersonne = IDpersonne
        self.contratEnCours = None
        self.AnnulationImpossible = False
        self.barre_problemes = None
        self.photo = None

        import locale
        self.locale = wx.Locale(wx.LANGUAGE_FRENCH)

        try:
            locale.setlocale(locale.LC_ALL, 'FR')
        except:
            pass

        self.panel_1 = wx.Panel(self, -1)
        self.label_hd_CatId = wx.StaticText(self.panel_1, -1, u"")
        self.static_line_1 = wx.StaticLine(self.panel_1, -1)
        self.label_hd_nomPrenom = wx.StaticText(self.panel_1, -1,
                                                _(u"NOM, Prénom"))
        self.label_hd_adresse = wx.StaticText(
            self.panel_1, -1,
            _(u"Résidant 42 rue des oiseaux 29870 LANNILIS"))
        self.label_hd_naiss = wx.StaticText(
            self.panel_1, -1, _(u"Date et lieu de naissance inconnus"))
        self.bitmap_photo = CTRL_Photo.CTRL_Photo(self.panel_1,
                                                  style=wx.SUNKEN_BORDER)
        self.bitmap_photo.SetPhoto(
            IDindividu=None,
            nomFichier=Chemins.GetStaticPath("Images/128x128/Personne.png"),
            taillePhoto=(128, 128),
            qualite=100)

        self.bitmap_button_aide = CTRL_Bouton_image.CTRL(
            self.panel_1,
            texte=_(u"Aide"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Aide.png"))
        self.bitmap_button_Ok = CTRL_Bouton_image.CTRL(
            self.panel_1,
            texte=_(u"Ok"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Valider.png"))
        self.bitmap_button_annuler = CTRL_Bouton_image.CTRL(
            self.panel_1,
            texte=_(u"Annuler"),
            cheminImage=Chemins.GetStaticPath("Images/32x32/Annuler.png"))

        # NoteBook
        self.notebook = Notebook(self.panel_1, IDpersonne=self.IDpersonne)
        if self.nouvelleFiche == True:
            self.notebook.AfficheAutresPages(False)

        # Recherche s'il y a un contrat en cours ou à venir pour savoir s'il faut afficher la barre des problèmes
        if self.IDpersonne in FonctionsPerso.Recherche_ContratsEnCoursOuAVenir(
        ):
            self.barre_problemes = True
        else:
            self.barre_problemes = False

        # Récupération de la liste des problèmes de la personne
        self.bitmap_problemes_G = wx.StaticBitmap(
            self.panel_1, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/Special/Problemes_G.png"),
                      wx.BITMAP_TYPE_PNG))
        self.bitmap_problemes_D = wx.StaticBitmap(
            self.panel_1, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/Special/Problemes_D.png"),
                      wx.BITMAP_TYPE_PNG))
        self.txtDefilant = Ticker(self.panel_1,
                                  size=(-1, 18),
                                  fgcolor=(255, 255, 255),
                                  bgcolor=(255, 60, 60))
        self.txtPbPersonne = self.Recup_txt_pb_personne()
        self.txtDefilant.SetText(self.txtPbPersonne)

        # Mise à jour des infos du bandeau supérieur de la fiche
        self.MaJ_header()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bitmap_button_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bitmap_button_Ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler,
                  self.bitmap_button_annuler)
        self.txtDefilant.Bind(wx.EVT_MOTION, self.OnMotionTxtDefilant)
        self.txtDefilant.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveTxtDefilant)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        self.__set_properties()
        self.__do_layout()

        self.Affichage_barre_problemes()