def MenuEnvoyerMail(self, event): """ Envoyer un Email """ from Utils import UTILS_Envoi_email listeAdresses = UTILS_Envoi_email.GetAdresseFamille(self.IDfamille) if len(listeAdresses) == 0: return # Depuis l'éditeur d'Emails de Noethys if event.GetId() == 200: import DLG_Mailer dlg = DLG_Mailer.Dialog(self) listeDonnees = [] for adresse in listeAdresses: listeDonnees.append({ "adresse": adresse, "pieces": [], "champs": {}, }) dlg.SetDonnees(listeDonnees, modificationAutorisee=False) dlg.ShowModal() dlg.Destroy() # Depuis le client de messagerie par défaut if event.GetId() == 210: FonctionsPerso.EnvoyerMail(adresses=listeAdresses, sujet="", message="")
def EnvoyerEmail(self, event): # Récupère l'adresse if event.GetId() in (801, 802) : ctrl = self.ctrl_travail_mail if event.GetId() in (901, 902) : ctrl = self.ctrl_mail adresse = ctrl.GetValue() valide, erreur = ctrl.Validation() # Vérifie l'adresse if adresse == "" or valide == False : dlg = wx.MessageDialog(self, _(u"Vous devez d'abord saisir une adresse internet valide !"), "Information", wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() ctrl.SetFocus() return # Depuis l'éditeur d'Emails de Noethys if event.GetId() in (801, 901) : import DLG_Mailer dlg = DLG_Mailer.Dialog(self) listeDonnees = [{"adresse" : adresse, "pieces" : [], "champs" : {},},] dlg.SetDonnees(listeDonnees, modificationAutorisee=False) dlg.ShowModal() dlg.Destroy() # Depuis le client de messagerie par défaut if event.GetId() in (802, 902) : FonctionsPerso.EnvoyerMail(adresses=[adresse,], sujet="", message="")
def EnvoyerEmail(self, event): """ Envoi par Email de rappels de pièces manquantes """ # Validation des données saisies tracks = self.ctrl_listview.GetTracksCoches() if len(tracks) == 0 : dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune famille dans la liste !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return False # Récupération des données adresse + champs + pièces listeDonnees = [] listeAnomalies = [] listeEnvoiNonDemande = [] for track in tracks : adresse = UTILS_Envoi_email.GetAdresseFamille(track.IDfamille, choixMultiple=False, muet=True, nomTitulaires=track.nomTitulaires) # Mémorisation des données if adresse not in (None, "", []) and track.pieces not in (None, "", []): champs = { "{NOM_FAMILLE}" : track.nomTitulaires, "{LISTE_PIECES_MANQUANTES}" : track.pieces, } listeDonnees.append({"adresse" : adresse, "pieces" : [], "champs" : champs}) else : listeAnomalies.append(track.nomTitulaires) # Annonce les anomalies trouvées if len(listeAnomalies) > 0 : texte = _(u"%d des familles sélectionnées n'ont pas d'adresse Email ou n'ont pas de pièces manquantes.\n\n") % len(listeAnomalies) texte += _(u"Souhaitez-vous quand même continuer avec les %d autres familles ?") % len(listeDonnees) dlg = wx.MessageDialog(self, texte, _(u"Avertissement"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return # Dernière vérification avant transfert if len(listeDonnees) == 0 : dlg = wx.MessageDialog(self, _(u"Il ne reste finalement aucun rappel à envoyer par Email !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Transfert des données vers DLG Mailer import DLG_Mailer dlg = DLG_Mailer.Dialog(self, categorie="rappel_pieces_manquantes") dlg.SetDonnees(listeDonnees, modificationAutorisee=False) dlg.ChargerModeleDefaut() dlg.ShowModal() dlg.Destroy()
def Envoyer_email(self, event): # Envoyer un email à la famille from Utils import UTILS_Envoi_email listeAdresses = UTILS_Envoi_email.GetAdresseFamille(self.IDfamille) if len(listeAdresses) == 0: dlg = wx.MessageDialog(self, _(u"Il n'y a aucune adresse email !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return False from Utils import UTILS_Titulaires listefamilles = [] listefamilles.append(self.IDfamille) titulaires = UTILS_Titulaires.GetTitulaires(listefamilles) nom_famille = None for id in titulaires: if titulaires[id].has_key("titulairesAvecCivilite"): nom_famille = titulaires[id]["titulairesAvecCivilite"] break if nom_famille == None: raise import DLG_Mailer dlg = DLG_Mailer.Dialog(self, categorie="portail") listeDonnees = [] champs = { "{IDENTIFIANT_INTERNET}": self.ctrl_compte_internet.GetIdentifiant(), "{MOTDEPASSE_INTERNET}": self.ctrl_compte_internet.GetMdp(), "{NOM_FAMILLE}": nom_famille, } for adresse in listeAdresses: listeDonnees.append({ "adresse": adresse, "pieces": [], "champs": champs }) dlg.SetDonnees(listeDonnees, modificationAutorisee=False) dlg.ChargerModeleDefaut() dlg.ShowModal() dlg.Destroy()
def OnBoutonOk(self, event): """ Aperçu PDF des factures """ # Validation des données saisies tracks = self.ctrl_liste_factures.GetTracksCoches() if len(tracks) == 0: dlg = wx.MessageDialog( self, _(u"Vous n'avez sélectionné aucune facture à envoyer par Email !" ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Création des factures sélectionnées listeIDfacture = [] for track in tracks: # Avertissements if track.etat == "annulation": dlg = wx.MessageDialog( self, _(u"La facture n°%s a été annulée.\n\nVous ne pouvez pas l'envoyer par Email !" ) % track.numero, _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Ajout listeIDfacture.append(track.IDfacture) facturation = UTILS_Facturation.Facturation() dictOptions = self.ctrl_options.GetOptions() if dictOptions == False: return resultat = facturation.Impression( listeFactures=listeIDfacture, nomDoc=None, afficherDoc=False, dictOptions=dictOptions, repertoire=dictOptions["repertoire_copie"], repertoireTemp=True) if resultat == False: return dictChampsFusion, dictPieces = resultat def SupprimerFichiersTemp(): for IDfacture, fichier in dictPieces.iteritems(): try: os.remove(fichier) except: pass # Récupération de toutes les adresses Emails DB = GestionDB.DB() req = """SELECT IDindividu, mail, travail_mail FROM individus;""" DB.ExecuterReq(req) listeAdressesIndividus = DB.ResultatReq() DB.Close() dictAdressesIndividus = {} for IDindividu, mail, travail_mail in listeAdressesIndividus: dictAdressesIndividus[IDindividu] = { "perso": mail, "travail": travail_mail } # Récupération des données adresse + champs + pièces listeDonnees = [] listeAnomalies = [] listeEnvoiNonDemande = [] for track in tracks: liste_adresses = [] if track.email == True: # Si Famille inscrite à l'envoi par Email : for valeur in track.email_factures.split("##"): IDindividu, categorie, adresse = valeur.split(";") if IDindividu != "": if dictAdressesIndividus.has_key(int(IDindividu)): adresse = dictAdressesIndividus[int( IDindividu)][categorie] liste_adresses.append(adresse) else: liste_adresses.append(adresse) else: # Si famille non inscrite à l'envoi par Email adresse = UTILS_Envoi_email.GetAdresseFamille( track.IDfamille, choixMultiple=False, muet=True, nomTitulaires=track.nomsTitulaires) liste_adresses.append(adresse) # Mémorisation des données for adresse in liste_adresses: if adresse not in (None, "", []): if dictPieces.has_key(track.IDfacture): fichier = dictPieces[track.IDfacture] champs = dictChampsFusion[track.IDfacture] listeDonnees.append({ "adresse": adresse, "pieces": [ fichier, ], "champs": champs }) if track.email == False: if track.nomsTitulaires not in listeEnvoiNonDemande: listeEnvoiNonDemande.append( track.nomsTitulaires) else: listeAnomalies.append(track.nomsTitulaires) # Annonce les anomalies trouvées if len(listeAnomalies) > 0: texte = _( u"%d des familles sélectionnées n'ont pas d'adresse Email.\n\n" ) % len(listeAnomalies) texte += _( u"Souhaitez-vous quand même continuer avec les %d autres familles ?" ) % len(listeDonnees) dlg = wx.MessageDialog( self, texte, _(u"Avertissement"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES: SupprimerFichiersTemp() return # Annonce les envois non demandés if len(listeEnvoiNonDemande) > 0: texte = _( u"%d des familles sélectionnées n'ont pas demandé d'envoi par Email de leur facture :\n\n" ) % len(listeEnvoiNonDemande) texte += _( u"Souhaitez-vous quand même leur envoyer une facture ?") dlg = wx.MessageDialog( self, texte, _(u"Avertissement"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES: SupprimerFichiersTemp() return # Dernière vérification avant transfert if len(listeDonnees) == 0: dlg = wx.MessageDialog( self, _(u"Il ne reste finalement aucune facture à envoyer par Email !" ), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() SupprimerFichiersTemp() return # Transfert des données vers DLG Mailer import DLG_Mailer dlg = DLG_Mailer.Dialog(self, categorie="facture") dlg.SetDonnees(listeDonnees, modificationAutorisee=False) dlg.ChargerModeleDefaut() dlg.ShowModal() dlg.Destroy() # Suppression des PDF temporaires SupprimerFichiersTemp()
def EnvoiEmail(self, event=None): """ Envoi par Email des attestations fiscales """ # Validation des données saisies tracks = self.ctrl_attestations.GetTracksCoches() if len(tracks) == 0 : dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune attestation à imprimer !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return False # Création des cotisations sélectionnées dictOptions = self.GetOptions() if dictOptions == False : return False x = UTILS_Attestations_fiscales.Attestations_fiscales() resultat = x.Impression(tracks=tracks, nomDoc=None, afficherDoc=False, dictOptions=dictOptions, repertoire=dictOptions["repertoire"], repertoireTemp=True) if resultat == False : return False dictChampsFusion, dictPieces = resultat def SupprimerFichiersTemp(): for IDcompte_payeur, fichier in dictPieces.iteritems() : os.remove(fichier) # Récupération de toutes les adresses Emails DB = GestionDB.DB() req = """SELECT IDindividu, mail, travail_mail FROM individus;""" DB.ExecuterReq(req) listeAdressesIndividus = DB.ResultatReq() DB.Close() dictAdressesIndividus = {} for IDindividu, mail, travail_mail in listeAdressesIndividus : dictAdressesIndividus[IDindividu] = {"perso" : mail, "travail" : travail_mail} # Récupération des données adresse + champs + pièces listeDonnees = [] listeAnomalies = [] listeEnvoiNonDemande = [] for track in tracks : adresse = UTILS_Envoi_email.GetAdresseFamille(track.IDfamille, choixMultiple=False, muet=True, nomTitulaires=track.nomsTitulaires) # Mémorisation des données if adresse not in (None, "", []) : if dictPieces.has_key(track.IDcompte_payeur) : fichier = dictPieces[track.IDcompte_payeur] champs = dictChampsFusion[track.IDcompte_payeur] listeDonnees.append({"adresse" : adresse, "pieces" : [fichier,], "champs" : champs}) else : listeAnomalies.append(track.nomsTitulaires) # Annonce les anomalies trouvées if len(listeAnomalies) > 0 : texte = _(u"%d des familles sélectionnées n'ont pas d'adresse Email.\n\n") % len(listeAnomalies) texte += _(u"Souhaitez-vous quand même continuer avec les %d autres familles ?") % len(listeDonnees) dlg = wx.MessageDialog(self, texte, _(u"Avertissement"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : SupprimerFichiersTemp() return # Dernière vérification avant transfert if len(listeDonnees) == 0 : dlg = wx.MessageDialog(self, _(u"Il ne reste finalement aucune attestation fiscale à envoyer par Email !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() SupprimerFichiersTemp() return # Transfert des données vers DLG Mailer import DLG_Mailer dlg = DLG_Mailer.Dialog(self, categorie="attestation_fiscale") dlg.SetDonnees(listeDonnees, modificationAutorisee=False) dlg.ChargerModeleDefaut() dlg.ShowModal() dlg.Destroy() # Suppression des PDF temporaires SupprimerFichiersTemp()
def EnvoyerAvisDepots(self): """ Envoi des avis de dépôt par Email aux familles """ # Recherche des adresses des individus DB = GestionDB.DB() req = """SELECT individus.IDindividu, mail, travail_mail FROM individus;""" DB.ExecuterReq(req) listeAdressesIndividus = DB.ResultatReq() DB.Close() dictAdressesIndividus = {} for IDindividu, mail, travail_mail in listeAdressesIndividus : dictAdressesIndividus[IDindividu] = {"perso" : mail, "travail" : travail_mail} # Recherche des titulaires dictTitulaires = UTILS_Titulaires.GetTitulaires() # Recherche les familles abonnées à ce service listeDonnees = [] for track in self.tracks : if track.email_depots != None and track.inclus == True : # Recherche de l'adresse d'envoi IDindividu, categorie, adresse = track.email_depots.split(";") if IDindividu != "" : try : if dictAdressesIndividus.has_key(int(IDindividu)) : adresse = dictAdressesIndividus[int(IDindividu)][categorie] except : adresse = u"" # Noms des titulaires de la famille nomTitulaires = dictTitulaires[track.IDfamille]["titulairesSansCivilite"] # Champs sur le règlement dictChamps = { "{ID_REGLEMENT}" : str(track.IDreglement), "{DATE_REGLEMENT}" : DateEngFr(str(track.date)), "{MODE_REGLEMENT}" : track.nom_mode, "{NOM_EMETTEUR}" : track.nom_emetteur, "{NUM_PIECE}" : track.numero_piece, "{MONTANT_REGLEMENT}" : u"%.2f %s" % (track.montant, SYMBOLE), "{NOM_PAYEUR}" : track.nom_payeur, "{NUM_QUITTANCIER}" : track.numero_quittancier, "{DATE_SAISIE}" : DateEngFr(str(track.date_saisie)), } listeDonnees.append({"nomTitulaires": nomTitulaires, "IDreglement" : track.IDreglement, "avis_depot" : track.avis_depot, "IDfamille" : track.IDfamille, "adresse" : adresse, "pieces" : [], "champs" : dictChamps}) import DLG_Selection_avis_depots dlg = DLG_Selection_avis_depots.Dialog(self, listeDonnees=listeDonnees) reponse = dlg.ShowModal() listeSelections = dlg.GetListeSelections() dlg.Destroy() if reponse != wx.ID_OK : return listeDonnees2 = [] for index in listeSelections : listeDonnees2.append(listeDonnees[index]) # Chargement du Mailer import DLG_Mailer dlg = DLG_Mailer.Dialog(self, categorie="reglement") dlg.SetDonnees(listeDonnees2, modificationAutorisee=True) dlg.ChargerModeleDefaut() dlg.ShowModal() listeSucces = dlg.listeSucces dlg.Destroy() # Mémorisation des avis envoyés avec succès DB = GestionDB.DB() listeIDreglements = [] for track in listeSucces : IDreglement = int(track.champs["{ID_REGLEMENT}"]) listeIDreglements.append(IDreglement) DB.ReqMAJ("reglements", [("avis_depot", str(datetime.date.today()) ),], "IDreglement", IDreglement) DB.Close() for track in self.tracks : if track.IDreglement in listeIDreglements : track.avis_depot = datetime.date.today() self.ctrl_reglements.RefreshObject(track)
def ExportExcel(listview=None, grid=None, titre=_(u"Liste"), listeColonnes=None, listeValeurs=None, autoriseSelections=True): """ Export de la liste au format Excel """ # Plus de sélection pour éviter les bugs !!!! autoriseSelections = False # Vérifie si données bien présentes if (listview != None and len(listview.donnees) == 0) or (grid != None and (grid.GetNumberRows() == 0 or grid.GetNumberCols() == 0)): dlg = wx.MessageDialog(None, _(u"Il n'y a aucune donnée dans la liste !"), "Erreur", wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() return # Récupération des valeurs if listview != None and listeColonnes == None and listeValeurs == None : listeColonnes, listeValeurs = GetValeursListview(listview, format="original") if grid != None and listeColonnes == None and listeValeurs == None : autoriseSelections = False listeColonnes, listeValeurs = GetValeursGrid(grid) # Selection des lignes if autoriseSelections == True : dlg = DLG_Selection_liste.Dialog(None, listeColonnes, listeValeurs, type="exportExcel") if dlg.ShowModal() == wx.ID_OK: listeSelections = dlg.GetSelections() dlg.Destroy() else: dlg.Destroy() return False # Choix Action dlg = DLG_Choix_action(None) reponse = dlg.ShowModal() dlg.Destroy() if reponse == 100 : mode = "enregistrer" elif reponse == 200 : mode = "email" else : return # Définit le nom et le chemin du fichier nomFichier = "ExportExcel_%s.xls" % datetime.datetime.now().strftime("%Y%m%d%H%M%S") # Mode Enregistrer if mode == "enregistrer" : # Demande à l'utilisateur le nom de fichier et le répertoire de destination wildcard = "Fichier Excel (*.xls)|*.xls|" \ "All files (*.*)|*.*" sp = wx.StandardPaths.Get() cheminDefaut = sp.GetDocumentsDir() dlg = wx.FileDialog( None, message = _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"), defaultDir=cheminDefaut, defaultFile = nomFichier, wildcard = wildcard, style = wx.SAVE ) dlg.SetFilterIndex(0) if dlg.ShowModal() == wx.ID_OK: cheminFichier = dlg.GetPath() dlg.Destroy() else: dlg.Destroy() return # Le fichier de destination existe déjà : if os.path.isfile(cheminFichier) == True : dlg = wx.MessageDialog(None, _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION) if dlg.ShowModal() == wx.ID_NO : return False dlg.Destroy() else: dlg.Destroy() # Mode Envoyer par Email if mode == "email" : cheminFichier = UTILS_Fichiers.GetRepTemp(fichier=nomFichier) # Export import pyExcelerator # Création d'un classeur wb = pyExcelerator.Workbook() # Création d'une feuille ws1 = wb.add_sheet(titre) # Remplissage de la feuille al = pyExcelerator.Alignment() al.horz = pyExcelerator.Alignment.HORZ_LEFT al.vert = pyExcelerator.Alignment.VERT_CENTER ar = pyExcelerator.Alignment() ar.horz = pyExcelerator.Alignment.HORZ_RIGHT ar.vert = pyExcelerator.Alignment.VERT_CENTER styleEuros = pyExcelerator.XFStyle() styleEuros.num_format_str = '"$"#,##0.00_);("$"#,##' styleEuros.alignment = ar styleDate = pyExcelerator.XFStyle() styleDate.num_format_str = 'DD/MM/YYYY' styleDate.alignment = ar styleHeure = pyExcelerator.XFStyle() styleHeure.num_format_str = "[hh]:mm" styleHeure.alignment = ar # Création des labels de colonnes x = 0 y = 0 for labelCol, alignement, largeur, nomChamp in listeColonnes : try : if "CheckState" in unicode(nomChamp) : nomChamp = "Coche" except : pass ws1.write(x, y, labelCol) ws1.col(y).width = largeur*42 y += 1 # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- # Création des lignes def RechercheFormatFromChaine(valeur): """ Recherche le type de la chaîne """ if valeur.endswith(SYMBOLE) : # Si c'est un montant en euros try : if valeur.startswith("- ") : valeur = valeur.replace("- ", "-") if valeur.startswith("+ ") : valeur = valeur.replace("+ ", "") nbre = float(valeur[:-1]) return (nbre, styleEuros) except : pass # Si c'est un nombre try : if valeur.startswith("- ") : valeur = valeur.replace("- ", "-") nbre = float(valeur) return (nbre, None) except : pass # Si c'est une date try : if len(valeur) == 10 : if valeur[2] == "/" and valeur[5] == "/" : return (valeur, styleDate) except : pass if type(valeur) == datetime.timedelta : return (valeur, styleHeure) # Si c'est une heure try : if len(valeur) > 3 : if ":" in valeur : separateur = ":" elif "h" in valeur : separateur = "h" else : separateur = None if separateur != None : heures, minutes = valeur.split(separateur) valeur = datetime.timedelta(minutes= int(heures)*60 + int(minutes)) # valeur = datetime.time(hour=int(valeur.split(separateur)[0]), minute=int(valeur.split(separateur)[1])) return (valeur, styleHeure) except : pass return unicode(valeur), None # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- def RechercheFormat(valeur): """ Recherche le type de la donnée """ if type(valeur) == decimal.Decimal : valeur = float(valeur) return (valeur, styleEuros) if type(valeur) == float : return (valeur, None) if type(valeur) == int : return (valeur, None) if type(valeur) == datetime.date : valeur = UTILS_Dates.DateDDEnFr(valeur) return (valeur, styleDate) if type(valeur) == datetime.timedelta : return (valeur, styleHeure) try : if len(valeur) > 3 : if ":" in valeur : separateur = ":" elif "h" in valeur : separateur = "h" else : separateur = None if separateur != None : donnees = valeur.split(separateur) if len(donnees) == 2 : heures, minutes = donnees if len(donnees) == 3 : heures, minutes, secondes = donnees valeur = datetime.timedelta(minutes= int(heures)*60 + int(minutes)) # valeur = datetime.time(hour=int(valeur.split(separateur)[0]), minute=int(valeur.split(separateur)[1])) return (valeur, styleHeure) except : pass if type(valeur) in (str, unicode) : if len(valeur) == 10 : if valeur[2] == "/" and valeur[5] == "/" : return (valeur, styleDate) if valeur[4] == "-" and valeur[7] == "-" : return (UTILS_Dates.DateEngFr(valeur), styleDate) return unicode(valeur), None # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- x = 1 y = 0 for valeurs in listeValeurs : if autoriseSelections == False or int(valeurs[0]) in listeSelections : for valeur in valeurs : if valeur == None : valeur = u"" # Recherche s'il y a un format de nombre ou de montant if listview != None : valeur, format = RechercheFormat(valeur) #RechercheFormatFromChaine(valeur) else : valeur, format = RechercheFormatFromChaine(valeur) # Enregistre la valeur if format != None : ws1.write(x, y, valeur, format) else: ws1.write(x, y, valeur) y += 1 x += 1 y = 0 # Finalisation du fichier xls try : wb.save(cheminFichier) except : dlg = wx.MessageDialog(None, _(u"Il est impossible d'enregistrer le fichier Excel. Veuillez vérifier que ce fichier n'est pas déjà ouvert en arrière-plan."), "Erreur", wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() return # Confirmation de création du fichier et demande d'ouverture directe dans Excel if mode == "enregistrer" : txtMessage = _(u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?") dlgConfirm = wx.MessageDialog(None, txtMessage, _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.ICON_QUESTION) reponse = dlgConfirm.ShowModal() dlgConfirm.Destroy() if reponse == wx.ID_NO: return else: FonctionsPerso.LanceFichierExterne(cheminFichier) # Envoyer par Email if mode == "email" : import DLG_Mailer dlg = DLG_Mailer.Dialog(None) dlg.ChargerModeleDefaut() dlg.SetPiecesJointes([cheminFichier,]) dlg.ShowModal() dlg.Destroy()