From ead4ef48bbf7a4cd530fa460ab4fb92c8f0ae8e5 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Thu, 10 Oct 2024 09:51:16 +0100 Subject: [PATCH 01/17] Add GUI base --- .env.example | 33 ------- .gitignore | 7 +- README.md | 56 +++++------- {data => assets}/table.csv | 0 main.py | 167 ----------------------------------- pyproject.toml | 15 ++++ requirements.txt | 3 - src/app.py | 20 +++++ src/main.py | 24 +++++ src/pages/home.py | 42 +++++++++ src/pages/settings.py | 14 +++ src/resources/icons/logo.png | Bin 0 -> 4453 bytes src/utils/config.py | 0 src/utils/logging.py | 18 ++++ src/utils/notifications.py | 16 ++++ src/utils/path.py | 6 ++ src/window.py | 23 +++++ 17 files changed, 205 insertions(+), 239 deletions(-) delete mode 100644 .env.example rename {data => assets}/table.csv (100%) delete mode 100644 main.py create mode 100644 pyproject.toml delete mode 100644 requirements.txt create mode 100644 src/app.py create mode 100644 src/main.py create mode 100644 src/pages/home.py create mode 100644 src/pages/settings.py create mode 100644 src/resources/icons/logo.png create mode 100644 src/utils/config.py create mode 100644 src/utils/logging.py create mode 100644 src/utils/notifications.py create mode 100644 src/utils/path.py create mode 100644 src/window.py diff --git a/.env.example b/.env.example deleted file mode 100644 index 6eaff16..0000000 --- a/.env.example +++ /dev/null @@ -1,33 +0,0 @@ -# +------+ -# | | -# | SMTP | -# | | -# +------+ - -SMTP_HOST="smtp.gmail.com" -SMTP_PORT=587 - -# NOTES: -# - Depending on your provider, this may be either the prefix or the entire email address, e.g "person" vs "person@example.com" -# - Gmail currently takes the full email address for the SMTP username -SMTP_USERNAME="person@example.com" - -# NOTES: -# - If using gmail, an app password is required instead of your regular account password: https://support.google.com/accounts/answer/185833 -SMTP_PASSWORD="youRealyThinkWeWouldUseOurRealPasswordHere?" - -# +------+ -# | | -# | DATA | -# | | -# +------+ - -# NOTES: -# - Both plain text and HTML files are supported -# - If writing HTML, the use of https://mjml.io is recommended for complex emails -TEMPLATE_PATH="assets/template.txt" - -# NOTES: -# - Both XLSX and CSV files are supported -# - The first row will be skipped when reading the file because it is commonly used as a header, keep that in mind -TABLE_PATH="data/table.csv" diff --git a/.gitignore b/.gitignore index b9620f3..db16cbe 100644 --- a/.gitignore +++ b/.gitignore @@ -18,12 +18,11 @@ __pycache__/ *$py.class # Build -.Python build/ -develop-eggs/ dist/ output/ out/ +deployment/ downloads/ eggs/ .eggs/ @@ -37,12 +36,16 @@ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg +develop-eggs/ *.egg +.Python + MANIFEST # Logs pip-log.txt pip-delete-this-directory.txt +nuitka-crash-report.xml # Testing htmlcov/ diff --git a/README.md b/README.md index e64be4c..647a38b 100644 --- a/README.md +++ b/README.md @@ -4,58 +4,46 @@ E-neiler makes it easy to quickly send high amounts of emails with tabled data t ## Requirements 📋 -- Python 3.10.0+ +- Python 3.12.0+ ## Usage 🚀 -- Clone the repository: +- Download the app from [here](https://github.com/NEIAAC/e-neiler/releases/latest), under the `assets` section, click the `.exe` file. - ```shell - git clone https://github.com/NEIAAC/e-neiler.git - ``` +- Load template. -- Install the dependencies: +- Load table. - ```shell - pip install -r requirements.txt - ``` - -- Create a `.env` file based on the provided `.env.example` file, with attention to the notes on each variable. +- Start the process. - Edit the `template.txt` file in the `data` folder to contain the appropriate email content or even change it to a `.html` file. - Edit the `table.csv` file in the `data` folder, or add your own, with the appropriate recipient emails, placeholder replacements and file attatchment paths, depending on what is needed. -- Map placeholders and files to the values that will be read from the CSV in this section of the `main.py` file: - - ```python - #-------------CONFIGURATION-------------# - - message["To"] = row[0] +## Development 🛠️ - # Most clients will ignore this and set it as the sender address automatically - message["From"] = "NEIAAC" +- Clone the repository: - message["Subject"] = "Your NEIAAC example workshop certificate!" + ```shell + git clone https://github.com/NEIAAC/e-neiler.git + ``` - # CC and BCC are optional - message["Cc"] = prepare_copy([""]) - message ["Bcc"] = prepare_copy(["sample@example.com", "fake@example.com"]) +- Install the dependencies: - # Replace template placeholders with values from the CSV - body = message_template.substitute( - NAME=row[1] - ) + ```shell + pip install . + ``` - # Repeat appends to this list for multiple files or comment/remove them if no files are needed - file_paths: list[str] = [] - file_paths.append(row[2]) +- Start the app: - #---------------------------------------# + ```shell + pyside6-project run ``` -- Run the script: +### Notes 🗒️ - ```shell - python main.py +- When adding resources to the app always use the `resources` folder and add each file to the `index.qrc` file too. The `run` command will then use this `.qrc` file to generate the `rc_index.py` file, which exposes the resources to be used inside app like this: + + ```python + QIcon(QPixmap(":/icons/logo.png")) ``` diff --git a/data/table.csv b/assets/table.csv similarity index 100% rename from data/table.csv rename to assets/table.csv diff --git a/main.py b/main.py deleted file mode 100644 index 2b7f68a..0000000 --- a/main.py +++ /dev/null @@ -1,167 +0,0 @@ -import os -import logging -import smtplib -import dotenv -import mimetypes -import pandas as pd -import html2text -from string import Template -from email.message import EmailMessage - -def get_env(var_name: str) -> str: - value = os.getenv(var_name) - if not value: - logging.critical(f"Environment variable for {var_name} is not set") - exit(1) - return value - -def read_template(template_path: str) -> Template: - with open(template_path, "r", encoding="utf-8") as template_file: - content = template_file.read() - return Template(content) - -def read_table(table_path: str) -> list[list[str]]: - if table_path.endswith(".csv"): - table = pd.read_csv(table_path, index_col=False) - elif table_path.endswith(".xlsx"): - table = pd.read_excel(table_path, index_col=False) - else: - logging.critical("Table data file type extension not supported") - exit(1) - return table.values.tolist() - -def prepare_copy(emails: list[str]) -> list[str]: - # Different clients may use different delimiters, change ", " to other delimiters if needed - return ", ".join(emails) - -def strip_html(content: str) -> str: - content = html2text.html2text(content) - return content - -def read_attachment(file_path: str) -> tuple[bytes, str, str]: - mime_type, _ = mimetypes.guess_type(file_path) - - if mime_type is None: - mime_type = "application/octet-stream" - main_type, sub_type = mime_type.split("/") - - with open(file_path, "rb") as file: - content = file.read() - - return content, main_type, sub_type - - -def main(): - logging.basicConfig( - format="%(asctime)s [%(levelname)s] %(message)s", - level=logging.DEBUG, - datefmt="%Y-%m-%d %H:%M:%S", - handlers=[ - logging.FileHandler("e-neiler.log"), - logging.StreamHandler(), - ], - ) - - logging.info("Process started") - - # Load environment variables - dotenv.load_dotenv(dotenv.find_dotenv()) - - smtp_host = get_env("SMTP_HOST") - smtp_port = get_env("SMTP_PORT") - smtp_username = get_env("SMTP_USERNAME") - smtp_password = get_env("SMTP_PASSWORD") - template_path = get_env("TEMPLATE_PATH") - table_path = get_env("TABLE_PATH") - - logging.info("Environment variables loaded") - logging.info(f"Logging in as {smtp_username} on {smtp_host}:{smtp_port}") - - server = smtplib.SMTP(host=smtp_host, port=smtp_port) - - try: - # Attemp to use TLS encryption with the server (remove if causing issues) - server.starttls() - server.login(smtp_username, smtp_password) - logging.info("Successfully logged in") - except Exception as e: - logging.critical(f"Failed to login: {e}") - exit(1) - - try: - template = read_template(template_path) - logging.info("Body template loaded") - except Exception as e: - logging.critical(f"Failed to load body template: {e}") - exit(1) - - try: - table = read_table(table_path) - logging.info(f"Table loaded, found {len(table)} {len(table) == 1 and 'row' or 'rows'}") - except Exception as e: - logging.critical(f"Failed to load table: {e}") - exit(1) - - total: int = 0 - successful: int = 0 - for row in table: - total += 1 - - message = EmailMessage() - - #----------------------------CONFIGURATION----------------------------# - - message["To"] = row[0] - - # Most clients will ignore this and set it as the sender address automatically - message["From"] = "NEIAAC" - - message["Subject"] = "Your NEIAAC example workshop certificate!" - - # CC and BCC are optional - message["Cc"] = prepare_copy([""]) - message ["Bcc"] = prepare_copy(["sample@example.com", "fake@example.com"]) - - # Replace template placeholders with values from the table - body = template.substitute( - NAME=row[1] - ) - - # Repeat appends to this list for multiple files or comment/remove them if no files are needed - file_paths: list[str] = [] - file_paths.append(row[2]) - - #---------------------------------------------------------------------# - - # Add alternative plain text version when using html, for backwards compatibility - if (template_path.endswith(".html")): - message.set_content(strip_html(body)) - message.add_alternative(body, subtype="html") - else: - message.set_content(body) - - # Skipped if file list is empty - try: - for file_path in file_paths: - file, main_type, sub_type = read_attachment(file_path) - message.add_attachment(file, maintype=main_type, subtype=sub_type, filename=os.path.basename(file_path)) - except Exception as e: - logging.error(f"[{total}] Failed to attach file in email to {row[0]}: {e}") - continue - - try: - server.send_message(message) - successful += 1 - logging.info(f"[{total}] Sent email to {row[0]}") - except Exception as e: - logging.error(f"[{total}] Failed to send email to {row[0]}: {e}") - - logging.info(f"Successfully sent {successful} out of {total} emails") - - logging.info("Logging out") - server.quit() - - logging.info("Process finished") - -if __name__ == "__main__": - main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..62dc8f8 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +[project] + +name = "e-neiler" +version = "0.1.0" +description = "Fully customizable SMTP e-mailer script." +dependencies = [ + "pyside6==6.7.3", + "pyside6-fluent-widgets==1.6.6", + "pandas===2.2.2", + "html2text==2024.2.26", +] + +[project.optional-dependencies] + +compiler = ["nuitka==2.4.8"] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 3d3e712..0000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -python-dotenv==1.0.1 -pandas===2.2.2 -html2text==2024.2.26 diff --git a/src/app.py b/src/app.py new file mode 100644 index 0000000..4fdf761 --- /dev/null +++ b/src/app.py @@ -0,0 +1,20 @@ +from PySide6.QtWidgets import QApplication +from PySide6.QtCore import Qt +from PySide6.QtGui import QIcon, QPixmap + +from utils import path + +LOGO_PATH = "resources/icons/logo.png" + +THEME_KEY = "app/style" +LOCALE_KEY = "app/locale" + +class App(QApplication): + def __init__(self, argv: list[str]): + super().__init__(argv) + + self.setApplicationName("E-neiler") + self.setOrganizationName("NEIAAC") + self.setOrganizationDomain("neiaac.com") + self.setWindowIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) + self.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..2a49443 --- /dev/null +++ b/src/main.py @@ -0,0 +1,24 @@ +# General options: +# nuitka-project: --standalone +# nuitka-project: --enable-plugin=pyside6 +# nuitka-project: --include-data-files={MAIN_DIRECTORY}/resources +# Compilation mode, standalone everywhere, except on macOS there app bundle: +# nuitka-project-if: {OS} == "Darwin": +# nuitka-project: --macos-create-app-bundle + +import sys + +from app import App + +from utils.logging import suppressor + +with suppressor(): + from window import Window + +if __name__ == "__main__": + app = App(sys.argv) + + window = Window() + window.show() + + sys.exit(app.exec()) diff --git a/src/pages/home.py b/src/pages/home.py new file mode 100644 index 0000000..b24e006 --- /dev/null +++ b/src/pages/home.py @@ -0,0 +1,42 @@ +from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QFileDialog, QSizePolicy + +from qfluentwidgets import LineEdit, PasswordLineEdit, FlowLayout, TextBrowser, PushButton + +class HomePage(QWidget): + def __init__(self): + super().__init__() + self.setObjectName("Home") + layout = QVBoxLayout() + ## add two inputs for smtp username and password + + smtpHostInput = LineEdit() + hostLabel = QLabel("SMTP Host:") + + smtpPasswordInput = PasswordLineEdit() + passwordLabel = QLabel("SMTP Password:") + + bodyFileDialog = QFileDialog() + bodyFileDialog.setFileMode(QFileDialog.FileMode.ExistingFile) + + emailBodyInput = TextBrowser() + + selectBodyButton = PushButton("Select Email Body") + selectBodyButton.clicked.connect(lambda: self.loadEmailBody(emailBodyInput, bodyFileDialog.getOpenFileName()[0])) + + layout.addWidget(hostLabel) + layout.addWidget(smtpHostInput) + layout.addWidget(passwordLabel) + layout.addWidget(smtpPasswordInput) + layout.addWidget(selectBodyButton) + layout.addWidget(emailBodyInput) + + self.setLayout(layout) + + def loadEmailBody(self, emailBodyInput, filePath): + if filePath: + with open(filePath, 'r', encoding='utf-8') as file: + fileContent = file.read() + if filePath.endswith('.html'): + emailBodyInput.setHtml(fileContent) + else: + emailBodyInput.setText(fileContent) diff --git a/src/pages/settings.py b/src/pages/settings.py new file mode 100644 index 0000000..3f0e997 --- /dev/null +++ b/src/pages/settings.py @@ -0,0 +1,14 @@ +from PySide6.QtWidgets import QWidget, QVBoxLayout +from qfluentwidgets import ComboBox + +class SettingsPage(QWidget): + def __init__(self): + super().__init__() + self.setObjectName("Settings") + comboBox = ComboBox() + # comboBox.addItems(SUPPORTED_THEMES) + # comboBox.setCurrentIndex(SUPPORTED_THEMES.index(App.getTheme())) + # comboBox.activated.connect(lambda: App.setTheme(comboBox.currentText())) + layout = QVBoxLayout() + layout.addWidget(comboBox) + self.setLayout(layout) diff --git a/src/resources/icons/logo.png b/src/resources/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f69241298db78265173e73bbed4512c9a8f49e9f GIT binary patch literal 4453 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 literal 0 HcmV?d00001 diff --git a/src/utils/config.py b/src/utils/config.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/logging.py b/src/utils/logging.py new file mode 100644 index 0000000..e777ea5 --- /dev/null +++ b/src/utils/logging.py @@ -0,0 +1,18 @@ +from contextlib import contextmanager +import sys, os + +@contextmanager +def suppressor(): + """ + Suppresses console output in guard statements.\n + Example:\n + with suppressStdout(): + print("Hello, World!") + """ + with open(os.devnull, "w") as devnull: + old_stdout = sys.stdout + sys.stdout = devnull + try: + yield + finally: + sys.stdout = old_stdout diff --git a/src/utils/notifications.py b/src/utils/notifications.py new file mode 100644 index 0000000..6090645 --- /dev/null +++ b/src/utils/notifications.py @@ -0,0 +1,16 @@ +from PySide6.QtWidgets import QSystemTrayIcon +from PySide6.QtGui import QIcon, QPixmap + +from app import LOGO_PATH + +class Notifications(QSystemTrayIcon): + def __init__(self): + super().__init__() + + self.setIcon(QIcon(QPixmap(LOGO_PATH))) + + def send(self, title, body): + """Allows sending tray messages with an hidden tray icon.""" + self.setVisible(True) + self.showMessage(title, body) + self.setVisible(False) diff --git a/src/utils/path.py b/src/utils/path.py new file mode 100644 index 0000000..0c36c22 --- /dev/null +++ b/src/utils/path.py @@ -0,0 +1,6 @@ +import os + +def fromBase(suffix: str) -> str: + current = os.path.dirname(os.path.realpath(__file__)) + root = os.path.abspath(os.path.join(current, "..", suffix)) + return root diff --git a/src/window.py b/src/window.py new file mode 100644 index 0000000..63df2d9 --- /dev/null +++ b/src/window.py @@ -0,0 +1,23 @@ +from PySide6.QtCore import QSettings +from qfluentwidgets import FluentWindow, FluentIcon + +from app import App + +from pages.home import HomePage +from pages.settings import SettingsPage + +GEOMETRY_KEY = "window/geometry" + +class Window(FluentWindow): + def __init__(self): + super().__init__() + + self.restoreGeometry(QSettings().value(GEOMETRY_KEY)) + + self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") + self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings") + + def closeEvent(self, event): + """Saves the current window geometry before closing.""" + QSettings().setValue(GEOMETRY_KEY, self.saveGeometry()) + event.accept() From ffcd271faa0e9b055b13401381de4f159338262d Mon Sep 17 00:00:00 2001 From: dy0gu Date: Fri, 11 Oct 2024 02:05:36 +0100 Subject: [PATCH 02/17] Improve logger --- pyproject.toml | 4 ++-- src/app.py | 32 +++++++++++++++++++++++++ src/main.py | 5 +--- src/utils/logger.py | 57 ++++++++++++++++++++++++++++++++++++++++++++ src/utils/logging.py | 18 -------------- src/version.py | 1 + src/window.py | 16 +++++++++---- 7 files changed, 104 insertions(+), 29 deletions(-) create mode 100644 src/utils/logger.py delete mode 100644 src/utils/logging.py create mode 100644 src/version.py diff --git a/pyproject.toml b/pyproject.toml index 62dc8f8..dca2985 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,8 @@ [project] name = "e-neiler" -version = "0.1.0" -description = "Fully customizable SMTP e-mailer script." +version = "2.1.1" +description = "Fully customizable SMTP e-mailer desktop app." dependencies = [ "pyside6==6.7.3", "pyside6-fluent-widgets==1.6.6", diff --git a/src/app.py b/src/app.py index 4fdf761..c336d74 100644 --- a/src/app.py +++ b/src/app.py @@ -2,7 +2,11 @@ from PySide6.QtCore import Qt from PySide6.QtGui import QIcon, QPixmap +import logging + +from version import __version__ from utils import path +from utils import logger LOGO_PATH = "resources/icons/logo.png" @@ -16,5 +20,33 @@ def __init__(self, argv: list[str]): self.setApplicationName("E-neiler") self.setOrganizationName("NEIAAC") self.setOrganizationDomain("neiaac.com") + self.setApplicationVersion(__version__) + self.setLogger(logger.setup) self.setWindowIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) self.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) + + def setLogger(self, setup: callable): + """ + Calls a setup function that is expected to configure the root logger. + The root logger is then used to log information about the application at startup. + """ + setup() + + # Add any other information you want to log as an item in the list + data = [ + self.applicationName(), + "", + self.applicationVersion(), + ] + + length = max(len(value) for value in data) + padding = 2 + row = f"+{'-' * (length + padding * 2)}+" + column = f"|{' ' * (length + padding * 2)}|" + + logging.info(row) + logging.info(column) + for line in data: + logging.info(f"|{' ' * padding}{line}{' ' * (length - len(line) + padding)}|") + logging.info(column) + logging.info(row) diff --git a/src/main.py b/src/main.py index 2a49443..0e668dc 100644 --- a/src/main.py +++ b/src/main.py @@ -7,11 +7,8 @@ # nuitka-project: --macos-create-app-bundle import sys - from app import App - -from utils.logging import suppressor - +from utils.logger import suppressor with suppressor(): from window import Window diff --git a/src/utils/logger.py b/src/utils/logger.py new file mode 100644 index 0000000..5da3cf2 --- /dev/null +++ b/src/utils/logger.py @@ -0,0 +1,57 @@ +import datetime +import sys, os, logging, logging.handlers +import traceback +from contextlib import contextmanager +from PySide6.QtCore import QStandardPaths + +class Formatter(logging.Formatter): + def formatTime(self, record, datefmt=None): + timestamp = datetime.datetime.fromtimestamp(record.created, datetime.timezone.utc) + return timestamp.strftime(datefmt) if datefmt else timestamp.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" + +def setup(): + """ + Sets up the root logger to the respective QT platform-specific folder, based on the organization and app name.\n + Development: logs to stdout and file.\n + Compiled: logs only to file.\n + """ + + path = os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppDataLocation), "logs") + + if not os.path.exists(path): + os.makedirs(path) + + syntax = "[%(asctime)s] [%(levelname)s] %(message)s" + + formatter = Formatter(syntax) + + def filename(): return "{:%Y-%m-%d}.log".format(datetime.datetime.now(tz=datetime.timezone.utc).date()) + file = logging.handlers.TimedRotatingFileHandler(os.path.join(path, filename()), backupCount=30, when="midnight", utc=True) + file.namer = lambda _: filename() + file.setFormatter(formatter) + + dev = "__compiled__" not in globals() + + logger = logging.getLogger() + logger.setLevel(logging.DEBUG if dev else logging.INFO) + logger.addHandler(file) + + if dev: + console = logging.StreamHandler() + console.setFormatter(formatter) + logger.addHandler(console) + + sys.excepthook = lambda exctype, value, tb: logging.error("".join(traceback.format_exception(exctype, value, tb))) + +@contextmanager +def suppressor(): + """ + Suppresses stdout output when used as a context manager. + """ + with open(os.devnull, "w") as devnull: + old = sys.stdout + sys.stdout = devnull + try: + yield + finally: + sys.stdout = old diff --git a/src/utils/logging.py b/src/utils/logging.py deleted file mode 100644 index e777ea5..0000000 --- a/src/utils/logging.py +++ /dev/null @@ -1,18 +0,0 @@ -from contextlib import contextmanager -import sys, os - -@contextmanager -def suppressor(): - """ - Suppresses console output in guard statements.\n - Example:\n - with suppressStdout(): - print("Hello, World!") - """ - with open(os.devnull, "w") as devnull: - old_stdout = sys.stdout - sys.stdout = devnull - try: - yield - finally: - sys.stdout = old_stdout diff --git a/src/version.py b/src/version.py new file mode 100644 index 0000000..58039f5 --- /dev/null +++ b/src/version.py @@ -0,0 +1 @@ +__version__ = "2.1.1" diff --git a/src/window.py b/src/window.py index 63df2d9..f7e38a6 100644 --- a/src/window.py +++ b/src/window.py @@ -1,23 +1,29 @@ from PySide6.QtCore import QSettings -from qfluentwidgets import FluentWindow, FluentIcon -from app import App +from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition from pages.home import HomePage from pages.settings import SettingsPage GEOMETRY_KEY = "window/geometry" +STATE_KEY = "window/maximized" class Window(FluentWindow): def __init__(self): super().__init__() - self.restoreGeometry(QSettings().value(GEOMETRY_KEY)) - self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") - self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings") + self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", position=NavigationItemPosition.BOTTOM) + + self.restoreGeometry(QSettings().value(GEOMETRY_KEY)) + if (QSettings().value(STATE_KEY)): + self.showMaximized() def closeEvent(self, event): """Saves the current window geometry before closing.""" QSettings().setValue(GEOMETRY_KEY, self.saveGeometry()) + if self.isMaximized(): + QSettings().setValue(STATE_KEY, True) + else: + QSettings().setValue(STATE_KEY, None) event.accept() From fac68dd69e6fd5312455ae7c063c96e3243259ae Mon Sep 17 00:00:00 2001 From: dy0gu Date: Fri, 11 Oct 2024 21:56:46 +0100 Subject: [PATCH 03/17] Add temporary store --- config/config.json | 6 ++++++ src/app.py | 26 ++++++++++++++++++-------- src/main.py | 5 ++--- src/pages/home.py | 6 ++---- src/pages/settings.py | 22 +++++++++++++++++----- src/resources/sounds/error.wav | Bin 0 -> 578942 bytes src/resources/sounds/success.wav | Bin 0 -> 631566 bytes src/utils/config.py | 23 +++++++++++++++++++++++ src/utils/logger.py | 1 + 9 files changed, 69 insertions(+), 20 deletions(-) create mode 100644 config/config.json create mode 100644 src/resources/sounds/error.wav create mode 100644 src/resources/sounds/success.wav diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..3523cbf --- /dev/null +++ b/config/config.json @@ -0,0 +1,6 @@ +{ + "QFluentWidgets": { + "ThemeColor": "#ff009faa", + "ThemeMode": "Light" + } +} \ No newline at end of file diff --git a/src/app.py b/src/app.py index c336d74..790c8c8 100644 --- a/src/app.py +++ b/src/app.py @@ -1,18 +1,19 @@ +import logging +import os + from PySide6.QtWidgets import QApplication -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, QStandardPaths from PySide6.QtGui import QIcon, QPixmap -import logging +from utils.logger import suppressor +with suppressor(): + from qfluentwidgets import QConfig, qconfig from version import __version__ -from utils import path -from utils import logger +from utils import path, logger, config LOGO_PATH = "resources/icons/logo.png" -THEME_KEY = "app/style" -LOCALE_KEY = "app/locale" - class App(QApplication): def __init__(self, argv: list[str]): super().__init__(argv) @@ -22,6 +23,7 @@ def __init__(self, argv: list[str]): self.setOrganizationDomain("neiaac.com") self.setApplicationVersion(__version__) self.setLogger(logger.setup) + self.setConfig(config.customizable) self.setWindowIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) self.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) @@ -32,7 +34,6 @@ def setLogger(self, setup: callable): """ setup() - # Add any other information you want to log as an item in the list data = [ self.applicationName(), "", @@ -50,3 +51,12 @@ def setLogger(self, setup: callable): logging.info(f"|{' ' * padding}{line}{' ' * (length - len(line) + padding)}|") logging.info(column) logging.info(row) + + def setConfig(self, config: QConfig): + file = os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppDataLocation), "config.json") + if os.path.exists(file): + logging.info(f"Config file found") + else: + logging.info(f"Config file not found, using defaults") + qconfig.load(file, config) + logging.info(f"Config initialized") diff --git a/src/main.py b/src/main.py index 0e668dc..a1753ac 100644 --- a/src/main.py +++ b/src/main.py @@ -7,10 +7,9 @@ # nuitka-project: --macos-create-app-bundle import sys + from app import App -from utils.logger import suppressor -with suppressor(): - from window import Window +from window import Window if __name__ == "__main__": app = App(sys.argv) diff --git a/src/pages/home.py b/src/pages/home.py index b24e006..5bd4ce5 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -1,13 +1,11 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QFileDialog, QSizePolicy - -from qfluentwidgets import LineEdit, PasswordLineEdit, FlowLayout, TextBrowser, PushButton +from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QFileDialog +from qfluentwidgets import LineEdit, PasswordLineEdit, TextBrowser, PushButton class HomePage(QWidget): def __init__(self): super().__init__() self.setObjectName("Home") layout = QVBoxLayout() - ## add two inputs for smtp username and password smtpHostInput = LineEdit() hostLabel = QLabel("SMTP Host:") diff --git a/src/pages/settings.py b/src/pages/settings.py index 3f0e997..e413b49 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -1,14 +1,26 @@ from PySide6.QtWidgets import QWidget, QVBoxLayout -from qfluentwidgets import ComboBox +from qfluentwidgets import ComboBoxSettingCard, FluentIcon, Theme + +from utils.config import customizable class SettingsPage(QWidget): def __init__(self): super().__init__() self.setObjectName("Settings") - comboBox = ComboBox() - # comboBox.addItems(SUPPORTED_THEMES) - # comboBox.setCurrentIndex(SUPPORTED_THEMES.index(App.getTheme())) - # comboBox.activated.connect(lambda: App.setTheme(comboBox.currentText())) + + comboBox = ComboBoxSettingCard( + customizable.themeMode, + FluentIcon.BRUSH, + "Theme", + "Change the appearance of the app.", + texts=[ + "Light", + "Dark", + "System" + ] + ) + layout = QVBoxLayout() layout.addWidget(comboBox) + self.setLayout(layout) diff --git a/src/resources/sounds/error.wav b/src/resources/sounds/error.wav new file mode 100644 index 0000000000000000000000000000000000000000..bab727e8ce1f6dee10a73ce0ed61489ba7a546ca GIT binary patch literal 578942 zcmeFa2Urwm*Eha>mtL2)yRdYmt034AdoNL=CK`K5jEOO^#Ta`@G?o}^?1?6pXzUFO zDhPri3QF(0EOpu5%m3UAlU)$=$KbgXe#?lxj44LQv%cEv3pWh=k zx_flj*jN&2?yRM=V&N#nKY{^*0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fK@5*BFqPNhBP|H+&gsd>vc*r~j3honcpJIFdzMFQd=?9+oq`y(c=-KSO(8I{IZf zNBgC>&-nMYzH9%^zV+YQEiq&AF3l1w?G2R z*63(4iit(gT1RyB2|GKofJDk|2Z=csd_chcz$0ND)sBo{+`nxXA1tvjjmN>VrQA8l9fKvO@EmF|OCh7gtss%a;1fc5E1W@h1Rp-fU;>T95qL)M1@;l5 z{{o4W1ku4DF(*OPl7QPW0Hl+^ZXD6DjKdd}9pQ5X6EKf}Y%Fg>4%mlq|1UVhG6LTU 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

XmUv0L)P0Hj7szTmO6 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 zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ n12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbAOrs&=!F1P literal 0 HcmV?d00001 diff --git a/src/resources/sounds/success.wav b/src/resources/sounds/success.wav new file mode 100644 index 0000000000000000000000000000000000000000..5a175de4f291ee62505d4cc10c8cabf1868dc77c GIT binary patch literal 631566 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%0AH`U4ns`h7Wv&u`$-jI_un(ebe=M-e&l1F9 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 z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz d5-5QZD1j0vff6Wz5-5QZD1j0vfe(Yg{{dq3);0hD literal 0 HcmV?d00001 diff --git a/src/utils/config.py b/src/utils/config.py index e69de29..990ee40 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -0,0 +1,23 @@ +import logging + +from PySide6.QtCore import QLocale +from qfluentwidgets import QConfig, EnumSerializer, OptionsConfigItem, OptionsValidator, ColorValidator, ColorSerializer +import qfluentwidgets + +class Options(QConfig): + """Global object for app options.""" + + country = OptionsConfigItem("App", "locale", QLocale.Country.UnitedStates, + OptionsValidator(QLocale.Country), EnumSerializer(QLocale.Country), restart=True) + + language = OptionsConfigItem("App", "language", QLocale.Language.English, + OptionsValidator(QLocale.Language), EnumSerializer(QLocale.Language), restart=True) + themeMode = OptionsConfigItem("window", "theme", qfluentwidgets.Theme.DARK, + OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme), restart=True) + themeColor = OptionsConfigItem("window", "themeColor", "#2BA9ED", + ColorValidator(qfluentwidgets.QColor()), ColorSerializer(), restart=True) +customizable = Options() +customizable.themeMode.valueChanged.connect(lambda theme: (qfluentwidgets.setTheme(theme, save=False), + logging.info(f"Theme mode set to {theme.value}"))) +customizable.themeColor.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color, save=False), + logging.info(f"Theme color set to {color}"))) diff --git a/src/utils/logger.py b/src/utils/logger.py index 5da3cf2..0fedaff 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -2,6 +2,7 @@ import sys, os, logging, logging.handlers import traceback from contextlib import contextmanager + from PySide6.QtCore import QStandardPaths class Formatter(logging.Formatter): From 9227eaef7e64d6f5835c79b924f88d255e9d6335 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Sat, 12 Oct 2024 02:10:52 +0100 Subject: [PATCH 04/17] Fix logger --- src/main.py | 2 + src/pages/home.py | 110 ++++++++++++++++++++++++++++++++---------- src/pages/settings.py | 12 +++-- src/utils/config.py | 12 ++--- src/utils/logger.py | 30 +++++++----- src/window.py | 8 ++- 6 files changed, 127 insertions(+), 47 deletions(-) diff --git a/src/main.py b/src/main.py index a1753ac..7b71a96 100644 --- a/src/main.py +++ b/src/main.py @@ -6,7 +6,9 @@ # nuitka-project-if: {OS} == "Darwin": # nuitka-project: --macos-create-app-bundle +import logging import sys +import time from app import App from window import Window diff --git a/src/pages/home.py b/src/pages/home.py index 5bd4ce5..d4a8ab7 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -1,40 +1,100 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QFileDialog -from qfluentwidgets import LineEdit, PasswordLineEdit, TextBrowser, PushButton +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFileDialog +from PySide6.QtCore import Qt +from qfluentwidgets import LineEdit, PasswordLineEdit, TextBrowser, PrimaryToolButton, FluentIcon + +DEFAULT_TEXT = "Use the button on the left to load a template of the email body!" class HomePage(QWidget): def __init__(self): super().__init__() self.setObjectName("Home") - layout = QVBoxLayout() + # SMTP host input smtpHostInput = LineEdit() - hostLabel = QLabel("SMTP Host:") + smtpHostInput.setMaximumWidth(500) + hostLabel = QLabel("SMTP HOST") + + smtpHostInputLayout = QVBoxLayout() + smtpHostInputLayout.setSpacing(10) + smtpHostInputLayout.addWidget(hostLabel) + smtpHostInputLayout.addWidget(smtpHostInput) + # SMTP password input smtpPasswordInput = PasswordLineEdit() - passwordLabel = QLabel("SMTP Password:") + smtpPasswordInput.setMaximumWidth(500) + passwordLabel = QLabel("SMTP PASSWORD") + + smtpPasswordInputLayout = QVBoxLayout() + smtpPasswordInputLayout.setSpacing(10) + smtpPasswordInputLayout.addWidget(passwordLabel) + smtpPasswordInputLayout.addWidget(smtpPasswordInput) + + # Create a new VBox for the SMTP input fields + smtpInputLayout = QVBoxLayout() + smtpInputLayout.setSpacing(20) + smtpInputLayout.addLayout(smtpHostInputLayout) + smtpInputLayout.addLayout(smtpPasswordInputLayout) + # Body file dialog bodyFileDialog = QFileDialog() bodyFileDialog.setFileMode(QFileDialog.FileMode.ExistingFile) + # Email body input (TextBrowser) emailBodyInput = TextBrowser() + emailBodyInput.setReadOnly(True) + emailBodyInput.setPlaceholderText(DEFAULT_TEXT) + + clearBodyButton = PrimaryToolButton(FluentIcon.DELETE) + clearBodyButton.setDisabled(True) + clearBodyButton.clicked.connect(lambda: (emailBodyInput.clear(), clearBodyButton.setDisabled(True))) + + def loadEmailBody(emailBodyInput, filePath): + if filePath: + with open(filePath, 'r', encoding='utf-8') as file: + fileContent = file.read() + if filePath.endswith('.html'): + emailBodyInput.setHtml(fileContent) + else: + emailBodyInput.setText(fileContent) + clearBodyButton.setDisabled(False) + + selectBodyButton = PrimaryToolButton(FluentIcon.FOLDER) + selectBodyButton.clicked.connect(lambda: loadEmailBody(emailBodyInput, bodyFileDialog.getOpenFileName()[0])) + + # Create horizontal layout for buttons and email body + emailReaderLayout = QHBoxLayout() + emailReaderLayout.setSpacing(10) + buttonLayout = QVBoxLayout() + buttonLayout.setSpacing(10) + + # Add buttons to buttonLayout + buttonLayout.addWidget(selectBodyButton) + buttonLayout.addWidget(clearBodyButton) + + # Align the buttons to the top of the buttonLayout + buttonLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + + # Add button layout (left) and emailBodyInput (right) to bodyLayout + emailReaderLayout.addLayout(buttonLayout) + emailReaderLayout.addWidget(emailBodyInput) + + # submit button + startButton = PrimaryToolButton(FluentIcon.PLAY) + startButton.setFixedWidth(100) + + startButtonLayout = QHBoxLayout() + startButtonLayout.setAlignment(Qt.AlignmentFlag.AlignRight) + startButtonLayout.addWidget(startButton) + + # Main layout for the entire page + mainLayout = QVBoxLayout() + mainLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + mainLayout.setContentsMargins(40, 40, 40, 40) + mainLayout.setSpacing(40) + + mainLayout.addLayout(smtpInputLayout) + mainLayout.addLayout(emailReaderLayout) # Add the horizontal layout for buttons and text + mainLayout.addLayout(startButtonLayout) - selectBodyButton = PushButton("Select Email Body") - selectBodyButton.clicked.connect(lambda: self.loadEmailBody(emailBodyInput, bodyFileDialog.getOpenFileName()[0])) - - layout.addWidget(hostLabel) - layout.addWidget(smtpHostInput) - layout.addWidget(passwordLabel) - layout.addWidget(smtpPasswordInput) - layout.addWidget(selectBodyButton) - layout.addWidget(emailBodyInput) - - self.setLayout(layout) - - def loadEmailBody(self, emailBodyInput, filePath): - if filePath: - with open(filePath, 'r', encoding='utf-8') as file: - fileContent = file.read() - if filePath.endswith('.html'): - emailBodyInput.setHtml(fileContent) - else: - emailBodyInput.setText(fileContent) + # Set the main layout + self.setLayout(mainLayout) diff --git a/src/pages/settings.py b/src/pages/settings.py index e413b49..55b021e 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -1,4 +1,5 @@ from PySide6.QtWidgets import QWidget, QVBoxLayout +from PySide6.QtCore import Qt from qfluentwidgets import ComboBoxSettingCard, FluentIcon, Theme from utils.config import customizable @@ -19,8 +20,13 @@ def __init__(self): "System" ] ) + comboBox.setMaximumWidth(500) - layout = QVBoxLayout() - layout.addWidget(comboBox) + mainLayout = QVBoxLayout() + mainLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + mainLayout.setContentsMargins(40, 40, 40, 40) + mainLayout.setSpacing(40) - self.setLayout(layout) + mainLayout.addWidget(comboBox) + + self.setLayout(mainLayout) diff --git a/src/utils/config.py b/src/utils/config.py index 990ee40..d42f189 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -12,12 +12,12 @@ class Options(QConfig): language = OptionsConfigItem("App", "language", QLocale.Language.English, OptionsValidator(QLocale.Language), EnumSerializer(QLocale.Language), restart=True) - themeMode = OptionsConfigItem("window", "theme", qfluentwidgets.Theme.DARK, - OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme), restart=True) - themeColor = OptionsConfigItem("window", "themeColor", "#2BA9ED", - ColorValidator(qfluentwidgets.QColor()), ColorSerializer(), restart=True) + themeMode = OptionsConfigItem("Window", "theme", qfluentwidgets.Theme.DARK, + OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme)) + themeColor = OptionsConfigItem("Window", "themeColor", "#2BA9ED", + ColorValidator(qfluentwidgets.QColor()), ColorSerializer()) customizable = Options() -customizable.themeMode.valueChanged.connect(lambda theme: (qfluentwidgets.setTheme(theme, save=False), +customizable.themeMode.valueChanged.connect(lambda theme: (qfluentwidgets.setTheme(theme), logging.info(f"Theme mode set to {theme.value}"))) -customizable.themeColor.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color, save=False), +customizable.themeColor.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color), logging.info(f"Theme color set to {color}"))) diff --git a/src/utils/logger.py b/src/utils/logger.py index 0fedaff..542fa4f 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -26,21 +26,29 @@ def setup(): formatter = Formatter(syntax) - def filename(): return "{:%Y-%m-%d}.log".format(datetime.datetime.now(tz=datetime.timezone.utc).date()) - file = logging.handlers.TimedRotatingFileHandler(os.path.join(path, filename()), backupCount=30, when="midnight", utc=True) - file.namer = lambda _: filename() + def namer(name: str): + dir, file = os.path.split(name) + _, timestamp = file.rsplit(".", 1) + return os.path.join(dir, f"{timestamp}.log") + + file = logging.handlers.TimedRotatingFileHandler( + os.path.join(path, "{:%Y-%m-%d}.log".format(datetime.datetime.now(tz=datetime.timezone.utc).date())), + backupCount=30, + when="midnight", + delay=True, + utc=True) file.setFormatter(formatter) + file.namer = namer - dev = "__compiled__" not in globals() + console = logging.StreamHandler() + console.setFormatter(formatter) - logger = logging.getLogger() - logger.setLevel(logging.DEBUG if dev else logging.INFO) - logger.addHandler(file) + dev = "__compiled__" not in globals() - if dev: - console = logging.StreamHandler() - console.setFormatter(formatter) - logger.addHandler(console) + logging.basicConfig( + level=logging.DEBUG if dev else logging.INFO, + handlers=[console, file] if dev else [file], + format=syntax) sys.excepthook = lambda exctype, value, tb: logging.error("".join(traceback.format_exception(exctype, value, tb))) diff --git a/src/window.py b/src/window.py index f7e38a6..a40b530 100644 --- a/src/window.py +++ b/src/window.py @@ -14,11 +14,15 @@ def __init__(self): self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", position=NavigationItemPosition.BOTTOM) - - self.restoreGeometry(QSettings().value(GEOMETRY_KEY)) + if (QSettings().value(GEOMETRY_KEY)): + self.restoreGeometry(QSettings().value(GEOMETRY_KEY)) + else: + self.resize(500, 500) if (QSettings().value(STATE_KEY)): self.showMaximized() + self.setMicaEffectEnabled(False) + def closeEvent(self, event): """Saves the current window geometry before closing.""" QSettings().setValue(GEOMETRY_KEY, self.saveGeometry()) From 362e0a99ae00afc75b7c8fc811992c45adfda635 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Sun, 13 Oct 2024 17:56:17 +0100 Subject: [PATCH 05/17] theme working but does not respect default values in no config exists and saves 2 redundant keys for theme --- config/config.json | 6 ---- pyproject.toml | 1 + src/app.py | 49 +++++++++------------------- src/main.py | 12 +++---- src/pages/settings.py | 43 +++++++++++++++++++------ src/utils/config.py | 61 +++++++++++++++++++++++++---------- src/utils/logger.py | 75 ++++++++++--------------------------------- src/window.py | 45 ++++++++++++++------------ 8 files changed, 143 insertions(+), 149 deletions(-) delete mode 100644 config/config.json diff --git a/config/config.json b/config/config.json deleted file mode 100644 index 3523cbf..0000000 --- a/config/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "QFluentWidgets": { - "ThemeColor": "#ff009faa", - "ThemeMode": "Light" - } -} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index dca2985..1c3075e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ dependencies = [ "pyside6-fluent-widgets==1.6.6", "pandas===2.2.2", "html2text==2024.2.26", + "loguru===0.7.2", ] [project.optional-dependencies] diff --git a/src/app.py b/src/app.py index 790c8c8..bb87634 100644 --- a/src/app.py +++ b/src/app.py @@ -1,39 +1,31 @@ -import logging import os from PySide6.QtWidgets import QApplication from PySide6.QtCore import Qt, QStandardPaths from PySide6.QtGui import QIcon, QPixmap -from utils.logger import suppressor -with suppressor(): - from qfluentwidgets import QConfig, qconfig +APP_NAME = "E-neiler" +AUTHOR_NAME = "NEIAAC" +AUTHOR_DOMAIN = "neiaac.com" +LOGO_PATH = "resources/icons/logo.png" +DATA_PATH = os.path.join(os.path.join((QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppDataLocation)), + AUTHOR_NAME, APP_NAME)) from version import __version__ -from utils import path, logger, config - -LOGO_PATH = "resources/icons/logo.png" +from utils import path +from utils.logger import logger class App(QApplication): def __init__(self, argv: list[str]): super().__init__(argv) - self.setApplicationName("E-neiler") - self.setOrganizationName("NEIAAC") - self.setOrganizationDomain("neiaac.com") + self.setApplicationName(APP_NAME) + self.setOrganizationName(AUTHOR_NAME) + self.setOrganizationDomain(AUTHOR_DOMAIN) self.setApplicationVersion(__version__) - self.setLogger(logger.setup) - self.setConfig(config.customizable) self.setWindowIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) self.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) - def setLogger(self, setup: callable): - """ - Calls a setup function that is expected to configure the root logger. - The root logger is then used to log information about the application at startup. - """ - setup() - data = [ self.applicationName(), "", @@ -45,18 +37,9 @@ def setLogger(self, setup: callable): row = f"+{'-' * (length + padding * 2)}+" column = f"|{' ' * (length + padding * 2)}|" - logging.info(row) - logging.info(column) + logger.info(row) + logger.info(column) for line in data: - logging.info(f"|{' ' * padding}{line}{' ' * (length - len(line) + padding)}|") - logging.info(column) - logging.info(row) - - def setConfig(self, config: QConfig): - file = os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppDataLocation), "config.json") - if os.path.exists(file): - logging.info(f"Config file found") - else: - logging.info(f"Config file not found, using defaults") - qconfig.load(file, config) - logging.info(f"Config initialized") + logger.info(f"|{' ' * padding}{line}{' ' * (length - len(line) + padding)}|") + logger.info(column) + logger.info(row) diff --git a/src/main.py b/src/main.py index 7b71a96..4ac6c80 100644 --- a/src/main.py +++ b/src/main.py @@ -6,17 +6,17 @@ # nuitka-project-if: {OS} == "Darwin": # nuitka-project: --macos-create-app-bundle -import logging import sys -import time +from utils.logger import logger from app import App from window import Window if __name__ == "__main__": - app = App(sys.argv) + with logger.catch(): + app = App(sys.argv) - window = Window() - window.show() + window = Window() + window.show() - sys.exit(app.exec()) + sys.exit(app.exec()) diff --git a/src/pages/settings.py b/src/pages/settings.py index 55b021e..2c36aa1 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -1,8 +1,9 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout from PySide6.QtCore import Qt -from qfluentwidgets import ComboBoxSettingCard, FluentIcon, Theme +from qfluentwidgets import ComboBoxSettingCard, ColorSettingCard, PrimaryToolButton, FluentIcon, FlowLayout, Dialog, Theme +import qfluentwidgets -from utils.config import customizable +from utils.config import config class SettingsPage(QWidget): def __init__(self): @@ -10,23 +11,47 @@ def __init__(self): self.setObjectName("Settings") comboBox = ComboBoxSettingCard( - customizable.themeMode, + config.style, FluentIcon.BRUSH, "Theme", - "Change the appearance of the app.", + "Change the theme mode of the app.", texts=[ - "Light", - "Dark", - "System" + theme.value + if theme.value != Theme.AUTO.value else "Automatic" + for theme in Theme ] ) comboBox.setMaximumWidth(500) + config.style.valueChanged.connect(lambda theme: (qfluentwidgets.setTheme(theme))) + + colorPicker = ColorSettingCard( + config.primaryColor, + FluentIcon.PALETTE, + "Color", + "Change the primary color of the app.", + ) + colorPicker.setMaximumWidth(500) + config.primaryColor.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color))) + + settingsLayout = FlowLayout() + settingsLayout.addWidget(comboBox) + settingsLayout.addWidget(colorPicker) + + reset = PrimaryToolButton( + FluentIcon.SYNC, + ) + reset.setFixedWidth(100) + reset.clicked.connect(lambda: config.reset()) + + resetLayout = QHBoxLayout() + resetLayout.addWidget(reset) mainLayout = QVBoxLayout() mainLayout.setAlignment(Qt.AlignmentFlag.AlignTop) mainLayout.setContentsMargins(40, 40, 40, 40) mainLayout.setSpacing(40) - mainLayout.addWidget(comboBox) + mainLayout.addLayout(resetLayout) + mainLayout.addLayout(settingsLayout) self.setLayout(mainLayout) diff --git a/src/utils/config.py b/src/utils/config.py index d42f189..7af7eec 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1,23 +1,50 @@ -import logging +import os -from PySide6.QtCore import QLocale -from qfluentwidgets import QConfig, EnumSerializer, OptionsConfigItem, OptionsValidator, ColorValidator, ColorSerializer +from PySide6.QtCore import QLocale, QStandardPaths +from qfluentwidgets import ( + qconfig, + QConfig, + EnumSerializer, + OptionsConfigItem, + OptionsValidator, + BoolValidator, + ColorSerializer, + ColorValidator, +) import qfluentwidgets -class Options(QConfig): - """Global object for app options.""" +from app import DATA_PATH - country = OptionsConfigItem("App", "locale", QLocale.Country.UnitedStates, - OptionsValidator(QLocale.Country), EnumSerializer(QLocale.Country), restart=True) +APP_NAME = "E-neiler" +AUTHOR_NAME = "NEIAAC" + +class Config(QConfig): + """ + Global object for app options. - language = OptionsConfigItem("App", "language", QLocale.Language.English, + ThemeMode and ThemeColor are already present from the base qfluentwidgets.Config class. + """ + + country = OptionsConfigItem("App", "Locale", QLocale.Country.UnitedStates, + OptionsValidator(QLocale.Country), EnumSerializer(QLocale.Country), restart=True) + language = OptionsConfigItem("App", "Language", QLocale.Language.English, OptionsValidator(QLocale.Language), EnumSerializer(QLocale.Language), restart=True) - themeMode = OptionsConfigItem("Window", "theme", qfluentwidgets.Theme.DARK, - OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme)) - themeColor = OptionsConfigItem("Window", "themeColor", "#2BA9ED", - ColorValidator(qfluentwidgets.QColor()), ColorSerializer()) -customizable = Options() -customizable.themeMode.valueChanged.connect(lambda theme: (qfluentwidgets.setTheme(theme), - logging.info(f"Theme mode set to {theme.value}"))) -customizable.themeColor.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color), - logging.info(f"Theme color set to {color}"))) + + maximized = OptionsConfigItem("Window", "Maximized", False, BoolValidator()) + width = OptionsConfigItem("Window", "Width", 500) + height = OptionsConfigItem("Window", "Height", 500) + x = OptionsConfigItem("Window", "X", 0) + y = OptionsConfigItem("Window", "Y", 0) + + style = OptionsConfigItem("Window", "Style", qfluentwidgets.Theme.LIGHT, + OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme), save=True) + primaryColor = OptionsConfigItem("Window", "PrimaryColor", qfluentwidgets.QColor("#4DA8DF"), + ColorValidator(qfluentwidgets.QColor()), ColorSerializer()) + + def reset(self): + for _, attr in self.__class__.__dict__.items(): + if isinstance(attr, OptionsConfigItem): + attr.value = attr.defaultValue + +config = Config() +qconfig.load(os.path.join(DATA_PATH, "config.json"), config) diff --git a/src/utils/logger.py b/src/utils/logger.py index 542fa4f..a5c1ab5 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -1,66 +1,25 @@ -import datetime -import sys, os, logging, logging.handlers -import traceback -from contextlib import contextmanager +import os +import sys -from PySide6.QtCore import QStandardPaths +from loguru import logger -class Formatter(logging.Formatter): - def formatTime(self, record, datefmt=None): - timestamp = datetime.datetime.fromtimestamp(record.created, datetime.timezone.utc) - return timestamp.strftime(datefmt) if datefmt else timestamp.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" +from app import DATA_PATH -def setup(): - """ - Sets up the root logger to the respective QT platform-specific folder, based on the organization and app name.\n - Development: logs to stdout and file.\n - Compiled: logs only to file.\n - """ +path = os.path.join(DATA_PATH, "logs") - path = os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppDataLocation), "logs") +formatter = "[{time:YYYY-MM-DDTHH:mm:ss.SSS[Z]}] [{level}] {message}" - if not os.path.exists(path): - os.makedirs(path) +dev = "__compiled__" not in globals() - syntax = "[%(asctime)s] [%(levelname)s] %(message)s" +logger.remove() +logger.level("INFO", color="") - formatter = Formatter(syntax) +if dev: + logger.add(sys.stdout, colorize=True, format=formatter, level="DEBUG") - def namer(name: str): - dir, file = os.path.split(name) - _, timestamp = file.rsplit(".", 1) - return os.path.join(dir, f"{timestamp}.log") - - file = logging.handlers.TimedRotatingFileHandler( - os.path.join(path, "{:%Y-%m-%d}.log".format(datetime.datetime.now(tz=datetime.timezone.utc).date())), - backupCount=30, - when="midnight", - delay=True, - utc=True) - file.setFormatter(formatter) - file.namer = namer - - console = logging.StreamHandler() - console.setFormatter(formatter) - - dev = "__compiled__" not in globals() - - logging.basicConfig( - level=logging.DEBUG if dev else logging.INFO, - handlers=[console, file] if dev else [file], - format=syntax) - - sys.excepthook = lambda exctype, value, tb: logging.error("".join(traceback.format_exception(exctype, value, tb))) - -@contextmanager -def suppressor(): - """ - Suppresses stdout output when used as a context manager. - """ - with open(os.devnull, "w") as devnull: - old = sys.stdout - sys.stdout = devnull - try: - yield - finally: - sys.stdout = old +logger.add(os.path.join(path, "{time:YYYY-MM-DD!UTC}.log".replace("\\", "/")), + format=formatter, + rotation="1 day", + retention="30 days", + compression="zip", + level="DEBUG" if dev else "INFO") diff --git a/src/window.py b/src/window.py index a40b530..566e7f7 100644 --- a/src/window.py +++ b/src/window.py @@ -1,33 +1,38 @@ -from PySide6.QtCore import QSettings +import os +import sys -from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition +from PySide6.QtCore import QSize, QPoint +try: + old = sys.stdout + sys.stdout = open(os.devnull, "w") + from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition +finally: + sys.stdout.close() + sys.stdout = old + +from utils.config import config from pages.home import HomePage from pages.settings import SettingsPage -GEOMETRY_KEY = "window/geometry" -STATE_KEY = "window/maximized" - class Window(FluentWindow): def __init__(self): super().__init__() - - self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") - self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", position=NavigationItemPosition.BOTTOM) - if (QSettings().value(GEOMETRY_KEY)): - self.restoreGeometry(QSettings().value(GEOMETRY_KEY)) - else: - self.resize(500, 500) - if (QSettings().value(STATE_KEY)): + self.setMicaEffectEnabled(False) + self.resize(QSize(config.width.value, config.height.value)) + self.move(QPoint(config.x.value, config.y.value)) + if config.maximized.value: self.showMaximized() - self.setMicaEffectEnabled(False) + self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") + self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", NavigationItemPosition.BOTTOM) def closeEvent(self, event): """Saves the current window geometry before closing.""" - QSettings().setValue(GEOMETRY_KEY, self.saveGeometry()) - if self.isMaximized(): - QSettings().setValue(STATE_KEY, True) - else: - QSettings().setValue(STATE_KEY, None) - event.accept() + config.width.value = self.width() + config.height.value = self.height() + config.x.value = self.x() + config.y.value = self.y() + config.maximized.value = self.isMaximized() + config.save() + super().closeEvent(event) From ba61e3164942b03a491812d98f01859d7c759502 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Mon, 14 Oct 2024 02:36:48 +0100 Subject: [PATCH 06/17] Add email thread base --- src/app.py | 14 +-- src/logic/email.py | 26 +++++ src/pages/home.py | 194 ++++++++++++++++++++++++++----------- src/pages/settings.py | 54 ++++++++--- src/utils/config.py | 53 +++++----- src/utils/contants.py | 11 +++ src/utils/logger.py | 11 +-- src/utils/notifications.py | 2 +- src/window.py | 33 ++++--- 9 files changed, 273 insertions(+), 125 deletions(-) create mode 100644 src/logic/email.py create mode 100644 src/utils/contants.py diff --git a/src/app.py b/src/app.py index bb87634..d9920d7 100644 --- a/src/app.py +++ b/src/app.py @@ -1,25 +1,17 @@ -import os - from PySide6.QtWidgets import QApplication -from PySide6.QtCore import Qt, QStandardPaths +from PySide6.QtCore import Qt from PySide6.QtGui import QIcon, QPixmap -APP_NAME = "E-neiler" -AUTHOR_NAME = "NEIAAC" -AUTHOR_DOMAIN = "neiaac.com" -LOGO_PATH = "resources/icons/logo.png" -DATA_PATH = os.path.join(os.path.join((QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppDataLocation)), - AUTHOR_NAME, APP_NAME)) - from version import __version__ from utils import path from utils.logger import logger +from utils.contants import EXECUTABLE_NAME, AUTHOR_NAME, AUTHOR_DOMAIN, LOGO_PATH class App(QApplication): def __init__(self, argv: list[str]): super().__init__(argv) - self.setApplicationName(APP_NAME) + self.setApplicationName(EXECUTABLE_NAME) self.setOrganizationName(AUTHOR_NAME) self.setOrganizationDomain(AUTHOR_DOMAIN) self.setApplicationVersion(__version__) diff --git a/src/logic/email.py b/src/logic/email.py new file mode 100644 index 0000000..1f52fd6 --- /dev/null +++ b/src/logic/email.py @@ -0,0 +1,26 @@ +import time + +from PySide6.QtCore import QThread +from qfluentwidgets import ( + PlainTextEdit +) + +from utils.logger import logger + +class EmailerThread(QThread): + + def __init__(self, box: PlainTextEdit, data: str): + super().__init__() + self.box = box + self.data = data + + def output(self, text: str): + logger.info(text) + self.box.appendPlainText(text) + + def run(self): + self.output("Emailing...") + time.sleep(1) + self.output(self.data) + time.sleep(1) + self.output("Emails sent!") diff --git a/src/pages/home.py b/src/pages/home.py index d4a8ab7..08c2a69 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -1,52 +1,118 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFileDialog +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFileDialog, QSizePolicy from PySide6.QtCore import Qt -from qfluentwidgets import LineEdit, PasswordLineEdit, TextBrowser, PrimaryToolButton, FluentIcon - -DEFAULT_TEXT = "Use the button on the left to load a template of the email body!" +from qfluentwidgets import ( + LineEdit, + PasswordLineEdit, + TextEdit, + PrimaryToolButton, + FluentIcon, + SingleDirectionScrollArea, + PlainTextEdit +) + +from logic.email import EmailerThread +from utils.config import config class HomePage(QWidget): def __init__(self): super().__init__() self.setObjectName("Home") - # SMTP host input smtpHostInput = LineEdit() smtpHostInput.setMaximumWidth(500) - hostLabel = QLabel("SMTP HOST") + smtpHostInput.setText(config.smtpHost.get()) + smtpHostInput.setPlaceholderText("smtp.gmail.com") + smtpHostInput.textChanged.connect(lambda text: config.smtpHost.set(text)) + smtphostLabel = QLabel("SMTP HOST") + + smtpPortInput = LineEdit() + smtpPortInput.setMaximumWidth(500) + smtpPortInput.setText(config.smtpPort.get()) + smtpHostInput.textChanged.connect(lambda text: config.smtpPort.set(text)) + smtpPortLabel = QLabel("SMTP PORT") smtpHostInputLayout = QVBoxLayout() smtpHostInputLayout.setSpacing(10) - smtpHostInputLayout.addWidget(hostLabel) + smtpHostInputLayout.addWidget(smtphostLabel) smtpHostInputLayout.addWidget(smtpHostInput) - # SMTP password input - smtpPasswordInput = PasswordLineEdit() - smtpPasswordInput.setMaximumWidth(500) - passwordLabel = QLabel("SMTP PASSWORD") - - smtpPasswordInputLayout = QVBoxLayout() - smtpPasswordInputLayout.setSpacing(10) - smtpPasswordInputLayout.addWidget(passwordLabel) - smtpPasswordInputLayout.addWidget(smtpPasswordInput) + smtpPortInputLayout = QVBoxLayout() + smtpPortInputLayout.setSpacing(10) + smtpPortInputLayout.addWidget(smtpPortLabel) + smtpPortInputLayout.addWidget(smtpPortInput) - # Create a new VBox for the SMTP input fields - smtpInputLayout = QVBoxLayout() - smtpInputLayout.setSpacing(20) - smtpInputLayout.addLayout(smtpHostInputLayout) - smtpInputLayout.addLayout(smtpPasswordInputLayout) + smtpServerLayout = QHBoxLayout() + smtpServerLayout.addLayout(smtpHostInputLayout) + smtpServerLayout.addLayout(smtpPortInputLayout) - # Body file dialog - bodyFileDialog = QFileDialog() - bodyFileDialog.setFileMode(QFileDialog.FileMode.ExistingFile) + smtpUsernameInput = LineEdit() + smtpUsernameInput.setMaximumWidth(500) + smtpUsernameInput.setText(config.smtpUsername.get()) + smtpUsernameInput.setPlaceholderText("person@example.com") + smtpUsernameInput.textChanged.connect(lambda text: config.smtpUsername.set(text)) + smtpusernameLabel = QLabel("SMTP USERNAME") - # Email body input (TextBrowser) - emailBodyInput = TextBrowser() - emailBodyInput.setReadOnly(True) - emailBodyInput.setPlaceholderText(DEFAULT_TEXT) + smtpUsernameLayout = QVBoxLayout() + smtpUsernameLayout.setSpacing(10) + smtpUsernameLayout.addWidget(smtpusernameLabel) + smtpUsernameLayout.addWidget(smtpUsernameInput) - clearBodyButton = PrimaryToolButton(FluentIcon.DELETE) - clearBodyButton.setDisabled(True) - clearBodyButton.clicked.connect(lambda: (emailBodyInput.clear(), clearBodyButton.setDisabled(True))) + smtpPasswordInput = PasswordLineEdit() + smtpPasswordInput.setText(config.smtpPassword.get()) + smtpPasswordInput.setMaximumWidth(500) + smtpPasswordInput.textChanged.connect(lambda text: config.smtpPassword.set(text)) + smtppasswordLabel = QLabel("SMTP PASSWORD") + + smtpPasswordLayout = QVBoxLayout() + smtpPasswordLayout.setSpacing(10) + smtpPasswordLayout.addWidget(smtppasswordLabel) + smtpPasswordLayout.addWidget(smtpPasswordInput) + + smtpAuthLayout = QHBoxLayout() + smtpAuthLayout.addLayout(smtpUsernameLayout) + smtpAuthLayout.addLayout(smtpPasswordLayout) + + smtpLayout = QVBoxLayout() + smtpLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) + smtpLayout.setSpacing(20) + smtpLayout.addLayout(smtpServerLayout) + smtpLayout.addLayout(smtpAuthLayout) + + subjectInput = LineEdit() + subjectInput.setMaximumWidth(500) + subjectLabel = QLabel("SUBJECT") + + ccInput = LineEdit() + ccInput.setMaximumWidth(500) + ccInput.setPlaceholderText("Use a comma (,) to separate emails you want to CC!") + ccLabel = QLabel("CC") + + bccInput = LineEdit() + bccInput.setMaximumWidth(500) + bccInput.setPlaceholderText("Use a comma (,) to separate emails you want to BCC!") + bccLabel = QLabel("BCC") + + headLayout = QVBoxLayout() + headLayout.setSpacing(10) + headLayout.addWidget(subjectLabel) + headLayout.addWidget(subjectInput) + headLayout.addWidget(ccLabel) + headLayout.addWidget(ccInput) + headLayout.addWidget(bccLabel) + headLayout.addWidget(bccInput) + + templatePicker = QFileDialog() + templatePicker.setFileMode(QFileDialog.FileMode.ExistingFile) + + templateContentBox = TextEdit() + templateContentBox.setMinimumHeight(150) + templateContentBox.setReadOnly(True) + templateContentBox.setPlaceholderText( + "Use the button on the left to load a template for the email body and visualize it here...") + + clearTemplateButton = PrimaryToolButton(FluentIcon.DELETE) + clearTemplateButton.setDisabled(True) + clearTemplateButton.clicked.connect(lambda: (templateContentBox.clear(), clearTemplateButton.setDisabled(True))) def loadEmailBody(emailBodyInput, filePath): if filePath: @@ -56,45 +122,57 @@ def loadEmailBody(emailBodyInput, filePath): emailBodyInput.setHtml(fileContent) else: emailBodyInput.setText(fileContent) - clearBodyButton.setDisabled(False) - - selectBodyButton = PrimaryToolButton(FluentIcon.FOLDER) - selectBodyButton.clicked.connect(lambda: loadEmailBody(emailBodyInput, bodyFileDialog.getOpenFileName()[0])) + clearTemplateButton.setDisabled(False) - # Create horizontal layout for buttons and email body - emailReaderLayout = QHBoxLayout() - emailReaderLayout.setSpacing(10) - buttonLayout = QVBoxLayout() - buttonLayout.setSpacing(10) + templatePickerButton = PrimaryToolButton(FluentIcon.FOLDER) + templatePickerButton.clicked.connect(lambda: loadEmailBody(templateContentBox, templatePicker.getOpenFileName()[0])) - # Add buttons to buttonLayout - buttonLayout.addWidget(selectBodyButton) - buttonLayout.addWidget(clearBodyButton) + templateButtonsLayout = QVBoxLayout() + templateButtonsLayout.setSpacing(10) + templateButtonsLayout.addWidget(templatePickerButton) + templateButtonsLayout.addWidget(clearTemplateButton) + templateButtonsLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - # Align the buttons to the top of the buttonLayout - buttonLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + templateLayout = QHBoxLayout() + templateLayout.setSpacing(10) + templateLayout.addLayout(templateButtonsLayout) + templateLayout.addWidget(templateContentBox) - # Add button layout (left) and emailBodyInput (right) to bodyLayout - emailReaderLayout.addLayout(buttonLayout) - emailReaderLayout.addWidget(emailBodyInput) + outputBox = PlainTextEdit() + outputBox.setMinimumHeight(150) + outputBox.setReadOnly(True) + outputBox.setDisabled(True) + outputBox.setPlaceholderText("Progress will be shown here.") - # submit button startButton = PrimaryToolButton(FluentIcon.PLAY) startButton.setFixedWidth(100) + worker = EmailerThread(outputBox, "data") + worker.finished.connect(lambda: startButton.setDisabled(False)) + startButtonLayout = QHBoxLayout() startButtonLayout.setAlignment(Qt.AlignmentFlag.AlignRight) startButtonLayout.addWidget(startButton) + startButton.clicked.connect(lambda: (startButton.setDisabled(True), worker.start())) + + contentWidget = QWidget() + contentLayout = QVBoxLayout(contentWidget) + contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + contentLayout.setContentsMargins(40, 40, 40, 40) + contentLayout.setSpacing(40) + contentLayout.addLayout(smtpLayout) + contentLayout.addLayout(headLayout) + contentLayout.addLayout(templateLayout) + contentLayout.addWidget(outputBox) + contentLayout.addLayout(startButtonLayout) + + scrollArea = SingleDirectionScrollArea(orient=Qt.Orientation.Vertical) + scrollArea.setWidget(contentWidget) + scrollArea.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding) + scrollArea.setWidgetResizable(True) + scrollArea.enableTransparentBackground() - # Main layout for the entire page mainLayout = QVBoxLayout() - mainLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - mainLayout.setContentsMargins(40, 40, 40, 40) - mainLayout.setSpacing(40) - - mainLayout.addLayout(smtpInputLayout) - mainLayout.addLayout(emailReaderLayout) # Add the horizontal layout for buttons and text - mainLayout.addLayout(startButtonLayout) + mainLayout.addWidget(scrollArea) - # Set the main layout self.setLayout(mainLayout) diff --git a/src/pages/settings.py b/src/pages/settings.py index 2c36aa1..822fb1e 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -1,7 +1,15 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QSizePolicy, QMessageBox from PySide6.QtCore import Qt -from qfluentwidgets import ComboBoxSettingCard, ColorSettingCard, PrimaryToolButton, FluentIcon, FlowLayout, Dialog, Theme import qfluentwidgets +from qfluentwidgets import ( + ComboBoxSettingCard, + ColorSettingCard, + PrimaryToolButton, + FluentIcon, + FlowLayout, + SingleDirectionScrollArea, + Dialog +) from utils.config import config @@ -17,41 +25,57 @@ def __init__(self): "Change the theme mode of the app.", texts=[ theme.value - if theme.value != Theme.AUTO.value else "Automatic" - for theme in Theme + if theme.value != qfluentwidgets.Theme.AUTO.value else "Automatic" + for theme in qfluentwidgets.Theme ] ) comboBox.setMaximumWidth(500) - config.style.valueChanged.connect(lambda theme: (qfluentwidgets.setTheme(theme))) colorPicker = ColorSettingCard( - config.primaryColor, + config.color, FluentIcon.PALETTE, "Color", "Change the primary color of the app.", ) colorPicker.setMaximumWidth(500) - config.primaryColor.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color))) settingsLayout = FlowLayout() settingsLayout.addWidget(comboBox) settingsLayout.addWidget(colorPicker) + + dialog = Dialog( + "Are you sure you want to reset all settings?", + "Every value will return to its default if you proceed.", + ) + dialog.setTitleBarVisible(False) + dialog.yesButton.setText("Reset") + dialog.cancelButton.setText("Cancel") + reset = PrimaryToolButton( - FluentIcon.SYNC, + FluentIcon.HISTORY ) reset.setFixedWidth(100) - reset.clicked.connect(lambda: config.reset()) + reset.clicked.connect(lambda: (config.reset() if dialog.exec() else None)) resetLayout = QHBoxLayout() resetLayout.addWidget(reset) - mainLayout = QVBoxLayout() - mainLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - mainLayout.setContentsMargins(40, 40, 40, 40) - mainLayout.setSpacing(40) + contentWidget = QWidget() + contentLayout = QVBoxLayout(contentWidget) + contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + contentLayout.setContentsMargins(40, 40, 40, 40) + contentLayout.setSpacing(40) + contentLayout.addLayout(resetLayout) + contentLayout.addLayout(settingsLayout) + + scrollArea = SingleDirectionScrollArea(orient=Qt.Orientation.Vertical) + scrollArea.setWidget(contentWidget) + scrollArea.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding) + scrollArea.setWidgetResizable(True) + scrollArea.enableTransparentBackground() - mainLayout.addLayout(resetLayout) - mainLayout.addLayout(settingsLayout) + mainLayout = QVBoxLayout() + mainLayout.addWidget(scrollArea) self.setLayout(mainLayout) diff --git a/src/utils/config.py b/src/utils/config.py index 7af7eec..373acf6 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1,6 +1,7 @@ import os -from PySide6.QtCore import QLocale, QStandardPaths +import qfluentwidgets +from PySide6.QtCore import QLocale from qfluentwidgets import ( qconfig, QConfig, @@ -11,40 +12,46 @@ ColorSerializer, ColorValidator, ) -import qfluentwidgets -from app import DATA_PATH +from utils.contants import DATA_PATH + +CONFIG_PATH = os.path.join(DATA_PATH, "config.json") -APP_NAME = "E-neiler" -AUTHOR_NAME = "NEIAAC" +class ConfigItem(OptionsConfigItem): + def set(self, value): + self.value = value + + def get(self): + return self.value class Config(QConfig): """ Global object for app options. - - ThemeMode and ThemeColor are already present from the base qfluentwidgets.Config class. """ - country = OptionsConfigItem("App", "Locale", QLocale.Country.UnitedStates, - OptionsValidator(QLocale.Country), EnumSerializer(QLocale.Country), restart=True) - language = OptionsConfigItem("App", "Language", QLocale.Language.English, - OptionsValidator(QLocale.Language), EnumSerializer(QLocale.Language), restart=True) + maximized = ConfigItem("Window", "Maximized", False, BoolValidator()) + width = ConfigItem("Window", "Width", 500) + height = ConfigItem("Window", "Height", 500) + x = ConfigItem("Window", "X", 0) + y = ConfigItem("Window", "Y", 0) - maximized = OptionsConfigItem("Window", "Maximized", False, BoolValidator()) - width = OptionsConfigItem("Window", "Width", 500) - height = OptionsConfigItem("Window", "Height", 500) - x = OptionsConfigItem("Window", "X", 0) - y = OptionsConfigItem("Window", "Y", 0) + style = ConfigItem("QFluentWidgets", "ThemeMode", qfluentwidgets.Theme.DARK, + OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme), restart=True) + color = ConfigItem("QFluentWidgets", "ThemeColor", qfluentwidgets.QColor("#4DA8DF"), + ColorValidator(qfluentwidgets.QColor()), ColorSerializer(), restart=True) - style = OptionsConfigItem("Window", "Style", qfluentwidgets.Theme.LIGHT, - OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme), save=True) - primaryColor = OptionsConfigItem("Window", "PrimaryColor", qfluentwidgets.QColor("#4DA8DF"), - ColorValidator(qfluentwidgets.QColor()), ColorSerializer()) + smtpHost = ConfigItem("Email", "SMTPHost", "") + smtpPort = ConfigItem("Email", "SMTPPort", "587") + smtpUsername = ConfigItem("Email", "SMTPUsername", "") + smtpPassword = ConfigItem("Email", "SMTPPassword", "") def reset(self): for _, attr in self.__class__.__dict__.items(): - if isinstance(attr, OptionsConfigItem): - attr.value = attr.defaultValue + if isinstance(attr, ConfigItem): + attr.set(attr.defaultValue) config = Config() -qconfig.load(os.path.join(DATA_PATH, "config.json"), config) +config.style.valueChanged.connect(lambda mode: (qfluentwidgets.setTheme(mode))) +config.color.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color))) + +qconfig.load(CONFIG_PATH, config) diff --git a/src/utils/contants.py b/src/utils/contants.py new file mode 100644 index 0000000..10c34b4 --- /dev/null +++ b/src/utils/contants.py @@ -0,0 +1,11 @@ +import os + +from PySide6.QtCore import QStandardPaths + +EXECUTABLE_NAME = "E-neiler" +AUTHOR_NAME = "NEIAAC" +AUTHOR_DOMAIN = "neiaac.com" +LOGO_PATH = "resources/icons/logo.png" +DATA_PATH = os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.GenericConfigLocation), + AUTHOR_NAME, EXECUTABLE_NAME) +SUPPORTED_TABLE_FORMATS = ["csv", "xlsx"] diff --git a/src/utils/logger.py b/src/utils/logger.py index a5c1ab5..30e7768 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -3,11 +3,11 @@ from loguru import logger -from app import DATA_PATH +from utils.contants import DATA_PATH -path = os.path.join(DATA_PATH, "logs") +LOGS_PATH = os.path.join(DATA_PATH, "logs") -formatter = "[{time:YYYY-MM-DDTHH:mm:ss.SSS[Z]}] [{level}] {message}" +formatter = "[{time:YYYY-MM-DDTHH:mm:ss.SSS[Z]!UTC}] [{level}] {message}" dev = "__compiled__" not in globals() @@ -17,9 +17,8 @@ if dev: logger.add(sys.stdout, colorize=True, format=formatter, level="DEBUG") -logger.add(os.path.join(path, "{time:YYYY-MM-DD!UTC}.log".replace("\\", "/")), +logger.add(os.path.join(LOGS_PATH, "{time:YYYY-MM-DD!UTC}.log".replace("\\", "/")), format=formatter, - rotation="1 day", + rotation="00:00", retention="30 days", - compression="zip", level="DEBUG" if dev else "INFO") diff --git a/src/utils/notifications.py b/src/utils/notifications.py index 6090645..284f87b 100644 --- a/src/utils/notifications.py +++ b/src/utils/notifications.py @@ -1,7 +1,7 @@ from PySide6.QtWidgets import QSystemTrayIcon from PySide6.QtGui import QIcon, QPixmap -from app import LOGO_PATH +from utils.contants import LOGO_PATH class Notifications(QSystemTrayIcon): def __init__(self): diff --git a/src/window.py b/src/window.py index 566e7f7..59c78e4 100644 --- a/src/window.py +++ b/src/window.py @@ -1,38 +1,49 @@ import os import sys -from PySide6.QtCore import QSize, QPoint try: old = sys.stdout sys.stdout = open(os.devnull, "w") - from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition + import qfluentwidgets + from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition, SplashScreen finally: sys.stdout.close() sys.stdout = old +from PySide6.QtCore import QSize, QPoint from utils.config import config - from pages.home import HomePage from pages.settings import SettingsPage class Window(FluentWindow): def __init__(self): super().__init__() + self.setMicaEffectEnabled(False) - self.resize(QSize(config.width.value, config.height.value)) - self.move(QPoint(config.x.value, config.y.value)) - if config.maximized.value: + self.resize(QSize(config.width.get(), config.height.get())) + self.move(QPoint(config.x.get(), config.y.get())) + if config.maximized.get(): self.showMaximized() + qfluentwidgets.setTheme(config.style.get()) + qfluentwidgets.setThemeColor(config.color.get()) + + # self.splashScreen = SplashScreen(self.windowIcon(), self) + # self.splashScreen.setIconSize(QSize(256, 256)) + + # self.show() + self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", NavigationItemPosition.BOTTOM) + # self.splashScreen.finish() + def closeEvent(self, event): """Saves the current window geometry before closing.""" - config.width.value = self.width() - config.height.value = self.height() - config.x.value = self.x() - config.y.value = self.y() - config.maximized.value = self.isMaximized() + config.width.set(self.width()) + config.height.set(self.height()) + config.x.set(self.x()) + config.y.set(self.y()) + config.maximized.set(self.isMaximized()) config.save() super().closeEvent(event) From a66b235fb6cdcaab18fc4abb8f29ca0442e9faf8 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Mon, 14 Oct 2024 15:13:36 +0100 Subject: [PATCH 07/17] Fix constant calls --- src/app.py | 2 +- src/logic/email.py | 10 +++- src/pages/home.py | 74 +++++++++++++++++++------ src/pages/settings.py | 4 +- src/utils/config.py | 18 +++--- src/utils/{contants.py => constants.py} | 0 src/utils/logger.py | 2 +- src/utils/notifications.py | 7 ++- src/window.py | 11 ++-- 9 files changed, 90 insertions(+), 38 deletions(-) rename src/utils/{contants.py => constants.py} (100%) diff --git a/src/app.py b/src/app.py index d9920d7..c7df828 100644 --- a/src/app.py +++ b/src/app.py @@ -5,7 +5,7 @@ from version import __version__ from utils import path from utils.logger import logger -from utils.contants import EXECUTABLE_NAME, AUTHOR_NAME, AUTHOR_DOMAIN, LOGO_PATH +from utils.constants import EXECUTABLE_NAME, AUTHOR_NAME, AUTHOR_DOMAIN, LOGO_PATH class App(QApplication): def __init__(self, argv: list[str]): diff --git a/src/logic/email.py b/src/logic/email.py index 1f52fd6..91e1ce3 100644 --- a/src/logic/email.py +++ b/src/logic/email.py @@ -1,11 +1,13 @@ import time -from PySide6.QtCore import QThread +from PySide6.QtCore import Qt, QThread from qfluentwidgets import ( - PlainTextEdit + PlainTextEdit, ) from utils.logger import logger +from utils.notifications import Notifications +from app import App class EmailerThread(QThread): @@ -24,3 +26,7 @@ def run(self): self.output(self.data) time.sleep(1) self.output("Emails sent!") + App.alert(self.box, 0) + App.applicationState() + if(App.applicationState() == Qt.ApplicationState.ApplicationInactive): + Notifications().send("Process finished!", "All emails have been sent.") diff --git a/src/pages/home.py b/src/pages/home.py index 08c2a69..3d820b8 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -9,15 +9,16 @@ SingleDirectionScrollArea, PlainTextEdit ) - from logic.email import EmailerThread from utils.config import config +from utils.constants import SUPPORTED_TABLE_FORMATS class HomePage(QWidget): def __init__(self): super().__init__() self.setObjectName("Home") + # SMTP Settings smtpHostInput = LineEdit() smtpHostInput.setMaximumWidth(500) smtpHostInput.setText(config.smtpHost.get()) @@ -28,7 +29,7 @@ def __init__(self): smtpPortInput = LineEdit() smtpPortInput.setMaximumWidth(500) smtpPortInput.setText(config.smtpPort.get()) - smtpHostInput.textChanged.connect(lambda text: config.smtpPort.set(text)) + smtpPortInput.textChanged.connect(lambda text: config.smtpPort.set(text)) smtpPortLabel = QLabel("SMTP PORT") smtpHostInputLayout = QVBoxLayout() @@ -78,6 +79,7 @@ def __init__(self): smtpLayout.addLayout(smtpServerLayout) smtpLayout.addLayout(smtpAuthLayout) + # Email Fields subjectInput = LineEdit() subjectInput.setMaximumWidth(500) subjectLabel = QLabel("SUBJECT") @@ -108,24 +110,15 @@ def __init__(self): templateContentBox.setMinimumHeight(150) templateContentBox.setReadOnly(True) templateContentBox.setPlaceholderText( - "Use the button on the left to load a template for the email body and visualize it here...") + "Use the button on the left to load a template for the email body and visualize it here..." + ) clearTemplateButton = PrimaryToolButton(FluentIcon.DELETE) clearTemplateButton.setDisabled(True) - clearTemplateButton.clicked.connect(lambda: (templateContentBox.clear(), clearTemplateButton.setDisabled(True))) - - def loadEmailBody(emailBodyInput, filePath): - if filePath: - with open(filePath, 'r', encoding='utf-8') as file: - fileContent = file.read() - if filePath.endswith('.html'): - emailBodyInput.setHtml(fileContent) - else: - emailBodyInput.setText(fileContent) - clearTemplateButton.setDisabled(False) + clearTemplateButton.clicked.connect(lambda: self.clearTemplate(templateContentBox, clearTemplateButton)) templatePickerButton = PrimaryToolButton(FluentIcon.FOLDER) - templatePickerButton.clicked.connect(lambda: loadEmailBody(templateContentBox, templatePicker.getOpenFileName()[0])) + templatePickerButton.clicked.connect(lambda: self.loadEmailBody(templateContentBox, clearTemplateButton, templatePicker)) templateButtonsLayout = QVBoxLayout() templateButtonsLayout.setSpacing(10) @@ -138,6 +131,25 @@ def loadEmailBody(emailBodyInput, filePath): templateLayout.addLayout(templateButtonsLayout) templateLayout.addWidget(templateContentBox) + tableFilePathLabel = QLabel("No table file selected") + tableFilePathLabel.setMaximumWidth(500) + + tableFilePickerButton = PrimaryToolButton(FluentIcon.FOLDER) + tableFilePickerButton.clicked.connect(lambda: self.selectFile(tableFilePathLabel)) + + clearTableButton = PrimaryToolButton(FluentIcon.DELETE) + clearTableButton.setDisabled(True) + clearTableButton.clicked.connect(lambda: self.clearSelectedFile(tableFilePathLabel, clearTableButton)) + + tablePickerLayout = QHBoxLayout() + tablePickerLayout.setSpacing(10) + tablePickerLayout.addWidget(tableFilePickerButton) + tablePickerLayout.addWidget(tableFilePathLabel) + + tableLayout = QVBoxLayout() + tableLayout.addLayout(tablePickerLayout) + tableLayout.addWidget(clearTableButton) + outputBox = PlainTextEdit() outputBox.setMinimumHeight(150) outputBox.setReadOnly(True) @@ -158,11 +170,12 @@ def loadEmailBody(emailBodyInput, filePath): contentWidget = QWidget() contentLayout = QVBoxLayout(contentWidget) contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - contentLayout.setContentsMargins(40, 40, 40, 40) + contentLayout.setContentsMargins(40, 40, 50, 40) contentLayout.setSpacing(40) contentLayout.addLayout(smtpLayout) contentLayout.addLayout(headLayout) contentLayout.addLayout(templateLayout) + contentLayout.addLayout(tableLayout) contentLayout.addWidget(outputBox) contentLayout.addLayout(startButtonLayout) @@ -176,3 +189,32 @@ def loadEmailBody(emailBodyInput, filePath): mainLayout.addWidget(scrollArea) self.setLayout(mainLayout) + + def loadEmailBody(self, templateContentBox, clearTemplateButton, templatePicker): + filePath, _ = templatePicker.getOpenFileName() + if filePath: + with open(filePath, 'r', encoding='utf-8') as file: + fileContent = file.read() + if filePath.endswith('.html'): + templateContentBox.setHtml(fileContent) + else: + templateContentBox.setText(fileContent) + clearTemplateButton.setDisabled(False) + + def clearTemplate(self, templateContentBox, clearTemplateButton): + templateContentBox.clear() + clearTemplateButton.setDisabled(True) + + def selectFile(self, filePathLabel): + file_dialog = QFileDialog() + file_dialog.setFileMode(QFileDialog.FileMode.ExistingFiles) + file_dialog.setNameFilters(SUPPORTED_TABLE_FORMATS) + + if file_dialog.exec(): + selected_files = file_dialog.selectedFiles() + if selected_files: + filePathLabel.setText(selected_files[0]) + + def clearSelectedFile(self, filePathLabel, clearButton): + filePathLabel.setText("No table file selected") + clearButton.setDisabled(True) diff --git a/src/pages/settings.py b/src/pages/settings.py index 822fb1e..cf4b2bd 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -1,4 +1,4 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QSizePolicy, QMessageBox +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QSizePolicy from PySide6.QtCore import Qt import qfluentwidgets from qfluentwidgets import ( @@ -64,7 +64,7 @@ def __init__(self): contentWidget = QWidget() contentLayout = QVBoxLayout(contentWidget) contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - contentLayout.setContentsMargins(40, 40, 40, 40) + contentLayout.setContentsMargins(40, 40, 50, 40) contentLayout.setSpacing(40) contentLayout.addLayout(resetLayout) contentLayout.addLayout(settingsLayout) diff --git a/src/utils/config.py b/src/utils/config.py index 373acf6..e9dfe17 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -13,13 +13,15 @@ ColorValidator, ) -from utils.contants import DATA_PATH +from utils.constants import DATA_PATH CONFIG_PATH = os.path.join(DATA_PATH, "config.json") class ConfigItem(OptionsConfigItem): - def set(self, value): + def set(self, value, save=False): self.value = value + if save: + self.parent.save() def get(self): return self.value @@ -34,16 +36,18 @@ class Config(QConfig): height = ConfigItem("Window", "Height", 500) x = ConfigItem("Window", "X", 0) y = ConfigItem("Window", "Y", 0) - - style = ConfigItem("QFluentWidgets", "ThemeMode", qfluentwidgets.Theme.DARK, - OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme), restart=True) - color = ConfigItem("QFluentWidgets", "ThemeColor", qfluentwidgets.QColor("#4DA8DF"), - ColorValidator(qfluentwidgets.QColor()), ColorSerializer(), restart=True) + style = ConfigItem("Window", "Style", qfluentwidgets.Theme.DARK, + OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme)) + color = ConfigItem("Window", "Color", qfluentwidgets.QColor("#4DA8DF"), + ColorValidator(qfluentwidgets.QColor()), ColorSerializer()) smtpHost = ConfigItem("Email", "SMTPHost", "") smtpPort = ConfigItem("Email", "SMTPPort", "587") smtpUsername = ConfigItem("Email", "SMTPUsername", "") smtpPassword = ConfigItem("Email", "SMTPPassword", "") + subject = ConfigItem("Email", "Subject", "") + cc = ConfigItem("Email", "CC", "") + bcc = ConfigItem("Email", "BCC", "") def reset(self): for _, attr in self.__class__.__dict__.items(): diff --git a/src/utils/contants.py b/src/utils/constants.py similarity index 100% rename from src/utils/contants.py rename to src/utils/constants.py diff --git a/src/utils/logger.py b/src/utils/logger.py index 30e7768..0ef2542 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -3,7 +3,7 @@ from loguru import logger -from utils.contants import DATA_PATH +from utils.constants import DATA_PATH LOGS_PATH = os.path.join(DATA_PATH, "logs") diff --git a/src/utils/notifications.py b/src/utils/notifications.py index 284f87b..31bd789 100644 --- a/src/utils/notifications.py +++ b/src/utils/notifications.py @@ -1,15 +1,16 @@ from PySide6.QtWidgets import QSystemTrayIcon from PySide6.QtGui import QIcon, QPixmap -from utils.contants import LOGO_PATH +from utils.constants import LOGO_PATH +from utils import path class Notifications(QSystemTrayIcon): def __init__(self): super().__init__() - self.setIcon(QIcon(QPixmap(LOGO_PATH))) + self.setIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) - def send(self, title, body): + def send(self, title: str, body: str): """Allows sending tray messages with an hidden tray icon.""" self.setVisible(True) self.showMessage(title, body) diff --git a/src/window.py b/src/window.py index 59c78e4..dea79fa 100644 --- a/src/window.py +++ b/src/window.py @@ -9,7 +9,7 @@ finally: sys.stdout.close() sys.stdout = old -from PySide6.QtCore import QSize, QPoint +from PySide6.QtCore import QSize, QPoint, QEventLoop, QTimer from utils.config import config from pages.home import HomePage @@ -28,15 +28,14 @@ def __init__(self): qfluentwidgets.setTheme(config.style.get()) qfluentwidgets.setThemeColor(config.color.get()) - # self.splashScreen = SplashScreen(self.windowIcon(), self) - # self.splashScreen.setIconSize(QSize(256, 256)) - - # self.show() + self.splashScreen = SplashScreen(self.windowIcon(), self) + self.splashScreen.setIconSize(QSize(128, 128)) + self.show() self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", NavigationItemPosition.BOTTOM) - # self.splashScreen.finish() + self.splashScreen.finish() def closeEvent(self, event): """Saves the current window geometry before closing.""" From 00d9b4876352db6d51ce5dcc1f8434b5edcdb439 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Mon, 21 Oct 2024 01:24:36 +0100 Subject: [PATCH 08/17] Fix workflow names --- .github/workflows/merge.yaml | 13 ++++++------- .github/workflows/release.yaml | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/merge.yaml b/.github/workflows/merge.yaml index 28ad857..45546c9 100644 --- a/.github/workflows/merge.yaml +++ b/.github/workflows/merge.yaml @@ -5,18 +5,17 @@ on: types: [opened, reopened, edited] jobs: - # Check if the PR has a title that matches the conventional commit format title: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: lts/* - - name: Install commitlint and config-conventional - run: npm install @commitlint/cli @commitlint/config-conventional - - name: Setup commitlint config + - name: Install commitlint run: | + npm install @commitlint/cli @commitlint/config-conventional echo 'extends: ["@commitlint/config-conventional"]' > .commitlintrc.yaml - - name: Validate PR title - run: echo "${{ github.event.pull_request.title }}" | npx commitlint + - name: Run commitlint on pull request title + env: + TITLE: ${{ github.event.pull_request.title }} + run: echo "$TITLE" | npx commitlint diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 78537b6..aead767 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,10 +9,10 @@ permissions: pull-requests: write jobs: - python: + metadata: runs-on: ubuntu-latest steps: - - uses: googleapis/release-please-action@v4 + - name: Update project metadata and the release pull request + uses: googleapis/release-please-action@v4 with: - # Updates CHANGELOG.md and creates a tagged release in github release-type: python From 68cf224e98a3143c5f11f3feb5a6c7b0c6e52bd2 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Mon, 21 Oct 2024 03:43:08 +0100 Subject: [PATCH 09/17] fix imports --- .github/workflows/build.yaml | 181 ++++++++++++ .github/workflows/code.yaml | 36 +++ .github/workflows/release.yaml | 33 +++ .github/workflows/test.yaml | 29 ++ .gitignore | 8 + README.md | 24 +- pyproject.toml | 23 +- src/__init__.py | 0 src/app.py | 20 +- src/logic/email.py | 46 ++-- src/main.py | 14 +- src/pages/help.py | 46 ++++ src/pages/home.py | 457 +++++++++++++++++++------------ src/pages/settings.py | 81 +++--- src/resources/sounds/error.wav | Bin 578942 -> 0 bytes src/resources/sounds/success.wav | Bin 631566 -> 141198 bytes src/utils/config.py | 32 ++- src/utils/constants.py | 11 +- src/utils/{path.py => loader.py} | 8 +- src/utils/logger.py | 41 ++- src/utils/notifications.py | 17 -- src/utils/system_tray.py | 23 ++ src/window.py | 20 +- test/__init__.py | 0 test/window_test.py | 16 ++ 25 files changed, 853 insertions(+), 313 deletions(-) create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/code.yaml create mode 100644 .github/workflows/test.yaml create mode 100644 src/__init__.py create mode 100644 src/pages/help.py delete mode 100644 src/resources/sounds/error.wav rename src/utils/{path.py => loader.py} (51%) delete mode 100644 src/utils/notifications.py create mode 100644 src/utils/system_tray.py create mode 100644 test/__init__.py create mode 100644 test/window_test.py diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..7a8a384 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,181 @@ +name: build + +on: + workflow_dispatch: + inputs: + build-version: + description: "Build version, e.g. 1.0.0, for app metadata." + required: true + type: string + workflow_call: + inputs: + build-version: + description: "Build version, e.g. 1.0.0, for app metadata." + required: true + type: string + outputs: + macos-artifact: + description: "MacOS artifact name." + value: ${{ jobs.macos.outputs.artifact-name }} + linux-artifact: + description: "Linux artifact name." + value: ${{ jobs.linux.outputs.artifact-name }} + windows-artifact: + description: "Windows artifact name." + value: ${{ jobs.windows.outputs.artifact-name }} + +env: + NAME: E-neiler + AUTHOR: NEIAAC + SIGNATURE: com.neiaac.e-neiler + +defaults: + run: + shell: bash + +jobs: + macos: + runs-on: macos-latest + outputs: + artifact-name: ${{ steps.export.outputs.artifact-name }} + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" + + - name: Install dependencies + run: pip install .[build] + + - name: Build artifact + uses: Nuitka/Nuitka-Action@main + with: + nuitka-version: main + script-name: src/main.py + onefile: false + standalone: true + include-data-dir: src/resources=resources + macos-create-app-bundle: true + macos-app-icon: src/resources/icons/logo.png + macos-signed-app-name: ${{ env.SIGNATURE }} + macos-app-name: ${{ env.NAME }} + macos-app-version: ${{ inputs.build-version }} + product-version: ${{ inputs.build-version }} + file-version: ${{ inputs.build-version }} + company-name: ${{ env.AUTHOR }} + product-name: ${{ env.NAME }} + file-description: ${{ env.NAME }} app, created by ${{ env.AUTHOR }}. + output-dir: build + enable-plugins: pyside6 + + - name: Mutate artifact + run: mv build/main.app build/${{ env.NAME }}.app + + - name: Set artifact name + id: export + run: echo "artifact-name=${{ env.NAME }}-MacOS-${{ inputs.build-version }}" >> $GITHUB_OUTPUT + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.export.outputs.artifact-name }} + path: build/${{ env.NAME }}*.app + if-no-files-found: error + include-hidden-files: true + + linux: + runs-on: ubuntu-latest + outputs: + artifact-name: ${{ steps.export.outputs.artifact-name }} + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" + + - name: Install dependencies + run: pip install .[build] + + - name: Build artifact + uses: Nuitka/Nuitka-Action@main + with: + nuitka-version: main + script-name: src/main.py + onefile: false + standalone: true + include-data-dir: src/resources=resources + linux-icon: src/resources/icons/logo.png + product-version: ${{ inputs.build-version }} + file-version: ${{ inputs.build-version }} + company-name: ${{ env.AUTHOR }} + product-name: ${{ env.NAME }} + file-description: ${{ env.NAME }} app, created by ${{ env.AUTHOR }}. + output-dir: build + enable-plugins: pyside6 + + - name: Mutate artifact + run: mv build/main.dist build/${{ env.NAME }} + + - name: Set artifact name + id: export + run: echo "artifact-name=${{ env.NAME }}-Linux-${{ inputs.build-version }}" >> $GITHUB_OUTPUT + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.export.outputs.artifact-name }} + path: build/${{ env.NAME }}* + if-no-files-found: error + include-hidden-files: true + + windows: + runs-on: windows-latest + outputs: + artifact-name: ${{ steps.export.outputs.artifact-name }} + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" + + - name: Install dependencies + run: pip install .[build] + + - name: Build artifact + uses: Nuitka/Nuitka-Action@main + with: + nuitka-version: main + script-name: src/main.py + onefile: false + standalone: true + include-data-dir: src/resources=resources + windows-icon-from-ico: src/resources/icons/logo.png + windows-console-mode: disable + product-version: ${{ inputs.build-version }} + file-version: ${{ inputs.build-version }} + company-name: ${{ env.AUTHOR }} + product-name: ${{ env.NAME }} + file-description: ${{ env.NAME }} app, created by ${{ env.AUTHOR }}. + output-dir: build + enable-plugins: pyside6 + + - name: Mutate artifact + run: mv build/main.dist build/${{ env.NAME }} + + - name: Set artifact name + id: export + run: echo "artifact-name=${{ env.NAME }}-Windows-${{ inputs.build-version }}" >> $GITHUB_OUTPUT + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.export.outputs.artifact-name }} + path: build/${{ env.NAME }}* + if-no-files-found: error + include-hidden-files: true diff --git a/.github/workflows/code.yaml b/.github/workflows/code.yaml new file mode 100644 index 0000000..606e7a2 --- /dev/null +++ b/.github/workflows/code.yaml @@ -0,0 +1,36 @@ +name: code + +on: + push: + branches: [main] + pull_request_target: + +jobs: + style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" + - name: Install Ruff + run: | + python -m pip install --upgrade pip + pip install ruff + - name: Run formatter + run: ruff format --check + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" + - name: Install Ruff + run: | + python -m pip install --upgrade pip + pip install ruff + - name: Run linter + run: ruff check diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index aead767..9e5d03f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -11,8 +11,41 @@ permissions: jobs: metadata: runs-on: ubuntu-latest + outputs: + major: ${{ steps.metadata.outputs.major }} + minor: ${{ steps.metadata.outputs.minor }} + patch: ${{ steps.metadata.outputs.patch }} + tag-name: ${{ steps.metadata.outputs.tag_name }} + release-created: ${{ steps.metadata.outputs.release_created }} steps: - name: Update project metadata and the release pull request uses: googleapis/release-please-action@v4 + id: metadata with: release-type: python + build: + needs: [metadata] + if: ${{ needs.metadata.outputs.release-created}} + uses: ./.github/workflows/build.yaml + with: + build-version: ${{ needs.metadata.outputs.major }}.${{ needs.metadata.outputs.minor }}.${{ needs.metadata.outputs.patch }} + upload: + needs: [metadata, build] + runs-on: ubuntu-latest + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + - name: Zip build artifacts + run: | + (cd ${{ needs.build.outputs.macos-artifact }} && zip -r ../${{ needs.build.outputs.macos-artifact }}.zip .) + (cd ${{ needs.build.outputs.linux-artifact }} && zip -r ../${{ needs.build.outputs.linux-artifact }}.zip .) + (cd ${{ needs.build.outputs.windows-artifact }} && zip -r ../${{ needs.build.outputs.windows-artifact }}.zip .) + - name: Append build artifacts to release + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} + run: > + gh release upload ${{ needs.metadata.outputs.tag-name }} + ${{ needs.build.outputs.macos-artifact }}.zip#MacOS + ${{ needs.build.outputs.linux-artifact }}.zip#Linux + ${{ needs.build.outputs.windows-artifact }}.zip#Windows diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..4edf99d --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,29 @@ +name: test + +on: + push: + branches: [main] + pull_request_target: + +jobs: + e2e: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + fail-fast: false + env: + DISPLAY: ":99.0" + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" + - uses: tlambert03/setup-qt-libs@v1 + - if: ${{ matrix.os == 'ubuntu-latest' }} + run: sudo apt-get install pulseaudio -y + - name: Install dependencies + run: pip install .[test] + - name: Run PyTests + run: pytest diff --git a/.gitignore b/.gitignore index db16cbe..8c21725 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # IDE .idea/ .vscode/ +xcuserdata/ # Environment .env* @@ -13,11 +14,17 @@ venv.bak/ !.env.example # Cache +*_cache __pycache__/ *.py[cod] *$py.class # Build +*.exe +*-build +*-dist +*.build +*.dist build/ dist/ output/ @@ -63,6 +70,7 @@ coverage.xml cover/ # Miscellaneous +.DS_Store *.mo *.pot *.log diff --git a/README.md b/README.md index 647a38b..aa18d3e 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,11 @@ # Quick and reliable ✉️➡️ -E-neiler makes it easy to quickly send high amounts of emails with tabled data through SMTP, file attachments included. It works on your custom server, gmail, outlook and any other service that allows SMTP. We support a variety of file types for both the body templates and the data tables. - ## Requirements 📋 - Python 3.12.0+ ## Usage 🚀 -- Download the app from [here](https://github.com/NEIAAC/e-neiler/releases/latest), under the `assets` section, click the `.exe` file. - -- Load template. - -- Load table. - -- Start the process. - -- Edit the `template.txt` file in the `data` folder to contain the appropriate email content or even change it to a `.html` file. - -- Edit the `table.csv` file in the `data` folder, or add your own, with the appropriate recipient emails, placeholder replacements and file attatchment paths, depending on what is needed. - ## Development 🛠️ - Clone the repository: @@ -37,13 +23,5 @@ E-neiler makes it easy to quickly send high amounts of emails with tabled data t - Start the app: ```shell - pyside6-project run - ``` - -### Notes 🗒️ - -- When adding resources to the app always use the `resources` folder and add each file to the `index.qrc` file too. The `run` command will then use this `.qrc` file to generate the `rc_index.py` file, which exposes the resources to be used inside app like this: - - ```python - QIcon(QPixmap(":/icons/logo.png")) + python src/main.py ``` diff --git a/pyproject.toml b/pyproject.toml index 1c3075e..49ab577 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,4 +13,25 @@ dependencies = [ [project.optional-dependencies] -compiler = ["nuitka==2.4.8"] +check = ["ruff==0.6.9"] +test = ["pytest==8.3.3", "pytest-qt==4.4.0", "pytest-xvfb==3.0.0"] +build = ["nuitka==2.4.8", "imageio==2.36.0"] + +[tool.ruff] +line-length = 80 +indent-width = 4 + +[tool.ruff.lint] +fixable = ["ALL"] +unfixable = [] + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" + +[tool.pytest.ini_options] +addopts = "-ra" +testpaths = ["test"] +python_files = ["*_test.py"] +python_classes = ["Test*"] +python_functions = ["*Test", "test*"] diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/app.py b/src/app.py index c7df828..53695d7 100644 --- a/src/app.py +++ b/src/app.py @@ -3,9 +3,15 @@ from PySide6.QtGui import QIcon, QPixmap from version import __version__ -from utils import path +from utils import loader from utils.logger import logger -from utils.constants import EXECUTABLE_NAME, AUTHOR_NAME, AUTHOR_DOMAIN, LOGO_PATH +from utils.constants import ( + EXECUTABLE_NAME, + AUTHOR_NAME, + AUTHOR_DOMAIN, + LOGO_PATH, +) + class App(QApplication): def __init__(self, argv: list[str]): @@ -15,8 +21,10 @@ def __init__(self, argv: list[str]): self.setOrganizationName(AUTHOR_NAME) self.setOrganizationDomain(AUTHOR_DOMAIN) self.setApplicationVersion(__version__) - self.setWindowIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) - self.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) + self.setWindowIcon(QIcon(QPixmap(loader.resources(LOGO_PATH)))) + self.setHighDpiScaleFactorRoundingPolicy( + Qt.HighDpiScaleFactorRoundingPolicy.PassThrough + ) data = [ self.applicationName(), @@ -32,6 +40,8 @@ def __init__(self, argv: list[str]): logger.info(row) logger.info(column) for line in data: - logger.info(f"|{' ' * padding}{line}{' ' * (length - len(line) + padding)}|") + logger.info( + f"|{' ' * padding}{line}{' ' * (length - len(line) + padding)}|" + ) logger.info(column) logger.info(row) diff --git a/src/logic/email.py b/src/logic/email.py index 91e1ce3..9aab68f 100644 --- a/src/logic/email.py +++ b/src/logic/email.py @@ -1,32 +1,36 @@ -import time +from datetime import datetime -from PySide6.QtCore import Qt, QThread -from qfluentwidgets import ( - PlainTextEdit, -) +from PySide6.QtCore import QThread, Signal from utils.logger import logger -from utils.notifications import Notifications -from app import App + class EmailerThread(QThread): + outputSignal = Signal(str) - def __init__(self, box: PlainTextEdit, data: str): + def __init__(self, data: str): super().__init__() - self.box = box self.data = data - def output(self, text: str): - logger.info(text) - self.box.appendPlainText(text) + def output(self, text: str, level="INFO"): + logger.log(level, text) + timestamped = f"[{datetime.now().strftime('%H:%M:%S')}] {text}\n" + self.outputSignal.emit(timestamped) def run(self): - self.output("Emailing...") - time.sleep(1) - self.output(self.data) - time.sleep(1) - self.output("Emails sent!") - App.alert(self.box, 0) - App.applicationState() - if(App.applicationState() == Qt.ApplicationState.ApplicationInactive): - Notifications().send("Process finished!", "All emails have been sent.") + try: + self.output( + "This is the start message, we will now wait for 3 seconds to simulate some work" + ) + self.msleep(3000) + + self.output( + f'You entered "{self.data}" in the input. We will now wait 3 more seconds' + ) + self.msleep(3000) + + self.output( + "Example finished, a sound was played. If the app is minimized it will also flash in the taskbar and you will receive a system notification" + ) + except Exception as e: + self.output(str(e), "ERROR") diff --git a/src/main.py b/src/main.py index 4ac6c80..40b0277 100644 --- a/src/main.py +++ b/src/main.py @@ -1,19 +1,15 @@ -# General options: -# nuitka-project: --standalone -# nuitka-project: --enable-plugin=pyside6 -# nuitka-project: --include-data-files={MAIN_DIRECTORY}/resources -# Compilation mode, standalone everywhere, except on macOS there app bundle: -# nuitka-project-if: {OS} == "Darwin": -# nuitka-project: --macos-create-app-bundle - import sys -from utils.logger import logger +from PySide6 import QtCore + +from utils.logger import logger, qMessageHandler from app import App from window import Window if __name__ == "__main__": with logger.catch(): + QtCore.qInstallMessageHandler(qMessageHandler) + app = App(sys.argv) window = Window() diff --git a/src/pages/help.py b/src/pages/help.py new file mode 100644 index 0000000..bd853a4 --- /dev/null +++ b/src/pages/help.py @@ -0,0 +1,46 @@ +from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy +from PySide6.QtCore import Qt +from qfluentwidgets import ( + BodyLabel, + SingleDirectionScrollArea, +) + + +class HelpPage(QWidget): + def __init__(self): + super().__init__() + self.setObjectName("Help") + + helpText = BodyLabel( + f""" +

Help

+ +

+ qfluentwidgets + is a lightweight, cross-platform, and cross-platform + QWidgets + for Windows, macOS, and Linux. +

+ + """, + ) + + contentWidget = QWidget() + contentLayout = QVBoxLayout(contentWidget) + contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + contentLayout.setContentsMargins(40, 40, 50, 40) + contentLayout.setSpacing(40) + contentLayout.addWidget(helpText) + + scrollArea = SingleDirectionScrollArea(orient=Qt.Orientation.Vertical) + scrollArea.setWidget(contentWidget) + scrollArea.setSizePolicy( + QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding + ) + scrollArea.setWidgetResizable(True) + scrollArea.enableTransparentBackground() + + mainLayout = QVBoxLayout() + mainLayout.addWidget(scrollArea) + + self.setLayout(mainLayout) diff --git a/src/pages/home.py b/src/pages/home.py index 3d820b8..9b0f668 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -1,5 +1,13 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFileDialog, QSizePolicy -from PySide6.QtCore import Qt +from PySide6.QtWidgets import ( + QWidget, + QVBoxLayout, + QHBoxLayout, + QLabel, + QFileDialog, + QSizePolicy, +) +from PySide6.QtMultimedia import QSoundEffect +from PySide6.QtCore import Qt, QUrl from qfluentwidgets import ( LineEdit, PasswordLineEdit, @@ -7,195 +15,253 @@ PrimaryToolButton, FluentIcon, SingleDirectionScrollArea, - PlainTextEdit + PlainTextEdit, + InfoBar, + InfoBarPosition, ) + +from app import App from logic.email import EmailerThread from utils.config import config +from utils import loader +from utils.system_tray import SystemTray from utils.constants import SUPPORTED_TABLE_FORMATS + class HomePage(QWidget): def __init__(self): super().__init__() self.setObjectName("Home") - # SMTP Settings - smtpHostInput = LineEdit() - smtpHostInput.setMaximumWidth(500) - smtpHostInput.setText(config.smtpHost.get()) - smtpHostInput.setPlaceholderText("smtp.gmail.com") - smtpHostInput.textChanged.connect(lambda text: config.smtpHost.set(text)) - smtphostLabel = QLabel("SMTP HOST") - - smtpPortInput = LineEdit() - smtpPortInput.setMaximumWidth(500) - smtpPortInput.setText(config.smtpPort.get()) - smtpPortInput.textChanged.connect(lambda text: config.smtpPort.set(text)) - smtpPortLabel = QLabel("SMTP PORT") - - smtpHostInputLayout = QVBoxLayout() - smtpHostInputLayout.setSpacing(10) - smtpHostInputLayout.addWidget(smtphostLabel) - smtpHostInputLayout.addWidget(smtpHostInput) - - smtpPortInputLayout = QVBoxLayout() - smtpPortInputLayout.setSpacing(10) - smtpPortInputLayout.addWidget(smtpPortLabel) - smtpPortInputLayout.addWidget(smtpPortInput) - - smtpServerLayout = QHBoxLayout() - smtpServerLayout.addLayout(smtpHostInputLayout) - smtpServerLayout.addLayout(smtpPortInputLayout) - - smtpUsernameInput = LineEdit() - smtpUsernameInput.setMaximumWidth(500) - smtpUsernameInput.setText(config.smtpUsername.get()) - smtpUsernameInput.setPlaceholderText("person@example.com") - smtpUsernameInput.textChanged.connect(lambda text: config.smtpUsername.set(text)) - smtpusernameLabel = QLabel("SMTP USERNAME") - - smtpUsernameLayout = QVBoxLayout() - smtpUsernameLayout.setSpacing(10) - smtpUsernameLayout.addWidget(smtpusernameLabel) - smtpUsernameLayout.addWidget(smtpUsernameInput) - - smtpPasswordInput = PasswordLineEdit() - smtpPasswordInput.setText(config.smtpPassword.get()) - smtpPasswordInput.setMaximumWidth(500) - smtpPasswordInput.textChanged.connect(lambda text: config.smtpPassword.set(text)) - smtppasswordLabel = QLabel("SMTP PASSWORD") - - smtpPasswordLayout = QVBoxLayout() - smtpPasswordLayout.setSpacing(10) - smtpPasswordLayout.addWidget(smtppasswordLabel) - smtpPasswordLayout.addWidget(smtpPasswordInput) - - smtpAuthLayout = QHBoxLayout() - smtpAuthLayout.addLayout(smtpUsernameLayout) - smtpAuthLayout.addLayout(smtpPasswordLayout) - - smtpLayout = QVBoxLayout() - smtpLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) - smtpLayout.setSpacing(20) - smtpLayout.addLayout(smtpServerLayout) - smtpLayout.addLayout(smtpAuthLayout) - - # Email Fields - subjectInput = LineEdit() - subjectInput.setMaximumWidth(500) - subjectLabel = QLabel("SUBJECT") - - ccInput = LineEdit() - ccInput.setMaximumWidth(500) - ccInput.setPlaceholderText("Use a comma (,) to separate emails you want to CC!") - ccLabel = QLabel("CC") - - bccInput = LineEdit() - bccInput.setMaximumWidth(500) - bccInput.setPlaceholderText("Use a comma (,) to separate emails you want to BCC!") - bccLabel = QLabel("BCC") - - headLayout = QVBoxLayout() - headLayout.setSpacing(10) - headLayout.addWidget(subjectLabel) - headLayout.addWidget(subjectInput) - headLayout.addWidget(ccLabel) - headLayout.addWidget(ccInput) - headLayout.addWidget(bccLabel) - headLayout.addWidget(bccInput) - - templatePicker = QFileDialog() - templatePicker.setFileMode(QFileDialog.FileMode.ExistingFile) - - templateContentBox = TextEdit() - templateContentBox.setMinimumHeight(150) - templateContentBox.setReadOnly(True) - templateContentBox.setPlaceholderText( + self.finishSound = QSoundEffect() + self.finishSound.setSource( + QUrl.fromLocalFile(loader.resources("sounds/success.wav")) + ) + self.finishSound.setVolume(0.2) + + # SMTP settings + self.smtpHostInput = LineEdit() + self.smtpHostInput.setMaximumWidth(500) + self.smtpHostInput.setText(config.smtpHost.get()) + self.smtpHostInput.setPlaceholderText("smtp.gmail.com") + self.smtpHostInput.textChanged.connect( + lambda text: config.smtpHost.set(text) + ) + self.smtphostLabel = QLabel("SMTP HOST") + + self.smtpPortInput = LineEdit() + self.smtpPortInput.setMaximumWidth(500) + self.smtpPortInput.setText(config.smtpPort.get()) + self.smtpPortInput.textChanged.connect( + lambda text: config.smtpPort.set(text) + ) + self.smtpPortLabel = QLabel("SMTP PORT") + + self.smtpHostInputLayout = QVBoxLayout() + self.smtpHostInputLayout.setSpacing(10) + self.smtpHostInputLayout.addWidget(self.smtphostLabel) + self.smtpHostInputLayout.addWidget(self.smtpHostInput) + + self.smtpPortInputLayout = QVBoxLayout() + self.smtpPortInputLayout.setSpacing(10) + self.smtpPortInputLayout.addWidget(self.smtpPortLabel) + self.smtpPortInputLayout.addWidget(self.smtpPortInput) + + self.smtpServerLayout = QHBoxLayout() + self.smtpServerLayout.addLayout(self.smtpHostInputLayout) + self.smtpServerLayout.addLayout(self.smtpPortInputLayout) + + self.smtpUsernameInput = LineEdit() + self.smtpUsernameInput.setMaximumWidth(500) + self.smtpUsernameInput.setText(config.smtpUsername.get()) + self.smtpUsernameInput.setPlaceholderText("person@example.com") + self.smtpUsernameInput.textChanged.connect( + lambda text: config.smtpUsername.set(text) + ) + self.smtpusernameLabel = QLabel("SMTP USERNAME") + + self.smtpUsernameLayout = QVBoxLayout() + self.smtpUsernameLayout.setSpacing(10) + self.smtpUsernameLayout.addWidget(self.smtpusernameLabel) + self.smtpUsernameLayout.addWidget(self.smtpUsernameInput) + + self.smtpPasswordInput = PasswordLineEdit() + self.smtpPasswordInput.setText(config.smtpPassword.get()) + self.smtpPasswordInput.setMaximumWidth(500) + self.smtpPasswordInput.textChanged.connect( + lambda text: config.smtpPassword.set(text) + ) + self.smtppasswordLabel = QLabel("SMTP PASSWORD") + + self.smtpPasswordLayout = QVBoxLayout() + self.smtpPasswordLayout.setSpacing(10) + self.smtpPasswordLayout.addWidget(self.smtppasswordLabel) + self.smtpPasswordLayout.addWidget(self.smtpPasswordInput) + + self.smtpAuthLayout = QHBoxLayout() + self.smtpAuthLayout.addLayout(self.smtpUsernameLayout) + self.smtpAuthLayout.addLayout(self.smtpPasswordLayout) + + self.smtpLayout = QVBoxLayout() + self.smtpLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.smtpLayout.setSpacing(20) + self.smtpLayout.addLayout(self.smtpServerLayout) + self.smtpLayout.addLayout(self.smtpAuthLayout) + + # Email headers + self.subjectInput = LineEdit() + self.subjectInput.setMaximumWidth(500) + self.subjectLabel = QLabel("SUBJECT") + + self.ccInput = LineEdit() + self.ccInput.setMaximumWidth(500) + self.ccInput.setPlaceholderText( + "Use a comma (,) to separate emails you want to CC!" + ) + self.ccLabel = QLabel("CC") + + self.bccInput = LineEdit() + self.bccInput.setMaximumWidth(500) + self.bccInput.setPlaceholderText( + "Use a comma (,) to separate emails you want to BCC!" + ) + self.bccLabel = QLabel("BCC") + + self.headLayout = QVBoxLayout() + self.headLayout.setSpacing(10) + self.headLayout.addWidget(self.subjectLabel) + self.headLayout.addWidget(self.subjectInput) + self.headLayout.addWidget(self.ccLabel) + self.headLayout.addWidget(self.ccInput) + self.headLayout.addWidget(self.bccLabel) + self.headLayout.addWidget(self.bccInput) + + self.templatePicker = QFileDialog() + self.templatePicker.setFileMode(QFileDialog.FileMode.ExistingFile) + + self.templateContentBox = TextEdit() + self.templateContentBox.setMinimumHeight(150) + self.templateContentBox.setReadOnly(True) + self.templateContentBox.setPlaceholderText( "Use the button on the left to load a template for the email body and visualize it here..." ) - clearTemplateButton = PrimaryToolButton(FluentIcon.DELETE) - clearTemplateButton.setDisabled(True) - clearTemplateButton.clicked.connect(lambda: self.clearTemplate(templateContentBox, clearTemplateButton)) - - templatePickerButton = PrimaryToolButton(FluentIcon.FOLDER) - templatePickerButton.clicked.connect(lambda: self.loadEmailBody(templateContentBox, clearTemplateButton, templatePicker)) - - templateButtonsLayout = QVBoxLayout() - templateButtonsLayout.setSpacing(10) - templateButtonsLayout.addWidget(templatePickerButton) - templateButtonsLayout.addWidget(clearTemplateButton) - templateButtonsLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - - templateLayout = QHBoxLayout() - templateLayout.setSpacing(10) - templateLayout.addLayout(templateButtonsLayout) - templateLayout.addWidget(templateContentBox) - - tableFilePathLabel = QLabel("No table file selected") - tableFilePathLabel.setMaximumWidth(500) - - tableFilePickerButton = PrimaryToolButton(FluentIcon.FOLDER) - tableFilePickerButton.clicked.connect(lambda: self.selectFile(tableFilePathLabel)) - - clearTableButton = PrimaryToolButton(FluentIcon.DELETE) - clearTableButton.setDisabled(True) - clearTableButton.clicked.connect(lambda: self.clearSelectedFile(tableFilePathLabel, clearTableButton)) - - tablePickerLayout = QHBoxLayout() - tablePickerLayout.setSpacing(10) - tablePickerLayout.addWidget(tableFilePickerButton) - tablePickerLayout.addWidget(tableFilePathLabel) - - tableLayout = QVBoxLayout() - tableLayout.addLayout(tablePickerLayout) - tableLayout.addWidget(clearTableButton) - - outputBox = PlainTextEdit() - outputBox.setMinimumHeight(150) - outputBox.setReadOnly(True) - outputBox.setDisabled(True) - outputBox.setPlaceholderText("Progress will be shown here.") - - startButton = PrimaryToolButton(FluentIcon.PLAY) - startButton.setFixedWidth(100) - - worker = EmailerThread(outputBox, "data") - worker.finished.connect(lambda: startButton.setDisabled(False)) - - startButtonLayout = QHBoxLayout() - startButtonLayout.setAlignment(Qt.AlignmentFlag.AlignRight) - startButtonLayout.addWidget(startButton) - startButton.clicked.connect(lambda: (startButton.setDisabled(True), worker.start())) - - contentWidget = QWidget() - contentLayout = QVBoxLayout(contentWidget) - contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - contentLayout.setContentsMargins(40, 40, 50, 40) - contentLayout.setSpacing(40) - contentLayout.addLayout(smtpLayout) - contentLayout.addLayout(headLayout) - contentLayout.addLayout(templateLayout) - contentLayout.addLayout(tableLayout) - contentLayout.addWidget(outputBox) - contentLayout.addLayout(startButtonLayout) - - scrollArea = SingleDirectionScrollArea(orient=Qt.Orientation.Vertical) - scrollArea.setWidget(contentWidget) - scrollArea.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding) - scrollArea.setWidgetResizable(True) - scrollArea.enableTransparentBackground() - - mainLayout = QVBoxLayout() - mainLayout.addWidget(scrollArea) - - self.setLayout(mainLayout) - - def loadEmailBody(self, templateContentBox, clearTemplateButton, templatePicker): + self.clearTemplateButton = PrimaryToolButton(FluentIcon.DELETE) + self.clearTemplateButton.setDisabled(True) + self.clearTemplateButton.clicked.connect( + lambda: self.clearTemplate( + self.templateContentBox, self.clearTemplateButton + ) + ) + + self.templatePickerButton = PrimaryToolButton(FluentIcon.FOLDER) + self.templatePickerButton.clicked.connect( + lambda: self.loadEmailBody( + self.templateContentBox, + self.clearTemplateButton, + self.templatePicker, + ) + ) + + self.templateButtonsLayout = QVBoxLayout() + self.templateButtonsLayout.setSpacing(10) + self.templateButtonsLayout.addWidget(self.templatePickerButton) + self.templateButtonsLayout.addWidget(self.clearTemplateButton) + self.templateButtonsLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + + self.templateLayout = QHBoxLayout() + self.templateLayout.setSpacing(10) + self.templateLayout.addLayout(self.templateButtonsLayout) + self.templateLayout.addWidget(self.templateContentBox) + + self.tableFilePathLabel = QLabel("No table file selected") + self.tableFilePathLabel.setMaximumWidth(500) + + self.tableFilePickerButton = PrimaryToolButton(FluentIcon.FOLDER) + self.tableFilePickerButton.clicked.connect( + lambda: self.selectFile(self.tableFilePathLabel) + ) + + self.clearTableButton = PrimaryToolButton(FluentIcon.DELETE) + self.clearTableButton.setDisabled(True) + self.clearTableButton.clicked.connect( + lambda: self.clearSelectedFile( + self.tableFilePathLabel, self.clearTableButton + ) + ) + + self.tablePickerLayout = QHBoxLayout() + self.tablePickerLayout.setSpacing(10) + self.tablePickerLayout.addWidget(self.tableFilePickerButton) + self.tablePickerLayout.addWidget(self.tableFilePathLabel) + + self.tableLayout = QVBoxLayout() + self.tableLayout.addLayout(self.tablePickerLayout) + self.tableLayout.addWidget(self.clearTableButton) + + self.outputBox = PlainTextEdit() + self.outputBox.setMinimumHeight(150) + self.outputBox.setReadOnly(True) + self.outputBox.setPlaceholderText("Progress will be shown here.") + + self.outputClearButton = PrimaryToolButton(FluentIcon.DELETE) + self.outputClearButton.setDisabled(True) + self.outputClearButton.clicked.connect(self.outputBox.clear) + + self.outputButtonLayout = QVBoxLayout() + self.outputButtonLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.outputButtonLayout.setSpacing(10) + self.outputButtonLayout.addWidget(self.outputClearButton) + + self.outputLayout = QHBoxLayout() + self.outputLayout.setSpacing(10) + self.outputLayout.addLayout(self.outputButtonLayout) + self.outputLayout.addWidget(self.outputBox) + + self.startButton = PrimaryToolButton(FluentIcon.PLAY) + self.startButton.setFixedWidth(100) + + self.worker = None + self.startButtonLayout = QHBoxLayout() + self.startButtonLayout.setAlignment(Qt.AlignmentFlag.AlignRight) + self.startButtonLayout.addWidget(self.startButton) + self.startButton.clicked.connect(self.runEmailer) + + self.contentWidget = QWidget() + self.contentLayout = QVBoxLayout(self.contentWidget) + self.contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.contentLayout.setContentsMargins(40, 40, 50, 40) + self.contentLayout.setSpacing(40) + self.contentLayout.addLayout(self.smtpLayout) + self.contentLayout.addLayout(self.headLayout) + self.contentLayout.addLayout(self.templateLayout) + self.contentLayout.addLayout(self.tableLayout) + self.contentLayout.addWidget(self.outputBox) + self.contentLayout.addLayout(self.startButtonLayout) + + self.scrollArea = SingleDirectionScrollArea( + orient=Qt.Orientation.Vertical + ) + self.scrollArea.setWidget(self.contentWidget) + self.scrollArea.setSizePolicy( + QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding + ) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.enableTransparentBackground() + + self.mainLayout = QVBoxLayout() + self.mainLayout.addWidget(self.scrollArea) + + self.setLayout(self.mainLayout) + + def loadEmailBody( + self, templateContentBox, clearTemplateButton, templatePicker + ): filePath, _ = templatePicker.getOpenFileName() if filePath: - with open(filePath, 'r', encoding='utf-8') as file: + with open(filePath, "r", encoding="utf-8") as file: fileContent = file.read() - if filePath.endswith('.html'): + if filePath.endswith(".html"): templateContentBox.setHtml(fileContent) else: templateContentBox.setText(fileContent) @@ -218,3 +284,44 @@ def selectFile(self, filePathLabel): def clearSelectedFile(self, filePathLabel, clearButton): filePathLabel.setText("No table file selected") clearButton.setDisabled(True) + + def runEmailer(self): + """Runs the example logic for this page.""" + if self.worker is not None and self.worker.isRunning(): + return + + if not self.templateContentBox.toPlainText(): + InfoBar.error( + title="Template is empty!", + content="", + isClosable=True, + position=InfoBarPosition.TOP_RIGHT, + duration=4000, + parent=self, + ) + return + + self.startButton.setDisabled(True) + self.worker = EmailerThread(self.templateContentBox.toPlainText()) + self.worker.outputSignal.connect( + lambda text: ( + self.outputBox.appendPlainText(text), + self.outputClearButton.setDisabled(False), + ) + ) + + def finished(): + self.startButton.setDisabled(False) + App.alert(self, 0) + if ( + App.applicationState() + == Qt.ApplicationState.ApplicationInactive + ): + SystemTray().send("Example finished!", "Go back to the app.") + self.finishSound.play() + + self.worker.finished.connect(finished) + self.worker.start() + + +# diff --git a/src/pages/settings.py b/src/pages/settings.py index cf4b2bd..2d3d8d6 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -8,74 +8,79 @@ FluentIcon, FlowLayout, SingleDirectionScrollArea, - Dialog + Dialog, ) from utils.config import config + class SettingsPage(QWidget): def __init__(self): super().__init__() self.setObjectName("Settings") - comboBox = ComboBoxSettingCard( + self.comboBox = ComboBoxSettingCard( config.style, FluentIcon.BRUSH, "Theme", "Change the theme mode of the app.", texts=[ - theme.value - if theme.value != qfluentwidgets.Theme.AUTO.value else "Automatic" - for theme in qfluentwidgets.Theme - ] + theme.value + if theme.value != qfluentwidgets.Theme.AUTO.value + else "Automatic" + for theme in qfluentwidgets.Theme + ], ) - comboBox.setMaximumWidth(500) + self.comboBox.setMaximumWidth(500) - colorPicker = ColorSettingCard( + self.colorPicker = ColorSettingCard( config.color, FluentIcon.PALETTE, "Color", "Change the primary color of the app.", ) - colorPicker.setMaximumWidth(500) - - settingsLayout = FlowLayout() - settingsLayout.addWidget(comboBox) - settingsLayout.addWidget(colorPicker) + self.colorPicker.setMaximumWidth(500) + self.settingsLayout = FlowLayout() + self.settingsLayout.addWidget(self.comboBox) + self.settingsLayout.addWidget(self.colorPicker) - dialog = Dialog( + self.dialog = Dialog( "Are you sure you want to reset all settings?", "Every value will return to its default if you proceed.", ) - dialog.setTitleBarVisible(False) - dialog.yesButton.setText("Reset") - dialog.cancelButton.setText("Cancel") + self.dialog.setTitleBarVisible(False) + self.dialog.yesButton.setText("Reset") + self.dialog.cancelButton.setText("Cancel") - reset = PrimaryToolButton( - FluentIcon.HISTORY + self.reset = PrimaryToolButton(FluentIcon.HISTORY) + self.reset.setFixedWidth(100) + self.reset.clicked.connect( + lambda: (config.reset() if self.dialog.exec() else None) ) - reset.setFixedWidth(100) - reset.clicked.connect(lambda: (config.reset() if dialog.exec() else None)) - resetLayout = QHBoxLayout() - resetLayout.addWidget(reset) + self.resetLayout = QHBoxLayout() + self.resetLayout.addWidget(self.reset) - contentWidget = QWidget() - contentLayout = QVBoxLayout(contentWidget) - contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - contentLayout.setContentsMargins(40, 40, 50, 40) - contentLayout.setSpacing(40) - contentLayout.addLayout(resetLayout) - contentLayout.addLayout(settingsLayout) + self.contentWidget = QWidget() + self.contentLayout = QVBoxLayout(self.contentWidget) + self.contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.contentLayout.setContentsMargins(40, 40, 50, 40) + self.contentLayout.setSpacing(40) + self.contentLayout.addLayout(self.resetLayout) + self.contentLayout.addLayout(self.settingsLayout) - scrollArea = SingleDirectionScrollArea(orient=Qt.Orientation.Vertical) - scrollArea.setWidget(contentWidget) - scrollArea.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding) - scrollArea.setWidgetResizable(True) - scrollArea.enableTransparentBackground() + self.scrollArea = SingleDirectionScrollArea( + orient=Qt.Orientation.Vertical + ) + self.scrollArea.setWidget(self.contentWidget) + self.scrollArea.setSizePolicy( + QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding + ) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.enableTransparentBackground() - mainLayout = QVBoxLayout() - mainLayout.addWidget(scrollArea) + self.mainLayout = QVBoxLayout() + self.mainLayout.addWidget(self.scrollArea) - self.setLayout(mainLayout) + self.setLayout(self.mainLayout) diff --git a/src/resources/sounds/error.wav b/src/resources/sounds/error.wav deleted file mode 100644 index bab727e8ce1f6dee10a73ce0ed61489ba7a546ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578942 zcmeFa2Urwm*Eha>mtL2)yRdYmt034AdoNL=CK`K5jEOO^#Ta`@G?o}^?1?6pXzUFO zDhPri3QF(0EOpu5%m3UAlU)$=$KbgXe#?lxj44LQv%cEv3pWh=k zx_flj*jN&2?yRM=V&N#nKY{^*0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU70fGU7 z0fK@5*BFqPNhBP|H+&gsd>vc*r~j3honcpJIFdzMFQd=?9+oq`y(c=-KSO(8I{IZf zNBgC>&-nMYzH9%^zV+YQEiq&AF3l1w?G2R z*63(4iit(gT1RyB2|GKofJDk|2Z=csd_chcz$0ND)sBo{+`nxXA1tvjjmN>VrQA8l9fKvO@EmF|OCh7gtss%a;1fc5E1W@h1Rp-fU;>T95qL)M1@;l5 z{{o4W1ku4DF(*OPl7QPW0Hl+^ZXD6DjKdd}9pQ5X6EKf}Y%Fg>4%mlq|1UVhG6LTU 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

XmUv0L)P0Hj7szTmO6 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 zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb zU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_ n12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbAOrs&=!F1P diff --git a/src/resources/sounds/success.wav b/src/resources/sounds/success.wav index 5a175de4f291ee62505d4cc10c8cabf1868dc77c..1f8c648cd4cf849d19de986809bb338d9690cdaf 100644 GIT binary patch literal 141198 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 literal 631566 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%0AH`U4ns`h7Wv&u`$-jI_un(ebe=M-e&l1F9 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 z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz z5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZ zD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0v zff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz5-5QZD1j0vff6Wz d5-5QZD1j0vff6Wz5-5QZD1j0vfe(Yg{{dq3);0hD diff --git a/src/utils/config.py b/src/utils/config.py index e9dfe17..3dd3d8b 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -1,7 +1,6 @@ import os import qfluentwidgets -from PySide6.QtCore import QLocale from qfluentwidgets import ( qconfig, QConfig, @@ -17,6 +16,7 @@ CONFIG_PATH = os.path.join(DATA_PATH, "config.json") + class ConfigItem(OptionsConfigItem): def set(self, value, save=False): self.value = value @@ -26,6 +26,7 @@ def set(self, value, save=False): def get(self): return self.value + class Config(QConfig): """ Global object for app options. @@ -36,10 +37,20 @@ class Config(QConfig): height = ConfigItem("Window", "Height", 500) x = ConfigItem("Window", "X", 0) y = ConfigItem("Window", "Y", 0) - style = ConfigItem("Window", "Style", qfluentwidgets.Theme.DARK, - OptionsValidator(qfluentwidgets.Theme), EnumSerializer(qfluentwidgets.Theme)) - color = ConfigItem("Window", "Color", qfluentwidgets.QColor("#4DA8DF"), - ColorValidator(qfluentwidgets.QColor()), ColorSerializer()) + style = ConfigItem( + "Window", + "Style", + qfluentwidgets.Theme.DARK, + OptionsValidator(qfluentwidgets.Theme), + EnumSerializer(qfluentwidgets.Theme), + ) + color = ConfigItem( + "Window", + "Color", + qfluentwidgets.QColor("#4DA8DF"), + ColorValidator(qfluentwidgets.QColor()), + ColorSerializer(), + ) smtpHost = ConfigItem("Email", "SMTPHost", "") smtpPort = ConfigItem("Email", "SMTPPort", "587") @@ -50,12 +61,15 @@ class Config(QConfig): bcc = ConfigItem("Email", "BCC", "") def reset(self): - for _, attr in self.__class__.__dict__.items(): - if isinstance(attr, ConfigItem): - attr.set(attr.defaultValue) + for _, attr in self.__class__.__dict__.items(): + if isinstance(attr, ConfigItem): + attr.set(attr.defaultValue) + config = Config() config.style.valueChanged.connect(lambda mode: (qfluentwidgets.setTheme(mode))) -config.color.valueChanged.connect(lambda color: (qfluentwidgets.setThemeColor(color))) +config.color.valueChanged.connect( + lambda color: (qfluentwidgets.setThemeColor(color)) +) qconfig.load(CONFIG_PATH, config) diff --git a/src/utils/constants.py b/src/utils/constants.py index 10c34b4..aecc4fc 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -5,7 +5,12 @@ EXECUTABLE_NAME = "E-neiler" AUTHOR_NAME = "NEIAAC" AUTHOR_DOMAIN = "neiaac.com" -LOGO_PATH = "resources/icons/logo.png" -DATA_PATH = os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.GenericConfigLocation), - AUTHOR_NAME, EXECUTABLE_NAME) +LOGO_PATH = "icons/logo.png" +DATA_PATH = os.path.join( + QStandardPaths.writableLocation( + QStandardPaths.StandardLocation.GenericConfigLocation + ), + AUTHOR_NAME, + EXECUTABLE_NAME, +) SUPPORTED_TABLE_FORMATS = ["csv", "xlsx"] diff --git a/src/utils/path.py b/src/utils/loader.py similarity index 51% rename from src/utils/path.py rename to src/utils/loader.py index 0c36c22..6a18b6b 100644 --- a/src/utils/path.py +++ b/src/utils/loader.py @@ -1,6 +1,12 @@ import os -def fromBase(suffix: str) -> str: + +def base(suffix: str) -> str: current = os.path.dirname(os.path.realpath(__file__)) root = os.path.abspath(os.path.join(current, "..", suffix)) return root + + +def resources(suffix: str) -> str: + parsed = base(os.path.join("resources", suffix)) + return parsed diff --git a/src/utils/logger.py b/src/utils/logger.py index 0ef2542..d40898d 100644 --- a/src/utils/logger.py +++ b/src/utils/logger.py @@ -1,13 +1,17 @@ +import datetime import os import sys from loguru import logger +from PySide6 import QtCore from utils.constants import DATA_PATH LOGS_PATH = os.path.join(DATA_PATH, "logs") -formatter = "[{time:YYYY-MM-DDTHH:mm:ss.SSS[Z]!UTC}] [{level}] {message}" +formatter = ( + "[{time:YYYY-MM-DDTHH:mm:ss.SSS[Z]!UTC}] [{level}] {message}" +) dev = "__compiled__" not in globals() @@ -15,10 +19,31 @@ logger.level("INFO", color="") if dev: - logger.add(sys.stdout, colorize=True, format=formatter, level="DEBUG") - -logger.add(os.path.join(LOGS_PATH, "{time:YYYY-MM-DD!UTC}.log".replace("\\", "/")), - format=formatter, - rotation="00:00", - retention="30 days", - level="DEBUG" if dev else "INFO") + logger.add( + sys.stdout, colorize=True, format=formatter, level="DEBUG", enqueue=True + ) + +logger.add( + os.path.join(LOGS_PATH, "{time:YYYY-MM-DD!UTC}.log".replace("\\", "/")), + format=formatter, + rotation=datetime.time(0, 0, 0, tzinfo=datetime.timezone.utc), + retention="30 days", + enqueue=True, + level="DEBUG" if dev else "INFO", +) + + +def qMessageHandler( + mode: QtCore.QtMsgType, _: QtCore.QMessageLogContext, message: str +): + match mode: + case QtCore.QtMsgType.QtInfoMsg: + logger.info(message) + case QtCore.QtMsgType.QtWarningMsg: + logger.warning(message) + case QtCore.QtMsgType.QtCriticalMsg: + logger.error(message) + case QtCore.QtMsgType.QtFatalMsg: + logger.critical(message) + case _: + logger.debug(message) diff --git a/src/utils/notifications.py b/src/utils/notifications.py deleted file mode 100644 index 31bd789..0000000 --- a/src/utils/notifications.py +++ /dev/null @@ -1,17 +0,0 @@ -from PySide6.QtWidgets import QSystemTrayIcon -from PySide6.QtGui import QIcon, QPixmap - -from utils.constants import LOGO_PATH -from utils import path - -class Notifications(QSystemTrayIcon): - def __init__(self): - super().__init__() - - self.setIcon(QIcon(QPixmap(path.fromBase(LOGO_PATH)))) - - def send(self, title: str, body: str): - """Allows sending tray messages with an hidden tray icon.""" - self.setVisible(True) - self.showMessage(title, body) - self.setVisible(False) diff --git a/src/utils/system_tray.py b/src/utils/system_tray.py new file mode 100644 index 0000000..03c7531 --- /dev/null +++ b/src/utils/system_tray.py @@ -0,0 +1,23 @@ +from PySide6.QtWidgets import QSystemTrayIcon +from PySide6.QtGui import QIcon, QPixmap + +from utils.constants import LOGO_PATH +from utils import loader + + +class SystemTray(QSystemTrayIcon): + def __init__(self, visible: bool = False): + super().__init__() + + self.setIcon(QIcon(QPixmap(loader.resources(LOGO_PATH)))) + self.setVisible(visible) + + def send(self, title: str, body: str, messageClicked: callable = None): + """Allows sending tray messages without showing an icon in the system tray.""" + self.messageClicked.connect(messageClicked) + visible = self.isVisible() + if not visible: + self.setVisible(True) + self.showMessage(title, body) + if not visible: + self.setVisible(False) diff --git a/src/window.py b/src/window.py index dea79fa..51104a2 100644 --- a/src/window.py +++ b/src/window.py @@ -5,15 +5,21 @@ old = sys.stdout sys.stdout = open(os.devnull, "w") import qfluentwidgets - from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition, SplashScreen + from qfluentwidgets import ( + FluentWindow, + FluentIcon, + NavigationItemPosition, + SplashScreen, + ) finally: sys.stdout.close() sys.stdout = old -from PySide6.QtCore import QSize, QPoint, QEventLoop, QTimer +from PySide6.QtCore import QSize, QPoint from utils.config import config from pages.home import HomePage from pages.settings import SettingsPage +from pages.help import HelpPage class Window(FluentWindow): def __init__(self): @@ -33,7 +39,15 @@ def __init__(self): self.show() self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") - self.addSubInterface(SettingsPage(), FluentIcon.SETTING, "Settings", NavigationItemPosition.BOTTOM) + self.addSubInterface( + HelpPage(), FluentIcon.HELP, "Help", NavigationItemPosition.BOTTOM + ) + self.addSubInterface( + SettingsPage(), + FluentIcon.SETTING, + "Settings", + NavigationItemPosition.BOTTOM, + ) self.splashScreen.finish() diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/window_test.py b/test/window_test.py new file mode 100644 index 0000000..88425bc --- /dev/null +++ b/test/window_test.py @@ -0,0 +1,16 @@ +from pytestqt.qt_compat import qt_api as qtapi + +from window import Window + +def testWindow(qtbot): + """ + Simple test to ensure we are setting up the Window correctly. + """ + assert qtapi.QtWidgets.QApplication.instance() is not None + window = Window() + qtbot.addWidget(window) + window.setWindowTitle("W1") + window.show() + + assert window.isVisible() + assert window.windowTitle() == "W1" From 42d6e0db1cca2167be99e607793362a39a50c2a8 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Mon, 21 Oct 2024 04:46:55 +0100 Subject: [PATCH 10/17] fix tests --- test/app_test.py | 15 +++++++++++++++ test/window_test.py | 20 ++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 test/app_test.py diff --git a/test/app_test.py b/test/app_test.py new file mode 100644 index 0000000..42038f9 --- /dev/null +++ b/test/app_test.py @@ -0,0 +1,15 @@ +import pytest + +from app import App +from utils.constants import AUTHOR_NAME, AUTHOR_DOMAIN, EXECUTABLE_NAME + +@pytest.fixture(scope="session") +def qapp_cls(): + return App + +def testAppMeta(qapp: App): + assert qapp.applicationName() == "pytest-qt-qapp" + qapp.setApplicationName(EXECUTABLE_NAME) + assert qapp.applicationName() == EXECUTABLE_NAME + assert qapp.organizationName() == AUTHOR_NAME + assert qapp.organizationDomain() == AUTHOR_DOMAIN diff --git a/test/window_test.py b/test/window_test.py index 88425bc..6d0b4b4 100644 --- a/test/window_test.py +++ b/test/window_test.py @@ -1,12 +1,9 @@ -from pytestqt.qt_compat import qt_api as qtapi +from PySide6 import QtCore +from pytestqt.qtbot import QtBot from window import Window -def testWindow(qtbot): - """ - Simple test to ensure we are setting up the Window correctly. - """ - assert qtapi.QtWidgets.QApplication.instance() is not None +def testSetup(qtbot: QtBot): window = Window() qtbot.addWidget(window) window.setWindowTitle("W1") @@ -14,3 +11,14 @@ def testWindow(qtbot): assert window.isVisible() assert window.windowTitle() == "W1" + +def testExitButton(qtbot: QtBot): + window = Window() + qtbot.addWidget(window) + window.show() + + assert window.isVisible() + + qtbot.mouseClick(window.titleBar.closeBtn, QtCore.Qt.MouseButton.LeftButton) + + assert not window.isVisible() From 9fd1a697338d07bd29be7a00e27bb5e05f9f1f9b Mon Sep 17 00:00:00 2001 From: dy0gu Date: Mon, 21 Oct 2024 15:01:50 +0100 Subject: [PATCH 11/17] ci: add commit hooks --- .pre-commit-config.yaml | 7 +++++ README.md | 60 +++++++++++++++++++++++++++++++++++++---- pyproject.toml | 3 ++- src/__init__.py | 0 src/app.py | 4 --- test/__init__.py | 0 test/app_test.py | 20 ++++++++++++-- test/window_test.py | 7 +++-- 8 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 .pre-commit-config.yaml delete mode 100644 src/__init__.py delete mode 100644 test/__init__.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0f7ff0f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.7.0 + hooks: + - id: ruff + args: [--fix, --exit-zero] + - id: ruff-format diff --git a/README.md b/README.md index aa18d3e..081eb55 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,40 @@ # Quick and reliable ✉️➡️ +E-neiler makes it easy to quickly send high amounts of emails with tabled data through SMTP, file attachments included. It works on your custom server, gmail, outlook and any other service that allows SMTP. We support a variety of file types for both the body templates and the data tables. + ## Requirements 📋 - Python 3.12.0+ ## Usage 🚀 -## Development 🛠️ +- Go to the `Releases` page of the GitHub repository. -- Clone the repository: +- Under the `Assets` section for the latest release, click the entry with the name of your operating system. - ```shell - git clone https://github.com/NEIAAC/e-neiler.git - ``` +- After downloading, extract the top content from the `.zip` to anywhere you want. + +### Windows + +- Run the `main.exe` file inside the extracted folder, you can create a shortcut with any name you like for this file. + +### Linux + +- Run the `main.bin` file inside the extracted folder. Note that compilation is targeted at Ubuntu (Wayland), other distributions may need additional actions to run the app. + +### MacOS + +- Run the bundle installer extracted from the `.zip` file. + +## Development 🛠️ + +- Clone the repository and open a terminal **inside** it. - Install the dependencies: ```shell + # It is it recommend that a virtual environment is set before doing this! + pip install . ``` @@ -25,3 +43,35 @@ ```shell python src/main.py ``` + +## Tooling 🧰 + +- Ruff is used as a linter and formatter: + + ```shell + pip install .[check] + ruff check --fix + ruff format + + # To automatically lint and format on every commit install the pre-commit hooks: + pre-commit install + + # Note that when using pre-commit the git command will fail if any files are lint fixed or formatted. + # You will have to add the changed files to the staged area and commit again to apply the changes. + ``` + +- PyTest and PyTest-Qt are used for testing: + + ```shell + pip install .[test] + pytest + ``` + +- Nuitka is used for cross-compiling to all supported platforms: + + ```shell + pip install .[build] + nuitka + ``` + + See the build [workflow](./.github/workflows/build.yaml) for a list of options used for each platform. diff --git a/pyproject.toml b/pyproject.toml index 49ab577..6d8f1b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ [project.optional-dependencies] -check = ["ruff==0.6.9"] +check = ["ruff==0.6.9", "pre-commit==4.0.1"] test = ["pytest==8.3.3", "pytest-qt==4.4.0", "pytest-xvfb==3.0.0"] build = ["nuitka==2.4.8", "imageio==2.36.0"] @@ -30,6 +30,7 @@ quote-style = "double" indent-style = "space" [tool.pytest.ini_options] +qt_qapp_name = "Test" addopts = "-ra" testpaths = ["test"] python_files = ["*_test.py"] diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/app.py b/src/app.py index 53695d7..047fba4 100644 --- a/src/app.py +++ b/src/app.py @@ -1,5 +1,4 @@ from PySide6.QtWidgets import QApplication -from PySide6.QtCore import Qt from PySide6.QtGui import QIcon, QPixmap from version import __version__ @@ -22,9 +21,6 @@ def __init__(self, argv: list[str]): self.setOrganizationDomain(AUTHOR_DOMAIN) self.setApplicationVersion(__version__) self.setWindowIcon(QIcon(QPixmap(loader.resources(LOGO_PATH)))) - self.setHighDpiScaleFactorRoundingPolicy( - Qt.HighDpiScaleFactorRoundingPolicy.PassThrough - ) data = [ self.applicationName(), diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/app_test.py b/test/app_test.py index 42038f9..8d047b1 100644 --- a/test/app_test.py +++ b/test/app_test.py @@ -1,15 +1,31 @@ import pytest +from PySide6.QtGui import QIcon, QPixmap + from app import App -from utils.constants import AUTHOR_NAME, AUTHOR_DOMAIN, EXECUTABLE_NAME +from version import __version__ +from utils import loader +from utils.constants import ( + AUTHOR_NAME, + AUTHOR_DOMAIN, + EXECUTABLE_NAME, + LOGO_PATH, +) + @pytest.fixture(scope="session") def qapp_cls(): return App + def testAppMeta(qapp: App): - assert qapp.applicationName() == "pytest-qt-qapp" + assert qapp.applicationName() == "Test" qapp.setApplicationName(EXECUTABLE_NAME) assert qapp.applicationName() == EXECUTABLE_NAME + assert qapp.applicationVersion() == __version__ assert qapp.organizationName() == AUTHOR_NAME assert qapp.organizationDomain() == AUTHOR_DOMAIN + assert ( + qapp.windowIcon().pixmap(16, 16).toImage() + == QIcon(QPixmap(loader.resources(LOGO_PATH))).pixmap(16, 16).toImage() + ) diff --git a/test/window_test.py b/test/window_test.py index 6d0b4b4..9aed101 100644 --- a/test/window_test.py +++ b/test/window_test.py @@ -3,14 +3,17 @@ from window import Window + def testSetup(qtbot: QtBot): window = Window() + name = "Test" qtbot.addWidget(window) - window.setWindowTitle("W1") + window.setWindowTitle(name) window.show() assert window.isVisible() - assert window.windowTitle() == "W1" + assert window.windowTitle() == name + def testExitButton(qtbot: QtBot): window = Window() From bfa8b8c2ad3a6f8fdc5d4048ed478c559b7f03ac Mon Sep 17 00:00:00 2001 From: dy0gu Date: Tue, 22 Oct 2024 10:13:49 +0100 Subject: [PATCH 12/17] ci: rename format job --- .github/workflows/code.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code.yaml b/.github/workflows/code.yaml index 606e7a2..c6adbdd 100644 --- a/.github/workflows/code.yaml +++ b/.github/workflows/code.yaml @@ -6,7 +6,7 @@ on: pull_request_target: jobs: - style: + format: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 005bdb488edebabf4bf033ff95eba5b9789f1488 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Wed, 23 Oct 2024 02:45:46 +0100 Subject: [PATCH 13/17] refactor: update to new ui design --- {assets => example}/certificate.pdf | Bin {assets => example}/invoice.pdf | Bin {assets => example}/table.csv | 0 {assets => example}/template.txt | 0 src/logic/email.py | 14 +- src/pages/help.py | 34 ++-- src/pages/home.py | 282 +++++++++++++++------------- src/pages/settings.py | 8 +- src/utils/config.py | 7 - src/window.py | 1 + 10 files changed, 176 insertions(+), 170 deletions(-) rename {assets => example}/certificate.pdf (100%) rename {assets => example}/invoice.pdf (100%) rename {assets => example}/table.csv (100%) rename {assets => example}/template.txt (100%) diff --git a/assets/certificate.pdf b/example/certificate.pdf similarity index 100% rename from assets/certificate.pdf rename to example/certificate.pdf diff --git a/assets/invoice.pdf b/example/invoice.pdf similarity index 100% rename from assets/invoice.pdf rename to example/invoice.pdf diff --git a/assets/table.csv b/example/table.csv similarity index 100% rename from assets/table.csv rename to example/table.csv diff --git a/assets/template.txt b/example/template.txt similarity index 100% rename from assets/template.txt rename to example/template.txt diff --git a/src/logic/email.py b/src/logic/email.py index 9aab68f..18122c5 100644 --- a/src/logic/email.py +++ b/src/logic/email.py @@ -14,23 +14,13 @@ def __init__(self, data: str): def output(self, text: str, level="INFO"): logger.log(level, text) - timestamped = f"[{datetime.now().strftime('%H:%M:%S')}] {text}\n" + timestamped = f"[{datetime.now().strftime('%H:%M:%S')}] {text}" self.outputSignal.emit(timestamped) def run(self): try: self.output( - "This is the start message, we will now wait for 3 seconds to simulate some work" - ) - self.msleep(3000) - - self.output( - f'You entered "{self.data}" in the input. We will now wait 3 more seconds' - ) - self.msleep(3000) - - self.output( - "Example finished, a sound was played. If the app is minimized it will also flash in the taskbar and you will receive a system notification" + f"{self.data}", ) except Exception as e: self.output(str(e), "ERROR") diff --git a/src/pages/help.py b/src/pages/help.py index bd853a4..1970e22 100644 --- a/src/pages/help.py +++ b/src/pages/help.py @@ -11,8 +11,8 @@ def __init__(self): super().__init__() self.setObjectName("Help") - helpText = BodyLabel( - f""" + self.helpText = BodyLabel( + """

Help

@@ -25,22 +25,24 @@ def __init__(self): """, ) - contentWidget = QWidget() - contentLayout = QVBoxLayout(contentWidget) - contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - contentLayout.setContentsMargins(40, 40, 50, 40) - contentLayout.setSpacing(40) - contentLayout.addWidget(helpText) + self.contentWidget = QWidget() + self.contentLayout = QVBoxLayout(self.contentWidget) + self.contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.contentLayout.setContentsMargins(40, 40, 50, 40) + self.contentLayout.setSpacing(40) + self.contentLayout.addWidget(self.helpText) - scrollArea = SingleDirectionScrollArea(orient=Qt.Orientation.Vertical) - scrollArea.setWidget(contentWidget) - scrollArea.setSizePolicy( + self.scrollArea = SingleDirectionScrollArea( + orient=Qt.Orientation.Vertical + ) + self.scrollArea.setWidget(self.contentWidget) + self.scrollArea.setSizePolicy( QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding ) - scrollArea.setWidgetResizable(True) - scrollArea.enableTransparentBackground() + self.scrollArea.setWidgetResizable(True) + self.scrollArea.enableTransparentBackground() - mainLayout = QVBoxLayout() - mainLayout.addWidget(scrollArea) + self.mainLayout = QVBoxLayout() + self.mainLayout.addWidget(self.scrollArea) - self.setLayout(mainLayout) + self.setLayout(self.mainLayout) diff --git a/src/pages/home.py b/src/pages/home.py index 9b0f668..3adf7a2 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -2,7 +2,6 @@ QWidget, QVBoxLayout, QHBoxLayout, - QLabel, QFileDialog, QSizePolicy, ) @@ -11,7 +10,7 @@ from qfluentwidgets import ( LineEdit, PasswordLineEdit, - TextEdit, + BodyLabel, PrimaryToolButton, FluentIcon, SingleDirectionScrollArea, @@ -25,7 +24,6 @@ from utils.config import config from utils import loader from utils.system_tray import SystemTray -from utils.constants import SUPPORTED_TABLE_FORMATS class HomePage(QWidget): @@ -39,7 +37,6 @@ def __init__(self): ) self.finishSound.setVolume(0.2) - # SMTP settings self.smtpHostInput = LineEdit() self.smtpHostInput.setMaximumWidth(500) self.smtpHostInput.setText(config.smtpHost.get()) @@ -47,7 +44,7 @@ def __init__(self): self.smtpHostInput.textChanged.connect( lambda text: config.smtpHost.set(text) ) - self.smtphostLabel = QLabel("SMTP HOST") + self.smtphostLabel = BodyLabel("SMTP HOST*") self.smtpPortInput = LineEdit() self.smtpPortInput.setMaximumWidth(500) @@ -55,7 +52,7 @@ def __init__(self): self.smtpPortInput.textChanged.connect( lambda text: config.smtpPort.set(text) ) - self.smtpPortLabel = QLabel("SMTP PORT") + self.smtpPortLabel = BodyLabel("SMTP PORT*") self.smtpHostInputLayout = QVBoxLayout() self.smtpHostInputLayout.setSpacing(10) @@ -78,7 +75,7 @@ def __init__(self): self.smtpUsernameInput.textChanged.connect( lambda text: config.smtpUsername.set(text) ) - self.smtpusernameLabel = QLabel("SMTP USERNAME") + self.smtpusernameLabel = BodyLabel("SMTP USERNAME*") self.smtpUsernameLayout = QVBoxLayout() self.smtpUsernameLayout.setSpacing(10) @@ -91,7 +88,7 @@ def __init__(self): self.smtpPasswordInput.textChanged.connect( lambda text: config.smtpPassword.set(text) ) - self.smtppasswordLabel = QLabel("SMTP PASSWORD") + self.smtppasswordLabel = BodyLabel("SMTP PASSWORD*") self.smtpPasswordLayout = QVBoxLayout() self.smtpPasswordLayout.setSpacing(10) @@ -108,24 +105,26 @@ def __init__(self): self.smtpLayout.addLayout(self.smtpServerLayout) self.smtpLayout.addLayout(self.smtpAuthLayout) - # Email headers + self.subjectLabel = BodyLabel("SUBJECT*") self.subjectInput = LineEdit() + self.subjectInput.setPlaceholderText( + "The title of the email goes here." + ) self.subjectInput.setMaximumWidth(500) - self.subjectLabel = QLabel("SUBJECT") self.ccInput = LineEdit() self.ccInput.setMaximumWidth(500) self.ccInput.setPlaceholderText( "Use a comma (,) to separate emails you want to CC!" ) - self.ccLabel = QLabel("CC") + self.ccLabel = BodyLabel("CC") self.bccInput = LineEdit() self.bccInput.setMaximumWidth(500) self.bccInput.setPlaceholderText( "Use a comma (,) to separate emails you want to BCC!" ) - self.bccLabel = QLabel("BCC") + self.bccLabel = BodyLabel("BCC") self.headLayout = QVBoxLayout() self.headLayout.setSpacing(10) @@ -136,96 +135,104 @@ def __init__(self): self.headLayout.addWidget(self.bccLabel) self.headLayout.addWidget(self.bccInput) + self.templateLabel = BodyLabel("TEMPLATE FILE*") self.templatePicker = QFileDialog() self.templatePicker.setFileMode(QFileDialog.FileMode.ExistingFile) - self.templateContentBox = TextEdit() - self.templateContentBox.setMinimumHeight(150) - self.templateContentBox.setReadOnly(True) - self.templateContentBox.setPlaceholderText( - "Use the button on the left to load a template for the email body and visualize it here..." - ) - - self.clearTemplateButton = PrimaryToolButton(FluentIcon.DELETE) - self.clearTemplateButton.setDisabled(True) - self.clearTemplateButton.clicked.connect( - lambda: self.clearTemplate( - self.templateContentBox, self.clearTemplateButton - ) - ) + self.templateFileBox = LineEdit() + self.templateFileBox.setMaximumWidth(500) + self.templateFileBox.setReadOnly(True) + self.templateFileBox.setPlaceholderText("No template file selected.") - self.templatePickerButton = PrimaryToolButton(FluentIcon.FOLDER) - self.templatePickerButton.clicked.connect( - lambda: self.loadEmailBody( - self.templateContentBox, - self.clearTemplateButton, - self.templatePicker, - ) - ) + self.templateFilePickButton = PrimaryToolButton(FluentIcon.FOLDER) + self.templateFilePickButton.clicked.connect(self.pickTemplateFile) - self.templateButtonsLayout = QVBoxLayout() - self.templateButtonsLayout.setSpacing(10) - self.templateButtonsLayout.addWidget(self.templatePickerButton) - self.templateButtonsLayout.addWidget(self.clearTemplateButton) - self.templateButtonsLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.templateContentLayout = QHBoxLayout() + self.templateContentLayout.setSpacing(10) + self.templateContentLayout.addWidget(self.templateFilePickButton) + self.templateContentLayout.addWidget(self.templateFileBox) - self.templateLayout = QHBoxLayout() + self.templateLayout = QVBoxLayout() self.templateLayout.setSpacing(10) - self.templateLayout.addLayout(self.templateButtonsLayout) - self.templateLayout.addWidget(self.templateContentBox) + self.templateLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.templateLayout.addWidget(self.templateLabel) + self.templateLayout.addLayout(self.templateContentLayout) - self.tableFilePathLabel = QLabel("No table file selected") - self.tableFilePathLabel.setMaximumWidth(500) + self.tableLabel = BodyLabel("TABLE FILE*") + self.tableFileInput = LineEdit() + self.tableFileInput.setReadOnly(True) + self.tableFileInput.setMaximumWidth(500) + self.tableFileInput.setPlaceholderText("No table file selected.") - self.tableFilePickerButton = PrimaryToolButton(FluentIcon.FOLDER) - self.tableFilePickerButton.clicked.connect( - lambda: self.selectFile(self.tableFilePathLabel) - ) + self.tableFilePickButton = PrimaryToolButton(FluentIcon.FOLDER) + self.tableFilePickButton.clicked.connect(self.pickTableFile) - self.clearTableButton = PrimaryToolButton(FluentIcon.DELETE) - self.clearTableButton.setDisabled(True) - self.clearTableButton.clicked.connect( - lambda: self.clearSelectedFile( - self.tableFilePathLabel, self.clearTableButton - ) - ) - - self.tablePickerLayout = QHBoxLayout() - self.tablePickerLayout.setSpacing(10) - self.tablePickerLayout.addWidget(self.tableFilePickerButton) - self.tablePickerLayout.addWidget(self.tableFilePathLabel) + self.tableContentLayout = QHBoxLayout() + self.tableContentLayout.setSpacing(10) + self.tableContentLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.tableContentLayout.addWidget(self.tableFilePickButton) + self.tableContentLayout.addWidget(self.tableFileInput) self.tableLayout = QVBoxLayout() - self.tableLayout.addLayout(self.tablePickerLayout) - self.tableLayout.addWidget(self.clearTableButton) - - self.outputBox = PlainTextEdit() - self.outputBox.setMinimumHeight(150) - self.outputBox.setReadOnly(True) - self.outputBox.setPlaceholderText("Progress will be shown here.") - - self.outputClearButton = PrimaryToolButton(FluentIcon.DELETE) - self.outputClearButton.setDisabled(True) - self.outputClearButton.clicked.connect(self.outputBox.clear) + self.tableLayout.setSpacing(10) + self.tableLayout.addWidget(self.tableLabel) + self.tableLayout.addLayout(self.tableContentLayout) + + self.attachmentLabel = BodyLabel("ATTACHMENTS DIRECTORY*") + self.attachmentFolderInput = LineEdit() + self.attachmentFolderInput.setReadOnly(True) + self.attachmentFolderInput.setMaximumWidth(500) + self.attachmentFolderInput.setPlaceholderText( + "No attachment folder selected." + ) - self.outputButtonLayout = QVBoxLayout() - self.outputButtonLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - self.outputButtonLayout.setSpacing(10) - self.outputButtonLayout.addWidget(self.outputClearButton) + self.attachmentFolderPickButton = PrimaryToolButton(FluentIcon.FOLDER) + self.attachmentFolderPickButton.clicked.connect( + self.pickAttachmentFolder + ) + self.attachmentContentLayout = QHBoxLayout() + self.attachmentContentLayout.setSpacing(10) + self.attachmentContentLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.attachmentContentLayout.addWidget(self.attachmentFolderPickButton) + self.attachmentContentLayout.addWidget(self.attachmentFolderInput) + + self.attachmentLayout = QVBoxLayout() + self.attachmentLayout.setSpacing(10) + self.attachmentLayout.addWidget(self.attachmentLabel) + self.attachmentLayout.addLayout(self.attachmentContentLayout) + + self.runLogsBox = PlainTextEdit() + self.runLogsBox.setMinimumHeight(150) + self.runLogsBox.setReadOnly(True) + self.runLogsBox.setPlaceholderText( + "Press the button on the left to start.\nLog output from the run will be shown here." + ) - self.outputLayout = QHBoxLayout() - self.outputLayout.setSpacing(10) - self.outputLayout.addLayout(self.outputButtonLayout) - self.outputLayout.addWidget(self.outputBox) + self.worker = None + self.runButton = PrimaryToolButton(FluentIcon.PLAY) + self.runButton.setFixedWidth(100) + self.runButton.clicked.connect(self.runEmailer) + + self.runLogsClearButton = PrimaryToolButton(FluentIcon.DELETE) + self.runLogsClearButton.setDisabled(True) + self.runLogsClearButton.setFixedWidth(100) + self.runLogsClearButton.clicked.connect( + lambda: ( + self.runLogsBox.clear(), + self.runLogsClearButton.setDisabled(True), + ) + ) - self.startButton = PrimaryToolButton(FluentIcon.PLAY) - self.startButton.setFixedWidth(100) + self.runButtonLayout = QVBoxLayout() + self.runButtonLayout.setSpacing(10) + self.runButtonLayout.setAlignment(Qt.AlignmentFlag.AlignTop) + self.runButtonLayout.addWidget(self.runButton) + self.runButtonLayout.addWidget(self.runLogsClearButton) - self.worker = None - self.startButtonLayout = QHBoxLayout() - self.startButtonLayout.setAlignment(Qt.AlignmentFlag.AlignRight) - self.startButtonLayout.addWidget(self.startButton) - self.startButton.clicked.connect(self.runEmailer) + self.runContentLayout = QHBoxLayout() + self.runContentLayout.setSpacing(10) + self.runContentLayout.addLayout(self.runButtonLayout) + self.runContentLayout.addWidget(self.runLogsBox) self.contentWidget = QWidget() self.contentLayout = QVBoxLayout(self.contentWidget) @@ -236,8 +243,8 @@ def __init__(self): self.contentLayout.addLayout(self.headLayout) self.contentLayout.addLayout(self.templateLayout) self.contentLayout.addLayout(self.tableLayout) - self.contentLayout.addWidget(self.outputBox) - self.contentLayout.addLayout(self.startButtonLayout) + self.contentLayout.addLayout(self.attachmentLayout) + self.contentLayout.addLayout(self.runContentLayout) self.scrollArea = SingleDirectionScrollArea( orient=Qt.Orientation.Vertical @@ -254,64 +261,71 @@ def __init__(self): self.setLayout(self.mainLayout) - def loadEmailBody( - self, templateContentBox, clearTemplateButton, templatePicker - ): - filePath, _ = templatePicker.getOpenFileName() - if filePath: - with open(filePath, "r", encoding="utf-8") as file: - fileContent = file.read() - if filePath.endswith(".html"): - templateContentBox.setHtml(fileContent) - else: - templateContentBox.setText(fileContent) - clearTemplateButton.setDisabled(False) - - def clearTemplate(self, templateContentBox, clearTemplateButton): - templateContentBox.clear() - clearTemplateButton.setDisabled(True) - - def selectFile(self, filePathLabel): - file_dialog = QFileDialog() - file_dialog.setFileMode(QFileDialog.FileMode.ExistingFiles) - file_dialog.setNameFilters(SUPPORTED_TABLE_FORMATS) - - if file_dialog.exec(): - selected_files = file_dialog.selectedFiles() - if selected_files: - filePathLabel.setText(selected_files[0]) - - def clearSelectedFile(self, filePathLabel, clearButton): - filePathLabel.setText("No table file selected") - clearButton.setDisabled(True) + def pickTemplateFile(self): + dialog = QFileDialog() + dialog.setFileMode(QFileDialog.FileMode.ExistingFile) + self.templateFileBox.setText( + dialog.getOpenFileName(self, "Select a template file!")[0] + ) + + def pickTableFile(self): + dialog = QFileDialog() + dialog.setFileMode(QFileDialog.FileMode.ExistingFile) + self.tableFileInput.setText( + dialog.getOpenFileName( + self, "Select a table file!", "", "Table (*.csv *.xlsx)" + )[0] + ) + + def pickAttachmentFolder(self): + dialog = QFileDialog() + dialog.setFileMode(QFileDialog.FileMode.Directory) + dialog.setOption(QFileDialog.Option.ShowDirsOnly, True) + self.attachmentFolderInput.setText( + dialog.getExistingDirectory( + self, + "Select the directory to load table attachments from!", + ) + ) def runEmailer(self): """Runs the example logic for this page.""" if self.worker is not None and self.worker.isRunning(): return - if not self.templateContentBox.toPlainText(): - InfoBar.error( - title="Template is empty!", - content="", - isClosable=True, - position=InfoBarPosition.TOP_RIGHT, - duration=4000, - parent=self, - ) - return - - self.startButton.setDisabled(True) - self.worker = EmailerThread(self.templateContentBox.toPlainText()) + schema = { + "SMTP Host": self.smtpHostInput.text(), + "SMTP Port": self.smtpPortInput.text(), + "SMTP Username": self.smtpUsernameInput.text(), + "SMTP Password": self.smtpPasswordInput.text(), + "Subject": self.subjectInput.text(), + "Table file": self.tableFileInput.text(), + "Attachment folder": self.attachmentFolderInput.text(), + "Template file": self.templateFileBox.text(), + } + for input in schema: + if not schema[input]: + InfoBar.error( + title=f"{input} field is empty!", + content="", + isClosable=True, + position=InfoBarPosition.TOP_RIGHT, + duration=4000, + parent=self, + ) + return + + self.runButton.setDisabled(True) + self.worker = EmailerThread(self.templateFileBox.text()) self.worker.outputSignal.connect( lambda text: ( - self.outputBox.appendPlainText(text), - self.outputClearButton.setDisabled(False), + self.runLogsBox.appendPlainText(text), + self.runLogsClearButton.setDisabled(False), ) ) def finished(): - self.startButton.setDisabled(False) + self.runButton.setDisabled(False) App.alert(self, 0) if ( App.applicationState() diff --git a/src/pages/settings.py b/src/pages/settings.py index 2d3d8d6..4182589 100644 --- a/src/pages/settings.py +++ b/src/pages/settings.py @@ -32,6 +32,9 @@ def __init__(self): ], ) self.comboBox.setMaximumWidth(500) + config.style.valueChanged.connect( + lambda mode: (qfluentwidgets.setTheme(mode)) + ) self.colorPicker = ColorSettingCard( config.color, @@ -40,6 +43,9 @@ def __init__(self): "Change the primary color of the app.", ) self.colorPicker.setMaximumWidth(500) + config.color.valueChanged.connect( + lambda color: (qfluentwidgets.setThemeColor(color)) + ) self.settingsLayout = FlowLayout() self.settingsLayout.addWidget(self.comboBox) @@ -53,7 +59,7 @@ def __init__(self): self.dialog.yesButton.setText("Reset") self.dialog.cancelButton.setText("Cancel") - self.reset = PrimaryToolButton(FluentIcon.HISTORY) + self.reset = PrimaryToolButton(FluentIcon.DELETE) self.reset.setFixedWidth(100) self.reset.clicked.connect( lambda: (config.reset() if self.dialog.exec() else None) diff --git a/src/utils/config.py b/src/utils/config.py index 3dd3d8b..f3ba748 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -56,9 +56,6 @@ class Config(QConfig): smtpPort = ConfigItem("Email", "SMTPPort", "587") smtpUsername = ConfigItem("Email", "SMTPUsername", "") smtpPassword = ConfigItem("Email", "SMTPPassword", "") - subject = ConfigItem("Email", "Subject", "") - cc = ConfigItem("Email", "CC", "") - bcc = ConfigItem("Email", "BCC", "") def reset(self): for _, attr in self.__class__.__dict__.items(): @@ -67,9 +64,5 @@ def reset(self): config = Config() -config.style.valueChanged.connect(lambda mode: (qfluentwidgets.setTheme(mode))) -config.color.valueChanged.connect( - lambda color: (qfluentwidgets.setThemeColor(color)) -) qconfig.load(CONFIG_PATH, config) diff --git a/src/window.py b/src/window.py index 51104a2..0a9d7d5 100644 --- a/src/window.py +++ b/src/window.py @@ -21,6 +21,7 @@ from pages.settings import SettingsPage from pages.help import HelpPage + class Window(FluentWindow): def __init__(self): super().__init__() From 6ac338b42f20c4a6a4fd6e64ae26ac9aacee8d08 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Wed, 23 Oct 2024 17:31:29 +0100 Subject: [PATCH 14/17] fix: improve send logic --- example/table.csv | 10 +- example/template.txt | 2 +- src/logic/email.py | 219 ++++++++++++++++++++++++++++++++++++++++--- src/pages/home.py | 38 +++++--- 4 files changed, 239 insertions(+), 30 deletions(-) diff --git a/example/table.csv b/example/table.csv index 5c0c991..2c0aaca 100644 --- a/example/table.csv +++ b/example/table.csv @@ -1,5 +1,5 @@ -EMAIL,NAME,FILE -bob@example.com,Bob,assets/certificate.pdf -alice@example.com,Alice,assets/invoice.pdf -robert@example.com,Robert,assets/certificate.pdf -carl@example.com,Carl,assets/invoice.pdf +,,NAME,OPTIONAL_EXTRA +bob@example.com,"certificate.pdf,invoice.pdf",Bob, +alice@example.com,certificate.pdf,Alice, +robert@example.com,certificate.pdf,Robert, +carl@example.com,,Carl,And you get some extra text since you have no files! diff --git a/example/template.txt b/example/template.txt index 820ea9e..e9e7aa2 100644 --- a/example/template.txt +++ b/example/template.txt @@ -1,6 +1,6 @@ Hello ${NAME}, -Thank you for attending our example workshop, attached to this email is your certificate. +Thank you for attending our example workshop, attached to this email is your certificate. ${OPTIONAL_EXTRA} Best regards, diff --git a/src/logic/email.py b/src/logic/email.py index 18122c5..802bcaa 100644 --- a/src/logic/email.py +++ b/src/logic/email.py @@ -1,26 +1,219 @@ -from datetime import datetime +import os +import smtplib +import mimetypes +from typing import Dict +from string import Template +from email.message import EmailMessage +from math import isnan +import pandas as pd +import html2text from PySide6.QtCore import QThread, Signal from utils.logger import logger class EmailerThread(QThread): - outputSignal = Signal(str) + outputSignal = Signal(str, str) - def __init__(self, data: str): + def __init__( + self, + smtpHost: str, + smtpPort: str, + smtpUsername: str, + smtpPassword: str, + subject: str, + cc: str, + bcc: str, + templatePath: str, + tablePath: str, + attachmentDir: str, + ): super().__init__() - self.data = data + self.smtpHost = smtpHost + self.smtpPort = smtpPort + self.smtpUsername = smtpUsername + self.smtpPassword = smtpPassword + self.subject = subject + self.cc = cc + self.bcc = bcc + self.templatePath = templatePath + self.tablePath = tablePath + self.attachmentDir = attachmentDir - def output(self, text: str, level="INFO"): + def output(self, text: str, level: str = "INFO"): logger.log(level, text) - timestamped = f"[{datetime.now().strftime('%H:%M:%S')}] {text}" - self.outputSignal.emit(timestamped) + self.outputSignal.emit(text, level) + + def readTemplate(self) -> Template: + with open(self.templatePath, "r", encoding="utf-8") as templateFile: + content = templateFile.read() + return Template(content) + + def readTable(self) -> tuple[list[Dict[str, str]], list[str]]: + if self.tablePath.endswith(".csv"): + table = pd.read_csv(self.tablePath, index_col=False) + elif self.tablePath.endswith(".xlsx"): + table = pd.read_excel(self.tablePath, index_col=False) + else: + self.output("Table data file type extension not supported", "ERROR") + raise ValueError("Unsupported file format") + + records = table.to_dict("records") + headers = list(table.columns) + + # Convert NaN, which is parsed in empty cells, to empty string + for record in records: + for key in record: + if type(record[key]) is float and isnan(record[key]): + record[key] = "" + + return records, headers + + def readAttachment(self, filePath: str) -> tuple[bytes, str, str]: + mimeType, _ = mimetypes.guess_type(filePath) + + if mimeType is None: + mimeType = "application/octet-stream" + mainType, subType = mimeType.split("/") + + with open(filePath, "rb") as file: + content = file.read() + + return content, mainType, subType def run(self): - try: - self.output( - f"{self.data}", - ) - except Exception as e: - self.output(str(e), "ERROR") + with logger.catch(): + if not os.path.isdir(self.attachmentDir): + self.output( + f"Attachment directory {self.attachmentDir} not found or is not a directory", + "ERROR", + ) + return + + try: + template = self.readTemplate() + self.output("Body template loaded") + except Exception as e: + self.output(f"Failed to load body template: {e}", "ERROR") + return + + try: + rows, cols = self.readTable() + self.output( + f"Table loaded, found {len(rows)} {len(rows) == 1 and 'row' or 'rows'}" + ) + except Exception as e: + self.output(f"Failed to load table: {e}", "ERROR") + return + + if not rows or not cols: + self.output("Given table is empty", "ERROR") + return + + try: + body = template.substitute(rows[0]) + except KeyError as e: + self.output( + f"[{total}] Template key {e} not found in table headers", + "ERROR", + ) + return + except TypeError as e: + self.output( + f"[{total}] Template key {e} found more than once in table headers", + "ERROR", + ) + return + + server = smtplib.SMTP(host=self.smtpHost, port=self.smtpPort) + + try: + server.starttls() + server.login(self.smtpUsername, self.smtpPassword) + self.output( + f"Logged in as {self.smtpUsername} on {self.smtpHost}:{self.smtpPort}" + ) + except Exception as e: + self.output(f"Failed to login: {e}", "ERROR") + return + + total: int = 0 + successful: int = 0 + for row in rows: + total += 1 + + message = EmailMessage() + + if not row[cols[0]] or "@" not in row[cols[0]]: + self.output( + f"[{total}] Email address column is empty or the value is invalid on this row", + "ERROR", + ) + continue + + # Configure email headers + message["To"] = row[cols[0]].strip() + message["From"] = self.smtpUsername + message["Subject"] = self.subject + message["Cc"] = self.cc + message["Bcc"] = self.bcc + + # Get email body from replacing keys in template + try: + body = template.substitute(row) + except KeyError as e: + self.output( + f"[{total}] Template key {e} not found in table headers", + "ERROR", + ) + break + + # Add body to email + if self.templatePath.endswith(".html"): + message.set_content(html2text.html2text(body)) + message.add_alternative(body, subtype="html") + else: + message.set_content(body) + + # Get attachments from joining given directory + filePaths column + filePaths: list[str] = [] + if row[cols[1]]: + attachmentNames = row[cols[1]].split(",") + for attachmentName in attachmentNames: + fullPath = os.path.join( + self.attachmentDir, attachmentName + ) + filePaths.append(fullPath) + + # Add attachments to email + try: + for filePath in filePaths: + file, mainType, subType = self.readAttachment(filePath) + message.add_attachment( + file, + maintype=mainType, + subtype=subType, + filename=os.path.basename(filePath), + ) + except Exception as e: + self.output( + f"[{total}] Failed to attach file in email to {row[cols[0]]}: {e}", + "ERROR", + ) + continue + + # Send email + try: + server.send_message(message) + successful += 1 + self.output(f"[{total}] Sent email to {row[cols[0]]}") + except Exception as e: + self.output( + f"[{total}] Failed to send email to {row[cols[0]]}: {e}", + "ERROR", + ) + + server.quit() + + self.output(f"Successfully sent {successful} out of {total} emails") diff --git a/src/pages/home.py b/src/pages/home.py index 3adf7a2..67d6700 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -14,7 +14,7 @@ PrimaryToolButton, FluentIcon, SingleDirectionScrollArea, - PlainTextEdit, + TextBrowser, InfoBar, InfoBarPosition, ) @@ -35,7 +35,7 @@ def __init__(self): self.finishSound.setSource( QUrl.fromLocalFile(loader.resources("sounds/success.wav")) ) - self.finishSound.setVolume(0.2) + self.finishSound.setVolume(0.1) self.smtpHostInput = LineEdit() self.smtpHostInput.setMaximumWidth(500) @@ -115,14 +115,14 @@ def __init__(self): self.ccInput = LineEdit() self.ccInput.setMaximumWidth(500) self.ccInput.setPlaceholderText( - "Use a comma (,) to separate emails you want to CC!" + "Use a comma , to separate emails you want to CC!" ) self.ccLabel = BodyLabel("CC") self.bccInput = LineEdit() self.bccInput.setMaximumWidth(500) self.bccInput.setPlaceholderText( - "Use a comma (,) to separate emails you want to BCC!" + "Use a comma , to separate emails you want to BCC!" ) self.bccLabel = BodyLabel("BCC") @@ -201,7 +201,8 @@ def __init__(self): self.attachmentLayout.addWidget(self.attachmentLabel) self.attachmentLayout.addLayout(self.attachmentContentLayout) - self.runLogsBox = PlainTextEdit() + self.runLogsBox = TextBrowser() + self.runLogsBox.setHtml("") self.runLogsBox.setMinimumHeight(150) self.runLogsBox.setReadOnly(True) self.runLogsBox.setPlaceholderText( @@ -316,14 +317,29 @@ def runEmailer(self): return self.runButton.setDisabled(True) - self.worker = EmailerThread(self.templateFileBox.text()) - self.worker.outputSignal.connect( - lambda text: ( - self.runLogsBox.appendPlainText(text), - self.runLogsClearButton.setDisabled(False), - ) + + self.worker = EmailerThread( + self.smtpHostInput.text(), + self.smtpPortInput.text(), + self.smtpUsernameInput.text(), + self.smtpPasswordInput.text(), + self.subjectInput.text(), + self.ccInput.text(), + self.bccInput.text(), + self.templateFileBox.text(), + self.tableFileInput.text(), + self.attachmentFolderInput.text(), ) + def output(text, level): + if level == "ERROR": + self.runLogsBox.append(f'{text}') + else: + self.runLogsBox.append(f'{text}') + self.runLogsClearButton.setDisabled(False) + + self.worker.outputSignal.connect(output) + def finished(): self.runButton.setDisabled(False) App.alert(self, 0) From aae5af94a86fada0c6d0d0feb0a1f4358da97bf6 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Wed, 23 Oct 2024 21:23:30 +0100 Subject: [PATCH 15/17] feat: add more logging --- src/logic/email.py | 10 +++++++++- src/pages/home.py | 5 +++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/logic/email.py b/src/logic/email.py index 802bcaa..141efab 100644 --- a/src/logic/email.py +++ b/src/logic/email.py @@ -83,6 +83,9 @@ def readAttachment(self, filePath: str) -> tuple[bytes, str, str]: return content, mainType, subType def run(self): + inputs = self.__dict__.copy() + inputs.pop("smtpPassword") + logger.info(f"Starting emailer thread with input parameters: {inputs}") with logger.catch(): if not os.path.isdir(self.attachmentDir): self.output( @@ -97,6 +100,7 @@ def run(self): except Exception as e: self.output(f"Failed to load body template: {e}", "ERROR") return + logger.info(f"Body template read: {template}") try: rows, cols = self.readTable() @@ -106,6 +110,8 @@ def run(self): except Exception as e: self.output(f"Failed to load table: {e}", "ERROR") return + logger.info(f"Table columns read: {cols}") + logger.info(f"Table rows read: {rows}") if not rows or not cols: self.output("Given table is empty", "ERROR") @@ -207,7 +213,9 @@ def run(self): try: server.send_message(message) successful += 1 - self.output(f"[{total}] Sent email to {row[cols[0]]}") + self.output( + f"[{total}] Sent email to {row[cols[0]]} with {len(filePaths)} {len(filePaths) == 1 and 'attachment' or 'attachments'}" + ) except Exception as e: self.output( f"[{total}] Failed to send email to {row[cols[0]]}: {e}", diff --git a/src/pages/home.py b/src/pages/home.py index 67d6700..886c493 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -290,7 +290,6 @@ def pickAttachmentFolder(self): ) def runEmailer(self): - """Runs the example logic for this page.""" if self.worker is not None and self.worker.isRunning(): return @@ -347,7 +346,9 @@ def finished(): App.applicationState() == Qt.ApplicationState.ApplicationInactive ): - SystemTray().send("Example finished!", "Go back to the app.") + SystemTray().send( + "Emails sent!", "Go back to the app to see the logs." + ) self.finishSound.play() self.worker.finished.connect(finished) From 09cacec6cf78d7e10f5426d08b1cfec7b5354370 Mon Sep 17 00:00:00 2001 From: dy0gu Date: Thu, 24 Oct 2024 10:04:02 +0100 Subject: [PATCH 16/17] docs: improve guide --- src/pages/help.py | 125 +++++++++++++++++++++++++++++++++++++++++++--- src/pages/home.py | 26 +++++----- src/window.py | 5 +- 3 files changed, 135 insertions(+), 21 deletions(-) diff --git a/src/pages/help.py b/src/pages/help.py index 1970e22..744e86b 100644 --- a/src/pages/help.py +++ b/src/pages/help.py @@ -9,21 +9,130 @@ class HelpPage(QWidget): def __init__(self): super().__init__() - self.setObjectName("Help") + self.setObjectName("Guide") self.helpText = BodyLabel( """ -

Help

+

Guide

-

- qfluentwidgets - is a lightweight, cross-platform, and cross-platform - QWidgets - for Windows, macOS, and Linux. -

+

Overview

+

+ This application helps you send personalized mass emails using data from a spreadsheet. Perfect for newsletters, + announcements, or any situation where you need to send customized emails to multiple recipients. +

+

SMTP Configuration

+ +

SMTP Host

+
    +
  • Enter your email provider's SMTP server address
  • +
  • Example: smtp.gmail.com for Gmail
  • +
  • For other providers, check their SMTP settings documentation
  • +
+ +

SMTP Port

+
    +
  • Enter your email provider's SMTP port
  • +
  • Common ports:
  • +
      +
    • 587 (TLS)
    • +
    • 465 (SSL)
    • +
    +
  • Check your email provider's documentation for the correct port
  • +
+ +

SMTP Username

+
    +
  • Enter your email address
  • +
  • For Gmail users: Use your complete email address
  • +
  • For business emails: Check with your IT department
  • +
+ +

SMTP Password

+
    +
  • Enter your email password or app-specific password
  • +
  • For Gmail: Use an App Password (regular password won't work with 2FA)
  • +
  • Keep this secure - the app saves this locally
  • +
+ +

Email Settings

+ +

Subject

+
    +
  • Enter your email subject line
  • +
  • You can use template variables: {{variable_name}}
  • +
  • Variables will be replaced with data from your spreadsheet
  • +
+ +

CC Recipients

+
    +
  • Optional: Add CC recipients
  • +
  • Separate multiple emails with commas
  • +
  • Example: person1@example.com, person2@example.com
  • +
+ +

BCC Recipients

+
    +
  • Optional: Add BCC recipients
  • +
  • Separate multiple emails with commas
  • +
  • Recipients won't see other BCC addresses
  • +
+ +

Files Setup

+ +

Template File

+
    +
  • Create an HTML file for your email template
  • +
  • Use {{variable_name}} for dynamic content
  • +
  • Variables must match your spreadsheet column names
  • +
  • Example: Dear {{name}}, Your balance is {{amount}}
  • +
+ +

Table File

+
    +
  • Supported formats: CSV, Excel (.xlsx)
  • +
  • Must include an 'email' column for recipients
  • +
  • Other columns can be used as template variables
  • +
  • First row should be column headers
  • +
+ +

Attachments Directory

+
    +
  • Optional: Select a folder containing attachments
  • +
  • Files must be named to match your data
  • +
  • Example: If spreadsheet has 'attachment' column with 'doc1.pdf', that file must exist in the folder
  • +
+ +

Running the App

+
    +
  1. Click the Play button to start sending emails
  2. +
  3. Monitor progress in the log window
  4. +
  5. Green text indicates success
  6. +
  7. Red text indicates errors
  8. +
  9. Use the trash can icon to clear logs
  10. +
  11. The app will notify you when complete
  12. +
+ +

Tips

+
    +
  • Test with a controlled small group first
  • +
  • Double-check all settings before sending
  • +
  • Keep template files simple and well-formatted
  • +
  • Ensure all attachments exist before starting
  • +
  • Watch for error messages in the run logs
  • +
+ +

Troubleshooting

+
    +
  • Authentication failed: Check username and password
  • +
  • Connection refused: Verify SMTP host and port
  • +
  • Template error: Check variable names match spreadsheet
  • +
  • File not found: Verify all paths and filenames
  • +
  • Invalid email: Check email format in spreadsheet
  • +
""", ) + self.helpText.setWordWrap(True) self.contentWidget = QWidget() self.contentLayout = QVBoxLayout(self.contentWidget) diff --git a/src/pages/home.py b/src/pages/home.py index 886c493..e29fe5c 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -44,7 +44,7 @@ def __init__(self): self.smtpHostInput.textChanged.connect( lambda text: config.smtpHost.set(text) ) - self.smtphostLabel = BodyLabel("SMTP HOST*") + self.smtphostLabel = BodyLabel("SMTP HOST") self.smtpPortInput = LineEdit() self.smtpPortInput.setMaximumWidth(500) @@ -52,7 +52,7 @@ def __init__(self): self.smtpPortInput.textChanged.connect( lambda text: config.smtpPort.set(text) ) - self.smtpPortLabel = BodyLabel("SMTP PORT*") + self.smtpPortLabel = BodyLabel("SMTP PORT") self.smtpHostInputLayout = QVBoxLayout() self.smtpHostInputLayout.setSpacing(10) @@ -75,7 +75,7 @@ def __init__(self): self.smtpUsernameInput.textChanged.connect( lambda text: config.smtpUsername.set(text) ) - self.smtpusernameLabel = BodyLabel("SMTP USERNAME*") + self.smtpusernameLabel = BodyLabel("SMTP USERNAME") self.smtpUsernameLayout = QVBoxLayout() self.smtpUsernameLayout.setSpacing(10) @@ -88,7 +88,7 @@ def __init__(self): self.smtpPasswordInput.textChanged.connect( lambda text: config.smtpPassword.set(text) ) - self.smtppasswordLabel = BodyLabel("SMTP PASSWORD*") + self.smtppasswordLabel = BodyLabel("SMTP PASSWORD") self.smtpPasswordLayout = QVBoxLayout() self.smtpPasswordLayout.setSpacing(10) @@ -105,7 +105,7 @@ def __init__(self): self.smtpLayout.addLayout(self.smtpServerLayout) self.smtpLayout.addLayout(self.smtpAuthLayout) - self.subjectLabel = BodyLabel("SUBJECT*") + self.subjectLabel = BodyLabel("SUBJECT") self.subjectInput = LineEdit() self.subjectInput.setPlaceholderText( "The title of the email goes here." @@ -117,14 +117,14 @@ def __init__(self): self.ccInput.setPlaceholderText( "Use a comma , to separate emails you want to CC!" ) - self.ccLabel = BodyLabel("CC") + self.ccLabel = BodyLabel("CC") self.bccInput = LineEdit() self.bccInput.setMaximumWidth(500) self.bccInput.setPlaceholderText( "Use a comma , to separate emails you want to BCC!" ) - self.bccLabel = BodyLabel("BCC") + self.bccLabel = BodyLabel("BCC") self.headLayout = QVBoxLayout() self.headLayout.setSpacing(10) @@ -135,7 +135,7 @@ def __init__(self): self.headLayout.addWidget(self.bccLabel) self.headLayout.addWidget(self.bccInput) - self.templateLabel = BodyLabel("TEMPLATE FILE*") + self.templateLabel = BodyLabel("TEMPLATE FILE") self.templatePicker = QFileDialog() self.templatePicker.setFileMode(QFileDialog.FileMode.ExistingFile) @@ -158,7 +158,7 @@ def __init__(self): self.templateLayout.addWidget(self.templateLabel) self.templateLayout.addLayout(self.templateContentLayout) - self.tableLabel = BodyLabel("TABLE FILE*") + self.tableLabel = BodyLabel("TABLE FILE") self.tableFileInput = LineEdit() self.tableFileInput.setReadOnly(True) self.tableFileInput.setMaximumWidth(500) @@ -178,7 +178,7 @@ def __init__(self): self.tableLayout.addWidget(self.tableLabel) self.tableLayout.addLayout(self.tableContentLayout) - self.attachmentLabel = BodyLabel("ATTACHMENTS DIRECTORY*") + self.attachmentLabel = BodyLabel("ATTACHMENTS DIRECTORY") self.attachmentFolderInput = LineEdit() self.attachmentFolderInput.setReadOnly(True) self.attachmentFolderInput.setMaximumWidth(500) @@ -206,7 +206,9 @@ def __init__(self): self.runLogsBox.setMinimumHeight(150) self.runLogsBox.setReadOnly(True) self.runLogsBox.setPlaceholderText( - "Press the button on the left to start.\nLog output from the run will be shown here." + "Press the start button on the left to begin. \ + \nLog output from the run will be shown here. \ + \nThe trash can button will clear this box." ) self.worker = None @@ -306,7 +308,7 @@ def runEmailer(self): for input in schema: if not schema[input]: InfoBar.error( - title=f"{input} field is empty!", + title=f"{input} field cannot be empty!", content="", isClosable=True, position=InfoBarPosition.TOP_RIGHT, diff --git a/src/window.py b/src/window.py index 0a9d7d5..8ece5ea 100644 --- a/src/window.py +++ b/src/window.py @@ -41,7 +41,10 @@ def __init__(self): self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") self.addSubInterface( - HelpPage(), FluentIcon.HELP, "Help", NavigationItemPosition.BOTTOM + HelpPage(), + FluentIcon.DICTIONARY, + "Guide", + NavigationItemPosition.BOTTOM, ) self.addSubInterface( SettingsPage(), From 1526a5814c6b7a3679399e606a09a013739f346f Mon Sep 17 00:00:00 2001 From: dy0gu Date: Thu, 24 Oct 2024 18:46:20 +0100 Subject: [PATCH 17/17] feat: add dynamic content support to every field --- README.md | 18 +++-- src/logic/email.py | 77 ++++++++++---------- src/pages/help.py | 157 ----------------------------------------- src/pages/home.py | 56 +++++++-------- src/utils/constants.py | 1 - src/window.py | 7 -- 6 files changed, 73 insertions(+), 243 deletions(-) delete mode 100644 src/pages/help.py diff --git a/README.md b/README.md index 081eb55..1d1de2f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Quick and reliable ✉️➡️ -E-neiler makes it easy to quickly send high amounts of emails with tabled data through SMTP, file attachments included. It works on your custom server, gmail, outlook and any other service that allows SMTP. We support a variety of file types for both the body templates and the data tables. +E-neiler makes it easy to quickly send high amounts of emails with tabled data through SMTP, file attachments included. It works can connect to your custom mail server, gmail, outlook and any other service that allows SMTP. We support a variety of file types for both the body templates and the data tables. ## Requirements 📋 @@ -14,17 +14,21 @@ E-neiler makes it easy to quickly send high amounts of emails with tabled data t - After downloading, extract the top content from the `.zip` to anywhere you want. -### Windows + ### Windows -- Run the `main.exe` file inside the extracted folder, you can create a shortcut with any name you like for this file. + - Run the `main.exe` file inside the extracted folder, you can create a shortcut with any name you like for this file. -### Linux + ### Linux -- Run the `main.bin` file inside the extracted folder. Note that compilation is targeted at Ubuntu (Wayland), other distributions may need additional actions to run the app. + - Run the `main.bin` file inside the extracted folder. Note that compilation is targeted at Ubuntu (Wayland), other distributions may need additional actions to run the app. -### MacOS + ### MacOS -- Run the bundle installer extracted from the `.zip` file. + - Run the bundle installer extracted from the `.zip` file. + +- Detailed usage instructions can be found in the [wiki](https://github.com/NEIAAC/e-neiler/wiki) page. + +- See the [example](./example/) directory for demo files. ## Development 🛠️ diff --git a/src/logic/email.py b/src/logic/email.py index 141efab..03b491e 100644 --- a/src/logic/email.py +++ b/src/logic/email.py @@ -95,21 +95,21 @@ def run(self): return try: - template = self.readTemplate() - self.output("Body template loaded") + body = self.readTemplate() except Exception as e: - self.output(f"Failed to load body template: {e}", "ERROR") + self.output(f"Failed to load body: {e}", "ERROR") return - logger.info(f"Body template read: {template}") + logger.info(f"Body loaded: {body}") + logger.info(f"Body read: {body}") try: rows, cols = self.readTable() - self.output( - f"Table loaded, found {len(rows)} {len(rows) == 1 and 'row' or 'rows'}" - ) except Exception as e: self.output(f"Failed to load table: {e}", "ERROR") return + logger.info( + f"Table loaded, found {len(rows)} {len(rows) == 1 and 'row' or 'rows'}" + ) logger.info(f"Table columns read: {cols}") logger.info(f"Table rows read: {rows}") @@ -117,20 +117,28 @@ def run(self): self.output("Given table is empty", "ERROR") return - try: - body = template.substitute(rows[0]) - except KeyError as e: - self.output( - f"[{total}] Template key {e} not found in table headers", - "ERROR", - ) - return - except TypeError as e: - self.output( - f"[{total}] Template key {e} found more than once in table headers", - "ERROR", - ) - return + variableInputs = { + "Subject": self.subject, + "CC": self.cc, + "BCC": self.bcc, + "Body": self.attachmentDir, + } + # Validate that all variable inputs are present in the table headers + for key, value in variableInputs.items(): + try: + Template(value).substitute(rows[0]) + except KeyError as e: + self.output( + f"{key} variable not found in table headers: {e}", + "ERROR", + ) + return + except TypeError as e: + self.output( + f"{key} variable found more than once in table headers: {e}", + "ERROR", + ) + return server = smtplib.SMTP(host=self.smtpHost, port=self.smtpPort) @@ -161,28 +169,19 @@ def run(self): # Configure email headers message["To"] = row[cols[0]].strip() message["From"] = self.smtpUsername - message["Subject"] = self.subject - message["Cc"] = self.cc - message["Bcc"] = self.bcc - - # Get email body from replacing keys in template - try: - body = template.substitute(row) - except KeyError as e: - self.output( - f"[{total}] Template key {e} not found in table headers", - "ERROR", - ) - break + message["Subject"] = Template(self.subject).substitute(row) + message["Cc"] = Template(self.cc).substitute(row) + message["Bcc"] = Template(self.bcc).substitute(row) # Add body to email + content = body.substitute(row) if self.templatePath.endswith(".html"): - message.set_content(html2text.html2text(body)) - message.add_alternative(body, subtype="html") + message.set_content(html2text.html2text(content)) + message.add_alternative(content, subtype="html") else: - message.set_content(body) + message.set_content(content) - # Get attachments from joining given directory + filePaths column + # Add attachments to email filePaths: list[str] = [] if row[cols[1]]: attachmentNames = row[cols[1]].split(",") @@ -191,8 +190,6 @@ def run(self): self.attachmentDir, attachmentName ) filePaths.append(fullPath) - - # Add attachments to email try: for filePath in filePaths: file, mainType, subType = self.readAttachment(filePath) diff --git a/src/pages/help.py b/src/pages/help.py deleted file mode 100644 index 744e86b..0000000 --- a/src/pages/help.py +++ /dev/null @@ -1,157 +0,0 @@ -from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy -from PySide6.QtCore import Qt -from qfluentwidgets import ( - BodyLabel, - SingleDirectionScrollArea, -) - - -class HelpPage(QWidget): - def __init__(self): - super().__init__() - self.setObjectName("Guide") - - self.helpText = BodyLabel( - """ -

Guide

- -

Overview

-

- This application helps you send personalized mass emails using data from a spreadsheet. Perfect for newsletters, - announcements, or any situation where you need to send customized emails to multiple recipients. -

- -

SMTP Configuration

- -

SMTP Host

-
    -
  • Enter your email provider's SMTP server address
  • -
  • Example: smtp.gmail.com for Gmail
  • -
  • For other providers, check their SMTP settings documentation
  • -
- -

SMTP Port

-
    -
  • Enter your email provider's SMTP port
  • -
  • Common ports:
  • -
      -
    • 587 (TLS)
    • -
    • 465 (SSL)
    • -
    -
  • Check your email provider's documentation for the correct port
  • -
- -

SMTP Username

-
    -
  • Enter your email address
  • -
  • For Gmail users: Use your complete email address
  • -
  • For business emails: Check with your IT department
  • -
- -

SMTP Password

-
    -
  • Enter your email password or app-specific password
  • -
  • For Gmail: Use an App Password (regular password won't work with 2FA)
  • -
  • Keep this secure - the app saves this locally
  • -
- -

Email Settings

- -

Subject

-
    -
  • Enter your email subject line
  • -
  • You can use template variables: {{variable_name}}
  • -
  • Variables will be replaced with data from your spreadsheet
  • -
- -

CC Recipients

-
    -
  • Optional: Add CC recipients
  • -
  • Separate multiple emails with commas
  • -
  • Example: person1@example.com, person2@example.com
  • -
- -

BCC Recipients

-
    -
  • Optional: Add BCC recipients
  • -
  • Separate multiple emails with commas
  • -
  • Recipients won't see other BCC addresses
  • -
- -

Files Setup

- -

Template File

-
    -
  • Create an HTML file for your email template
  • -
  • Use {{variable_name}} for dynamic content
  • -
  • Variables must match your spreadsheet column names
  • -
  • Example: Dear {{name}}, Your balance is {{amount}}
  • -
- -

Table File

-
    -
  • Supported formats: CSV, Excel (.xlsx)
  • -
  • Must include an 'email' column for recipients
  • -
  • Other columns can be used as template variables
  • -
  • First row should be column headers
  • -
- -

Attachments Directory

-
    -
  • Optional: Select a folder containing attachments
  • -
  • Files must be named to match your data
  • -
  • Example: If spreadsheet has 'attachment' column with 'doc1.pdf', that file must exist in the folder
  • -
- -

Running the App

-
    -
  1. Click the Play button to start sending emails
  2. -
  3. Monitor progress in the log window
  4. -
  5. Green text indicates success
  6. -
  7. Red text indicates errors
  8. -
  9. Use the trash can icon to clear logs
  10. -
  11. The app will notify you when complete
  12. -
- -

Tips

-
    -
  • Test with a controlled small group first
  • -
  • Double-check all settings before sending
  • -
  • Keep template files simple and well-formatted
  • -
  • Ensure all attachments exist before starting
  • -
  • Watch for error messages in the run logs
  • -
- -

Troubleshooting

-
    -
  • Authentication failed: Check username and password
  • -
  • Connection refused: Verify SMTP host and port
  • -
  • Template error: Check variable names match spreadsheet
  • -
  • File not found: Verify all paths and filenames
  • -
  • Invalid email: Check email format in spreadsheet
  • -
- """, - ) - self.helpText.setWordWrap(True) - - self.contentWidget = QWidget() - self.contentLayout = QVBoxLayout(self.contentWidget) - self.contentLayout.setAlignment(Qt.AlignmentFlag.AlignTop) - self.contentLayout.setContentsMargins(40, 40, 50, 40) - self.contentLayout.setSpacing(40) - self.contentLayout.addWidget(self.helpText) - - self.scrollArea = SingleDirectionScrollArea( - orient=Qt.Orientation.Vertical - ) - self.scrollArea.setWidget(self.contentWidget) - self.scrollArea.setSizePolicy( - QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Expanding - ) - self.scrollArea.setWidgetResizable(True) - self.scrollArea.enableTransparentBackground() - - self.mainLayout = QVBoxLayout() - self.mainLayout.addWidget(self.scrollArea) - - self.setLayout(self.mainLayout) diff --git a/src/pages/home.py b/src/pages/home.py index e29fe5c..9da2be1 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -114,16 +114,10 @@ def __init__(self): self.ccInput = LineEdit() self.ccInput.setMaximumWidth(500) - self.ccInput.setPlaceholderText( - "Use a comma , to separate emails you want to CC!" - ) self.ccLabel = BodyLabel("CC") self.bccInput = LineEdit() self.bccInput.setMaximumWidth(500) - self.bccInput.setPlaceholderText( - "Use a comma , to separate emails you want to BCC!" - ) self.bccLabel = BodyLabel("BCC") self.headLayout = QVBoxLayout() @@ -135,30 +129,30 @@ def __init__(self): self.headLayout.addWidget(self.bccLabel) self.headLayout.addWidget(self.bccInput) - self.templateLabel = BodyLabel("TEMPLATE FILE") - self.templatePicker = QFileDialog() - self.templatePicker.setFileMode(QFileDialog.FileMode.ExistingFile) + self.bodyLabel = BodyLabel("BODY FILE") + self.bodyPicker = QFileDialog() + self.bodyPicker.setFileMode(QFileDialog.FileMode.ExistingFile) - self.templateFileBox = LineEdit() - self.templateFileBox.setMaximumWidth(500) - self.templateFileBox.setReadOnly(True) - self.templateFileBox.setPlaceholderText("No template file selected.") + self.bodyFileBox = LineEdit() + self.bodyFileBox.setMaximumWidth(500) + self.bodyFileBox.setReadOnly(True) + self.bodyFileBox.setPlaceholderText("No body file selected.") - self.templateFilePickButton = PrimaryToolButton(FluentIcon.FOLDER) - self.templateFilePickButton.clicked.connect(self.pickTemplateFile) + self.bodyFilePickButton = PrimaryToolButton(FluentIcon.FOLDER) + self.bodyFilePickButton.clicked.connect(self.pickBodyFile) - self.templateContentLayout = QHBoxLayout() - self.templateContentLayout.setSpacing(10) - self.templateContentLayout.addWidget(self.templateFilePickButton) - self.templateContentLayout.addWidget(self.templateFileBox) + self.bodyContentLayout = QHBoxLayout() + self.bodyContentLayout.setSpacing(10) + self.bodyContentLayout.addWidget(self.bodyFilePickButton) + self.bodyContentLayout.addWidget(self.bodyFileBox) - self.templateLayout = QVBoxLayout() - self.templateLayout.setSpacing(10) - self.templateLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) - self.templateLayout.addWidget(self.templateLabel) - self.templateLayout.addLayout(self.templateContentLayout) + self.bodyLayout = QVBoxLayout() + self.bodyLayout.setSpacing(10) + self.bodyLayout.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.bodyLayout.addWidget(self.bodyLabel) + self.bodyLayout.addLayout(self.bodyContentLayout) - self.tableLabel = BodyLabel("TABLE FILE") + self.tableLabel = BodyLabel("VARIABLE TABLE FILE") self.tableFileInput = LineEdit() self.tableFileInput.setReadOnly(True) self.tableFileInput.setMaximumWidth(500) @@ -244,7 +238,7 @@ def __init__(self): self.contentLayout.setSpacing(40) self.contentLayout.addLayout(self.smtpLayout) self.contentLayout.addLayout(self.headLayout) - self.contentLayout.addLayout(self.templateLayout) + self.contentLayout.addLayout(self.bodyLayout) self.contentLayout.addLayout(self.tableLayout) self.contentLayout.addLayout(self.attachmentLayout) self.contentLayout.addLayout(self.runContentLayout) @@ -264,11 +258,11 @@ def __init__(self): self.setLayout(self.mainLayout) - def pickTemplateFile(self): + def pickBodyFile(self): dialog = QFileDialog() dialog.setFileMode(QFileDialog.FileMode.ExistingFile) - self.templateFileBox.setText( - dialog.getOpenFileName(self, "Select a template file!")[0] + self.bodyFileBox.setText( + dialog.getOpenFileName(self, "Select a body file!")[0] ) def pickTableFile(self): @@ -303,7 +297,7 @@ def runEmailer(self): "Subject": self.subjectInput.text(), "Table file": self.tableFileInput.text(), "Attachment folder": self.attachmentFolderInput.text(), - "Template file": self.templateFileBox.text(), + "Body file": self.bodyFileBox.text(), } for input in schema: if not schema[input]: @@ -327,7 +321,7 @@ def runEmailer(self): self.subjectInput.text(), self.ccInput.text(), self.bccInput.text(), - self.templateFileBox.text(), + self.bodyFileBox.text(), self.tableFileInput.text(), self.attachmentFolderInput.text(), ) diff --git a/src/utils/constants.py b/src/utils/constants.py index aecc4fc..88a91b2 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -13,4 +13,3 @@ AUTHOR_NAME, EXECUTABLE_NAME, ) -SUPPORTED_TABLE_FORMATS = ["csv", "xlsx"] diff --git a/src/window.py b/src/window.py index 8ece5ea..f6ea81d 100644 --- a/src/window.py +++ b/src/window.py @@ -19,7 +19,6 @@ from utils.config import config from pages.home import HomePage from pages.settings import SettingsPage -from pages.help import HelpPage class Window(FluentWindow): @@ -40,12 +39,6 @@ def __init__(self): self.show() self.addSubInterface(HomePage(), FluentIcon.HOME, "Home") - self.addSubInterface( - HelpPage(), - FluentIcon.DICTIONARY, - "Guide", - NavigationItemPosition.BOTTOM, - ) self.addSubInterface( SettingsPage(), FluentIcon.SETTING,