예제 #1
0
 def __createWidgets(self):
     u"""Créée les widgets de l'interface graphique"""
     self._ui = Ui_mail()
     self._ui.setupUi(self)
     self.__connectSlots()
예제 #2
0
 def __createWidgets(self):
     u"""Créée les widgets de l'interface graphique"""
     self._ui = Ui_mail()
     self._ui.setupUi(self)
     self.__connectSlots()
예제 #3
0
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)
예제 #4
0
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)