272 lines
9.8 KiB
Python
272 lines
9.8 KiB
Python
import os
|
|
|
|
from PyQt6 import QtGui, QtWidgets, QtCore
|
|
|
|
from src import Icon
|
|
|
|
from .dialog_sources import NewMailTemplateDesignerDialog
|
|
|
|
import sys
|
|
from loguru import logger as log
|
|
|
|
logger = log
|
|
logger.remove()
|
|
logger.add("logs/application.log", rotation="1 week", enqueue=True)
|
|
log.add(
|
|
f"logs/mail.log",
|
|
enqueue=True,
|
|
)
|
|
|
|
# logger.add(sys.stderr, format="{time} {level} {message}", level="INFO")
|
|
logger.add(sys.stdout)
|
|
|
|
|
|
class MailTemplateDialog(QtWidgets.QDialog, NewMailTemplateDesignerDialog):
|
|
updateSignal = QtCore.pyqtSignal()
|
|
|
|
def __init__(self, parent=None) -> None:
|
|
super().__init__(parent)
|
|
self.setupUi(self)
|
|
self.setWindowIcon(Icon("edit_note").icon)
|
|
self.setWindowTitle("Mailvorlage erstellen")
|
|
self.placeholder_list.addItem("")
|
|
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)
|
|
logger.info("Mail template dialog setup complete")
|
|
|
|
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(Icon("save").icon)
|
|
save = dialog.exec()
|
|
template_name = dialog.textValue()
|
|
logger.info("Saving template")
|
|
if template_name != "" and save == 1:
|
|
template = template_name + ".eml"
|
|
if template in os.listdir("mail_vorlagen"):
|
|
logger.error("Template already exists")
|
|
# warning dialog
|
|
dialog = QtWidgets.QMessageBox()
|
|
dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
|
|
Icon("warning", dialog)
|
|
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
|
|
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 = """<html>
|
|
<head>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
</head>
|
|
"""
|
|
mail_base = mail.split("<html>")[0]
|
|
mail_body = mail.split("</head>")[1]
|
|
mail = mail_base + html_head + mail_body
|
|
mail = (
|
|
mail.replace("<", "<")
|
|
.replace(">", ">")
|
|
.replace(""", '"')
|
|
.replace("&", "&")
|
|
)
|
|
with open(f"mail_vorlagen/{template}", "w", encoding="utf-8") as f:
|
|
f.write(mail)
|
|
self.updateSignal.emit()
|
|
self.close()
|
|
logger.success(f"Template {template} saved successfully")
|
|
else:
|
|
# warning dialog
|
|
dialog = QtWidgets.QMessageBox()
|
|
dialog.setIcon(QtWidgets.QMessageBox.Icon.Warning)
|
|
dialog.setWindowIcon(Icon("warning").icon)
|
|
|
|
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.setWindowIcon(Icon("warning").icon)
|
|
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; 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
|
|
Icon("template_fail", self.testTemplate)
|
|
dialog = QtWidgets.QMessageBox()
|
|
dialog.setWindowIcon(Icon("warning").icon)
|
|
|
|
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": "{greeting}",
|
|
"apparatsfach": "{AppSubject}",
|
|
"apparatsname": "{Appname}",
|
|
"apparatsnummer": "{AppNr}",
|
|
"dozentname": "{Profname}",
|
|
"signatur": """<pre class="moz-signature" cols="72">--
|
|
{signature}
|
|
</pre>""",
|
|
}
|
|
cursor = self.templateEdit.textCursor()
|
|
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()
|
|
|
|
|
|
def launch_gui():
|
|
app = QtWidgets.QApplication([])
|
|
window = MailTemplateDialog()
|
|
window.show()
|
|
app.exec()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
launch_gui()
|