akmi-utilities/widget.py
Argiris Deligiannidis c309c2db56
Some checks failed
continuous-integration/drone Build is failing
v1.0
2025-01-08 00:57:05 +02:00

193 lines
8.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This Python file uses the following encoding: utf-8
import os
import io
import sys
import shutil
import base64
from docx import Document
from msoffice2pdf import convert
import pandas as pd
import requests
from PySide6.QtWidgets import QApplication, QWidget, QFileDialog
from PySide6.QtCore import QFile, QIODevice
# Important:
# You need to run the following command to generate the ui_form.py file
# pyside6-uic form.ui -o ui_form.py, or
# pyside2-uic form.ui -o ui_form.py
from ui_form import Ui_Widget
import resources_rc
class Widget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_Widget()
self.ui.setupUi(self)
self.setWindowTitle("AKMI Utilities")
self.ui.file_selector.clicked.connect(self.file_selector)
self.ui.file_template.clicked.connect(self.file_template)
self.ui.create_button.clicked.connect(self.create_button)
self.ui.enable_email.clicked.connect(self.enable_token)
self.selected_file = False
self.selected_template = False
self.filepath_template = ""
self.filepath = ""
self.img_dir = os.path.join(os.path.dirname(__file__), "images")
self.font_dir = os.path.join(os.path.dirname(__file__), "FONTS")
def qrc_to_bytes(self, filename):
file = QFile(filename)
if not file.open(QIODevice.ReadOnly):
raise RuntimeError(file.errorString())
return
f = io.BytesIO(file.readAll().data())
return f
def enable_create(self):
if self.selected_file and self.selected_template:
self.ui.create_button.setEnabled(True)
def enable_token(self):
print(self.ui.oauth2_token.isEnabled())
if self.ui.oauth2_token.isEnabled():
self.ui.oauth2_token.setEnabled(False)
else:
self.ui.oauth2_token.setEnabled(True)
def file_selector(self):
self.filepath = QFileDialog.getOpenFileName(self, "Επιλογή Αρχείου")
if self.filepath[0]:
ext = os.path.splitext(self.filepath[0])[-1].lower()
if ext in [".xlsx", ".xls"]:
self.ui.log_output.appendPlainText("Επιλέχθηκε το αρχείο δεδομενων: {}".format(self.filepath[0]))
self.ui.label_3.setText("{}".format(self.filepath[0]))
self.selected_file = True
self.in_file = self.filepath[0]
self.file_path = os.path.dirname(self.filepath[0])
else:
self.ui.label_3.setText("Το αρχείο πρέπει να είναι της μορφής .xlsx ή .xls")
self.selected_file = False
self.enable_create()
def file_template(self):
self.filepath_template = QFileDialog.getOpenFileName(self, "Επιλογή Αρχείου")
if self.filepath_template[0]:
ext = os.path.splitext(self.filepath_template[0])[-1].lower()
if ext in [".docx", ".doc"]:
self.ui.log_output.appendPlainText("Επιλέχθηκε το προσχέδιο: {}".format(self.filepath_template[0]))
self.ui.label_4.setText("{}".format(self.filepath_template[0]))
self.selected_template = True
self.in_template = self.filepath_template[0]
self.template_path = os.path.dirname(self.filepath_template[0])
else:
self.ui.label_4.setText("Το αρχείο πρέπει να είναι της μορφής .docx ή .doc")
self.selected_template = False
self.enable_create()
def create_button(self):
df = pd.read_excel("{}".format(self.filepath[0]))
doc = Document("{}".format(self.filepath_template[0]))
self.create_certificates(df, doc)
def replace_text_styled(self, paragraph, key, value):
if key in paragraph.text:
inline = paragraph.runs
for i in range(len(inline)):
if key in inline[i].text:
text = inline[i].text.replace(key, value)
inline[i].text = text
def send_email(self, data_row, attachement):
endpoint = "https://graph.microsoft.com/v1.0/me/sendMail"
headers = {
"Authorization": "{}".format(self.ui.oauth2_token.toPlainText()),
"Content-Type": "application/json"
}
cert_file = open("./OUTPUT/{}".format(attachement), "rb")
data = cert_file.read()
email_data = {
"message": {
"subject": "ΠΙΣΤΟΠΟΙΗΤΙΚΟ ΠΑΡΑΚΟΛΟΥΘΗΣΗΣ ΣΕΜΙΝΑΡΙΟΥ: {}".format(data_row['ΘΕΜΑ ΣΕΜΙΝΑΡΙΟΥ']),
"body": {
"contentType": "Text",
"content": "Χαίρετε,\nΣτο παρόν email επισυνάπτεται το πιστοποιητικό παρακολούθησης του σεμιναρίου {} που παρακολουθήσατε στη δομή {} το μήνα {}".format(data_row['ΘΕΜΑ ΣΕΜΙΝΑΡΙΟΥ'], data_row['CAMPUS'], data_row['DATE'])
},
"toRecipients": [
{
"emailAddress": {
"address": "{}".format(data_row['EMAIL'])
}
}
],
"attachments": [
{
"@odata.type": "#microsoft.graph.fileAttachment",
"name": "{}".format(attachement),
"contentType": "application/pdf",
"contentBytes": base64.b64encode(data).decode('utf-8')
}
]
},
"saveToSentItems": "true"
}
response = requests.post(endpoint, headers=headers, json=email_data)
cert_file.close()
if response.status_code == 202:
self.ui.log_output.appendPlainText("Email στάλθηκε: {}".format(data_row['EMAIL']))
else:
self.ui.log_output.appendPlainText(f"Αποτυχία αποστολής. Status code: {response.status_code}, Error: {response.text}")
def create_certificates(self, in_df, in_doc):
if not os.path.exists("./OUTPUT"):
os.makedirs("./OUTPUT")
for index, row in in_df.iterrows():
if row['ΟΝΟΜΑΤΕΠΩΝΥΜΟ'] in ['EMPTY', None] or pd.isna(row['ΟΝΟΜΑΤΕΠΩΝΥΜΟ']):
student_name = "{} {} του {}".format(row['ΕΠΩΝΥΜΟ'],row['ΟΝΟΜΑ'], row['ΠΑΤΡΩΝΥΜΟ'])
else:
student_name = "{} {} του {}".format(row['ΟΝΟΜΑΤΕΠΩΝΥΜΟ'], row['ΠΑΤΡΩΝΥΜΟ'])
mock_data = {
'ΟΝΟΜΑΤΕΠΩΝΥΜΟ': student_name,
'ΘΕΜΑΕΜΙΝΑΡΙΟΥ': row['ΘΕΜΑ ΣΕΜΙΝΑΡΙΟΥ'],
'DATE': row['DATE'],
'CAMPUS': row['CAMPUS'],
'EMAIL': row['EMAIL']
}
for paragraph in in_doc.paragraphs:
for key in mock_data:
self.replace_text_styled(paragraph, key, mock_data[key])
if os.path.exists("./edit.docx"):
os.remove("./edit.docx")
in_doc.save('edit.docx')
output = convert(source="edit.docx", output_dir="./", soft=0)
fname = output.rsplit('/')[-1]
shutil.move("./{}".format(fname), "./OUTPUT/{}.pdf".format(student_name.replace(" ", "_")))
print("PDF created: {}.pdf".format(student_name.replace(" ", "_")))
if self.ui.enable_email.isChecked():
self.send_email(row, attachement="{}.pdf".format(student_name.replace(" ", "_")))
self.ui.label_4.setText(
"Τα αρχείο PDF δημιουργήθηκαν εντός του φακέλου OUTPUT."
)
self.ui.create_button.setEnabled(False)
if os.path.exists("./edit.docx"):
os.remove("./edit.docx")
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec())