def __init__(self, parent): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX) self.parent = parent self.dictDonnees = {} # Titre self.staticbox_generalites_staticbox = wx.StaticBox( self, -1, _(u"Généralités")) self.label_titre = wx.StaticText(self, -1, _(u"Titre de l'onglet :")) self.ctrl_titre = wx.TextCtrl(self, -1, "") # Editeur self.staticbox_texte_staticbox = wx.StaticBox(self, -1, _(u"Texte")) self.ctrl_editeur = CTRL_Editeur_email.CTRL(self) # 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)
def __init__(self, parent, IDelement=None, categorie=None): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX) self.parent = parent self.IDelement = IDelement self.categorie = categorie # Editeur self.ctrl_editeur = CTRL_Editeur_email.CTRL(self) # 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) if self.IDelement != None or self.categorie != None: self.SetTitle(_(u"Modification d'un texte HTML")) self.Importation() else: self.SetTitle(_(u"Saisie d'un texte HTML"))
def VerifieFusion(self, texteHTML="", listeDestinataires=[]): """ Vérifie que tous les mots-clés ont été remplacés """ listeResultats = [] for track in listeDestinataires: dictChamps = track.champs # Remplacement des champs pour la fusion texte = copy.deepcopy(texteHTML) for motcle, valeur in CTRL_Editeur_email.GetChampsStandards( ).items(): texte = texte.replace(motcle, valeur) for motcle, valeur in dictChamps.items(): try: if valeur == None: valeur = u"" if type(valeur) == int: valeur = str(valeur) texte = texte.replace(motcle, valeur) except: pass # Vérifie si champs non remplacés x = r"\{[A-Za-z0-9_]*?\}" regex = re.compile(x) listeAnomalies = regex.findall(texte) if len(listeAnomalies) > 0: listeResultats.append((track.adresse, listeAnomalies)) # Affichage des résultats if len(listeResultats) > 0: message = _( u"Certains mots-clés semblent ne pas avoir été remplacés lors de la fusion des données. Est-ce normal ?\n\n" ) affichageMax = 10 for adresse, listeAnomalies in listeResultats[:affichageMax]: message += u" - %s : %s.\n" % (adresse, ", ".join(listeAnomalies)) if len(listeResultats) > affichageMax: message += _(u" - Ainsi que %d autres...\n") % ( len(listeResultats) - affichageMax) message += _(u"\nSouhaitez-vous tout de même continuer l'envoi ?") dlgErreur = wx.MessageDialog( self, message, _(u"Anomalies"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) if dlgErreur.ShowModal() == wx.ID_YES: return True else: return False else: return True
def __init__(self, parent): wx.Panel.__init__(self, parent, id=-1, style=wx.TAB_TRAVERSAL) self.parent = parent self.IDelement = None # Contrôles self.ctrl_editeur = CTRL_Editeur_email.CTRL(self) # Layout grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=5, hgap=5) grid_sizer_base.Add(self.ctrl_editeur, 0, wx.EXPAND | wx.LEFT, 10) grid_sizer_base.AddGrowableCol(0) grid_sizer_base.AddGrowableRow(0) self.SetSizer(grid_sizer_base) grid_sizer_base.Fit(self) self.Layout()
def MAJ_apercu(self): index = self.ctrl_adresse.GetSelection() if index == -1 : return xml = self.texte_xml if xml == None : return # Remplacement des champs standards for motcle, valeur in CTRL_Editeur_email.GetChampsStandards().iteritems() : xml = xml.replace(motcle, valeur) # Remplacement des champs spécifiques dictDonnee = self.donnees[index] for motcle, valeur in dictDonnee["champs"].iteritems() : if valeur == None or valeur == "//None" : valeur = "" xml = xml.replace(motcle, valeur) # MAJ éditeur self.ctrl_editeur.SetXML(xml)
def __init__(self, parent, donnees=[], texte_xml=None): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX|wx.THICK_FRAME) self.parent = parent self.donnees = donnees self.texte_xml = texte_xml listeAdresses = [] for dictTemp in self.donnees : listeAdresses.append(dictTemp["adresse"]) # Navigation self.bouton_premier = wx.BitmapButton(self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Premier.png"), wx.BITMAP_TYPE_ANY)) self.bouton_reculer = wx.BitmapButton(self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Reculer.png"), wx.BITMAP_TYPE_ANY)) self.ctrl_adresse = wx.ComboBox(self, -1, choices=listeAdresses, style=wx.CB_DROPDOWN ) self.ctrl_adresse.SetEditable(False) if len(listeAdresses) > 0 : self.ctrl_adresse.Select(0) self.bouton_avancer = wx.BitmapButton(self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Avancer.png"), wx.BITMAP_TYPE_ANY)) self.bouton_dernier = wx.BitmapButton(self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Dernier.png"), wx.BITMAP_TYPE_ANY)) # Aperçu self.ctrl_editeur = CTRL_Editeur_email.Editeur(self) self.ctrl_editeur.SetEditable(False) # Boutons self.bouton_aide = CTRL_Bouton_image.CTRL(self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png") self.bouton_fermer = CTRL_Bouton_image.CTRL(self, texte=_(u"Fermer"), cheminImage="Images/32x32/Fermer.png") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnBoutonPremier, self.bouton_premier) self.Bind(wx.EVT_BUTTON, self.OnBoutonReculer, self.bouton_reculer) self.Bind(wx.EVT_CHOICE, self.OnChoixAdresse, self.ctrl_adresse) self.Bind(wx.EVT_BUTTON, self.OnBoutonAvancer, self.bouton_avancer) self.Bind(wx.EVT_BUTTON, self.OnBoutonDernier, self.bouton_dernier) self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonFermer, self.bouton_fermer) # Init contrôles self.bouton_fermer.SetFocus() self.MAJ_apercu()
def MAJ_apercu(self): index = self.ctrl_adresse.GetSelection() if index == -1: return xml = self.texte_xml if xml == None: return # Remplacement des champs standards for motcle, valeur in CTRL_Editeur_email.GetChampsStandards().items(): xml = xml.replace(motcle.encode("iso-8859-15"), valeur.encode("iso-8859-15")) # Remplacement des champs spécifiques dictDonnee = self.donnees[index] for motcle, valeur in dictDonnee["champs"].items(): if valeur == None or valeur == "//None": valeur = "" if type(valeur) == int: valeur = str(valeur) if type(valeur) == datetime.date: valeur = UTILS_Dates.DateDDEnFr(valeur) xml = xml.replace(motcle, valeur) # MAJ éditeur self.ctrl_editeur.SetXML(xml)
def Envoyer(self, listeDestinataires=[], adresseTest=None): # Expéditeur dictExp = self.ctrl_exp.GetDonnees() if dictExp == None: dlg = wx.MessageDialog( self, _(u"Vous n'avez sélectionné aucune adresse d'expéditeur !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() return # Accusé de réception accuseReception = self.check_accuseReception.GetValue() # Objet sujet = self.ctrl_objet.GetValue() if len(sujet) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un objet pour ce message !" ), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() self.ctrl_objet.SetFocus() return # Destinataires if len(listeDestinataires) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez sélectionner au moins un destinataire !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() return nbreAnomalies = 0 for dest in listeDestinataires: if dest.adresse == None: nbreAnomalies += 1 if nbreAnomalies > 0: dlg = wx.MessageDialog( self, _(u"%d adresse(s) Email ne sont pas renseignées !") % nbreAnomalies, _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Texte if len(self.ctrl_editeur.GetValue()) == 0: dlg = wx.MessageDialog( self, _(u"Vous devez obligatoirement saisir un texte !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False: self.ShowModal() self.ctrl_editeur.SetFocus() return texteHTML, listeImages, handler = self.ctrl_editeur.GetHTML( imagesIncluses=True) # Vérifie la fusion des mots-clés if self.VerifieFusion(texteHTML, listeDestinataires) == False: if self.IsShown() == False: self.ShowModal() return # Pièces jointes listePiecesCommunes = self.ctrl_pieces.GetDonnees() # Demande de confirmation if adresseTest == None and self.afficher_confirmation_envoi == True: dlg = wx.MessageDialog( self, _(u"Confirmez-vous l'envoi de ce message pour %d destinataires ?\n\nAttention, l'envoi peut prendre quelques minutes..." ) % len(listeDestinataires), _(u"Confirmation"), wx.YES_NO | wx.YES_DEFAULT | wx.CANCEL | wx.ICON_QUESTION) if dlg.ShowModal() != wx.ID_YES: dlg.Destroy() if self.IsShown() == False: self.ShowModal() return dlg.Destroy() # Préparation des messages liste_messages = [] for track in listeDestinataires: adresse = track.adresse if adresseTest != None: adresse = adresseTest listePiecesPersonnelles = track.pieces dictChamps = track.champs # Pièces Personnelles + communes listePieces = listePiecesPersonnelles listePieces.extend(listePiecesCommunes) # Traitement des champs pour la fusion texte = copy.deepcopy(texteHTML) for motcle, valeur in CTRL_Editeur_email.GetChampsStandards( ).items(): texte = texte.replace(motcle, valeur) for motcle, valeur in dictChamps.items(): if valeur == None: valeur = u"" if type(valeur) == int: valeur = str(valeur) if type(valeur) == bool: valeur = str(valeur) if type(valeur) == datetime.date: valeur = UTILS_Dates.DateDDEnFr(valeur) texte = texte.replace(motcle, valeur) # Mémorisation du message message = UTILS_Envoi_email.Message( destinataires=[ adresse, ], sujet=sujet, texte_html=texte, fichiers=listePieces, images=listeImages, champs=dictChamps, ) liste_messages.append(message) # Connexion messagerie dlg_progress = wx.ProgressDialog( _(u"Envoi des mails"), _(u"Connexion au serveur de messagerie..."), maximum=len(liste_messages) + 1, parent=None) dlg_progress.SetSize((450, 140)) dlg_progress.CenterOnScreen() try: messagerie = UTILS_Envoi_email.Messagerie( backend=dictExp["moteur"], hote=dictExp["smtp"], port=dictExp["port"], utilisateur=dictExp["utilisateur"], motdepasse=dictExp["motdepasse"], email_exp=dictExp["adresse"], nom_exp=dictExp["nom_adresse"], timeout=20, use_tls=dictExp["startTLS"], parametres=dictExp["parametres"]) messagerie.Connecter() except Exception as err: dlg_progress.Destroy() err = str(err) intro = _( u"La connexion au serveur de messagerie est impossible :") conclusion = _( u"Vérifiez votre connexion internet ou les paramètres de votre adresse d'expédition." ) dlgErreur = DLG_Messagebox.Dialog(self, titre=_(u"Erreur"), introduction=intro, detail=err, conclusion=conclusion, icone=wx.ICON_ERROR, boutons=[ _(u"Ok"), ]) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Envoi des messages self.listeSucces = messagerie.Envoyer_lot( messages=liste_messages, dlg_progress=dlg_progress, afficher_confirmation_envoi=self.afficher_confirmation_envoi) # Fermeture messagerie try: messagerie.Fermer() except: pass # Fermeture dlg_progress si besoin if dlg_progress != None: try: dlg_progress.Destroy() except: pass # Suppression des images temporaires incluses dans le message handler.DeleteTemporaryImages() # Mémorisation dans l'historique if self.listeSucces != False: for message in self.listeSucces: self.MemorisationHistorique(message.GetLabelDestinataires(), message.sujet)
def InsererMotcle(self, event): motcle, label = CTRL_Editeur_email.GetMotscles( self.categorie)[event.GetId() - 10000] self.ctrl_editeur.EcritTexte(motcle)
def __init__(self, parent, categorie="saisie_libre", afficher_confirmation_envoi=True): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX) self.parent = parent self.categorie = categorie self.afficher_confirmation_envoi = afficher_confirmation_envoi self.listePiecesJointes = [] self.listeAnomalies = [] self.listeSucces = [] # Bandeau intro = _( u"Vous pouvez ici expédier des Emails par lot. Sélectionnez une adresse d'expéditeur, un objet, un ou plusieurs destinataires avant de rédiger votre texte. Les Emails sont envoyés par lots afin de contourner les protections anti-spam des opérateurs." ) titre = _(u"Editeur d'Emails") self.SetTitle(titre) self.ctrl_bandeau = CTRL_Bandeau.Bandeau( self, titre=titre, texte=intro, hauteurHtml=30, nomImage="Images/32x32/Editeur_email.png") # Destinataires self.box_destinataires_staticbox = wx.StaticBox( self, -1, _(u"Destinataires")) self.ctrl_destinataires = OL_Destinataires_emails.ListView( self, id=-1, style=wx.LC_REPORT | wx.SUNKEN_BORDER | wx.LC_SINGLE_SEL | wx.LC_HRULES | wx.LC_VRULES) self.ctrl_destinataires.MAJ() self.bouton_modifier_dest = wx.BitmapButton( self, -1, wx.Bitmap( Chemins.GetStaticPath("Images/16x16/Email_destinataires.png"), wx.BITMAP_TYPE_ANY)) self.bouton_ajouter_piece_spec = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"), wx.BITMAP_TYPE_ANY)) self.bouton_retirer_piece_spec = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"), wx.BITMAP_TYPE_ANY)) # Paramètres self.box_param_staticbox = wx.StaticBox(self, -1, _(u"Paramètres")) self.label_exp = wx.StaticText(self, -1, _(u"Exp. :")) self.ctrl_exp = CTRL_Editeur_email.Panel_Expediteur(self) self.check_accuseReception = wx.CheckBox(self, -1, _(u"Accusé de réception")) # Pièces jointes self.box_pieces_staticbox = wx.StaticBox( self, -1, _(u"Pièces jointes communes")) self.ctrl_pieces = OL_Pieces_jointes_emails.ListView( self, id=-1, style=wx.LC_NO_HEADER | wx.LC_REPORT | wx.SUNKEN_BORDER | wx.LC_SINGLE_SEL | wx.LC_HRULES | wx.LC_VRULES) self.ctrl_pieces.SetMinSize((200, 70)) self.ctrl_pieces.MAJ() self.bouton_ajouter_piece = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"), wx.BITMAP_TYPE_ANY)) self.bouton_suppr_piece = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"), wx.BITMAP_TYPE_ANY)) # Texte self.box_texte_staticbox = wx.StaticBox(self, -1, _(u"Message")) self.label_objet = wx.StaticText(self, -1, _(u"Objet :")) self.ctrl_objet = wx.TextCtrl(self, -1, u"") self.ctrl_objet.SetMinSize((200, -1)) self.ctrl_editeur = CTRL_Editeur_email.CTRL(self) # Commandes self.bouton_aide = CTRL_Bouton_image.CTRL( self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png") self.bouton_outils = CTRL_Bouton_image.CTRL( self, texte=_(u"Outils"), cheminImage="Images/32x32/Configuration.png") self.bouton_envoyer = CTRL_Bouton_image.CTRL( self, texte=_(u"Envoyer l'Email"), cheminImage="Images/32x32/Emails_exp.png") self.bouton_annuler = CTRL_Bouton_image.CTRL( self, id=wx.ID_CANCEL, texte=_(u"Fermer"), cheminImage="Images/32x32/Fermer.png") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnBoutonOutils, self.bouton_outils) self.Bind(wx.EVT_BUTTON, self.ctrl_destinataires.Modifier, self.bouton_modifier_dest) self.Bind(wx.EVT_BUTTON, self.ctrl_destinataires.AjouterPiece, self.bouton_ajouter_piece_spec) self.Bind(wx.EVT_BUTTON, self.ctrl_destinataires.RetirerPiece, self.bouton_retirer_piece_spec) self.Bind(wx.EVT_BUTTON, self.ctrl_pieces.Ajouter, self.bouton_ajouter_piece) self.Bind(wx.EVT_BUTTON, self.ctrl_pieces.Retirer, self.bouton_suppr_piece) self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonEnvoyer, self.bouton_envoyer) # Init contrôles self.ctrl_objet.SetFocus()
def OnBoutonOutils(self, event): # Création du menu contextuel menuPop = UTILS_Adaptations.Menu() # Insérer un mot-clé listeMotscles = CTRL_Editeur_email.GetMotscles(self.categorie) sousMenuMotscles = UTILS_Adaptations.Menu() index = 0 for motcle, label in listeMotscles: id = 10000 + index sousMenuMotscles.AppendItem(wx.MenuItem(menuPop, id, motcle)) self.Bind(wx.EVT_MENU, self.InsererMotcle, id=id) index += 1 menuPop.AppendMenu(10, _(u"Insérer un mot-clé"), sousMenuMotscles) # Aperçu de la fusion item = wx.MenuItem(menuPop, 60, _(u"Aperçu de la fusion")) item.SetBitmap( wx.Bitmap( Chemins.GetStaticPath("Images/16x16/Apercu_fusion_emails.png"), wx.BITMAP_TYPE_PNG)) menuPop.AppendItem(item) self.Bind(wx.EVT_MENU, self.ApercuFusion, id=60) menuPop.AppendSeparator() # Effacer le texte item = wx.MenuItem(menuPop, 50, _(u"Effacer le texte")) item.SetBitmap( wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Gomme.png"), wx.BITMAP_TYPE_PNG)) menuPop.AppendItem(item) self.Bind(wx.EVT_MENU, self.EffacerTexte, id=50) menuPop.AppendSeparator() # Modèles d'Emails sousMenuModeles = UTILS_Adaptations.Menu() DB = GestionDB.DB() req = """SELECT IDmodele, nom, description FROM modeles_emails WHERE categorie='%s' ORDER BY nom;""" % self.categorie DB.ExecuterReq(req) listeDonnees = DB.ResultatReq() DB.Close() for IDmodele, nom, description in listeDonnees: id = 20000 + IDmodele item = wx.MenuItem(menuPop, id, nom) item.SetBitmap( wx.Bitmap( Chemins.GetStaticPath("Images/16x16/Emails_modele.png"), wx.BITMAP_TYPE_PNG)) sousMenuModeles.AppendItem(item) self.Bind(wx.EVT_MENU, self.ChargerModeleMenu, id=id) item = menuPop.AppendMenu(20, _(u"Charger un modèle d'Email"), sousMenuModeles) if len(listeDonnees) == 0: if item != None: item.Enable(False) # Gestion des modèles d'Email item = wx.MenuItem(menuPop, 30, _(u"Gestion des modèles")) item.SetBitmap( wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Emails_modele.png"), wx.BITMAP_TYPE_PNG)) menuPop.AppendItem(item) self.Bind(wx.EVT_MENU, self.GestionModeles, id=30) menuPop.AppendSeparator() # Envoyer un email de test item = wx.MenuItem(menuPop, 40, _(u"Envoyer un Email de test")) item.SetBitmap( wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Mail.png"), wx.BITMAP_TYPE_PNG)) menuPop.AppendItem(item) self.Bind(wx.EVT_MENU, self.EnvoyerTest, id=40) self.PopupMenu(menuPop) menuPop.Destroy()
def __init__(self, parent, categorie="", IDmodele=None): wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX) self.parent = parent self.categorie = categorie self.IDmodele = IDmodele self.defaut = 0 # Généralités self.staticbox_generalites_staticbox = wx.StaticBox( self, -1, _(u"Généralités")) self.label_nom = wx.StaticText(self, -1, _(u"Nom :")) self.ctrl_nom = wx.TextCtrl(self, -1, u"") self.label_description = wx.StaticText(self, -1, _(u"Description :")) self.ctrl_description = wx.TextCtrl(self, -1, u"", style=wx.TE_MULTILINE) # Mots-clés self.listeMotsCles = [] listeMotscles = CTRL_Editeur_email.GetMotscles(self.categorie) for motCle, code in listeMotscles: self.listeMotsCles.append(motCle) self.staticbox_motscles_staticbox = wx.StaticBox( self, -1, _(u"Mots-clés disponibles")) self.ctrl_motscles = wx.ListBox(self, -1, choices=self.listeMotsCles, style=wx.SIMPLE_BORDER) self.ctrl_motscles.SetBackgroundColour("#F0FBED") # Expéditeur self.label_exp = wx.StaticText(self, -1, _(u"Expéditeur :")) self.ctrl_exp = CTRL_Editeur_email.Panel_Expediteur(self) # Objet self.label_objet = wx.StaticText(self, -1, _(u"Objet :")) self.ctrl_objet = wx.TextCtrl(self, -1, u"") # texte self.staticbox_texte_staticbox = wx.StaticBox(self, -1, _(u"Message")) self.ctrl_editeur = CTRL_Editeur_email.CTRL(self) # 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_LISTBOX_DCLICK, self.OnInsertMotcle, self.ctrl_motscles) self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide) self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok) if self.IDmodele != None: self.SetTitle(_(u"Modification d'un modèle d'Email")) self.Importation() else: self.SetTitle(_(u"Saisie d'un modèle d'Email"))
def Envoyer(self, listeDestinataires=[], adresseTest=None): # Expéditeur dictExp = self.ctrl_exp.GetDonnees() if dictExp == None : dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune adresse d'expéditeur !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() return exp = dictExp["adresse"] nomexp = dictExp["nom_adresse"] serveur = dictExp["smtp"] port = dictExp["port"] connexionAuthentifiee = dictExp["auth"] connexionStartTLS = dictExp["startTLS"] motdepasse = dictExp["motdepasse"] utilisateur = dictExp["utilisateur"] # Accusé de réception accuseReception = self.check_accuseReception.GetValue() # Objet sujet = self.ctrl_objet.GetValue() if len(sujet) == 0 : dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement saisir un objet pour ce message !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() self.ctrl_objet.SetFocus() return # Destinataires if len(listeDestinataires) == 0 : dlg = wx.MessageDialog(self, _(u"Vous devez sélectionner au moins un destinataire !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() return nbreAnomalies = 0 for dest in listeDestinataires : if dest.adresse == None : nbreAnomalies += 1 if nbreAnomalies > 0 : dlg = wx.MessageDialog(self, _(u"%d adresse(s) Email ne sont pas renseignées !") % nbreAnomalies, _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Texte if len(self.ctrl_editeur.GetValue()) == 0 : dlg = wx.MessageDialog(self, _(u"Vous devez obligatoirement saisir un texte !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() if self.IsShown() == False : self.ShowModal() self.ctrl_editeur.SetFocus() return texteHTML, listeImages, handler = self.ctrl_editeur.GetHTML(imagesIncluses=True) # Vérifie la fusion des mots-clés if self.VerifieFusion(texteHTML, listeDestinataires) == False : if self.IsShown() == False : self.ShowModal() return # Pièces jointes listePiecesCommunes = self.ctrl_pieces.GetDonnees() # Demande de confirmation if adresseTest == None and self.afficher_confirmation_envoi == True : dlg = wx.MessageDialog(self, _(u"Confirmez-vous l'envoi de ce message pour %d destinataires ?\n\nAttention, l'envoi peut prendre quelques minutes...") % len(listeDestinataires), _(u"Confirmation"), wx.YES_NO|wx.YES_DEFAULT|wx.CANCEL|wx.ICON_QUESTION) if dlg.ShowModal() != wx.ID_YES : dlg.Destroy() if self.IsShown() == False : self.ShowModal() return dlg.Destroy() # Envoi des mails dlg = wx.ProgressDialog(_(u"Envoi des mails"), _(u"Veuillez patienter..."), maximum = len(listeDestinataires)+1, parent=self) dlg.SetSize((370, 140)) dlg.CenterOnScreen() index = 1 self.listeAnomalies = [] self.listeSucces = [] for track in listeDestinataires : adresse = track.adresse if adresseTest != None : adresse = adresseTest ## adresse = FonctionsPerso.Supprime_accent2(adresse) listePiecesPersonnelles = track.pieces dictChamps = track.champs # Pièces Personnelles + communes listePieces = listePiecesPersonnelles listePieces.extend(listePiecesCommunes) # Traitement des champs pour la fusion texte = copy.deepcopy(texteHTML) for motcle, valeur in CTRL_Editeur_email.GetChampsStandards().iteritems() : texte = texte.replace(motcle, valeur) for motcle, valeur in dictChamps.iteritems() : if valeur == None : valeur = u"" if type(valeur) == int : valeur = str(valeur) if type(valeur) == bool : valeur = str(valeur) if type(valeur) == datetime.date : valeur = UTILS_Dates.DateDDEnFr(valeur) texte = texte.replace(motcle, valeur) # Envoi du mail try : labelAdresse = adresse.decode("iso-8859-15") except : labelAdresse = adresse label = _(u"Envoi %d/%d : %s...") % (index, len(listeDestinataires), labelAdresse) self.EcritStatusBar(label) dlg.Update(index, label) try : etat = UTILS_Envoi_email.Envoi_mail( adresseExpediteur=exp, nomadresseExpediteur=nomexp, listeDestinataires=[adresse,], listeDestinatairesCCI=[], sujetMail=sujet, texteMail=texte, listeFichiersJoints=listePieces, serveur=serveur, port=port, avecAuthentification=connexionAuthentifiee, avecStartTLS=connexionStartTLS, listeImages=listeImages, motdepasse=motdepasse, accuseReception=accuseReception, utilisateur=utilisateur, ) self.listeSucces.append(track) # Mémorisation dans l'historique self.MemorisationHistorique(adresse, sujet) except Exception, err: err = str(err).decode("iso-8859-15") self.listeAnomalies.append((track, err)) print ("Erreur dans l'envoi d'un mail : %s...", err) traceback.print_exc(file=sys.stdout) if index == len(listeDestinataires) : dlgErreur = wx.MessageDialog(self, _(u"%s\n\nL'erreur suivante a été détectée :\n%s.") % (label, err), _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() else : dlgErreur = wx.MessageDialog(self, _(u"%s\n\nL'erreur suivante a été détectée :\n%s.\n\nSouhaitez-vous quand même continuer le processus ?") % (label, err), _(u"Erreur"), wx.YES_NO|wx.YES_DEFAULT|wx.CANCEL|wx.ICON_ERROR) if dlgErreur.ShowModal() != wx.ID_YES : dlgErreur.Destroy() # Arrêt du processus dlg.Destroy() handler.DeleteTemporaryImages() self.EcritStatusBar(u"") return dlgErreur.Destroy() if len(listeDestinataires) > 1 : time.sleep(2) # Attente entre chaque envoi... index += 1
def __init__(self, parent): wx.Dialog.__init__(self, parent, -1, name="DLG_Export_noethysweb", style=wx.DEFAULT_DIALOG_STYLE) self.parent = parent # Bandeau intro = _( u"Utilisez cette fonctionnalité pour convertir votre base de données au format Noethysweb. Saisissez un mot de passe deux fois et cliquez sur le bouton Générer." ) titre = _(u"Exporter les données vers Noethysweb") self.SetTitle(titre) self.ctrl_bandeau = CTRL_Bandeau.Bandeau( self, titre=titre, texte=intro, hauteurHtml=30, nomImage="Images/32x32/Document_export.png") # Fichier de destination self.box_destination_staticbox = wx.StaticBox(self, -1, _(u"Destination")) self.label_nom = wx.StaticText(self, -1, u"Nom :") nom_fichier = _(u"Noethysweb_%s") % datetime.datetime.now().strftime( "%Y%m%d_%H%M") self.ctrl_nom = wx.TextCtrl(self, -1, nom_fichier) self.label_repertoire = wx.StaticText(self, -1, u"Répertoire :") sp = wx.StandardPaths.Get() cheminDefaut = sp.GetDocumentsDir() self.ctrl_repertoire = wx.TextCtrl(self, -1, cheminDefaut) self.bouton_repertoire = wx.BitmapButton( self, -1, wx.Bitmap(Chemins.GetStaticPath(u"Images/16x16/Repertoire.png"), wx.BITMAP_TYPE_ANY)) # Mot de passe self.box_cryptage_staticbox = wx.StaticBox(self, -1, _(u"Cryptage")) self.label_mdp = wx.StaticText(self, -1, _(u"Mot de passe :")) self.ctrl_mdp = wx.TextCtrl(self, -1, u"", style=wx.TE_PASSWORD) self.label_confirmation = wx.StaticText(self, -1, _(u"Confirmation :")) self.ctrl_confirmation = wx.TextCtrl(self, -1, u"", style=wx.TE_PASSWORD) # CTRL Editeur d'Emails pour récupérer la version HTML d'un texte XML self.ctrl_editeur = CTRL_Editeur_email.CTRL(self) self.ctrl_editeur.Show(False) self.bouton_aide = CTRL_Bouton_image.CTRL( self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png") self.bouton_generer = CTRL_Bouton_image.CTRL( self, texte=_(u"Générer"), cheminImage="Images/32x32/Sauvegarder.png") self.bouton_annuler = CTRL_Bouton_image.CTRL( self, id=wx.ID_CANCEL, texte=_(u"Fermer"), cheminImage="Images/32x32/Annuler.png") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnBoutonRepertoire, self.bouton_repertoire) self.Bind(wx.EVT_BUTTON, self.OnBoutonGenerer, self.bouton_generer) self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)