From d54d29261ccf04146b9514917ee308019fcdfe98 Mon Sep 17 00:00:00 2001 From: WorldTeacher <41587052+WorldTeacher@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:41:20 +0200 Subject: [PATCH] mail template --- src/ui/dialogs/mailTemplate.py | 179 ++++++++++++++++++++++++++++++--- 1 file changed, 164 insertions(+), 15 deletions(-) diff --git a/src/ui/dialogs/mailTemplate.py b/src/ui/dialogs/mailTemplate.py index c7da07d..abc6c30 100644 --- a/src/ui/dialogs/mailTemplate.py +++ b/src/ui/dialogs/mailTemplate.py @@ -1,6 +1,7 @@ from dialog_sources.newMailTemplateDesigner_ui import Ui_Dialog from PyQt6 import QtWidgets, QtCore, QtGui from PyQt6.QtGui import QFont +import os class MailTemplateDialog(QtWidgets.QDialog, Ui_Dialog): def __init__(self,parent = None) -> None: @@ -10,34 +11,182 @@ class MailTemplateDialog(QtWidgets.QDialog, Ui_Dialog): self.placeholder_list.setCurrentText("") self.insertPlaceholder.clicked.connect(self.insert_placeholder) self.placeholder_list.currentTextChanged.connect(self.updateDescription) + self.bold.clicked.connect(self.setFontBold) + self.italic.clicked.connect(self.setTextFontItalic) + self.underlined.clicked.connect(self.setTextFontUnderline) + self.testTemplate.clicked.connect(self.test_template) + self.fontBox.currentFontChanged.connect(self.setCurrentFont) + self.fontSize.currentTextChanged.connect(self.setFontSize) + #buttonbox + #save button + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Save).clicked.connect(self.save_template) + #discard button + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Discard).clicked.connect(self.discard_changes) + #cancel button + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Cancel).clicked.connect(self.closeNow) + + def save_template(self): + print("save triggered") + #create a dialog to ask for the name of the template + dialog = QtWidgets.QInputDialog() + dialog.setInputMode(QtWidgets.QInputDialog.InputMode.TextInput) + dialog.setLabelText("Bitte geben Sie den Namen des Templates ein:") + dialog.setWindowTitle("Template speichern") + dialog.setOkButtonText("Speichern") + dialog.setCancelButtonText("Abbrechen") + dialog.setWindowIcon(QtGui.QIcon("icons/save.png")) + save = dialog.exec() + template_name = dialog.textValue() + if template_name != "": + template = template_name + ".eml" + if template in os.listdir("mail_vorlagen"): + #warning dialog + dialog = QtWidgets.QMessageBox() + dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + dialog.setText("Ein Template mit diesem Namen existiert bereits. Möchten Sie es überschreiben?") + dialog.setWindowTitle("Template überschreiben") + dialog.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No) + dialog.setDefaultButton(QtWidgets.QMessageBox.StandardButton.No) + ret = dialog.exec() + if ret == QtWidgets.QMessageBox.StandardButton.No: + return + + if save == 1: + + mail = f"""Subject: {self.subject.text()} +MIME-Version: 1.0 +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: 8bit +{self.templateEdit.toHtml()}""" + html_head = ''' +
+ + + ''' + mail_base = mail.split("")[0] + mail_body = mail.split("")[1] + mail = mail_base + html_head + mail_body + mail = mail.replace("<", "<").replace(">", ">").replace(""", '"').replace("&", "&") + with open(f"mail_vorlagen/{template}","w") as f: + f.write(mail) + self.close() + else: + #warning dialog + dialog = QtWidgets.QMessageBox() + dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + dialog.setText("Bitte geben Sie einen Namen für das Template ein.") + dialog.setWindowTitle("Fehler beim Speichern") + dialog.exec() + return + + def discard_changes(self): + self.subject.clear() + self.templateEdit.clear() + + def closeNow(self): + if self.subject.text() == "" and self.templateEdit.toPlainText() == "": + self.close() + else: + dialog = QtWidgets.QMessageBox() + dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + dialog.setText("Möchten Sie die Änderungen wirklich verwerfen?") + dialog.setWindowTitle("Änderungen verwerfen") + dialog.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No) + dialog.setDefaultButton(QtWidgets.QMessageBox.StandardButton.No) + ret = dialog.exec() + if ret == QtWidgets.QMessageBox.StandardButton.Yes: + self.close() def updateDescription(self): print("update triggered") print(self.placeholder_list.currentText()) - placeholders = {"anrede" : "Die Anrede beinhaltet sowohl Person als auch Sehr geehrte/r", - "apparatsfach" : "Das Fach, in welchem der Apparat angelegt wurde", - "apparatsname": "Der Name des Apparats", - "apparatsnummer": "Die Nummer des Apparats", - "dozentname" : "Der Name des Dozenten / der Dozentin", - "signatur" : "Die persönliche / allgemeine Signatur am ende der Mail", + placeholders = {"anrede" : "Die Anrede beinhaltet sowohl Person als auch Sehr geehrte/r; dargestellt als: {greeting}", + "apparatsfach" : "Das Fach, in welchem der Apparat angelegt wurde; dargestellt als: {AppSubject}", + "apparatsname": "Der Name des Apparats; dargestellt als: {Appname}", + "apparatsnummer": "Die Nummer des Apparats; dargestellt als: {AppNr}", + "dozentname" : "Der Name des Dozenten / der Dozentin; dargestellt als: {Profname}", + "signatur" : "Die persönliche / allgemeine Signatur am ende der Mail; dargestellt als: {signature}", "": " "} for key, item, in placeholders.items(): if key in self.placeholder_list.currentText().lower(): self.lineEdit.setText(item) break + def setCurrentFont(self): + font = self.fontBox.currentFont() + font.setPointSize(int(self.fontSize.currentText())) + self.templateEdit.setFont(font) + + def setFontSize(self): + size = self.fontSize.currentText() + self.templateEdit.setFontPointSize(int(size)) + + def setFontBold(self): + if self.bold.isChecked(): + self.templateEdit.setFontWeight(QtGui.QFont.Weight.Bold) + else: + self.templateEdit.setFontWeight(QtGui.QFont.Weight.Normal) + + def setTextFontItalic(self): + if self.italic.isChecked(): + self.templateEdit.setFontItalic(True) + else: + self.templateEdit.setFontItalic(False) + + def setTextFontUnderline(self): + if self.underlined.isChecked(): + self.templateEdit.setFontUnderline(True) + else: + self.templateEdit.setFontUnderline(False) + + def test_template(self): + placeholders = ["{greeting}","{AppSubject}","{Appname}","{AppNr}","{Profname}","{signature}"] + mail_subject = self.subject.text() + mail_body = self.templateEdit.toHtml() + missing_body = [] + missing_subject = [] + try: + assert placeholders[2] in mail_subject + except AssertionError: + missing_subject.append(placeholders[2]) + #check if all placeholders are in the mail body + for placeholder in placeholders: + try: + assert placeholder in mail_body + except AssertionError: + missing_body.append(placeholder) + if missing_body != []: + #warning dialog + self.testTemplate.setText("❗") + dialog = QtWidgets.QMessageBox() + dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning) + dialog.setText("Folgende Platzhalter fehlen im Template:") + + missing = "Betreff:\n" +"\n".join(missing_subject) + "\n\n" + "Mailtext:\n"+"\n".join(missing_body) + + dialog.setInformativeText(f"{missing}") + dialog.setWindowTitle("Fehlende Platzhalter") + dialog.exec() + self.testTemplate.setText("Template testen") + else: + self.testTemplate.setText("✔") + def insert_placeholder(self): - placeholder = {"anrede" : "{}", - "apparatsfach" : "Das Fach, in welchem der Apparat angelegt wurde", - "apparatsname": "Der Name des Apparats", - "apparatsnummer": "Die Nummer des Apparats", - "dozentname" : "Der Name des Dozenten / der Dozentin", - "signatur" : "Die persönliche / allgemeine Signatur am ende der Mail", - "": " "} + placeholder = {"anrede" : "{greeting}", + "apparatsfach" : "{AppSubject}", + "apparatsname": "{Appname}", + "apparatsnummer": "{AppNr}", + "dozentname" : "{Profname}", + "signatur" : '''--
+{signature}
+'''
+ }
cursor = self.templateEdit.textCursor()
-
- cursor.insertText("{{placeholder}}")
+ for key, item, in placeholder.items():
+ if key in self.placeholder_list.currentText().lower():
+ cursor.insertText(item)
+ break
self.templateEdit.setTextCursor(cursor)
self.templateEdit.setFocus()