def __createWidgets(self): u"""Créée les widgets de l'interface graphique""" self._ui = Ui_mail() self._ui.setupUi(self) self.__connectSlots()
class MailUI(QWidget): u"""Classe chargée de l'interface d'envoi d'emails""" # signaux u"""Signal envoyé quand la base a été modifiée""" majBdd = Signal() u"""Signal envoyé pour notifier d'un événement""" notification = Signal(str, int) u"""Durée de vie des messages de notification""" DUREE_MESSAGE = 10000 def __init__(self, parent=None): super(MailUI, self).__init__(parent) self.__conf = Config.getInstance() self.__ms = MailSender(self) self.__createWidgets() self.miseAJour() def __createWidgets(self): u"""Créée les widgets de l'interface graphique""" self._ui = Ui_mail() self._ui.setupUi(self) self.__connectSlots() def __connectSlots(self): u"""Connecte les signaux des contrôles et de mise à jour""" self._ui.cbAbsence.currentIndexChanged.connect(self.__majUI) self.__ms.sentSignal.connect(self.__resulatEnvoi) self._ui.pbEnvoyer.clicked.connect(self.__envoyer) self.majBdd.connect(self.miseAJour) def __majUI(self, item): u"""Rafraîchit le contenu de l'ui quand l'absence sélectionnée change""" idx = self._ui.cbAbsence.currentIndex() date = self.__absences[idx]["date"].toString(Qt.SystemLocaleLongDate) sujet = "Absence du " + date self._ui.leSujet.setText(sujet) self._ui.teCorps.setText( u"""Bonjour,\n""" u"Pourrais-tu me dire rapidement quand tu comptes rattraper tes " + "cours du " + date + u", car cette absence date déjà de plus de " + nombre[int(self.__conf["duree"])] + u""" jours. Merci, """ + self.__conf["signature"]) self._ui.pbEnvoyer.setText(u"Envoyer à <" + self.__absences[idx]["adresse"] + ">") def miseAJour(self): u"""Liste les absences pouvant donner lieu à un email de rappel""" self._ui.cbAbsence.clear() # Vérification des mails à envoyer req = QSqlQuery() sql = MailSQL.construitRequeteComptage(self.__conf["duree"]) if req.exec_(sql): req.next() nbMails = req.record().value(0) else: # TODO log print req.lastError().text() print req.lastQuery() print "Erreur de requête" return label = str(nbMails) + " absence" if nbMails == 0: label += " :" self._ui.lAbsence.setText(label) self._ui.leSujet.setText("") self._ui.teCorps.setText("") self.__activerUi(False) self._ui.pbEnvoyer.setText("Envoyer") return else: self.__activerUi(True) if nbMails > 1: label += "s" label += " :" self._ui.lAbsence.setText(label) sql = MailSQL.construitRequeteListe(self.__conf["duree"]) if not req.exec_(sql): print req.lastError().text() print req.lastQuery() print "Erreur de requête" else: self.__absences = [] while (req.next()): absence = {} rec = req.record() absence = {} absence["id"] = rec.value(0) absence["date"] = QDate.fromString(rec.value(1), Qt.ISODate) absence["nom"] = rec.value(2) absence["adresse"] = rec.value(3) self.__absences.append(absence) item = absence["nom"] + " le " item += absence["date"].toString(Qt.SystemLocaleLongDate) self._ui.cbAbsence.addItem(item) def __resulatEnvoi(self, errCode): u"""Slot notifié quand l'envoi du mail est fini errCode indique le succès, ou l'échec (avec la raison) de l'envoi du mail """ if errCode == MailSender.MAIL_ERROR_NONE: # Mail envoyé, mise à jour de la base self.notification.emit(u"Email envoyé", MailUI.DUREE_MESSAGE) index = self._ui.cbAbsence.currentIndex() sql = MailSQL.mailEnvoye(str(self.__absences[index]["id"])) req = QSqlQuery() if not req.exec_(sql): QMessageBox.critical( self, u"Erreur de base de données", u"Le mail a été envoyé mais impossible de <br />" + u"l'enregistrer dans la base.") # TODO logger print "SQL error" print str(req.lastError().text().toUtf8()) print req.lastQuery() else: self.majBdd.emit() elif (errCode == MailSender.MAIL_ERROR_TIMEOUT or errCode == MailSender.MAIL_ERROR_CONNECTION): message = u"Email non envoyé - " if errCode == MailSender.MAIL_ERROR_TIMEOUT: message += u"Durée dépassée" else: message += u"Erreur de connexion" self.notification.emit(message, MailUI.DUREE_MESSAGE) QMessageBox.critical( self, "Erreur de connection", u"Impossible de contacter le serveur.<br />" + u"Veuillez vérifier la connexion à internet, <br />" + u"ainsi que l'adresse du serveur de messagerie.") elif errCode == MailSender.MAIL_ERROR_AUTHENTICATION: message = u"Email non envoyé - Erreur d'authentification" self.notification.emit(message, MailUI.DUREE_MESSAGE) QMessageBox.critical( self, "Erreur d'authentification", "Indentifiants incorrects.<br />(login " + self.__conf["email"] + ")") del self.__password else: # MailSender.MAIL_ERROR_OTHER: message = u"Email non envoyé - Erreur inconnue" self.notification.emit(message, MailUI.DUREE_MESSAGE) QMessageBox.critical( self, "Erreur inconnue", "Une erreur inconnue s'est produite.<br />(login '" + self.__conf["email"] + "')") # TODO logger l'erreur réelle à la levée de l'exception self.majBdd.emit() def __activerUi(self, actif): """Active/désactive les contrôles de l'onglet d'écriture d'emails""" self._ui.cbAbsence.setEnabled(actif) self._ui.pbEnvoyer.setEnabled(actif) self._ui.leSujet.setEnabled(actif) self._ui.teCorps.setEnabled(actif) def __envoyer(self): """Envoie l'email""" index = self._ui.cbAbsence.currentIndex() dest = self.__absences[index]["adresse"] sujet = self._ui.leSujet.text() corps = self._ui.teCorps.toPlainText() try: password = self.__password except AttributeError: result = QInputDialog.getText( self, "Mot de passe", "Veuillez saisir le mot de passe<br /> " + "de votre compte de messagerie", QLineEdit.Password) self.__password = str(result[0]) password = self.__password if not result[1]: return self.__activerUi(False) self.notification.emit("Email en cours d'envoi", MailUI.DUREE_MESSAGE) self.__ms.envoiMail(dest, sujet, corps, password)
class MailUI(QWidget): u"""Classe chargée de l'interface d'envoi d'emails""" # signaux u"""Signal envoyé quand la base a été modifiée""" majBdd = Signal() u"""Signal envoyé pour notifier d'un événement""" notification = Signal(str, int) u"""Durée de vie des messages de notification""" DUREE_MESSAGE = 10000 def __init__(self, parent=None): super(MailUI, self).__init__(parent) self.__conf = Config.getInstance() self.__ms = MailSender(self) self.__createWidgets() self.miseAJour() def __createWidgets(self): u"""Créée les widgets de l'interface graphique""" self._ui = Ui_mail() self._ui.setupUi(self) self.__connectSlots() def __connectSlots(self): u"""Connecte les signaux des contrôles et de mise à jour""" self._ui.cbAbsence.currentIndexChanged.connect(self.__majUI) self.__ms.sentSignal.connect(self.__resulatEnvoi) self._ui.pbEnvoyer.clicked.connect(self.__envoyer) self.majBdd.connect(self.miseAJour) def __majUI(self, item): u"""Rafraîchit le contenu de l'ui quand l'absence sélectionnée change""" idx = self._ui.cbAbsence.currentIndex() date = self.__absences[idx]["date"].toString(Qt.SystemLocaleLongDate) sujet = "Absence du " + date self._ui.leSujet.setText(sujet) self._ui.teCorps.setText(u"""Bonjour,\n""" u"Pourrais-tu me dire rapidement quand tu comptes rattraper tes " + "cours du " + date + u", car cette absence date déjà de plus de " + nombre[int(self.__conf["duree"])] + u""" jours. Merci, """ + self.__conf["signature"]) self._ui.pbEnvoyer.setText(u"Envoyer à <" + self.__absences[idx]["adresse"] + ">") def miseAJour(self): u"""Liste les absences pouvant donner lieu à un email de rappel""" self._ui.cbAbsence.clear() # Vérification des mails à envoyer req = QSqlQuery() sql = MailSQL.construitRequeteComptage(self.__conf["duree"]) if req.exec_(sql): req.next() nbMails = req.record().value(0) else: # TODO log print req.lastError().text() print req.lastQuery() print "Erreur de requête" return label = str(nbMails) + " absence" if nbMails == 0: label += " :" self._ui.lAbsence.setText(label) self._ui.leSujet.setText("") self._ui.teCorps.setText("") self.__activerUi(False) self._ui.pbEnvoyer.setText("Envoyer") return else: self.__activerUi(True) if nbMails > 1: label += "s" label += " :" self._ui.lAbsence.setText(label) sql = MailSQL.construitRequeteListe(self.__conf["duree"]) if not req.exec_(sql): print req.lastError().text() print req.lastQuery() print "Erreur de requête" else: self.__absences = [] while (req.next()): absence = {} rec = req.record() absence = {} absence["id"] = rec.value(0) absence["date"] = QDate.fromString(rec.value(1), Qt.ISODate) absence["nom"] = rec.value(2) absence["adresse"] = rec.value(3) self.__absences.append(absence) item = absence["nom"] + " le " item += absence["date"].toString(Qt.SystemLocaleLongDate) self._ui.cbAbsence.addItem(item) def __resulatEnvoi(self, errCode): u"""Slot notifié quand l'envoi du mail est fini errCode indique le succès, ou l'échec (avec la raison) de l'envoi du mail """ if errCode == MailSender.MAIL_ERROR_NONE: # Mail envoyé, mise à jour de la base self.notification.emit(u"Email envoyé", MailUI.DUREE_MESSAGE) index = self._ui.cbAbsence.currentIndex() sql = MailSQL.mailEnvoye(str(self.__absences[index]["id"])) req = QSqlQuery() if not req.exec_(sql): QMessageBox.critical(self, u"Erreur de base de données", u"Le mail a été envoyé mais impossible de <br />" + u"l'enregistrer dans la base.") # TODO logger print "SQL error" print str(req.lastError().text().toUtf8()) print req.lastQuery() else: self.majBdd.emit() elif (errCode == MailSender.MAIL_ERROR_TIMEOUT or errCode == MailSender.MAIL_ERROR_CONNECTION): message = u"Email non envoyé - " if errCode == MailSender.MAIL_ERROR_TIMEOUT: message += u"Durée dépassée" else: message += u"Erreur de connexion" self.notification.emit(message, MailUI.DUREE_MESSAGE) QMessageBox.critical(self, "Erreur de connection", u"Impossible de contacter le serveur.<br />" + u"Veuillez vérifier la connexion à internet, <br />" + u"ainsi que l'adresse du serveur de messagerie.") elif errCode == MailSender.MAIL_ERROR_AUTHENTICATION: message = u"Email non envoyé - Erreur d'authentification" self.notification.emit(message, MailUI.DUREE_MESSAGE) QMessageBox.critical(self, "Erreur d'authentification", "Indentifiants incorrects.<br />(login " + self.__conf["email"] + ")") del self.__password else: # MailSender.MAIL_ERROR_OTHER: message = u"Email non envoyé - Erreur inconnue" self.notification.emit(message, MailUI.DUREE_MESSAGE) QMessageBox.critical(self, "Erreur inconnue", "Une erreur inconnue s'est produite.<br />(login '" + self.__conf["email"] + "')") # TODO logger l'erreur réelle à la levée de l'exception self.majBdd.emit() def __activerUi(self, actif): """Active/désactive les contrôles de l'onglet d'écriture d'emails""" self._ui.cbAbsence.setEnabled(actif) self._ui.pbEnvoyer.setEnabled(actif) self._ui.leSujet.setEnabled(actif) self._ui.teCorps.setEnabled(actif) def __envoyer(self): """Envoie l'email""" index = self._ui.cbAbsence.currentIndex() dest = self.__absences[index]["adresse"] sujet = self._ui.leSujet.text() corps = self._ui.teCorps.toPlainText() try: password = self.__password except AttributeError: result = QInputDialog.getText(self, "Mot de passe", "Veuillez saisir le mot de passe<br /> " + "de votre compte de messagerie", QLineEdit.Password) self.__password = str(result[0]) password = self.__password if not result[1]: return self.__activerUi(False) self.notification.emit("Email en cours d'envoi", MailUI.DUREE_MESSAGE) self.__ms.envoiMail(dest, sujet, corps, password)