From bc36887af643d17e271f2ca63287acc0f415c5c7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 16 May 2024 23:44:17 -0400 Subject: [PATCH 001/110] Add Python project files to the gitignore --- .gitignore | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7ad7f38..0ed796e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,165 @@ -companies.json +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Runtime data files +companies.json \ No newline at end of file From 1bc23240b2c576c90da80b3cb59989e8732574eb Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 09:41:44 -0400 Subject: [PATCH 002/110] Add an editorconfig file --- .editorconfig | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5aa417c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = false \ No newline at end of file From d5103814c09cfc36e3f0d29f2cc5a09c1cc2462c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 09:48:02 -0400 Subject: [PATCH 003/110] Change the sample E-mail addresses to use example.com domains This just makes sure that, if sent, the test E-mails won't actually go anywhere. --- email-template.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/email-template.txt b/email-template.txt index b1d3d10..9be97fc 100644 --- a/email-template.txt +++ b/email-template.txt @@ -1,12 +1,12 @@ google -google@google.com +google@example.com apple -apple@apple.com +apple@example.com uhs -uhs@uhs.org +uhs@example.com amazon -amazon.com +example.com facebook -facebook@meta.com +facebook@example.com microsoft -sdoijf@osdif.com \ No newline at end of file +sdoijf@example.com \ No newline at end of file From b909126394ea726cad2ef0f2d471e1de1d9ed6b3 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 13:55:37 -0400 Subject: [PATCH 004/110] Restructure the project and upload drafts directly to Gmail --- .gitignore | 2 +- README.md | 22 +++++++------ email_generator/__main__.py | 38 ++++++++++++++++++++++ email_generator/email_creator.py | 30 ++++++++++++++++++ email_generator/gmail.py | 54 ++++++++++++++++++++++++++++++++ email_generator/mail_util.py | 17 ++++++++++ file_parser/__main__.py | 35 +++++++++++++++++++++ index.html | 6 ---- json-to-email.py | 24 -------------- run.sh | 5 +++ setup.sh | 6 ++++ txt-to-json.py | 22 ------------- 12 files changed, 198 insertions(+), 63 deletions(-) create mode 100644 email_generator/__main__.py create mode 100644 email_generator/email_creator.py create mode 100644 email_generator/gmail.py create mode 100644 email_generator/mail_util.py create mode 100644 file_parser/__main__.py delete mode 100644 index.html delete mode 100644 json-to-email.py create mode 100755 run.sh create mode 100755 setup.sh delete mode 100644 txt-to-json.py diff --git a/.gitignore b/.gitignore index 0ed796e..6646058 100644 --- a/.gitignore +++ b/.gitignore @@ -162,4 +162,4 @@ cython_debug/ #.idea/ # Runtime data files -companies.json \ No newline at end of file +.credentials \ No newline at end of file diff --git a/README.md b/README.md index ac1372e..f196c8b 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,19 @@ ## Installation Go to [zip](https://github.com/roboblazers7617/2024Robot/archive/refs/heads/main.zip). Or go to Code > download zip +## Setup +Run `setup.sh` (can be run by simply double-clicking on the file) +### Set up the Google API +Follow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to generate OAuth2 credentials, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope so the script can edit drafts. Download them into `.credentials/credentials.json` (you will have to create this directory yourself, and show hidden files to see it on MacOS). +### Set up the template +- update the email template in `email_generator/email_creator.py` +- put the file paths to any attachments in the `attachment_paths` list in `email_generator/__main__.py` + ## Usage -### Generate JSON +### Prepare data - copy and paste the table into `email-template.txt` - make sure there is nothing else in the file - save it -- right click on the folder > services > new terminal at folder -- run `python txt-to-json.py` -### Generate Emails -- update the email template and name in `json-to-email.py` -- run `python json-to-email.py` -- click on the links - -## Errors -tell me +### Run the program +Run `run.sh` (can be run by double-clicking as well) +The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. \ No newline at end of file diff --git a/email_generator/__main__.py b/email_generator/__main__.py new file mode 100644 index 0000000..621f198 --- /dev/null +++ b/email_generator/__main__.py @@ -0,0 +1,38 @@ +import json +import concurrent.futures +import fileinput + +import gmail +import mail_util +import email_creator + +# File paths +# TODO: Move these to global paths +google_token_path = ".credentials/token.json" +google_oauth_credentials_path = ".credentials/credentials.json" +# TODO: Pull attachments from a directory +attachment_paths = [] + +if __name__ == "__main__": + # Load the companies from the JSON file + print("Processing input data") + json_data = "" + for line in fileinput.input(): + json_data += line + companies = json.loads(json_data) + + # Authenticate with Google + print("Authenticating") + creds = gmail.get_creds(google_token_path, google_oauth_credentials_path) + + # Build all of the attachments + print("Processing attachments") + attachments = [] + with concurrent.futures.ProcessPoolExecutor() as executor: + for attachment_path in attachment_paths: + attachments.append(mail_util.build_attachment(attachment_path)) + + print("Generating and uploading E-mails") + with concurrent.futures.ProcessPoolExecutor() as executor: + for company in companies: + gmail.create_draft(creds, email_creator.create_email_body(company, attachments)) \ No newline at end of file diff --git a/email_generator/email_creator.py b/email_generator/email_creator.py new file mode 100644 index 0000000..262858a --- /dev/null +++ b/email_generator/email_creator.py @@ -0,0 +1,30 @@ +import base64 +from email.message import EmailMessage + +# Generates an E-mail with the provided company name and attachments +def create_email_body(company, attachments): + mime_message = EmailMessage() + + # headers + # TODO: Pull these from a configuration file + mime_message["To"] = company['email'] + # Doesn't seem to be required for Gmail + # mime_message["From"] = "" + mime_message["Subject"] = "sample with attachment" + + # text + mime_message.set_content(f"""Dear {company['name']}, + +We are pleased to inform you that your company has been selected for a special offer. +Please find attached the details of the offer. + +Best regards, +Your Company""") + + # Add attachments + for attachment in attachments: + mime_message.add_attachment(attachment['data'], maintype=attachment['maintype'], subtype=attachment['subtype'], filename=attachment['name']) + + encoded_message = base64.urlsafe_b64encode(mime_message.as_bytes()).decode() + + return {"message": {"raw": encoded_message}} \ No newline at end of file diff --git a/email_generator/gmail.py b/email_generator/gmail.py new file mode 100644 index 0000000..5557ef6 --- /dev/null +++ b/email_generator/gmail.py @@ -0,0 +1,54 @@ +import os +from google.auth.transport.requests import Request +from google.oauth2.credentials import Credentials +from google_auth_oauthlib.flow import InstalledAppFlow +from googleapiclient.discovery import build +from googleapiclient.errors import HttpError + +# If modifying these scopes, delete the file token.json. +SCOPES = ["https://www.googleapis.com/auth/gmail.compose"] + +# Gets the user's Gmail credentials +def get_creds(token_path, creds_path): + creds = None + # The file token.json stores the user's access and refresh tokens, and is created automatically when the authorization flow completes for the first time. + if os.path.exists(token_path): + creds = Credentials.from_authorized_user_file(token_path, SCOPES) + # If there are no (valid) credentials available, let the user log in. + if not creds or not creds.valid: + # Refresh expired creds + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + # Create new creds + else: + # If OAuth2 creds do not exist, tell the user to create them + if not os.path.exists(creds_path): + raise FileNotFoundError(f"No OAuth2 Credentials exist! Follow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to create them, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope. Download them into `.credentials/credentials.json`, and re-launch the program.") + # If they do, create an OAuth flow + else: + flow = InstalledAppFlow.from_client_secrets_file(creds_path, SCOPES) + creds = flow.run_local_server(port=0) + # Save the credentials for the next run + with open(token_path, "w") as token: + token.write(creds.to_json()) + + return creds + +# Creates an email draft with the provided body +def create_draft(creds, body): + try: + # Create Gmail API client + service = build("gmail", "v1", credentials=creds) + + # pylint: disable=E1101 + draft = ( + service.users() + .drafts() + .create(userId="me", body=body) + .execute() + ) + print(f'Draft id: {draft["id"]}\nDraft message: {draft["message"]}') + except HttpError as error: + print(f"An error occurred: {error}") + draft = None + return draft \ No newline at end of file diff --git a/email_generator/mail_util.py b/email_generator/mail_util.py new file mode 100644 index 0000000..7b46624 --- /dev/null +++ b/email_generator/mail_util.py @@ -0,0 +1,17 @@ +import os +import mimetypes + +# Builds an attachment into an array of values so it can be passed around as an object +def build_attachment(path): + type_subtype, _ = mimetypes.guess_type(path) + maintype, subtype = type_subtype.split("/") + + with open(path, "rb") as fp: + attachment_data = fp.read() + + return { + 'data': attachment_data, + 'name': os.path.basename(path), + 'maintype': maintype, + 'subtype': subtype, + } \ No newline at end of file diff --git a/file_parser/__main__.py b/file_parser/__main__.py new file mode 100644 index 0000000..c7169c5 --- /dev/null +++ b/file_parser/__main__.py @@ -0,0 +1,35 @@ +"""Takes a text file and converts it to a JSON file that can be read by the program +File format is a newline-seperated list of company names and e-mail adresses like this: +``` +Company Name 1 +e-mail@company1.com +Company Name 2 +e-mail@company2.com +Company Name 3 +e-mail@company3.com +``` +""" + +import sys +import fileinput +import json +import concurrent.futures + +companies = [] + +if __name__ == "__main__": + try: + chars = [] + for char in fileinput.input(): + chars.append(char) + lines = ''.join(chars).split('\n') + with concurrent.futures.ProcessPoolExecutor() as executor: + for i in range(0, len(lines), 2): + companies.append({ + 'name': lines[i].strip(), + 'email': lines[i+1].strip() + }) + except: + raise ValueError("Invalid input file") + + json.dump(companies, sys.stdout, indent="\t") \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 58a7942..0000000 --- a/index.html +++ /dev/null @@ -1,6 +0,0 @@ - text - text - text - text - text - text diff --git a/json-to-email.py b/json-to-email.py deleted file mode 100644 index 71fc6fe..0000000 --- a/json-to-email.py +++ /dev/null @@ -1,24 +0,0 @@ -import json -import urllib.parse -# Load the companies from the JSON file -with open('companies.json') as f: - companies = json.load(f) - -# Define your email template -email_template = """Dear {company_name}, - -We are pleased to inform you that your company has been selected for a special offer. -Please find attached the details of the offer. - -Best regards, -Your Company""" -email_name=urllib.parse.quote("Give us money please!!!!") - -# Generate emails for each company -for company in companies: - email = urllib.parse.quote(email_template.format(company_name=company['name'])) - email_link = "mailto:" + f"{company['email']}?subject={email_name}&body={email}" - # print(f" text") - print(email_link) - - diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..a64df19 --- /dev/null +++ b/run.sh @@ -0,0 +1,5 @@ +#!/bin/sh +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +cd "$parent_path" +source "$parent_path/.venv/bin/activate" +python3 file_parser email-template.txt | python3 email_generator \ No newline at end of file diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..589610e --- /dev/null +++ b/setup.sh @@ -0,0 +1,6 @@ +#!/bin/sh +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +cd "$parent_path" +python3 -m venv "$parent_path/.venv" +source "$parent_path/.venv/bin/activate" +pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib \ No newline at end of file diff --git a/txt-to-json.py b/txt-to-json.py deleted file mode 100644 index 42af71c..0000000 --- a/txt-to-json.py +++ /dev/null @@ -1,22 +0,0 @@ -import json - -input_file = 'email-template.txt' -output_file = 'companies.json' - -companies = [] - -try: - with open(input_file, 'r') as file: - lines = file.readlines() - for i in range(0, len(lines), 2): - company = { - 'name': lines[i].strip(), - 'email': lines[i+1].strip() - } - companies.append(company) -except: - print("invalid input file") - - -with open(output_file, 'w') as file: - json.dump(companies, file, indent=4) From 19343e32203f2bb2815d33bdebbf2f8865afc59c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 19:31:27 -0400 Subject: [PATCH 005/110] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 6646058..76ef23d 100644 --- a/.gitignore +++ b/.gitignore @@ -161,5 +161,8 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +# OS-specific stuff +.DS_Store + # Runtime data files .credentials \ No newline at end of file From 56dbfd5db042176a419ab0b121dfb1b76a9758e7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 19:41:16 -0400 Subject: [PATCH 006/110] Restructure the project according to the PyPA guidelines --- README.md | 13 +++-- email_generator/__main__.py | 38 -------------- pyproject.toml | 52 +++++++++++++++++++ run.sh | 2 +- setup.sh | 4 +- src/email_generator/__init__.py | 0 src/email_generator/__main__.py | 4 ++ .../email_generator}/email_creator.py | 2 +- src/email_generator/file_parser/__init__.py | 0 src/email_generator/file_parser/__main__.py | 4 ++ .../email_generator/file_parser/main.py | 34 ++++++------ .../email_generator}/gmail.py | 4 +- .../email_generator}/mail_util.py | 4 +- src/email_generator/main.py | 38 ++++++++++++++ 14 files changed, 132 insertions(+), 67 deletions(-) delete mode 100644 email_generator/__main__.py create mode 100644 pyproject.toml create mode 100644 src/email_generator/__init__.py create mode 100644 src/email_generator/__main__.py rename {email_generator => src/email_generator}/email_creator.py (92%) create mode 100644 src/email_generator/file_parser/__init__.py create mode 100644 src/email_generator/file_parser/__main__.py rename file_parser/__main__.py => src/email_generator/file_parser/main.py (53%) rename {email_generator => src/email_generator}/gmail.py (95%) rename {email_generator => src/email_generator}/mail_util.py (77%) create mode 100644 src/email_generator/main.py diff --git a/README.md b/README.md index f196c8b..b521bec 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,17 @@ # Email Generator ## Installation -Go to [zip](https://github.com/roboblazers7617/2024Robot/archive/refs/heads/main.zip). Or go to Code > download zip +Download the latest release as a `tar.gz` file. ## Setup -Run `setup.sh` (can be run by simply double-clicking on the file) ### Set up the Google API Follow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to generate OAuth2 credentials, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope so the script can edit drafts. Download them into `.credentials/credentials.json` (you will have to create this directory yourself, and show hidden files to see it on MacOS). ### Set up the template - update the email template in `email_generator/email_creator.py` -- put the file paths to any attachments in the `attachment_paths` list in `email_generator/__main__.py` +- put the file paths to any attachments in the `attachment_paths` list in `email_generator/main.py` +### Build program +Run `setup.sh` (can be run by simply double-clicking on the file) +If you make any changes to the template after this, run `setup.sh` again. ## Usage ### Prepare data @@ -18,4 +20,7 @@ Follow the guide at https://developers.google.com/gmail/api/quickstart/python#se - save it ### Run the program Run `run.sh` (can be run by double-clicking as well) -The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. \ No newline at end of file +The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. + +## Building from source +Install the `build` tool with pip and run `python3 -m build` to build the package. \ No newline at end of file diff --git a/email_generator/__main__.py b/email_generator/__main__.py deleted file mode 100644 index 621f198..0000000 --- a/email_generator/__main__.py +++ /dev/null @@ -1,38 +0,0 @@ -import json -import concurrent.futures -import fileinput - -import gmail -import mail_util -import email_creator - -# File paths -# TODO: Move these to global paths -google_token_path = ".credentials/token.json" -google_oauth_credentials_path = ".credentials/credentials.json" -# TODO: Pull attachments from a directory -attachment_paths = [] - -if __name__ == "__main__": - # Load the companies from the JSON file - print("Processing input data") - json_data = "" - for line in fileinput.input(): - json_data += line - companies = json.loads(json_data) - - # Authenticate with Google - print("Authenticating") - creds = gmail.get_creds(google_token_path, google_oauth_credentials_path) - - # Build all of the attachments - print("Processing attachments") - attachments = [] - with concurrent.futures.ProcessPoolExecutor() as executor: - for attachment_path in attachment_paths: - attachments.append(mail_util.build_attachment(attachment_path)) - - print("Generating and uploading E-mails") - with concurrent.futures.ProcessPoolExecutor() as executor: - for company in companies: - gmail.create_draft(creds, email_creator.create_email_body(company, attachments)) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..3684d87 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,52 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "email_generator" +version = "0.0.1" +description = "A utility to generate E-mail drafts from a list of E-mail addresses." +readme = "README.md" +license = {file = "LICENSE"} +requires-python = ">=3.8" +keywords = ["email", "gmail", "email-template", "email-generator"] + +# This should be your name or the name of the organization who originally authored the project, and a valid email address corresponding to the name listed. +authors = [ + {name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, + {name = "Max Nargang", email = "CoffeeCoder1@outlook.com" } +] + +# This should be your name or the names of the organization who currently maintains the project, and a valid email address corresponding to the name listed. +maintainers = [ + {name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, + {name = "Max Nargang", email = "CoffeeCoder1@outlook.com" } +] + +# For a list of valid classifiers, see https://pypi.org/classifiers/ +classifiers = [ + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + "Development Status :: 3 - Alpha", + "Intended Audience :: Customer Service", + "Topic :: Communications :: Email :: Mailing List Servers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", +] + +dependencies = [ + "google-api-python-client", + "google-auth-httplib2", + "google-auth-oauthlib", +] + +[project.urls] +"Homepage" = "https://github.com/fodfodfod/Email-Generator" +"Bug Reports" = "https://github.com/fodfodfod/Email-Generator/issues" +"Source" = "https://github.com/fodfodfod/Email-Generator" + +[project.scripts] +email-generator = "email_generator.main:main" +email-list-parser = "email_generator.file_parser.main:main" \ No newline at end of file diff --git a/run.sh b/run.sh index a64df19..a4aac8c 100755 --- a/run.sh +++ b/run.sh @@ -2,4 +2,4 @@ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) cd "$parent_path" source "$parent_path/.venv/bin/activate" -python3 file_parser email-template.txt | python3 email_generator \ No newline at end of file +email-list-parser email-template.txt | email-generator \ No newline at end of file diff --git a/setup.sh b/setup.sh index 589610e..098a3a8 100755 --- a/setup.sh +++ b/setup.sh @@ -3,4 +3,6 @@ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) cd "$parent_path" python3 -m venv "$parent_path/.venv" source "$parent_path/.venv/bin/activate" -pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib \ No newline at end of file +pip3 install build +python3 -m build +pip3 install --force-reinstall ./dist/*.whl \ No newline at end of file diff --git a/src/email_generator/__init__.py b/src/email_generator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/email_generator/__main__.py b/src/email_generator/__main__.py new file mode 100644 index 0000000..dd1d6d0 --- /dev/null +++ b/src/email_generator/__main__.py @@ -0,0 +1,4 @@ +import email_generator.main + +if __name__ == "__main__": + email_generator.main.main() \ No newline at end of file diff --git a/email_generator/email_creator.py b/src/email_generator/email_creator.py similarity index 92% rename from email_generator/email_creator.py rename to src/email_generator/email_creator.py index 262858a..fae5e4f 100644 --- a/email_generator/email_creator.py +++ b/src/email_generator/email_creator.py @@ -1,8 +1,8 @@ import base64 from email.message import EmailMessage -# Generates an E-mail with the provided company name and attachments def create_email_body(company, attachments): + """Generates an E-mail with the provided company name and attachments""" mime_message = EmailMessage() # headers diff --git a/src/email_generator/file_parser/__init__.py b/src/email_generator/file_parser/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/email_generator/file_parser/__main__.py b/src/email_generator/file_parser/__main__.py new file mode 100644 index 0000000..56aad47 --- /dev/null +++ b/src/email_generator/file_parser/__main__.py @@ -0,0 +1,4 @@ +import email_generator.file_parser.main + +if __name__ == "__main__": + email_generator.file_parser.main.main() \ No newline at end of file diff --git a/file_parser/__main__.py b/src/email_generator/file_parser/main.py similarity index 53% rename from file_parser/__main__.py rename to src/email_generator/file_parser/main.py index c7169c5..c386ba5 100644 --- a/file_parser/__main__.py +++ b/src/email_generator/file_parser/main.py @@ -1,35 +1,33 @@ -"""Takes a text file and converts it to a JSON file that can be read by the program -File format is a newline-seperated list of company names and e-mail adresses like this: -``` -Company Name 1 -e-mail@company1.com -Company Name 2 -e-mail@company2.com -Company Name 3 -e-mail@company3.com -``` -""" - import sys import fileinput import json import concurrent.futures -companies = [] - -if __name__ == "__main__": - try: +def main(): + """Takes a text file and converts it to a JSON file that can be read by the program + File format is a newline-seperated list of company names and e-mail adresses like this: + ``` + Company Name 1 + e-mail@company1.com + Company Name 2 + e-mail@company2.com + Company Name 3 + e-mail@company3.com + ``` + """ + try: chars = [] for char in fileinput.input(): chars.append(char) lines = ''.join(chars).split('\n') + companies = [] with concurrent.futures.ProcessPoolExecutor() as executor: for i in range(0, len(lines), 2): companies.append({ 'name': lines[i].strip(), - 'email': lines[i+1].strip() + 'email': lines[i+1].strip() }) except: raise ValueError("Invalid input file") - + json.dump(companies, sys.stdout, indent="\t") \ No newline at end of file diff --git a/email_generator/gmail.py b/src/email_generator/gmail.py similarity index 95% rename from email_generator/gmail.py rename to src/email_generator/gmail.py index 5557ef6..705db0b 100644 --- a/email_generator/gmail.py +++ b/src/email_generator/gmail.py @@ -8,8 +8,8 @@ # If modifying these scopes, delete the file token.json. SCOPES = ["https://www.googleapis.com/auth/gmail.compose"] -# Gets the user's Gmail credentials def get_creds(token_path, creds_path): + """Gets the user's Gmail credentials""" creds = None # The file token.json stores the user's access and refresh tokens, and is created automatically when the authorization flow completes for the first time. if os.path.exists(token_path): @@ -34,8 +34,8 @@ def get_creds(token_path, creds_path): return creds -# Creates an email draft with the provided body def create_draft(creds, body): + """Creates an email draft with the provided body""" try: # Create Gmail API client service = build("gmail", "v1", credentials=creds) diff --git a/email_generator/mail_util.py b/src/email_generator/mail_util.py similarity index 77% rename from email_generator/mail_util.py rename to src/email_generator/mail_util.py index 7b46624..96f5e18 100644 --- a/email_generator/mail_util.py +++ b/src/email_generator/mail_util.py @@ -1,14 +1,14 @@ import os import mimetypes -# Builds an attachment into an array of values so it can be passed around as an object def build_attachment(path): + """Builds an attachment into an array of values so it can be passed around as an object""" type_subtype, _ = mimetypes.guess_type(path) maintype, subtype = type_subtype.split("/") with open(path, "rb") as fp: attachment_data = fp.read() - + return { 'data': attachment_data, 'name': os.path.basename(path), diff --git a/src/email_generator/main.py b/src/email_generator/main.py new file mode 100644 index 0000000..d40c91d --- /dev/null +++ b/src/email_generator/main.py @@ -0,0 +1,38 @@ +import json +import concurrent.futures +import fileinput + +import email_generator.gmail +import email_generator.mail_util +import email_generator.email_creator + +def main(): + # File paths + # TODO: Move these to global paths + google_token_path = ".credentials/token.json" + google_oauth_credentials_path = ".credentials/credentials.json" + # TODO: Pull attachments from a directory + attachment_paths = [] + + # Load the companies from the JSON file + print("Processing input data") + json_data = "" + for line in fileinput.input(): + json_data += line + companies = json.loads(json_data) + + # Authenticate with Google + print("Authenticating") + creds = email_generator.gmail.get_creds(google_token_path, google_oauth_credentials_path) + + # Build all of the attachments + print("Processing attachments") + attachments = [] + with concurrent.futures.ProcessPoolExecutor() as executor: + for attachment_path in attachment_paths: + attachments.append(email_generator.mail_util.build_attachment(attachment_path)) + + print("Generating and uploading E-mails") + with concurrent.futures.ProcessPoolExecutor() as executor: + for company in companies: + email_generator.gmail.create_draft(creds, email_generator.email_creator.create_email_body(company, attachments)) \ No newline at end of file From 7dd9c55f1b338a70a2b279a34945bb683287c9c7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 20:08:01 -0400 Subject: [PATCH 007/110] Rename module to resolve naming conflict --- pyproject.toml | 6 +++--- .../__init__.py | 0 src/email_draft_generator/__main__.py | 4 ++++ .../email_creator.py | 0 .../file_parser/__init__.py | 0 src/email_draft_generator/file_parser/__main__.py | 4 ++++ .../file_parser/main.py | 0 .../gmail.py | 0 .../mail_util.py | 0 .../main.py | 12 ++++++------ src/email_generator/__main__.py | 4 ---- src/email_generator/file_parser/__main__.py | 4 ---- 12 files changed, 17 insertions(+), 17 deletions(-) rename src/{email_generator => email_draft_generator}/__init__.py (100%) create mode 100644 src/email_draft_generator/__main__.py rename src/{email_generator => email_draft_generator}/email_creator.py (100%) rename src/{email_generator => email_draft_generator}/file_parser/__init__.py (100%) create mode 100644 src/email_draft_generator/file_parser/__main__.py rename src/{email_generator => email_draft_generator}/file_parser/main.py (100%) rename src/{email_generator => email_draft_generator}/gmail.py (100%) rename src/{email_generator => email_draft_generator}/mail_util.py (100%) rename src/{email_generator => email_draft_generator}/main.py (66%) delete mode 100644 src/email_generator/__main__.py delete mode 100644 src/email_generator/file_parser/__main__.py diff --git a/pyproject.toml b/pyproject.toml index 3684d87..369f645 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["hatchling"] build-backend = "hatchling.build" [project] -name = "email_generator" +name = "email_draft_generator" version = "0.0.1" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" @@ -48,5 +48,5 @@ dependencies = [ "Source" = "https://github.com/fodfodfod/Email-Generator" [project.scripts] -email-generator = "email_generator.main:main" -email-list-parser = "email_generator.file_parser.main:main" \ No newline at end of file +email-generator = "email_draft_generator.main:main" +email-list-parser = "email_draft_generator.file_parser.main:main" \ No newline at end of file diff --git a/src/email_generator/__init__.py b/src/email_draft_generator/__init__.py similarity index 100% rename from src/email_generator/__init__.py rename to src/email_draft_generator/__init__.py diff --git a/src/email_draft_generator/__main__.py b/src/email_draft_generator/__main__.py new file mode 100644 index 0000000..f9ae293 --- /dev/null +++ b/src/email_draft_generator/__main__.py @@ -0,0 +1,4 @@ +import email_draft_generator.main + +if __name__ == "__main__": + email_draft_generator.main.main() \ No newline at end of file diff --git a/src/email_generator/email_creator.py b/src/email_draft_generator/email_creator.py similarity index 100% rename from src/email_generator/email_creator.py rename to src/email_draft_generator/email_creator.py diff --git a/src/email_generator/file_parser/__init__.py b/src/email_draft_generator/file_parser/__init__.py similarity index 100% rename from src/email_generator/file_parser/__init__.py rename to src/email_draft_generator/file_parser/__init__.py diff --git a/src/email_draft_generator/file_parser/__main__.py b/src/email_draft_generator/file_parser/__main__.py new file mode 100644 index 0000000..f2cf2b7 --- /dev/null +++ b/src/email_draft_generator/file_parser/__main__.py @@ -0,0 +1,4 @@ +import email_draft_generator.file_parser.main + +if __name__ == "__main__": + email_draft_generator.file_parser.main.main() \ No newline at end of file diff --git a/src/email_generator/file_parser/main.py b/src/email_draft_generator/file_parser/main.py similarity index 100% rename from src/email_generator/file_parser/main.py rename to src/email_draft_generator/file_parser/main.py diff --git a/src/email_generator/gmail.py b/src/email_draft_generator/gmail.py similarity index 100% rename from src/email_generator/gmail.py rename to src/email_draft_generator/gmail.py diff --git a/src/email_generator/mail_util.py b/src/email_draft_generator/mail_util.py similarity index 100% rename from src/email_generator/mail_util.py rename to src/email_draft_generator/mail_util.py diff --git a/src/email_generator/main.py b/src/email_draft_generator/main.py similarity index 66% rename from src/email_generator/main.py rename to src/email_draft_generator/main.py index d40c91d..3f3b86e 100644 --- a/src/email_generator/main.py +++ b/src/email_draft_generator/main.py @@ -2,9 +2,9 @@ import concurrent.futures import fileinput -import email_generator.gmail -import email_generator.mail_util -import email_generator.email_creator +import email_draft_generator.gmail +import email_draft_generator.mail_util +import email_draft_generator.email_creator def main(): # File paths @@ -23,16 +23,16 @@ def main(): # Authenticate with Google print("Authenticating") - creds = email_generator.gmail.get_creds(google_token_path, google_oauth_credentials_path) + creds = email_draft_generator.gmail.get_creds(google_token_path, google_oauth_credentials_path) # Build all of the attachments print("Processing attachments") attachments = [] with concurrent.futures.ProcessPoolExecutor() as executor: for attachment_path in attachment_paths: - attachments.append(email_generator.mail_util.build_attachment(attachment_path)) + attachments.append(email_draft_generator.mail_util.build_attachment(attachment_path)) print("Generating and uploading E-mails") with concurrent.futures.ProcessPoolExecutor() as executor: for company in companies: - email_generator.gmail.create_draft(creds, email_generator.email_creator.create_email_body(company, attachments)) \ No newline at end of file + email_draft_generator.gmail.create_draft(creds, email_draft_generator.email_creator.create_email_body(company, attachments)) \ No newline at end of file diff --git a/src/email_generator/__main__.py b/src/email_generator/__main__.py deleted file mode 100644 index dd1d6d0..0000000 --- a/src/email_generator/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -import email_generator.main - -if __name__ == "__main__": - email_generator.main.main() \ No newline at end of file diff --git a/src/email_generator/file_parser/__main__.py b/src/email_generator/file_parser/__main__.py deleted file mode 100644 index 56aad47..0000000 --- a/src/email_generator/file_parser/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -import email_generator.file_parser.main - -if __name__ == "__main__": - email_generator.file_parser.main.main() \ No newline at end of file From cee92638f1f1e12eff1a00f61664475e726edf69 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 20:13:06 -0400 Subject: [PATCH 008/110] Fix indentation --- src/email_draft_generator/file_parser/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/file_parser/main.py b/src/email_draft_generator/file_parser/main.py index c386ba5..ef89188 100644 --- a/src/email_draft_generator/file_parser/main.py +++ b/src/email_draft_generator/file_parser/main.py @@ -25,7 +25,7 @@ def main(): for i in range(0, len(lines), 2): companies.append({ 'name': lines[i].strip(), - 'email': lines[i+1].strip() + 'email': lines[i+1].strip() }) except: raise ValueError("Invalid input file") From ea753908d382d62f2f153548f58bd4faf81a7f44 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 21:21:51 -0400 Subject: [PATCH 009/110] Pull the template from a JSON file --- README.md | 27 ++++++++++++------ email-template.txt => data/email-list.txt | 0 data/template.json | 5 ++++ data/test_image.png | Bin 0 -> 13503 bytes data/test_pdf.pdf | Bin 0 -> 12586 bytes pyproject.toml | 2 +- run.sh | 2 +- src/email_draft_generator/email_creator.py | 20 +++++-------- src/email_draft_generator/main.py | 31 ++++++++++++++++----- 9 files changed, 57 insertions(+), 30 deletions(-) rename email-template.txt => data/email-list.txt (100%) create mode 100644 data/template.json create mode 100644 data/test_image.png create mode 100644 data/test_pdf.pdf diff --git a/README.md b/README.md index b521bec..eab8fec 100644 --- a/README.md +++ b/README.md @@ -4,20 +4,31 @@ Download the latest release as a `tar.gz` file. ## Setup +### Build program +Run `setup.sh` (can be run by simply double-clicking on the file). + ### Set up the Google API Follow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to generate OAuth2 credentials, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope so the script can edit drafts. Download them into `.credentials/credentials.json` (you will have to create this directory yourself, and show hidden files to see it on MacOS). + ### Set up the template -- update the email template in `email_generator/email_creator.py` -- put the file paths to any attachments in the `attachment_paths` list in `email_generator/main.py` -### Build program -Run `setup.sh` (can be run by simply double-clicking on the file) -If you make any changes to the template after this, run `setup.sh` again. +Update the email template in `data/template.json`. + +#### Template Format +| Key | Value | +|--------------------------|--------------------------------------------------| +| `subject` (formatted) | E-mail subject | +| `body` (formatted) | E-mail body | +| `attachments` (optional) | Paths to any attachments that should be included | + +Formatted fields can include the following variables +| Variable | Data | +|-----------|----------------| +| `{name}` | Company name | +| `{email}` | Company E-mail | ## Usage ### Prepare data -- copy and paste the table into `email-template.txt` -- make sure there is nothing else in the file -- save it +Copy and paste the table into `data/email-list.txt`. ### Run the program Run `run.sh` (can be run by double-clicking as well) The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. diff --git a/email-template.txt b/data/email-list.txt similarity index 100% rename from email-template.txt rename to data/email-list.txt diff --git a/data/template.json b/data/template.json new file mode 100644 index 0000000..f0a7bd8 --- /dev/null +++ b/data/template.json @@ -0,0 +1,5 @@ +{ + "subject": "Special offer!!!!", + "body": "Dear {name},\nWe are pleased to inform you that your company has been selected for a special offer.\nPlease find attached the details of the offer.\n\nBest regards,\nYour Company", + "attachments": ["data/test_pdf.pdf", "data/test_image.png"] +} \ No newline at end of file diff --git a/data/test_image.png b/data/test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..a356038bea648cbc457f62fe66448e685926304b GIT binary patch literal 13503 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 U0Ycjcs5p?Uq>@CHm|?*G0ZkH9jsO4v literal 0 HcmV?d00001 diff --git a/data/test_pdf.pdf b/data/test_pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e4a55382e11591f5ac11db53fc732c7ac8f6b209 GIT binary patch literal 12586 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 Date: Fri, 17 May 2024 21:40:17 -0400 Subject: [PATCH 010/110] Add a Github action to publish package on release --- .github/workflows/python-publish.yml | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 0000000..2c21fae --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,39 @@ +# This workflow will upload a Python Package using Twine when a release is created +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Upload Python Package + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: '3.12' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build + - name: Build package + run: python -m build + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} From bb65170546710875c2492f99abc23933b614d1a1 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 21:44:39 -0400 Subject: [PATCH 011/110] Create a GitHub action to build on push and release on tag --- .github/workflows/python-build.yml | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/python-build.yml diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml new file mode 100644 index 0000000..87ff7dd --- /dev/null +++ b/.github/workflows/python-build.yml @@ -0,0 +1,31 @@ +name: Build CI/CD + +on: + push: + pull_request: + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: '3.12' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build + - name: Build package + run: python -m build + - name: Upload a Build Artifact + uses: actions/upload-artifact@v3.1.3 + with: + path: dist/* + - name: Create release + uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'refs/tags/') + with: + files: dist/* From 72016cfe8efc2c4b961711e0cd98d3f42cbc0d80 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 22:20:07 -0400 Subject: [PATCH 012/110] Combine the GitHub Actions workflows into one workflow --- .github/workflows/python-build.yml | 8 +++++- .github/workflows/python-publish.yml | 39 ---------------------------- 2 files changed, 7 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 87ff7dd..c92cce5 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -1,3 +1,4 @@ +# Builds the package, and, if the commit has a tag assigned to it, create a release for it and publish it to PyPI name: Build CI/CD on: @@ -6,7 +7,6 @@ on: jobs: build: - name: Build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -29,3 +29,9 @@ jobs: if: startsWith(github.ref, 'refs/tags/') with: files: dist/* + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + if: startsWith(github.ref, 'refs/tags/') + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml deleted file mode 100644 index 2c21fae..0000000 --- a/.github/workflows/python-publish.yml +++ /dev/null @@ -1,39 +0,0 @@ -# This workflow will upload a Python Package using Twine when a release is created -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries - -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -name: Upload Python Package - -on: - release: - types: [published] - -permissions: - contents: read - -jobs: - deploy: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: '3.12' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install build - - name: Build package - run: python -m build - - name: Publish package - uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} From 63d459fea49c2414131125e32f2c42b52e33187c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 17 May 2024 23:02:44 -0400 Subject: [PATCH 013/110] Split the GitHub Actions workflow into seperate jobs --- .github/workflows/python-build.yml | 31 +++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index c92cce5..a2333c5 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -6,6 +6,7 @@ on: pull_request: jobs: + # Builds the package and uploads a build artifiact build: runs-on: ubuntu-latest steps: @@ -23,15 +24,39 @@ jobs: - name: Upload a Build Artifact uses: actions/upload-artifact@v3.1.3 with: + name: distribution-archives path: dist/* + # Creates a release if the commit has a tag associated with it + release: + needs: build + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Download build + uses: actions/download-artifact@v4.1.7 + with: + name: distribution-archives + path: dist - name: Create release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: dist/* + # Publish to PyPI if the commit has a tag associated with it + publish: + needs: build + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Download build + uses: actions/download-artifact@v4.1.7 + with: + name: distribution-archives + path: dist - name: Publish package - uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 - if: startsWith(github.ref, 'refs/tags/') + uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 with: user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} \ No newline at end of file + password: ${{ secrets.PYPI_API_TOKEN }} From 9384bf1cee1c2564eb6a59a680ad38d3cf9c6f68 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 10:06:03 -0400 Subject: [PATCH 014/110] Add command line arguments for various things --- run.sh | 2 +- src/email_draft_generator/main.py | 30 +++++++++++++++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/run.sh b/run.sh index 0ce1dca..4963351 100755 --- a/run.sh +++ b/run.sh @@ -2,4 +2,4 @@ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) cd "$parent_path" source "$parent_path/.venv/bin/activate" -email-list-parser data/email-list.txt | email-generator \ No newline at end of file +email-list-parser "$parent_path/data/email-list.txt" | email-generator -t "$parent_path/data/template.json" - \ No newline at end of file diff --git a/src/email_draft_generator/main.py b/src/email_draft_generator/main.py index 22e0f76..a31c190 100644 --- a/src/email_draft_generator/main.py +++ b/src/email_draft_generator/main.py @@ -1,32 +1,36 @@ -import os import json import concurrent.futures -import fileinput +import argparse import email_draft_generator.gmail import email_draft_generator.mail_util import email_draft_generator.email_creator def main(): + # Command-line arguments + parser = argparse.ArgumentParser( + prog='email-generator', + description='Generates E-mail drafts from a list of E-mail addresses and uploads them to Gmail.' + ) + + parser.add_argument('-t', '--template', type=argparse.FileType('r'), help='the template file to use') + parser.add_argument('infile', type=argparse.FileType('r'), help='the list of e-mail addresses to parse') + + args = parser.parse_args() + # File paths - # TODO: Move these to global paths + # TODO: Use a keyring for these google_token_path = ".credentials/token.json" google_oauth_credentials_path = ".credentials/credentials.json" # Load the companies from the JSON file print("Processing input data") - json_data = "" - for line in fileinput.input(): - json_data += line - companies = json.loads(json_data) + companies = json.load(args.infile) # Load the template, or use the default if none is provided - # TODO: Create a command line argument for the template path - template_path = "data/template.json" - if os.path.exists(template_path): - with open(template_path) as f: - template = json.load(f) - print("Template loaded from file") + if args.template: + template = json.load(args.template) + print("Template loaded from file") else: template = { 'subject': "Test E-mail", From 16c760295d8b5cfce4fbabe148fb4795a2a6b807 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 10:54:45 -0400 Subject: [PATCH 015/110] Add a more guided credential setup process --- src/email_draft_generator/gmail.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/email_draft_generator/gmail.py b/src/email_draft_generator/gmail.py index 705db0b..37cbfe5 100644 --- a/src/email_draft_generator/gmail.py +++ b/src/email_draft_generator/gmail.py @@ -1,4 +1,5 @@ import os +from pathlib import Path from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow @@ -23,11 +24,24 @@ def get_creds(token_path, creds_path): else: # If OAuth2 creds do not exist, tell the user to create them if not os.path.exists(creds_path): - raise FileNotFoundError(f"No OAuth2 Credentials exist! Follow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to create them, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope. Download them into `.credentials/credentials.json`, and re-launch the program.") - # If they do, create an OAuth flow + creds_path_input = input("No OAuth2 Credentials exist!\nFollow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to create them, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope.\nDownload them to your device, copy the file path, and enter it here: ") + + input_path = Path(creds_path_input) + with open(input_path, "r") as creds_input: + oauth_creds = creds_input.read() + + flow = InstalledAppFlow.from_client_secrets_file(creds_path_input, SCOPES) + + output_path = Path(creds_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(creds_path, "w") as creds_output: + creds_output.write(oauth_creds) + + input_path.unlink(missing_ok=True) else: + # If they do, create an OAuth flow flow = InstalledAppFlow.from_client_secrets_file(creds_path, SCOPES) - creds = flow.run_local_server(port=0) + creds = flow.run_local_server(port=0) # Save the credentials for the next run with open(token_path, "w") as token: token.write(creds.to_json()) From 0bfb928e9b998ae4940e54c882c859b94e90ed1b Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 10:55:59 -0400 Subject: [PATCH 016/110] New version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 13ce53b..d908b8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "email_draft_generator" -version = "0.0.2" +version = "0.0.3" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" license = {file = "LICENSE"} From 6a9a3fea553fd8db562be1653a0e9b53d9bddb46 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 11:02:05 -0400 Subject: [PATCH 017/110] Remove artifact names from the GitHub Actions workflow's download tasks --- .github/workflows/python-build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index a2333c5..7dc17af 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -36,7 +36,6 @@ jobs: - name: Download build uses: actions/download-artifact@v4.1.7 with: - name: distribution-archives path: dist - name: Create release uses: softprops/action-gh-release@v2 @@ -53,7 +52,6 @@ jobs: - name: Download build uses: actions/download-artifact@v4.1.7 with: - name: distribution-archives path: dist - name: Publish package uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 From 8ac39dbb15c6c709cdd7f8ba48d89591ec4d0546 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 12:17:25 -0400 Subject: [PATCH 018/110] Update deprecated Github Actions actions Also adds back the name field in the download artifact action as that might work now --- .github/workflows/python-build.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 7dc17af..1338c9a 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -12,7 +12,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5.1.0 with: python-version: '3.12' - name: Install dependencies @@ -22,7 +22,7 @@ jobs: - name: Build package run: python -m build - name: Upload a Build Artifact - uses: actions/upload-artifact@v3.1.3 + uses: actions/upload-artifact@v4.3.3 with: name: distribution-archives path: dist/* @@ -36,6 +36,7 @@ jobs: - name: Download build uses: actions/download-artifact@v4.1.7 with: + name: distribution-archives path: dist - name: Create release uses: softprops/action-gh-release@v2 @@ -52,6 +53,7 @@ jobs: - name: Download build uses: actions/download-artifact@v4.1.7 with: + name: distribution-archives path: dist - name: Publish package uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 From 9ec5b9b9b49d35c57a265b3b57bd362a754adaf8 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 12:24:32 -0400 Subject: [PATCH 019/110] Split the file parser into modules --- src/email_draft_generator/file_parser/main.py | 37 +++++++------------ .../file_parser/text_parser.py | 23 ++++++++++++ 2 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 src/email_draft_generator/file_parser/text_parser.py diff --git a/src/email_draft_generator/file_parser/main.py b/src/email_draft_generator/file_parser/main.py index ef89188..8582481 100644 --- a/src/email_draft_generator/file_parser/main.py +++ b/src/email_draft_generator/file_parser/main.py @@ -1,32 +1,21 @@ import sys -import fileinput +import argparse import json -import concurrent.futures +import email_draft_generator.file_parser.text_parser as text_parser def main(): - """Takes a text file and converts it to a JSON file that can be read by the program - File format is a newline-seperated list of company names and e-mail adresses like this: - ``` - Company Name 1 - e-mail@company1.com - Company Name 2 - e-mail@company2.com - Company Name 3 - e-mail@company3.com - ``` - """ + # Command-line arguments + parser = argparse.ArgumentParser( + prog='email-list-parser', + description='Takes a list of E-mail addresses and turns it into a JSON file.' + ) + + parser.add_argument('infile', type=argparse.FileType('r'), help='the list of e-mail addresses to parse') + + args = parser.parse_args() + try: - chars = [] - for char in fileinput.input(): - chars.append(char) - lines = ''.join(chars).split('\n') - companies = [] - with concurrent.futures.ProcessPoolExecutor() as executor: - for i in range(0, len(lines), 2): - companies.append({ - 'name': lines[i].strip(), - 'email': lines[i+1].strip() - }) + companies = text_parser.parse(args.infile.readlines()) except: raise ValueError("Invalid input file") diff --git a/src/email_draft_generator/file_parser/text_parser.py b/src/email_draft_generator/file_parser/text_parser.py new file mode 100644 index 0000000..d238d1a --- /dev/null +++ b/src/email_draft_generator/file_parser/text_parser.py @@ -0,0 +1,23 @@ +import concurrent.futures + +def parse(data): + """Takes a text file and converts it to a list of companies. +Data format is a newline-seperated list of company names and e-mail adresses like this: +``` +Company Name 1 +e-mail@company1.com +Company Name 2 +e-mail@company2.com +Company Name 3 +e-mail@company3.com +... +``` +""" + companies = [] + with concurrent.futures.ProcessPoolExecutor() as executor: + for i in range(0, len(data), 2): + companies.append({ + 'name': data[i].strip(), + 'email': data[i+1].strip() + }) + return companies \ No newline at end of file From 9f26d918c6bf3adba260e300c01bfd0b8c5fca0c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 12:58:02 -0400 Subject: [PATCH 020/110] Add a CSV parser --- data/email-list.csv | 6 ++++++ pyproject.toml | 2 +- src/email_draft_generator/file_parser/csv_parser.py | 11 +++++++++++ src/email_draft_generator/file_parser/main.py | 9 +++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 data/email-list.csv create mode 100644 src/email_draft_generator/file_parser/csv_parser.py diff --git a/data/email-list.csv b/data/email-list.csv new file mode 100644 index 0000000..66012fd --- /dev/null +++ b/data/email-list.csv @@ -0,0 +1,6 @@ +google,google@example.com +apple,apple@example.com +uhs,uhs@example.com +amazon,example.com +facebook,facebook@example.com +microsoft,sdoijf@example.com \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index d908b8b..1c020b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "email_draft_generator" -version = "0.0.3" +version = "0.0.4" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" license = {file = "LICENSE"} diff --git a/src/email_draft_generator/file_parser/csv_parser.py b/src/email_draft_generator/file_parser/csv_parser.py new file mode 100644 index 0000000..50238f9 --- /dev/null +++ b/src/email_draft_generator/file_parser/csv_parser.py @@ -0,0 +1,11 @@ +import csv +import concurrent.futures + +def parse(data): + """Takes a CSV file with fields `name,email` and parses it into a list of companies""" + companies = [] + reader = csv.DictReader(data, fieldnames=["name", "email"]) + with concurrent.futures.ProcessPoolExecutor() as executor: + for row in reader: + companies.append(row) + return companies \ No newline at end of file diff --git a/src/email_draft_generator/file_parser/main.py b/src/email_draft_generator/file_parser/main.py index 8582481..57a7da1 100644 --- a/src/email_draft_generator/file_parser/main.py +++ b/src/email_draft_generator/file_parser/main.py @@ -1,7 +1,8 @@ import sys import argparse import json -import email_draft_generator.file_parser.text_parser as text_parser +from email_draft_generator.file_parser import text_parser +from email_draft_generator.file_parser import csv_parser def main(): # Command-line arguments @@ -10,12 +11,16 @@ def main(): description='Takes a list of E-mail addresses and turns it into a JSON file.' ) + parser.add_argument('--format', choices=['text', 'csv'], default='text', help='the format of the input file (default: text)') parser.add_argument('infile', type=argparse.FileType('r'), help='the list of e-mail addresses to parse') args = parser.parse_args() try: - companies = text_parser.parse(args.infile.readlines()) + if args.format == 'text': + companies = text_parser.parse(args.infile.readlines()) + elif args.format == 'csv': + companies = csv_parser.parse(args.infile) except: raise ValueError("Invalid input file") From 55b07d585521dc36ce7505349f9e43d285f1ef62 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 14:03:35 -0400 Subject: [PATCH 021/110] Update README --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index eab8fec..9773f60 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,39 @@ # Email Generator -## Installation -Download the latest release as a `tar.gz` file. +## Installation (PyPI) +```sh +pip3 install email-draft-generator +``` -## Setup -### Build program -Run `setup.sh` (can be run by simply double-clicking on the file). +## Building from source +Install the `build` tool with pip and run `python3 -m build` to build the package. + +## Usage +The utility provides two binaries: `email-generator` and `email-list-parser`. + +### email-generator +`email-generator` takes a JSON-formatted list of E-mail addresses and recipient names, formats them according to the template JSON, and uploads them to Gmail. To set up the Google API, run it once (you will need to provide a valid list of E-mail addresses for it to run), and it will guide you through setting this up. Most of the usage specifics are described in the usage help, which you can show by running `email-generator -h`. -### Set up the Google API -Follow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to generate OAuth2 credentials, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope so the script can edit drafts. Download them into `.credentials/credentials.json` (you will have to create this directory yourself, and show hidden files to see it on MacOS). +### email-list-parser +`email-list-parser` takes a CSV formatted list or a newline-seperated list of values and turn it into a JSON file which can be piped into `email-generator`. -### Set up the template -Update the email template in `data/template.json`. +#### Text file format +The values should be formatted as follows +``` +Company Name 1 +e-mail@company1.com +Company Name 2 +e-mail@company2.com +Company Name 3 +e-mail@company3.com +... +``` -#### Template Format +#### CSV format +The CSV file should have the keys in the order `name,email` + +### Template Format +The E-mail template is a JSON file with the following keys | Key | Value | |--------------------------|--------------------------------------------------| | `subject` (formatted) | E-mail subject | @@ -26,12 +46,22 @@ Formatted fields can include the following variables | `{name}` | Company name | | `{email}` | Company E-mail | -## Usage +## Installation (scripts) +Download the latest release as a `tar.gz` file. + +### Setup +#### Build program +Run `setup.sh` (can be run by simply double-clicking on the file). + +#### Set up the template +Update the email template in `data/template.json` according to the [template format](#template-format). + +#### Google API +Run the program once, and it will guide you through setting up the Google API. + +## Usage (scripts) ### Prepare data Copy and paste the table into `data/email-list.txt`. ### Run the program Run `run.sh` (can be run by double-clicking as well) -The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. - -## Building from source -Install the `build` tool with pip and run `python3 -m build` to build the package. \ No newline at end of file +The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. \ No newline at end of file From 79ef0444bbbd012e9758c2f4d1b4e91cea4fbe51 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 18:53:01 -0400 Subject: [PATCH 022/110] Seperate authentication logic from TUI and move credentials to a global location --- src/email_draft_generator/__main__.py | 4 +- src/email_draft_generator/gmail.py | 74 +++++++++++++++++---------- src/email_draft_generator/main.py | 10 ++-- 3 files changed, 54 insertions(+), 34 deletions(-) diff --git a/src/email_draft_generator/__main__.py b/src/email_draft_generator/__main__.py index f9ae293..910b424 100644 --- a/src/email_draft_generator/__main__.py +++ b/src/email_draft_generator/__main__.py @@ -1,4 +1,4 @@ -import email_draft_generator.main +from email_draft_generator import main if __name__ == "__main__": - email_draft_generator.main.main() \ No newline at end of file + main.main() \ No newline at end of file diff --git a/src/email_draft_generator/gmail.py b/src/email_draft_generator/gmail.py index 37cbfe5..8955cd7 100644 --- a/src/email_draft_generator/gmail.py +++ b/src/email_draft_generator/gmail.py @@ -9,43 +9,61 @@ # If modifying these scopes, delete the file token.json. SCOPES = ["https://www.googleapis.com/auth/gmail.compose"] -def get_creds(token_path, creds_path): - """Gets the user's Gmail credentials""" - creds = None +def get_oauth_flow(global_creds_path, creds_path=None): + """Get an OAuth2 flow from the specified credentials, copying them to the global location if they are not already there.""" + if not os.path.exists(global_creds_path) and creds_path: + # If the global credentials do not exist, copy the provided credentials there + input_path = Path(creds_path) + with open(input_path, "r") as creds_input: + oauth_creds = creds_input.read() + + flow = InstalledAppFlow.from_client_secrets_file(creds_path, SCOPES) + + output_path = Path(global_creds_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(global_creds_path, "w") as creds_output: + creds_output.write(oauth_creds) + + input_path.unlink(missing_ok=True) + else: + # If they do, create an OAuth flow + flow = InstalledAppFlow.from_client_secrets_file(global_creds_path, SCOPES) + return flow + +def get_token(token_path): + """Get the user's OAuth2 token and refresh it if it is expired.""" # The file token.json stores the user's access and refresh tokens, and is created automatically when the authorization flow completes for the first time. if os.path.exists(token_path): creds = Credentials.from_authorized_user_file(token_path, SCOPES) - # If there are no (valid) credentials available, let the user log in. - if not creds or not creds.valid: # Refresh expired creds if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) - # Create new creds - else: - # If OAuth2 creds do not exist, tell the user to create them - if not os.path.exists(creds_path): - creds_path_input = input("No OAuth2 Credentials exist!\nFollow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to create them, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope.\nDownload them to your device, copy the file path, and enter it here: ") - - input_path = Path(creds_path_input) - with open(input_path, "r") as creds_input: - oauth_creds = creds_input.read() - - flow = InstalledAppFlow.from_client_secrets_file(creds_path_input, SCOPES) + else: + creds = None + return creds - output_path = Path(creds_path) - output_path.parent.mkdir(parents=True, exist_ok=True) - with open(creds_path, "w") as creds_output: - creds_output.write(oauth_creds) +def write_token(creds, token_path): + """Sets the user's token globally.""" + output_path = Path(token_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(token_path, "w") as token: + token.write(creds.to_json()) - input_path.unlink(missing_ok=True) - else: - # If they do, create an OAuth flow - flow = InstalledAppFlow.from_client_secrets_file(creds_path, SCOPES) - creds = flow.run_local_server(port=0) +def get_creds(token_path, creds_path): + """Gets the user's Gmail credentials, asking for input on the command line where necessary.""" + creds = get_token(token_path) + # If there are no (valid) credentials available, let the user log in. + if not creds or not creds.valid: + # Create new creds + # If OAuth2 creds do not exist, tell the user to create them + if not os.path.exists(creds_path): + creds_path_input = input("No OAuth2 Credentials exist!\nFollow the guide at https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment to create them, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope.\nDownload them to your device, copy the file path, and enter it here: ") + flow = get_oauth_flow(creds_path, creds_path_input) + else: + flow = get_oauth_flow(creds_path) + creds = flow.run_local_server(port=0) # Save the credentials for the next run - with open(token_path, "w") as token: - token.write(creds.to_json()) - + write_token(creds, token_path) return creds def create_draft(creds, body): diff --git a/src/email_draft_generator/main.py b/src/email_draft_generator/main.py index a31c190..4e765e5 100644 --- a/src/email_draft_generator/main.py +++ b/src/email_draft_generator/main.py @@ -1,3 +1,5 @@ +import os + import json import concurrent.futures import argparse @@ -18,10 +20,10 @@ def main(): args = parser.parse_args() - # File paths # TODO: Use a keyring for these - google_token_path = ".credentials/token.json" - google_oauth_credentials_path = ".credentials/credentials.json" + global_creds_dir = os.path.expanduser("~/.local/share/email-generator/credentials") + global_token_path = f"{global_creds_dir}/token.json" + global_creds_path = f"{global_creds_dir}/credentials.json" # Load the companies from the JSON file print("Processing input data") @@ -43,7 +45,7 @@ def main(): # Authenticate with Google print("Authenticating") - creds = email_draft_generator.gmail.get_creds(google_token_path, google_oauth_credentials_path) + creds = email_draft_generator.gmail.get_creds(global_token_path, global_creds_path) # Build all of the attachments attachments = [] From c94a008b334bba0ea4830ced2eb47d3860392185 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 18:54:28 -0400 Subject: [PATCH 023/110] Update editorconfig --- .editorconfig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index 5aa417c..ceaff57 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,5 +8,7 @@ indent_style = tab indent_size = 4 end_of_line = lf charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = false \ No newline at end of file +trim_trailing_whitespace = false +insert_final_newline = false +# Use line wrapping instead of formatting +max_line_length = 1000 \ No newline at end of file From f784caef91e5592cf8c6c694046c11d34dc35d3c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 18 May 2024 19:01:31 -0400 Subject: [PATCH 024/110] Use a Trusted Publisher instead of a token for releasing to PyPI --- .github/workflows/python-build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 1338c9a..c85b150 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -57,6 +57,3 @@ jobs: path: dist - name: Publish package uses: pypa/gh-action-pypi-publish@81e9d935c883d0b210363ab89cf05f3894778450 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} From 64a73ba151e33cb9de2f531d73b7620c146d69fc Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 19 May 2024 13:07:58 -0400 Subject: [PATCH 025/110] Move the sample template to a function --- src/email_draft_generator/email_creator.py | 12 +++++++++++- src/email_draft_generator/main.py | 8 +------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/email_draft_generator/email_creator.py b/src/email_draft_generator/email_creator.py index c83e81b..2384131 100644 --- a/src/email_draft_generator/email_creator.py +++ b/src/email_draft_generator/email_creator.py @@ -21,4 +21,14 @@ def create_email_body(template, company, attachments): encoded_message = base64.urlsafe_b64encode(mime_message.as_bytes()).decode() - return {"message": {"raw": encoded_message}} \ No newline at end of file + return {"message": {"raw": encoded_message}} + +def get_sample_template(): + """Returns a sample E-mail template.""" + return { + 'subject': "Test E-mail", + 'body': """This is a template E-mail used to test an E-mail generation program. Please disregard. + +company.name: {name} +company.email: {email}""", + } \ No newline at end of file diff --git a/src/email_draft_generator/main.py b/src/email_draft_generator/main.py index 4e765e5..0bd8af6 100644 --- a/src/email_draft_generator/main.py +++ b/src/email_draft_generator/main.py @@ -34,13 +34,7 @@ def main(): template = json.load(args.template) print("Template loaded from file") else: - template = { - 'subject': "Test E-mail", - 'body': """This is a template E-mail used to test an E-mail generation program. Please disregard. - -company.name: {name} -company.email: {email}""", - } + template = email_draft_generator.email_creator.get_sample_template() print("No template provided! Sample template was used") # Authenticate with Google From 95a6fd1c7584cc45bafd2017d71219c8d34de61a Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 19 May 2024 17:09:03 -0400 Subject: [PATCH 026/110] Make more things classes --- data/template.json | 9 ++- pyproject.toml | 13 ++-- src/email_draft_generator/__init__.py | 1 + src/email_draft_generator/__main__.py | 2 +- src/email_draft_generator/attachment.py | 28 +++++++ src/email_draft_generator/email_creator.py | 34 --------- src/email_draft_generator/email_list.py | 15 ++++ src/email_draft_generator/email_template.py | 74 +++++++++++++++++++ .../file_parser/__init__.py | 1 + .../file_parser/__main__.py | 4 +- .../file_parser/csv_parser.py | 13 ++-- src/email_draft_generator/file_parser/main.py | 22 +++--- .../file_parser/text_parser.py | 14 ++-- src/email_draft_generator/gmail.py | 23 +++--- src/email_draft_generator/mail_util.py | 17 ----- src/email_draft_generator/main.py | 46 +++++------- 16 files changed, 193 insertions(+), 123 deletions(-) create mode 100644 src/email_draft_generator/attachment.py delete mode 100644 src/email_draft_generator/email_creator.py create mode 100644 src/email_draft_generator/email_list.py create mode 100644 src/email_draft_generator/email_template.py delete mode 100644 src/email_draft_generator/mail_util.py diff --git a/data/template.json b/data/template.json index f0a7bd8..bbb0870 100644 --- a/data/template.json +++ b/data/template.json @@ -1,5 +1,12 @@ { "subject": "Special offer!!!!", "body": "Dear {name},\nWe are pleased to inform you that your company has been selected for a special offer.\nPlease find attached the details of the offer.\n\nBest regards,\nYour Company", - "attachments": ["data/test_pdf.pdf", "data/test_image.png"] + "attachments": [ + { + "path": "data/test_pdf.pdf" + }, + { + "path": "data/test_image.png" + } + ] } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 1c020b2..0bcb4a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,20 +7,20 @@ name = "email_draft_generator" version = "0.0.4" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" -license = {file = "LICENSE"} +license = { file = "LICENSE" } requires-python = ">=3.8" keywords = ["email", "gmail", "email-template", "email-generator"] # This should be your name or the name of the organization who originally authored the project, and a valid email address corresponding to the name listed. authors = [ - {name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, - {name = "Max Nargang", email = "CoffeeCoder1@outlook.com" } + { name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, + { name = "Max Nargang", email = "CoffeeCoder1@outlook.com" }, ] # This should be your name or the names of the organization who currently maintains the project, and a valid email address corresponding to the name listed. maintainers = [ - {name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, - {name = "Max Nargang", email = "CoffeeCoder1@outlook.com" } + { name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, + { name = "Max Nargang", email = "CoffeeCoder1@outlook.com" }, ] # For a list of valid classifiers, see https://pypi.org/classifiers/ @@ -40,6 +40,7 @@ dependencies = [ "google-api-python-client", "google-auth-httplib2", "google-auth-oauthlib", + "json-fix", ] [project.urls] @@ -49,4 +50,4 @@ dependencies = [ [project.scripts] email-generator = "email_draft_generator.main:main" -email-list-parser = "email_draft_generator.file_parser.main:main" \ No newline at end of file +email-list-parser = "email_draft_generator.file_parser.main:main" diff --git a/src/email_draft_generator/__init__.py b/src/email_draft_generator/__init__.py index e69de29..8b13789 100644 --- a/src/email_draft_generator/__init__.py +++ b/src/email_draft_generator/__init__.py @@ -0,0 +1 @@ + diff --git a/src/email_draft_generator/__main__.py b/src/email_draft_generator/__main__.py index 910b424..7d9b56e 100644 --- a/src/email_draft_generator/__main__.py +++ b/src/email_draft_generator/__main__.py @@ -1,4 +1,4 @@ from email_draft_generator import main if __name__ == "__main__": - main.main() \ No newline at end of file + main.main() diff --git a/src/email_draft_generator/attachment.py b/src/email_draft_generator/attachment.py new file mode 100644 index 0000000..0f8c6bc --- /dev/null +++ b/src/email_draft_generator/attachment.py @@ -0,0 +1,28 @@ +import os +import mimetypes + + +class EmailAttachment: + + def __init__(self, *, data, path: os.PathLike, filename: str | None = None): + self.data = data + self.path = path + # If the filename is None, default to the name of the source file + if filename == None: + self.filename = os.path.basename(path) + else: + self.filename = filename + + type_subtype, _ = mimetypes.guess_type(path) + self.maintype, self.subtype = type_subtype.split("/") + + @classmethod + def from_path(cls, path: os.PathLike, filename: str | None = None): + with open(path, "rb") as fp: + data = fp.read() + + return cls(data=data, path=path, filename=filename) + + @classmethod + def from_dict(cls, dictionary: dict): + return cls.from_path(path=dictionary.get('path'), filename=dictionary.get('filename')) diff --git a/src/email_draft_generator/email_creator.py b/src/email_draft_generator/email_creator.py deleted file mode 100644 index 2384131..0000000 --- a/src/email_draft_generator/email_creator.py +++ /dev/null @@ -1,34 +0,0 @@ -import base64 -from email.message import EmailMessage - -def create_email_body(template, company, attachments): - """Generates an E-mail with the provided template, company data, and attachments""" - mime_message = EmailMessage() - - # Add headers - mime_message["To"] = company['email'] - # Doesn't seem to be required for Gmail - # mime_message["From"] = "" - if 'subject' in template: - mime_message["Subject"] = str(template['subject']).format_map(company) - - # Add text - mime_message.set_content(str(template['body']).format_map(company)) - - # Add attachments - for attachment in attachments: - mime_message.add_attachment(attachment['data'], maintype=attachment['maintype'], subtype=attachment['subtype'], filename=attachment['name']) - - encoded_message = base64.urlsafe_b64encode(mime_message.as_bytes()).decode() - - return {"message": {"raw": encoded_message}} - -def get_sample_template(): - """Returns a sample E-mail template.""" - return { - 'subject': "Test E-mail", - 'body': """This is a template E-mail used to test an E-mail generation program. Please disregard. - -company.name: {name} -company.email: {email}""", - } \ No newline at end of file diff --git a/src/email_draft_generator/email_list.py b/src/email_draft_generator/email_list.py new file mode 100644 index 0000000..2e7e7d4 --- /dev/null +++ b/src/email_draft_generator/email_list.py @@ -0,0 +1,15 @@ +class EmailRecipient: + """A recipient on the E-mail list.""" + + def __init__(self, *, name="", email=""): + self.name = name + self.email = email + + def __json__(self): + """Returns a dictionary for JSON serialization.""" + return self.__dict__ + + @classmethod + def from_dict(cls, dictionary: dict): + """Creates an EmailRecipient from a dictionary with keys 'name' and 'email'.""" + return cls(name=dictionary.get('name'), email=dictionary.get('email')) diff --git a/src/email_draft_generator/email_template.py b/src/email_draft_generator/email_template.py new file mode 100644 index 0000000..7ee1414 --- /dev/null +++ b/src/email_draft_generator/email_template.py @@ -0,0 +1,74 @@ +import json +import base64 +from email.message import EmailMessage + +from email_draft_generator.attachment import EmailAttachment +from email_draft_generator.email_list import EmailRecipient + + +class EmailTemplate: + """An E-mail template.""" + + def __init__( + self, + *, + subject: str | None = None, + body: str | None = None, + attachments: [] = [], + ): + """Creates a new E-mail template.""" + self.subject = subject + self.body = body + self.attachments = attachments + + def create_email_body(self, recipient: EmailRecipient): + """Uses the template to generate an E-mail body with the provided company.""" + mime_message = EmailMessage() + + # Add headers + mime_message["To"] = recipient.email + # Doesn't seem to be required for Gmail + # mime_message["From"] = "" + if self.subject != None: + mime_message["Subject"] = str(self.subject).format_map(recipient.__dict__) + + # Add text + mime_message.set_content(str(self.body).format_map(recipient.__dict__)) + + # Add attachments + for attachment in self.attachments: + mime_message.add_attachment(attachment.data, maintype=attachment.maintype, subtype=attachment.subtype, filename=attachment.filename) + + encoded_message = base64.urlsafe_b64encode(mime_message.as_bytes()).decode() + + return {"message": {"raw": encoded_message}} + + @classmethod + def get_sample_template(cls): + """Returns a sample E-mail template.""" + return cls( + subject="Test E-mail", + body="""This is a template E-mail used to test an E-mail generation program. Please disregard. + +company.name: {name} +company.email: {email}""", + ) + + @classmethod + def from_dict(cls, dictionary: dict): + """Parses an E-mail template from a dictionary with keys 'subject', 'body', and 'attachments'.""" + template = cls( + subject=dictionary.get('subject'), + body=dictionary.get('body'), + ) + if 'attachments' in dictionary: + for attachment in dictionary['attachments']: + template.attachments.append(EmailAttachment.from_dict(attachment)) + return template + + @classmethod + def from_file(cls, file): + """Parses an E-mail template out of a JSON file.""" + template_dict = json.load(file) + template = cls.from_dict(template_dict) + return template diff --git a/src/email_draft_generator/file_parser/__init__.py b/src/email_draft_generator/file_parser/__init__.py index e69de29..8b13789 100644 --- a/src/email_draft_generator/file_parser/__init__.py +++ b/src/email_draft_generator/file_parser/__init__.py @@ -0,0 +1 @@ + diff --git a/src/email_draft_generator/file_parser/__main__.py b/src/email_draft_generator/file_parser/__main__.py index f2cf2b7..d0e8357 100644 --- a/src/email_draft_generator/file_parser/__main__.py +++ b/src/email_draft_generator/file_parser/__main__.py @@ -1,4 +1,4 @@ -import email_draft_generator.file_parser.main +import email_draft_generator.file_parser.main as main if __name__ == "__main__": - email_draft_generator.file_parser.main.main() \ No newline at end of file + main.main() diff --git a/src/email_draft_generator/file_parser/csv_parser.py b/src/email_draft_generator/file_parser/csv_parser.py index 50238f9..f422e8a 100644 --- a/src/email_draft_generator/file_parser/csv_parser.py +++ b/src/email_draft_generator/file_parser/csv_parser.py @@ -1,11 +1,14 @@ import csv import concurrent.futures +from email_draft_generator.email_list import EmailRecipient + + def parse(data): - """Takes a CSV file with fields `name,email` and parses it into a list of companies""" - companies = [] - reader = csv.DictReader(data, fieldnames=["name", "email"]) + """Takes a CSV file with fields `name,email` and parses it into a list of recipients.""" + recipients = [] + reader = csv.DictReader(data, fieldnames=["name", "email"]) with concurrent.futures.ProcessPoolExecutor() as executor: for row in reader: - companies.append(row) - return companies \ No newline at end of file + recipients.append(EmailRecipient.from_dict(row)) + return recipients diff --git a/src/email_draft_generator/file_parser/main.py b/src/email_draft_generator/file_parser/main.py index 57a7da1..c00433e 100644 --- a/src/email_draft_generator/file_parser/main.py +++ b/src/email_draft_generator/file_parser/main.py @@ -1,27 +1,27 @@ import sys import argparse import json +import json_fix + from email_draft_generator.file_parser import text_parser from email_draft_generator.file_parser import csv_parser + def main(): # Command-line arguments - parser = argparse.ArgumentParser( - prog='email-list-parser', - description='Takes a list of E-mail addresses and turns it into a JSON file.' - ) - + parser = argparse.ArgumentParser(prog='email-list-parser', description='Takes a list of E-mail addresses and turns it into a JSON file.') + parser.add_argument('--format', choices=['text', 'csv'], default='text', help='the format of the input file (default: text)') parser.add_argument('infile', type=argparse.FileType('r'), help='the list of e-mail addresses to parse') - + args = parser.parse_args() - + try: if args.format == 'text': - companies = text_parser.parse(args.infile.readlines()) + recipients = text_parser.parse(args.infile.readlines()) elif args.format == 'csv': - companies = csv_parser.parse(args.infile) + recipients = csv_parser.parse(args.infile) except: raise ValueError("Invalid input file") - - json.dump(companies, sys.stdout, indent="\t") \ No newline at end of file + + json.dump(recipients, sys.stdout, indent="\t") diff --git a/src/email_draft_generator/file_parser/text_parser.py b/src/email_draft_generator/file_parser/text_parser.py index d238d1a..3bc53b6 100644 --- a/src/email_draft_generator/file_parser/text_parser.py +++ b/src/email_draft_generator/file_parser/text_parser.py @@ -1,7 +1,10 @@ import concurrent.futures +from email_draft_generator.email_list import EmailRecipient + + def parse(data): - """Takes a text file and converts it to a list of companies. + """Takes a text file and parses it into a list of recipients. Data format is a newline-seperated list of company names and e-mail adresses like this: ``` Company Name 1 @@ -13,11 +16,8 @@ def parse(data): ... ``` """ - companies = [] + recipients = [] with concurrent.futures.ProcessPoolExecutor() as executor: for i in range(0, len(data), 2): - companies.append({ - 'name': data[i].strip(), - 'email': data[i+1].strip() - }) - return companies \ No newline at end of file + recipients.append(EmailRecipient.from_dict({'name': data[i].strip(), 'email': data[i + 1].strip()})) + return recipients diff --git a/src/email_draft_generator/gmail.py b/src/email_draft_generator/gmail.py index 8955cd7..ba14d53 100644 --- a/src/email_draft_generator/gmail.py +++ b/src/email_draft_generator/gmail.py @@ -1,5 +1,6 @@ import os from pathlib import Path + from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow @@ -9,6 +10,7 @@ # If modifying these scopes, delete the file token.json. SCOPES = ["https://www.googleapis.com/auth/gmail.compose"] + def get_oauth_flow(global_creds_path, creds_path=None): """Get an OAuth2 flow from the specified credentials, copying them to the global location if they are not already there.""" if not os.path.exists(global_creds_path) and creds_path: @@ -16,20 +18,21 @@ def get_oauth_flow(global_creds_path, creds_path=None): input_path = Path(creds_path) with open(input_path, "r") as creds_input: oauth_creds = creds_input.read() - + flow = InstalledAppFlow.from_client_secrets_file(creds_path, SCOPES) - + output_path = Path(global_creds_path) output_path.parent.mkdir(parents=True, exist_ok=True) with open(global_creds_path, "w") as creds_output: creds_output.write(oauth_creds) - + input_path.unlink(missing_ok=True) else: # If they do, create an OAuth flow flow = InstalledAppFlow.from_client_secrets_file(global_creds_path, SCOPES) return flow + def get_token(token_path): """Get the user's OAuth2 token and refresh it if it is expired.""" # The file token.json stores the user's access and refresh tokens, and is created automatically when the authorization flow completes for the first time. @@ -42,6 +45,7 @@ def get_token(token_path): creds = None return creds + def write_token(creds, token_path): """Sets the user's token globally.""" output_path = Path(token_path) @@ -49,6 +53,7 @@ def write_token(creds, token_path): with open(token_path, "w") as token: token.write(creds.to_json()) + def get_creds(token_path, creds_path): """Gets the user's Gmail credentials, asking for input on the command line where necessary.""" creds = get_token(token_path) @@ -66,21 +71,17 @@ def get_creds(token_path, creds_path): write_token(creds, token_path) return creds + def create_draft(creds, body): """Creates an email draft with the provided body""" try: # Create Gmail API client service = build("gmail", "v1", credentials=creds) - + # pylint: disable=E1101 - draft = ( - service.users() - .drafts() - .create(userId="me", body=body) - .execute() - ) + draft = (service.users().drafts().create(userId="me", body=body).execute()) print(f'Draft id: {draft["id"]}\nDraft message: {draft["message"]}') except HttpError as error: print(f"An error occurred: {error}") draft = None - return draft \ No newline at end of file + return draft diff --git a/src/email_draft_generator/mail_util.py b/src/email_draft_generator/mail_util.py deleted file mode 100644 index 96f5e18..0000000 --- a/src/email_draft_generator/mail_util.py +++ /dev/null @@ -1,17 +0,0 @@ -import os -import mimetypes - -def build_attachment(path): - """Builds an attachment into an array of values so it can be passed around as an object""" - type_subtype, _ = mimetypes.guess_type(path) - maintype, subtype = type_subtype.split("/") - - with open(path, "rb") as fp: - attachment_data = fp.read() - - return { - 'data': attachment_data, - 'name': os.path.basename(path), - 'maintype': maintype, - 'subtype': subtype, - } \ No newline at end of file diff --git a/src/email_draft_generator/main.py b/src/email_draft_generator/main.py index 0bd8af6..0cdf809 100644 --- a/src/email_draft_generator/main.py +++ b/src/email_draft_generator/main.py @@ -4,52 +4,42 @@ import concurrent.futures import argparse -import email_draft_generator.gmail -import email_draft_generator.mail_util -import email_draft_generator.email_creator +from email_draft_generator import gmail +from email_draft_generator.email_template import EmailTemplate +from email_draft_generator.email_list import EmailRecipient + def main(): # Command-line arguments - parser = argparse.ArgumentParser( - prog='email-generator', - description='Generates E-mail drafts from a list of E-mail addresses and uploads them to Gmail.' - ) - + parser = argparse.ArgumentParser(prog='email-generator', description='Generates E-mail drafts from a list of E-mail addresses and uploads them to Gmail.') + parser.add_argument('-t', '--template', type=argparse.FileType('r'), help='the template file to use') parser.add_argument('infile', type=argparse.FileType('r'), help='the list of e-mail addresses to parse') - + args = parser.parse_args() - + # TODO: Use a keyring for these global_creds_dir = os.path.expanduser("~/.local/share/email-generator/credentials") global_token_path = f"{global_creds_dir}/token.json" global_creds_path = f"{global_creds_dir}/credentials.json" - + # Load the companies from the JSON file print("Processing input data") - companies = json.load(args.infile) - + recipients = json.load(args.infile) + # Load the template, or use the default if none is provided if args.template: - template = json.load(args.template) + template = EmailTemplate.from_file(args.template) print("Template loaded from file") else: - template = email_draft_generator.email_creator.get_sample_template() + template = EmailTemplate.get_sample_template() print("No template provided! Sample template was used") - + # Authenticate with Google print("Authenticating") - creds = email_draft_generator.gmail.get_creds(global_token_path, global_creds_path) - - # Build all of the attachments - attachments = [] - if 'attachments' in template: - print("Processing attachments") - with concurrent.futures.ProcessPoolExecutor() as executor: - for attachment_path in template['attachments']: - attachments.append(email_draft_generator.mail_util.build_attachment(attachment_path)) - + creds = gmail.get_creds(global_token_path, global_creds_path) + print("Generating and uploading E-mails") with concurrent.futures.ProcessPoolExecutor() as executor: - for company in companies: - email_draft_generator.gmail.create_draft(creds, email_draft_generator.email_creator.create_email_body(template, company, attachments)) \ No newline at end of file + for recipient in recipients: + gmail.create_draft(creds, template.create_email_body(EmailRecipient.from_dict(recipient))) From 22d26c3a37985250e06aa7c4b261a9557f75c140 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 20 May 2024 12:52:23 -0400 Subject: [PATCH 027/110] Change Python version requirement --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0bcb4a1..197b03f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ version = "0.0.4" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" license = { file = "LICENSE" } -requires-python = ">=3.8" +requires-python = ">=3.10" keywords = ["email", "gmail", "email-template", "email-generator"] # This should be your name or the name of the organization who originally authored the project, and a valid email address corresponding to the name listed. From 38eee696a352ccf7d220228b455694e626e07a82 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 20 May 2024 13:05:02 -0400 Subject: [PATCH 028/110] Change the run script to use a temporary file so the credentials setup flow works --- run.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/run.sh b/run.sh index 4963351..b62851d 100755 --- a/run.sh +++ b/run.sh @@ -2,4 +2,5 @@ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) cd "$parent_path" source "$parent_path/.venv/bin/activate" -email-list-parser "$parent_path/data/email-list.txt" | email-generator -t "$parent_path/data/template.json" - \ No newline at end of file +email-list-parser "$parent_path/data/email-list.txt" > "/tmp/email-list.json" +email-generator -t "$parent_path/data/template.json" "/tmp/email-list.json" \ No newline at end of file From 959e1161f37f0cbf40b2c4700703da12fdcf8b68 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 20 May 2024 13:46:15 -0400 Subject: [PATCH 029/110] Change the setup script to install system site packages Needed so Tkinter works --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 098a3a8..0f2d364 100755 --- a/setup.sh +++ b/setup.sh @@ -1,7 +1,7 @@ #!/bin/sh parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) cd "$parent_path" -python3 -m venv "$parent_path/.venv" +python3 -m venv --system-site-packages "$parent_path/.venv" source "$parent_path/.venv/bin/activate" pip3 install build python3 -m build From b47d378c6a2437c5372198638122e05316e8c8df Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 23 May 2024 11:58:18 -0400 Subject: [PATCH 030/110] Remove warning that isn't true --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9773f60..792eb76 100644 --- a/README.md +++ b/README.md @@ -64,4 +64,4 @@ Run the program once, and it will guide you through setting up the Google API. Copy and paste the table into `data/email-list.txt`. ### Run the program Run `run.sh` (can be run by double-clicking as well) -The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. \ No newline at end of file +The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). From ff1fdca82291d995eb60e9a3d655b557f9218a4c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 28 Jun 2024 20:14:56 -0400 Subject: [PATCH 031/110] Add yapf style --- .style.yapf | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .style.yapf diff --git a/.style.yapf b/.style.yapf new file mode 100644 index 0000000..2ad0e1f --- /dev/null +++ b/.style.yapf @@ -0,0 +1,4 @@ +[style] +USE_TABS = true +COLUMN_LIMIT = 10000 +INDENT_BLANK_LINES = true \ No newline at end of file From 4b628e851a71cabb817f4f95671b7c4dd45408e9 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 28 Jun 2024 20:16:47 -0400 Subject: [PATCH 032/110] Enable vscode format on save --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3b61434 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.formatOnSave": true +} \ No newline at end of file From 03460b42b856dd2a35beb35568b9bd99e9971e3b Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 28 Jun 2024 20:19:21 -0400 Subject: [PATCH 033/110] Add comparison and json serialization to attachments and email templates --- src/email_draft_generator/attachment.py | 10 ++++++++++ src/email_draft_generator/email_template.py | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/email_draft_generator/attachment.py b/src/email_draft_generator/attachment.py index 0f8c6bc..53a47aa 100644 --- a/src/email_draft_generator/attachment.py +++ b/src/email_draft_generator/attachment.py @@ -16,6 +16,16 @@ def __init__(self, *, data, path: os.PathLike, filename: str | None = None): type_subtype, _ = mimetypes.guess_type(path) self.maintype, self.subtype = type_subtype.split("/") + def __eq__(self, other): + """EmailAttachment objects are considered equal if they have the same contents.""" + if type(self) != type(other): + return NotImplemented + return vars(self) == vars(other) + + def __json__(self): + """Returns a dictionary for JSON serialization.""" + return {"path": self.path, "filename": self.filename} + @classmethod def from_path(cls, path: os.PathLike, filename: str | None = None): with open(path, "rb") as fp: diff --git a/src/email_draft_generator/email_template.py b/src/email_draft_generator/email_template.py index 7ee1414..099360e 100644 --- a/src/email_draft_generator/email_template.py +++ b/src/email_draft_generator/email_template.py @@ -21,6 +21,16 @@ def __init__( self.body = body self.attachments = attachments + def __eq__(self, other): + """EmailTemplate objects are considered equal if they have the same contents.""" + if type(self) != type(other): + return NotImplemented + return vars(self) == vars(other) + + def __json__(self): + """Returns a dictionary for JSON serialization.""" + return self.__dict__ + def create_email_body(self, recipient: EmailRecipient): """Uses the template to generate an E-mail body with the provided company.""" mime_message = EmailMessage() From d5b9467cc02df24aef90144b33ad3991e95d0f64 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 28 Jun 2024 20:20:11 -0400 Subject: [PATCH 034/110] Add a validity check for email addresses --- src/email_draft_generator/email_list.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/email_draft_generator/email_list.py b/src/email_draft_generator/email_list.py index 2e7e7d4..4ab38dc 100644 --- a/src/email_draft_generator/email_list.py +++ b/src/email_draft_generator/email_list.py @@ -1,3 +1,6 @@ +import re + + class EmailRecipient: """A recipient on the E-mail list.""" @@ -13,3 +16,9 @@ def __json__(self): def from_dict(cls, dictionary: dict): """Creates an EmailRecipient from a dictionary with keys 'name' and 'email'.""" return cls(name=dictionary.get('name'), email=dictionary.get('email')) + + @property + def valid(self): + """Checks if the E-mail address is valid.""" + pattern = r"^[\w\-\.]+@([\w-]+\.)+[\w-]{2,}$" + return re.match(pattern, self.email) != None From e612dc07dabb38fc3077f6ce5ee4b0049583961e Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 28 Jun 2024 20:40:37 -0400 Subject: [PATCH 035/110] Split email draft generation into its own class Should make it easier to do more advanced stuff later --- src/email_draft_generator/email_drafter.py | 14 ++++++++++++++ src/email_draft_generator/main.py | 7 ++----- 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 src/email_draft_generator/email_drafter.py diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py new file mode 100644 index 0000000..11975ef --- /dev/null +++ b/src/email_draft_generator/email_drafter.py @@ -0,0 +1,14 @@ +from email_draft_generator import gmail +from email_draft_generator.email_list import EmailRecipient +from email_draft_generator.email_template import EmailTemplate + +import concurrent.futures + + +class EmailDrafter: + """Utility class to draft E-mails""" + + def generate_drafts(recipients, template: EmailTemplate, creds): + with concurrent.futures.ProcessPoolExecutor() as executor: + for recipient in recipients: + gmail.create_draft(creds, template.create_email_body(EmailRecipient.from_dict(recipient))) diff --git a/src/email_draft_generator/main.py b/src/email_draft_generator/main.py index 0cdf809..58dd076 100644 --- a/src/email_draft_generator/main.py +++ b/src/email_draft_generator/main.py @@ -1,12 +1,11 @@ import os import json -import concurrent.futures import argparse from email_draft_generator import gmail from email_draft_generator.email_template import EmailTemplate -from email_draft_generator.email_list import EmailRecipient +from email_draft_generator.email_drafter import EmailDrafter def main(): @@ -40,6 +39,4 @@ def main(): creds = gmail.get_creds(global_token_path, global_creds_path) print("Generating and uploading E-mails") - with concurrent.futures.ProcessPoolExecutor() as executor: - for recipient in recipients: - gmail.create_draft(creds, template.create_email_body(EmailRecipient.from_dict(recipient))) + EmailDrafter.generate_drafts(recipients, template, creds) From d326e838ce94769314eead2d081742b286ec0c11 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Fri, 28 Jun 2024 21:13:43 -0400 Subject: [PATCH 036/110] Add an initial gui version --- launch.sh | 5 ++ pyproject.toml | 2 + run_gui.py | 7 +++ src/email_draft_generator/gui/__init__.py | 1 + src/email_draft_generator/gui/__main__.py | 4 ++ src/email_draft_generator/gui/gmail_gui.py | 60 +++++++++++++++++++ src/email_draft_generator/gui/main.py | 69 ++++++++++++++++++++++ src/email_draft_generator/gui/util.py | 32 ++++++++++ 8 files changed, 180 insertions(+) create mode 100755 launch.sh create mode 100644 run_gui.py create mode 100644 src/email_draft_generator/gui/__init__.py create mode 100644 src/email_draft_generator/gui/__main__.py create mode 100644 src/email_draft_generator/gui/gmail_gui.py create mode 100644 src/email_draft_generator/gui/main.py create mode 100644 src/email_draft_generator/gui/util.py diff --git a/launch.sh b/launch.sh new file mode 100755 index 0000000..9a68ce0 --- /dev/null +++ b/launch.sh @@ -0,0 +1,5 @@ +#!/bin/sh +parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +cd "$parent_path" +source "$parent_path/.venv/bin/activate" +email-list-parser "$parent_path/data/email-list.txt" | email-generator-gui \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 197b03f..56b5c5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,3 +51,5 @@ dependencies = [ [project.scripts] email-generator = "email_draft_generator.main:main" email-list-parser = "email_draft_generator.file_parser.main:main" +email-generator-gui = "email_draft_generator.gui.main:main" +email-template-editor-gui = "email_draft_generator.gui.template_editor:main" diff --git a/run_gui.py b/run_gui.py new file mode 100644 index 0000000..10b1493 --- /dev/null +++ b/run_gui.py @@ -0,0 +1,7 @@ +import sys + +sys.path.append('./src') + +import email_draft_generator.gui.main as main + +main.main() diff --git a/src/email_draft_generator/gui/__init__.py b/src/email_draft_generator/gui/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/email_draft_generator/gui/__init__.py @@ -0,0 +1 @@ + diff --git a/src/email_draft_generator/gui/__main__.py b/src/email_draft_generator/gui/__main__.py new file mode 100644 index 0000000..6f8e230 --- /dev/null +++ b/src/email_draft_generator/gui/__main__.py @@ -0,0 +1,4 @@ +from email_draft_generator.gui import main + +if __name__ == "__main__": + main.main() diff --git a/src/email_draft_generator/gui/gmail_gui.py b/src/email_draft_generator/gui/gmail_gui.py new file mode 100644 index 0000000..5e2b6ff --- /dev/null +++ b/src/email_draft_generator/gui/gmail_gui.py @@ -0,0 +1,60 @@ +import os + +import tkinter as tk +from tkinter import ttk +from tkinter import filedialog +import webbrowser + +from email_draft_generator import gmail + + +class CredsPopup(tk.Toplevel): + + def __init__(self, parent): + super().__init__(parent) + self.wm_title("OAuth2 Credentials") + + frm = ttk.Frame(self, padding=10) + frm.grid() + + ttk.Label(self, text="No OAuth2 Credentials exist!").grid(row=0) + ttk.Label(self, text="Follow the guide below to create them, and, when you are at the step to configure the OAuth consent screen, add the `gmail.compose` scope.\nDownload them to your device, and select the file.").grid(row=1, column=0) + ttk.Button(self, text="Guide", command=self.open_guide).grid(row=2, column=0) + ttk.Button(self, text="Select File", command=self.choose_path).grid(row=2, column=1) + ttk.Button(self, text="Cancel", command=self.destroy).grid(row=2, column=2) + + self.selected_path = None + + def open_guide(self): + webbrowser.open_new('https://developers.google.com/gmail/api/quickstart/python#set_up_your_environment') + + def choose_path(self): + """Prompts the user to select the creds file.""" + self.selected_path = filedialog.askopenfilename() + self.destroy() + + def show(self): + """Shows the window and returns the selected file path""" + self.deiconify() + self.wm_protocol("WM_DELETE_WINDOW", self.destroy) + self.wait_window(self) + return self.selected_path + + +def get_creds(token_path, creds_path, root=None): + """Gets the user's Gmail credentials, asking for input on the command line where necessary if `prompt` is `True`.""" + creds = gmail.get_token(token_path) + # If there are no (valid) credentials available and `prompt` is `True`, let the user log in. + if root and (not creds or not creds.valid): + # Create new creds + # If OAuth2 creds do not exist, tell the user to create them + if not os.path.exists(creds_path): + popup = CredsPopup(root) + creds_path_input = popup.show() + flow = gmail.get_oauth_flow(creds_path, creds_path_input) + else: + flow = gmail.get_oauth_flow(creds_path) + creds = flow.run_local_server(port=0) + # Save the credentials for the next run + gmail.write_token(creds, token_path) + return creds diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py new file mode 100644 index 0000000..1c32821 --- /dev/null +++ b/src/email_draft_generator/gui/main.py @@ -0,0 +1,69 @@ +import fileinput +import json +import os + +import tkinter as tk +from tkinter import ttk + +from email_draft_generator.gui import gmail_gui +from email_draft_generator.email_drafter import EmailDrafter +from email_draft_generator.email_template import EmailTemplate + +# TODO: Use a keyring for these +global_creds_dir = os.path.expanduser("~/.local/share/email-generator/credentials") +global_token_path = f"{global_creds_dir}/token.json" +global_creds_path = f"{global_creds_dir}/credentials.json" + + +class App(tk.Frame): + # Get creds if they exist, but do not prompt the user if they don't + creds = gmail_gui.get_creds(global_token_path, global_creds_path) + + def __init__(self, master): + # Set up a window + super().__init__(master, padx=10, pady=10) + self.pack() + + self.parent = master + + # Frame for the main app content + frm = self + frm.grid() + + ttk.Button(frm, text="Authenticate", command=self.authenticate).grid(column=0, row=0) + + ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=1) + + def authenticate(self): + self.creds = gmail_gui.get_creds(global_token_path, global_creds_path, root=self) + + def send_emails(self): + # If not authenticated, prompt the user to authenticate + if not self.creds.valid: + self.authenticate() + + #drafting_progressbar = ttk.Progressbar(self, orient='horizontal', mode='indeterminate') + #drafting_progressbar.grid(column=0, row=2) + + # TODO: Add a GUI to select and edit these + json_data = "" + for line in fileinput.input(): + json_data += line + recipients = json.loads(json_data) + #drafting_progressbar.step() + template = EmailTemplate.get_sample_template() + #drafting_progressbar.step() + + # TODO: Make the progressbar work + #drafting_progressbar.start() + EmailDrafter.generate_drafts(recipients, template, self.creds) + #drafting_progressbar.stop() + + +def main(): + """Tcl/Tk based GUI for email-draft-generator""" + root = tk.Tk() + root.title("E-mail Generator") + root.resizable(False, False) + app = App(root) + app.mainloop() diff --git a/src/email_draft_generator/gui/util.py b/src/email_draft_generator/gui/util.py new file mode 100644 index 0000000..d044d1d --- /dev/null +++ b/src/email_draft_generator/gui/util.py @@ -0,0 +1,32 @@ +import tkinter as tk +from tkinter import scrolledtext + + +class SettableText(tk.Text): + + def set_text(self, text): + self.clear() + self.insert(tk.END, text) + + def clear(self): + self.delete("1.0", tk.END) + + +class SettableScrolledText(scrolledtext.ScrolledText): + + def set_text(self, text): + self.clear() + self.insert(tk.END, text) + + def clear(self): + self.delete("1.0", tk.END) + + +class SettableEntry(tk.Entry): + + def set_text(self, text): + self.clear() + self.insert(0, text) + + def clear(self): + self.delete(0, tk.END) From d164eda1f5701766d3ad34fbfd77a0e3f55b0469 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 10:51:22 -0400 Subject: [PATCH 037/110] Add a template editor --- src/email_draft_generator/gui/main.py | 23 ++- .../gui/template_editor.py | 172 ++++++++++++++++++ 2 files changed, 190 insertions(+), 5 deletions(-) create mode 100644 src/email_draft_generator/gui/template_editor.py diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 1c32821..5df60d8 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -8,6 +8,7 @@ from email_draft_generator.gui import gmail_gui from email_draft_generator.email_drafter import EmailDrafter from email_draft_generator.email_template import EmailTemplate +from email_draft_generator.gui.template_editor import TemplateEditorPopup # TODO: Use a keyring for these global_creds_dir = os.path.expanduser("~/.local/share/email-generator/credentials") @@ -30,13 +31,27 @@ def __init__(self, master): frm = self frm.grid() + # Create a template editor and hide it + self.template_editor = TemplateEditorPopup(self) + self.template_editor.withdraw() + ttk.Button(frm, text="Authenticate", command=self.authenticate).grid(column=0, row=0) - ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=1) + ttk.Label(frm, text="Template").grid(column=0, row=1) + ttk.Button(frm, text="Open", command=self.template_editor.template_editor.load_template).grid(column=1, row=1) + ttk.Button(frm, text="Edit", command=self.edit_template).grid(column=2, row=1) + + ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=2) def authenticate(self): self.creds = gmail_gui.get_creds(global_token_path, global_creds_path, root=self) + def edit_template(self): + """Opens the template editor""" + self.template_editor.show() + # TODO: Fix the thing where the parent window is focused on return + #self.parent.deiconify() + def send_emails(self): # If not authenticated, prompt the user to authenticate if not self.creds.valid: @@ -45,18 +60,16 @@ def send_emails(self): #drafting_progressbar = ttk.Progressbar(self, orient='horizontal', mode='indeterminate') #drafting_progressbar.grid(column=0, row=2) - # TODO: Add a GUI to select and edit these + # TODO: Add a GUI to select and edit this json_data = "" for line in fileinput.input(): json_data += line recipients = json.loads(json_data) #drafting_progressbar.step() - template = EmailTemplate.get_sample_template() - #drafting_progressbar.step() # TODO: Make the progressbar work #drafting_progressbar.start() - EmailDrafter.generate_drafts(recipients, template, self.creds) + EmailDrafter.generate_drafts(recipients, self.template_editor.template_editor.template_editor.template, self.creds) #drafting_progressbar.stop() diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py new file mode 100644 index 0000000..1c776d9 --- /dev/null +++ b/src/email_draft_generator/gui/template_editor.py @@ -0,0 +1,172 @@ +import os +import json +import json_fix + +import tkinter as tk +from tkinter import ttk +from tkinter import filedialog +from tkinter import messagebox + +from email_draft_generator.gui import util +from email_draft_generator.email_template import EmailTemplate + + +class AttachmentEditor(tk.Frame): + """An editor for EmailAttachments.""" + + def __init__(self, parent, attachments: [] = []): + super().__init__(parent) + + +# TODO: Add the ability to edit attachments +class TemplateEditor(tk.Frame): + """An editor for EmailTemplates.""" + + def __init__(self, parent, template: EmailTemplate | None = None): + super().__init__(parent) + + if template == None: + self.template = EmailTemplate.get_sample_template() + else: + self.template = template + + # Subject + subject_frame = tk.LabelFrame(self, text="Subject", padx=5, pady=5) + subject_frame.grid(row=0, column=0, padx=10, pady=10, sticky="nsew") + subject_frame.grid_rowconfigure(0, weight=1) + subject_frame.grid_columnconfigure(0, weight=1) + + self.subject_textbox = util.SettableEntry(subject_frame) + self.subject_textbox.grid(sticky="nsew") + + # Body + body_frame = tk.LabelFrame(self, text="Body", padx=5, pady=5) + body_frame.grid(row=1, column=0, padx=10, pady=10, sticky="nsew") + body_frame.grid_rowconfigure(0, weight=1) + body_frame.grid_columnconfigure(0, weight=1) + + self.body_textbox = util.SettableScrolledText(body_frame) + self.body_textbox.grid(sticky="nsew") + + self.grid_rowconfigure(0, weight=0) + self.grid_rowconfigure(1, weight=1) + self.grid_columnconfigure(0, weight=1) + + self.set_template(self.template) + + def get_template(self): + """Returns the current template.""" + return EmailTemplate(subject=self.subject_textbox.get(), body=self.body_textbox.get("1.0", "end-1c")) + + def set_template(self, template: EmailTemplate): + """Sets the template.""" + self.subject_textbox.set_text(template.subject) + self.body_textbox.set_text(template.body) + self.template = template + + def check_if_edited(self): + """Compares the current template to the saved data.""" + return self.template != self.get_template() + + +class TemplateEditorWindow(tk.Frame): + """An editor for EmailTemplates with an interface to control it.""" + + def __init__(self, parent, template: EmailTemplate | None = None, *, popup=False): + super().__init__(parent, padx=10, pady=10) + self.parent = parent + self.popup = popup + + self.parent.wm_title("Template Editor") + self.parent.wm_protocol("WM_DELETE_WINDOW", self.quit_with_prompt) # Prompt to save on quit + + # Allow the contents to expand to the size of the frame + self.grid_rowconfigure(0, weight=0) + self.grid_rowconfigure(1, weight=1) + self.grid_columnconfigure(0, weight=1) + self.grid(sticky="nsew") + + # Buttons + buttons_frame = ttk.Frame(self) + buttons_frame.grid(row=0, column=0, sticky="ew") + + if popup: + ttk.Button(buttons_frame, text="Save and Return", command=self.save_template).grid(row=0, column=0) + ttk.Button(buttons_frame, text="Cancel", command=self.quit_with_prompt).grid(row=0, column=1) + else: + ttk.Button(buttons_frame, text="Open", command=self.load_template).grid(row=0, column=0) + ttk.Button(buttons_frame, text="Save", command=self.save_template).grid(row=0, column=1) + ttk.Button(buttons_frame, text="Exit", command=self.quit_with_prompt).grid(row=0, column=2) + + self.template_editor = TemplateEditor(self, template) + self.template_editor.grid(row=1, column=0, sticky="nsew") + + def prompt_to_save(self): + """Prompt the user to save if the file has been edited. + + Return: + `True` if user selected `Yes` or `No` or the file has not been edited, `False` if user selected `Cancel`. + """ + if self.template_editor.check_if_edited(): + save_prompt = messagebox.askyesnocancel("Unsaved Changes", "You have unsaved changes. Would you like to save them?") + if save_prompt == True: + self.save_template() + return save_prompt != None + else: + return True + + def load_template(self): + """Prompts the user to select the template file.""" + if self.prompt_to_save(): + self.template_path = filedialog.askopenfilename() + + # Parse template + with open(self.template_path) as template_file: + self.template_editor.set_template(EmailTemplate.from_file(template_file)) + + self.parent.wm_title("Template Editor - " + os.path.basename(self.template_path)) + + def save_template(self): + """Saves the current template and returns to the main window if it is a popup.""" + self.template_editor.template = self.template_editor.get_template() + + with open(self.template_path, "w") as template_file: + json.dump(self.template_editor.template, template_file) + + if self.popup: + self.parent.withdraw() + + def quit_with_prompt(self): + """Quit, prompting the user to save if the file has been edited.""" + if self.prompt_to_save(): + # If the window is a popup, hide it so it can be used again later + if self.popup: + self.parent.withdraw() + else: + self.parent.destroy() + + +class TemplateEditorPopup(tk.Toplevel): + + def __init__(self, parent, template: EmailTemplate | None = None): + super().__init__(parent) + # Allow the contents to expand to the size of the frame + self.grid_rowconfigure(0, weight=1) + self.grid_columnconfigure(0, weight=1) + + # Template Editor + self.template_editor = TemplateEditorWindow(self, template, popup=True) + self.template_editor.grid(row=0, column=0, sticky="nsew") + + def show(self): + """Shows the window and returns the template.""" + self.deiconify() + self.wait_visibility() + return self.template_editor.template_editor.template + + +def main(): + root = tk.Tk() + editor = TemplateEditorWindow(root) + editor.pack(expand=True, fill='both') + editor.mainloop() From d2257501a6db1c20d3f01901401018e024e19922 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 11:44:13 -0400 Subject: [PATCH 038/110] Initial GUI editor for EmailAttachments --- .../gui/template_editor.py | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index 1c776d9..cc50958 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -11,11 +11,45 @@ from email_draft_generator.email_template import EmailTemplate +class AttachmentEditorPopup(tk.Toplevel): + """An editor window for EmailAttachments.""" + + def __init__(self, parent, attachment): + super().__init__(parent) + + self.wm_title("Attachment Editor: " + attachment.filename) + + # Allow the contents to expand to the size of the frame + self.grid_rowconfigure(0, weight=1) + self.grid_columnconfigure(0, weight=1) + + self.attachment = attachment + + self.close_button = ttk.Button(self, text="Close", command=self.destroy) + self.close_button.grid(row=0, column=0) + + def show(self): + """Shows the window and returns the template.""" + self.deiconify() + self.wait_window() + return self.attachment + + class AttachmentEditor(tk.Frame): - """An editor for EmailAttachments.""" + """An editor for a template's EmailAttachments.""" - def __init__(self, parent, attachments: [] = []): + def __init__(self, parent): super().__init__(parent) + + def set_attachments(self, attachments): + self.attachments = attachments + for i, attachment in enumerate(attachments): + button = ttk.Button(self, text=attachment.filename, command=lambda: self.edit_attachment(attachment)) + button.grid(row=0, column=i) + + def edit_attachment(self, attachment): + editor = AttachmentEditorPopup(self, attachment) + editor.show() # TODO: Add the ability to edit attachments @@ -48,8 +82,18 @@ def __init__(self, parent, template: EmailTemplate | None = None): self.body_textbox = util.SettableScrolledText(body_frame) self.body_textbox.grid(sticky="nsew") + # Attachments + attachment_frame = tk.LabelFrame(self, text="Attachments", padx=5, pady=5) + attachment_frame.grid(row=2, column=0, padx=10, pady=10, sticky="nsew") + attachment_frame.grid_rowconfigure(0, weight=1) + attachment_frame.grid_columnconfigure(0, weight=1) + + self.attachment_editor = AttachmentEditor(attachment_frame) + self.attachment_editor.grid(sticky="nsew") + self.grid_rowconfigure(0, weight=0) self.grid_rowconfigure(1, weight=1) + self.grid_rowconfigure(2, weight=0) self.grid_columnconfigure(0, weight=1) self.set_template(self.template) @@ -62,6 +106,7 @@ def set_template(self, template: EmailTemplate): """Sets the template.""" self.subject_textbox.set_text(template.subject) self.body_textbox.set_text(template.body) + self.attachment_editor.set_attachments(template.attachments) self.template = template def check_if_edited(self): From 172526c41d26d72130ac38c9e9e8f00d0f576b26 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 13:31:24 -0400 Subject: [PATCH 039/110] Make the type checker less angry --- src/email_draft_generator/gui/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 5df60d8..0f836cd 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -54,7 +54,7 @@ def edit_template(self): def send_emails(self): # If not authenticated, prompt the user to authenticate - if not self.creds.valid: + if not self.creds or not self.creds.valid: self.authenticate() #drafting_progressbar = ttk.Progressbar(self, orient='horizontal', mode='indeterminate') From 9b5eb572d536d98b1139f36ea93c1d801902e67f Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 14:15:15 -0400 Subject: [PATCH 040/110] Add some more stuff to the attachment editor --- .../gui/template_editor.py | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index cc50958..cab3b3f 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -1,12 +1,15 @@ import os import json import json_fix +import subprocess +import platform import tkinter as tk from tkinter import ttk from tkinter import filedialog from tkinter import messagebox +from email_draft_generator.attachment import EmailAttachment from email_draft_generator.gui import util from email_draft_generator.email_template import EmailTemplate @@ -14,8 +17,9 @@ class AttachmentEditorPopup(tk.Toplevel): """An editor window for EmailAttachments.""" - def __init__(self, parent, attachment): + def __init__(self, parent, attachment: EmailAttachment): super().__init__(parent) + # TODO: Add a file preview? self.wm_title("Attachment Editor: " + attachment.filename) @@ -25,13 +29,35 @@ def __init__(self, parent, attachment): self.attachment = attachment - self.close_button = ttk.Button(self, text="Close", command=self.destroy) - self.close_button.grid(row=0, column=0) + # Filename + filename_frame = tk.LabelFrame(self, text="File Name", padx=5, pady=5) + filename_frame.grid(row=0, column=0, padx=10, pady=10, sticky="nsew", columnspan=2) + filename_frame.grid_rowconfigure(0, weight=1) + filename_frame.grid_columnconfigure(0, weight=1) + + self.filename_textbox = util.SettableEntry(filename_frame) + self.filename_textbox.grid(sticky="nsew") + self.filename_textbox.set_text(self.attachment.filename) + + buttons_frame = ttk.Frame(self) + buttons_frame.grid(row=1, column=0, sticky="ew") + ttk.Button(buttons_frame, text="Preview", command=self.open).grid(row=0, column=0) + ttk.Button(buttons_frame, text="Close", command=self.destroy).grid(row=0, column=1) + + def open(self): + if platform.system() == 'Darwin': # macOS + subprocess.call(('open', self.attachment.path)) # type: ignore + elif platform.system() == 'Windows': # Windows + os.startfile(self.attachment.path) # type: ignore + else: # linux variants + subprocess.call(('xdg-open', self.attachment.path)) # type: ignore def show(self): """Shows the window and returns the template.""" self.deiconify() self.wait_window() + # TODO: Figure out why this doesnt work + self.attachment.filename = self.filename_textbox.get() return self.attachment @@ -40,16 +66,26 @@ class AttachmentEditor(tk.Frame): def __init__(self, parent): super().__init__(parent) + + # Frame to contain attachments + self.attachment_frame = tk.LabelFrame(self, text="Attachments", padx=5, pady=5) + self.attachment_frame.grid(row=2, column=0, padx=10, pady=10, sticky="nsew") + + self.attachment_frame.grid_rowconfigure(0, weight=1) + self.attachment_frame.grid_columnconfigure(0, weight=1) def set_attachments(self, attachments): self.attachments = attachments for i, attachment in enumerate(attachments): - button = ttk.Button(self, text=attachment.filename, command=lambda: self.edit_attachment(attachment)) + button = ttk.Button(self.attachment_frame, text=attachment.filename, command=lambda: self.edit_attachment(i)) button.grid(row=0, column=i) - def edit_attachment(self, attachment): - editor = AttachmentEditorPopup(self, attachment) - editor.show() + def edit_attachment(self, attachment: int): + editor = AttachmentEditorPopup(self, self.attachments[attachment]) + self.attachments[attachment] = editor.show() + + def get(self): + return self.attachments # TODO: Add the ability to edit attachments @@ -83,12 +119,7 @@ def __init__(self, parent, template: EmailTemplate | None = None): self.body_textbox.grid(sticky="nsew") # Attachments - attachment_frame = tk.LabelFrame(self, text="Attachments", padx=5, pady=5) - attachment_frame.grid(row=2, column=0, padx=10, pady=10, sticky="nsew") - attachment_frame.grid_rowconfigure(0, weight=1) - attachment_frame.grid_columnconfigure(0, weight=1) - - self.attachment_editor = AttachmentEditor(attachment_frame) + self.attachment_editor = AttachmentEditor(self) self.attachment_editor.grid(sticky="nsew") self.grid_rowconfigure(0, weight=0) @@ -100,7 +131,7 @@ def __init__(self, parent, template: EmailTemplate | None = None): def get_template(self): """Returns the current template.""" - return EmailTemplate(subject=self.subject_textbox.get(), body=self.body_textbox.get("1.0", "end-1c")) + return EmailTemplate(subject=self.subject_textbox.get(), body=self.body_textbox.get("1.0", "end-1c"), attachments=self.attachment_editor.get()) def set_template(self, template: EmailTemplate): """Sets the template.""" From 467f6ff3a5329e3e3d9916b01afdfc7d65396a5c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 16:37:32 -0400 Subject: [PATCH 041/110] Add a delete button to the attachment editor --- .../gui/template_editor.py | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index cab3b3f..299de73 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -28,10 +28,11 @@ def __init__(self, parent, attachment: EmailAttachment): self.grid_columnconfigure(0, weight=1) self.attachment = attachment + self.deleted = False # Filename filename_frame = tk.LabelFrame(self, text="File Name", padx=5, pady=5) - filename_frame.grid(row=0, column=0, padx=10, pady=10, sticky="nsew", columnspan=2) + filename_frame.grid(row=0, column=0, padx=10, pady=10, sticky="nsew") filename_frame.grid_rowconfigure(0, weight=1) filename_frame.grid_columnconfigure(0, weight=1) @@ -42,7 +43,8 @@ def __init__(self, parent, attachment: EmailAttachment): buttons_frame = ttk.Frame(self) buttons_frame.grid(row=1, column=0, sticky="ew") ttk.Button(buttons_frame, text="Preview", command=self.open).grid(row=0, column=0) - ttk.Button(buttons_frame, text="Close", command=self.destroy).grid(row=0, column=1) + ttk.Button(buttons_frame, text="Delete", command=self.delete).grid(row=0, column=1) + ttk.Button(buttons_frame, text="Close", command=self.destroy).grid(row=0, column=2) def open(self): if platform.system() == 'Darwin': # macOS @@ -52,13 +54,20 @@ def open(self): else: # linux variants subprocess.call(('xdg-open', self.attachment.path)) # type: ignore + def delete(self): + self.deleted = True + self.destroy() + def show(self): """Shows the window and returns the template.""" self.deiconify() self.wait_window() # TODO: Figure out why this doesnt work - self.attachment.filename = self.filename_textbox.get() - return self.attachment + #self.attachment.filename = self.filename_textbox.get() + if not self.deleted: + return self.attachment + else: + return False class AttachmentEditor(tk.Frame): @@ -76,6 +85,10 @@ def __init__(self, parent): def set_attachments(self, attachments): self.attachments = attachments + # Remove all of the previous attachments fromt the frame + for widget in self.attachment_frame.winfo_children(): + widget.destroy() + # Add a widget for each attachment for i, attachment in enumerate(attachments): button = ttk.Button(self.attachment_frame, text=attachment.filename, command=lambda: self.edit_attachment(i)) button.grid(row=0, column=i) @@ -83,12 +96,14 @@ def set_attachments(self, attachments): def edit_attachment(self, attachment: int): editor = AttachmentEditorPopup(self, self.attachments[attachment]) self.attachments[attachment] = editor.show() + if self.attachments[attachment] == False: + self.attachments.pop(attachment) + self.set_attachments(self.attachments) def get(self): return self.attachments -# TODO: Add the ability to edit attachments class TemplateEditor(tk.Frame): """An editor for EmailTemplates.""" From 4119fdfd982ad48aa3dbab3d58cf3151e6443b95 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 16:53:42 -0400 Subject: [PATCH 042/110] Handle incorrect filetypes a bit better in the parser --- src/email_draft_generator/file_parser/main.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/email_draft_generator/file_parser/main.py b/src/email_draft_generator/file_parser/main.py index c00433e..d1b5d36 100644 --- a/src/email_draft_generator/file_parser/main.py +++ b/src/email_draft_generator/file_parser/main.py @@ -21,7 +21,12 @@ def main(): recipients = text_parser.parse(args.infile.readlines()) elif args.format == 'csv': recipients = csv_parser.parse(args.infile) + else: + recipients = None + + if recipients != None: + json.dump(recipients, sys.stdout, indent="\t") + else: + raise ValueError("Unsupported filetype!") except: raise ValueError("Invalid input file") - - json.dump(recipients, sys.stdout, indent="\t") From 01d3850eea3417e12da4d267b7c850bbeda7df20 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 17:03:20 -0400 Subject: [PATCH 043/110] Fix JSON serialization of attachment paths --- src/email_draft_generator/attachment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/attachment.py b/src/email_draft_generator/attachment.py index 53a47aa..a301e98 100644 --- a/src/email_draft_generator/attachment.py +++ b/src/email_draft_generator/attachment.py @@ -24,7 +24,7 @@ def __eq__(self, other): def __json__(self): """Returns a dictionary for JSON serialization.""" - return {"path": self.path, "filename": self.filename} + return {"path": str(self.path), "filename": self.filename} @classmethod def from_path(cls, path: os.PathLike, filename: str | None = None): From 8af34ea518e68ef84c5b28f5aa7cd0b34c00348a Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 29 Jun 2024 17:04:09 -0400 Subject: [PATCH 044/110] Add a New Attachment button --- src/email_draft_generator/gui/template_editor.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index 299de73..9de0bf1 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -1,5 +1,6 @@ import os import json +import pathlib import json_fix import subprocess import platform @@ -82,6 +83,13 @@ def __init__(self, parent): self.attachment_frame.grid_rowconfigure(0, weight=1) self.attachment_frame.grid_columnconfigure(0, weight=1) + + ttk.Button(self, text="New Attachment", command=self.new).grid(row=1, column=0) + + def new(self): + attachment_path = filedialog.askopenfilename() + self.attachments.append(EmailAttachment.from_path(pathlib.Path(attachment_path))) + self.set_attachments(self.attachments) def set_attachments(self, attachments): self.attachments = attachments From 1fb2c30e9a58974323c7b1ca81671f9d3ab09299 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 24 Aug 2024 13:14:47 -0400 Subject: [PATCH 045/110] Add a shebang to `run_gui.py` --- run_gui.py | 2 ++ 1 file changed, 2 insertions(+) mode change 100644 => 100755 run_gui.py diff --git a/run_gui.py b/run_gui.py old mode 100644 new mode 100755 index 10b1493..832ee94 --- a/run_gui.py +++ b/run_gui.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import sys sys.path.append('./src') From b35dfb22b3a332b556775106bbaca290e36701f3 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 24 Aug 2024 14:03:15 -0400 Subject: [PATCH 046/110] Add initial functionality for importing E-mail lists --- src/email_draft_generator/email_drafter.py | 2 +- src/email_draft_generator/gui/main.py | 45 +++++++++++++++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 11975ef..1c8e621 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -8,7 +8,7 @@ class EmailDrafter: """Utility class to draft E-mails""" - def generate_drafts(recipients, template: EmailTemplate, creds): + def generate_drafts(self, recipients, template: EmailTemplate, creds): with concurrent.futures.ProcessPoolExecutor() as executor: for recipient in recipients: gmail.create_draft(creds, template.create_email_body(EmailRecipient.from_dict(recipient))) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 0f836cd..99862a7 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -1,13 +1,19 @@ import fileinput import json +import mimetypes import os +import concurrent.futures import tkinter as tk from tkinter import ttk +from tkinter import filedialog from email_draft_generator.gui import gmail_gui +from email_draft_generator.file_parser import csv_parser +from email_draft_generator.file_parser import text_parser from email_draft_generator.email_drafter import EmailDrafter from email_draft_generator.email_template import EmailTemplate +from email_draft_generator.email_list import EmailRecipient from email_draft_generator.gui.template_editor import TemplateEditorPopup # TODO: Use a keyring for these @@ -41,6 +47,9 @@ def __init__(self, master): ttk.Button(frm, text="Open", command=self.template_editor.template_editor.load_template).grid(column=1, row=1) ttk.Button(frm, text="Edit", command=self.edit_template).grid(column=2, row=1) + ttk.Label(frm, text="E-mail list").grid(column=0, row=2) + ttk.Button(frm, text="Open", command=self.load_email_list).grid(column=1, row=2) + ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=2) def authenticate(self): @@ -52,24 +61,50 @@ def edit_template(self): # TODO: Fix the thing where the parent window is focused on return #self.parent.deiconify() + def load_email_list(self): + """Opens an E-mail list""" + email_list_path = filedialog.askopenfilename() + + # Get the mimetype of the file so we can figure out how to parse it + type_subtype, _ = mimetypes.guess_type(email_list_path) + + # Parse list + with open(email_list_path) as email_list_file: + if type_subtype == "text/json": + # Load JSON data + email_list_dict = json.load(email_list_file) + + # Convert the list of dictionaries to a list of recipients + email_list = [] + with concurrent.futures.ProcessPoolExecutor() as executor: + for recipient in email_list_dict: + email_list.append(EmailRecipient.from_dict(recipient)) + + elif type_subtype == "text/csv": + # Load CSV data + self.email_list = csv_parser.parse(email_list_file) + elif type_subtype == "text/plain": + # Load plaintext data + self.email_list = text_parser.parse(email_list_file) + def send_emails(self): # If not authenticated, prompt the user to authenticate if not self.creds or not self.creds.valid: self.authenticate() + # If no email list was provided, load the email list + if not self.email_list: + self.load_email_list() + #drafting_progressbar = ttk.Progressbar(self, orient='horizontal', mode='indeterminate') #drafting_progressbar.grid(column=0, row=2) # TODO: Add a GUI to select and edit this - json_data = "" - for line in fileinput.input(): - json_data += line - recipients = json.loads(json_data) #drafting_progressbar.step() # TODO: Make the progressbar work #drafting_progressbar.start() - EmailDrafter.generate_drafts(recipients, self.template_editor.template_editor.template_editor.template, self.creds) + EmailDrafter.generate_drafts(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds) #drafting_progressbar.stop() From bd04952928da6811496ba06e7e514747cb7e69c7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sat, 24 Aug 2024 18:05:26 -0400 Subject: [PATCH 047/110] Add an install script This should be able to be run pretty easily by just piping the output of `curl` (pulling from Github) into `sh` --- install.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100755 install.sh diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..25dff38 --- /dev/null +++ b/install.sh @@ -0,0 +1,6 @@ +#!/bin/sh +parent_path="$HOME/.local/share/email-generator" +cd "$parent_path" +python3 -m venv --system-site-packages "$parent_path/.venv" +source "$parent_path/.venv/bin/activate" +pip3 install email-draft-generator \ No newline at end of file From f7577aec979874af5366bb25253ccf5be826758d Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 16:04:07 -0400 Subject: [PATCH 048/110] Make `generate_drafts()` a class method --- src/email_draft_generator/email_drafter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 1c8e621..207ec58 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -8,7 +8,8 @@ class EmailDrafter: """Utility class to draft E-mails""" - def generate_drafts(self, recipients, template: EmailTemplate, creds): + @classmethod + def generate_drafts(cls, recipients, template: EmailTemplate, creds): with concurrent.futures.ProcessPoolExecutor() as executor: for recipient in recipients: gmail.create_draft(creds, template.create_email_body(EmailRecipient.from_dict(recipient))) From d0905e70e2fe7d045ebb4d2770fc2462345692a9 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 16:08:12 -0400 Subject: [PATCH 049/110] Use EmailRecipients instead of dicts in `generate_drafts()` --- src/email_draft_generator/email_drafter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 207ec58..7b85c6f 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -12,4 +12,4 @@ class EmailDrafter: def generate_drafts(cls, recipients, template: EmailTemplate, creds): with concurrent.futures.ProcessPoolExecutor() as executor: for recipient in recipients: - gmail.create_draft(creds, template.create_email_body(EmailRecipient.from_dict(recipient))) + gmail.create_draft(creds, template.create_email_body(recipient)) From 73f658a77521f02fcf53b43cd50cd2539fd1cacd Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 16:21:16 -0400 Subject: [PATCH 050/110] Fix some UI layout problems --- src/email_draft_generator/gui/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 99862a7..9f2a871 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -50,7 +50,7 @@ def __init__(self, master): ttk.Label(frm, text="E-mail list").grid(column=0, row=2) ttk.Button(frm, text="Open", command=self.load_email_list).grid(column=1, row=2) - ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=2) + ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=3) def authenticate(self): self.creds = gmail_gui.get_creds(global_token_path, global_creds_path, root=self) From 840101293a4259dc9de3f479e2ef3d728ffa30b3 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 16:51:16 -0400 Subject: [PATCH 051/110] Add a progress bar --- src/email_draft_generator/email_drafter.py | 7 ++++++- src/email_draft_generator/gui/main.py | 15 ++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 7b85c6f..322dc37 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -3,13 +3,18 @@ from email_draft_generator.email_template import EmailTemplate import concurrent.futures +from tkinter import ttk class EmailDrafter: """Utility class to draft E-mails""" @classmethod - def generate_drafts(cls, recipients, template: EmailTemplate, creds): + def generate_drafts(cls, recipients, template: EmailTemplate, creds, progressbar: ttk.Progressbar | None = None): with concurrent.futures.ProcessPoolExecutor() as executor: for recipient in recipients: gmail.create_draft(creds, template.create_email_body(recipient)) + if progressbar != None: + progressbar.step() + if progressbar != None: + progressbar.destroy() diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 9f2a871..0cc2695 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -3,6 +3,7 @@ import mimetypes import os import concurrent.futures +import threading import tkinter as tk from tkinter import ttk @@ -96,16 +97,12 @@ def send_emails(self): if not self.email_list: self.load_email_list() - #drafting_progressbar = ttk.Progressbar(self, orient='horizontal', mode='indeterminate') - #drafting_progressbar.grid(column=0, row=2) + self.drafting_progressbar = ttk.Progressbar(self, orient='horizontal', maximum=len(self.email_list)) + self.drafting_progressbar.grid(column=0, row=4) - # TODO: Add a GUI to select and edit this - #drafting_progressbar.step() - - # TODO: Make the progressbar work - #drafting_progressbar.start() - EmailDrafter.generate_drafts(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds) - #drafting_progressbar.stop() + # Thread allows the UI to continue to work while this runs + t = threading.Thread(target=EmailDrafter.generate_drafts, args=(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds, self.drafting_progressbar)) + t.start() def main(): From 28ce4ab460c473fc83478e92316853cb4e56f372 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:16:42 -0400 Subject: [PATCH 052/110] Fix prompt to open E-mail list --- src/email_draft_generator/gui/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 0cc2695..344cdb2 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -94,7 +94,7 @@ def send_emails(self): self.authenticate() # If no email list was provided, load the email list - if not self.email_list: + if not hasattr(self, 'email_list'): self.load_email_list() self.drafting_progressbar = ttk.Progressbar(self, orient='horizontal', maximum=len(self.email_list)) From 739582746c7e2654f3b4ebec145f03d8067dfc3b Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:18:53 -0400 Subject: [PATCH 053/110] Add a title to the E-mail list file selector window --- src/email_draft_generator/gui/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 344cdb2..924259e 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -64,7 +64,7 @@ def edit_template(self): def load_email_list(self): """Opens an E-mail list""" - email_list_path = filedialog.askopenfilename() + email_list_path = filedialog.askopenfilename(title="Select E-mail list") # Get the mimetype of the file so we can figure out how to parse it type_subtype, _ = mimetypes.guess_type(email_list_path) From d2cebe1a2a6f250a3e59ad021064c3ba66533d37 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:23:28 -0400 Subject: [PATCH 054/110] Add filetypes to the E-mail list file selector --- src/email_draft_generator/gui/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 924259e..def352f 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -64,7 +64,7 @@ def edit_template(self): def load_email_list(self): """Opens an E-mail list""" - email_list_path = filedialog.askopenfilename(title="Select E-mail list") + email_list_path = filedialog.askopenfilename(title="Select E-mail list", filetypes=[("E-mail list files", ".json .csv .txt")]) # Get the mimetype of the file so we can figure out how to parse it type_subtype, _ = mimetypes.guess_type(email_list_path) From d7577c4498d149778a381edbb6b6957bde30dfc7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:23:50 -0400 Subject: [PATCH 055/110] Add a title and filetypes to the E-mail template file selector --- src/email_draft_generator/gui/template_editor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index 9de0bf1..7f34c70 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -217,7 +217,7 @@ def prompt_to_save(self): def load_template(self): """Prompts the user to select the template file.""" if self.prompt_to_save(): - self.template_path = filedialog.askopenfilename() + self.template_path = filedialog.askopenfilename(title="Select E-mail template", filetypes=[("E-mail template files", ".json")]) # Parse template with open(self.template_path) as template_file: From 156df42fa5f4e773660bfb56214fc3987aa1059f Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:28:44 -0400 Subject: [PATCH 056/110] Add title and filetype to API credential file selector --- src/email_draft_generator/gui/gmail_gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/gmail_gui.py b/src/email_draft_generator/gui/gmail_gui.py index 5e2b6ff..cbcc9f0 100644 --- a/src/email_draft_generator/gui/gmail_gui.py +++ b/src/email_draft_generator/gui/gmail_gui.py @@ -30,7 +30,7 @@ def open_guide(self): def choose_path(self): """Prompts the user to select the creds file.""" - self.selected_path = filedialog.askopenfilename() + self.selected_path = filedialog.askopenfilename(title="Select credentials file", filetypes=[("Google API credentials files", ".json")]) self.destroy() def show(self): From 73f44e5128e3344f59288ab6fca685f1987570a0 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:37:16 -0400 Subject: [PATCH 057/110] Prompt the user to save the template to a file if no file exists already --- src/email_draft_generator/gui/template_editor.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index 7f34c70..ce487bf 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -229,8 +229,17 @@ def save_template(self): """Saves the current template and returns to the main window if it is a popup.""" self.template_editor.template = self.template_editor.get_template() - with open(self.template_path, "w") as template_file: - json.dump(self.template_editor.template, template_file) + if not hasattr(self, "template_path"): + # If no template file was opened, prompt the user to save to a new file + template_file = filedialog.asksaveasfile(mode='w', title="Select where to save the template", defaultextension=".json") + if template_file == None: + if self.popup: + self.parent.withdraw() + return + else: + template_file = open(self.template_path, "w") + + json.dump(self.template_editor.template, template_file) if self.popup: self.parent.withdraw() From f21c95728bc5aafa62f595de04d1a9306227601d Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:49:46 -0400 Subject: [PATCH 058/110] Clear the attachment list when opening a template --- src/email_draft_generator/email_template.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/email_draft_generator/email_template.py b/src/email_draft_generator/email_template.py index 099360e..060ce89 100644 --- a/src/email_draft_generator/email_template.py +++ b/src/email_draft_generator/email_template.py @@ -71,6 +71,7 @@ def from_dict(cls, dictionary: dict): subject=dictionary.get('subject'), body=dictionary.get('body'), ) + template.attachments = [] # Make sure that there are no attachments left over from the previous run if 'attachments' in dictionary: for attachment in dictionary['attachments']: template.attachments.append(EmailAttachment.from_dict(attachment)) From d7024e67d730755ef6324d613bbff0a7589bd7fb Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 17:55:54 -0400 Subject: [PATCH 059/110] Reset template if user opts to not save changes --- src/email_draft_generator/gui/template_editor.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index ce487bf..ac73723 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -210,6 +210,9 @@ def prompt_to_save(self): save_prompt = messagebox.askyesnocancel("Unsaved Changes", "You have unsaved changes. Would you like to save them?") if save_prompt == True: self.save_template() + elif save_prompt == False: + self.template_editor.set_template(self.template_editor.template) + return save_prompt != None else: return True From 02ac3bfae9908389388d706337ec7b46c9e216c6 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 18:12:21 -0400 Subject: [PATCH 060/110] Add a save as button to the template editor --- .../gui/template_editor.py | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index ac73723..afda7a2 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -191,7 +191,8 @@ def __init__(self, parent, template: EmailTemplate | None = None, *, popup=False if popup: ttk.Button(buttons_frame, text="Save and Return", command=self.save_template).grid(row=0, column=0) - ttk.Button(buttons_frame, text="Cancel", command=self.quit_with_prompt).grid(row=0, column=1) + ttk.Button(buttons_frame, text="Save As...", command=self.save_template_as).grid(row=0, column=1) + ttk.Button(buttons_frame, text="Cancel", command=self.quit_with_prompt).grid(row=0, column=2) else: ttk.Button(buttons_frame, text="Open", command=self.load_template).grid(row=0, column=0) ttk.Button(buttons_frame, text="Save", command=self.save_template).grid(row=0, column=1) @@ -234,19 +235,34 @@ def save_template(self): if not hasattr(self, "template_path"): # If no template file was opened, prompt the user to save to a new file - template_file = filedialog.asksaveasfile(mode='w', title="Select where to save the template", defaultextension=".json") - if template_file == None: + template_path = filedialog.asksaveasfilename(title="Select where to save the template", defaultextension=".json") + if template_path == None or template_path == '': if self.popup: self.parent.withdraw() return - else: - template_file = open(self.template_path, "w") + else: + self.template_path = template_path + self.parent.wm_title("Template Editor - " + os.path.basename(self.template_path)) - json.dump(self.template_editor.template, template_file) + with open(self.template_path, "w") as template_file: + json.dump(self.template_editor.template, template_file) if self.popup: self.parent.withdraw() + def save_template_as(self): + """Saves the current template as a new file.""" + self.template_editor.template = self.template_editor.get_template() + + template_path = filedialog.asksaveasfilename(title="Select where to save the template", defaultextension=".json") + if template_path == None or template_path == '': + return + else: + self.template_path = template_path + self.parent.wm_title("Template Editor - " + os.path.basename(self.template_path)) + + self.save_template() + def quit_with_prompt(self): """Quit, prompting the user to save if the file has been edited.""" if self.prompt_to_save(): From 1e1fb9afda1458ea7723a76677ecd92623cb682c Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Sun, 25 Aug 2024 18:18:14 -0400 Subject: [PATCH 061/110] Add checks to make sure that the user selected a file --- src/email_draft_generator/gui/gmail_gui.py | 3 ++- src/email_draft_generator/gui/main.py | 3 +++ src/email_draft_generator/gui/template_editor.py | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/gmail_gui.py b/src/email_draft_generator/gui/gmail_gui.py index cbcc9f0..3f48d5b 100644 --- a/src/email_draft_generator/gui/gmail_gui.py +++ b/src/email_draft_generator/gui/gmail_gui.py @@ -31,7 +31,8 @@ def open_guide(self): def choose_path(self): """Prompts the user to select the creds file.""" self.selected_path = filedialog.askopenfilename(title="Select credentials file", filetypes=[("Google API credentials files", ".json")]) - self.destroy() + if not (self.selected_path == None or self.selected_path == ''): + self.destroy() def show(self): """Shows the window and returns the selected file path""" diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index def352f..fdab706 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -66,6 +66,9 @@ def load_email_list(self): """Opens an E-mail list""" email_list_path = filedialog.askopenfilename(title="Select E-mail list", filetypes=[("E-mail list files", ".json .csv .txt")]) + if email_list_path == None or email_list_path == '': + return + # Get the mimetype of the file so we can figure out how to parse it type_subtype, _ = mimetypes.guess_type(email_list_path) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index afda7a2..490039f 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -223,6 +223,9 @@ def load_template(self): if self.prompt_to_save(): self.template_path = filedialog.askopenfilename(title="Select E-mail template", filetypes=[("E-mail template files", ".json")]) + if self.template_path == None or self.template_path == '': + return + # Parse template with open(self.template_path) as template_file: self.template_editor.set_template(EmailTemplate.from_file(template_file)) From 598f9c31bd237aadb6900a0dccc0a14218e77def Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 15:57:28 -0400 Subject: [PATCH 062/110] Add a log out function --- src/email_draft_generator/gui/main.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index fdab706..d5fed47 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -3,11 +3,13 @@ import mimetypes import os import concurrent.futures +from pathlib import Path import threading import tkinter as tk from tkinter import ttk from tkinter import filedialog +from tkinter import messagebox from email_draft_generator.gui import gmail_gui from email_draft_generator.file_parser import csv_parser @@ -42,7 +44,7 @@ def __init__(self, master): self.template_editor = TemplateEditorPopup(self) self.template_editor.withdraw() - ttk.Button(frm, text="Authenticate", command=self.authenticate).grid(column=0, row=0) + ttk.Button(frm, text="Authenticate", command=self.authenticate_button).grid(column=0, row=0) ttk.Label(frm, text="Template").grid(column=0, row=1) ttk.Button(frm, text="Open", command=self.template_editor.template_editor.load_template).grid(column=1, row=1) @@ -53,9 +55,21 @@ def __init__(self, master): ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=3) + def authenticate_button(self): + """Callback for the authentication button, logs out if already authenticated.""" + if not self.creds or not self.creds.valid: + self.authenticate() + else: + self.log_out() + self.creds = gmail_gui.get_creds(global_token_path, global_creds_path) # Clear the credentials variable + def authenticate(self): self.creds = gmail_gui.get_creds(global_token_path, global_creds_path, root=self) + def log_out(self): + if messagebox.askyesno("Log out?", "Would you like to log out?"): + Path(global_token_path).unlink(missing_ok=True) + def edit_template(self): """Opens the template editor""" self.template_editor.show() From 6849f27e0e57c1853594246b9a136c1bf359f339 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:15:43 -0400 Subject: [PATCH 063/110] Show whether an account is logged in or not --- src/email_draft_generator/gmail.py | 13 +++++++++++++ src/email_draft_generator/gui/main.py | 27 ++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/email_draft_generator/gmail.py b/src/email_draft_generator/gmail.py index ba14d53..2fd7669 100644 --- a/src/email_draft_generator/gmail.py +++ b/src/email_draft_generator/gmail.py @@ -85,3 +85,16 @@ def create_draft(creds, body): print(f"An error occurred: {error}") draft = None return draft + + +def get_user_info(creds): + """Creates an email draft with the provided body""" + try: + # Create Gmail API client + service = build("gmail", "v1", credentials=creds) + + profile = service.users().getProfile(userId='me').execute() + except HttpError as error: + print(f"An error occurred: {error}") + profile = None + return profile diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index d5fed47..de75b98 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -11,6 +11,7 @@ from tkinter import filedialog from tkinter import messagebox +from email_draft_generator import gmail from email_draft_generator.gui import gmail_gui from email_draft_generator.file_parser import csv_parser from email_draft_generator.file_parser import text_parser @@ -44,7 +45,10 @@ def __init__(self, master): self.template_editor = TemplateEditorPopup(self) self.template_editor.withdraw() - ttk.Button(frm, text="Authenticate", command=self.authenticate_button).grid(column=0, row=0) + self.authenticate_button = ttk.Button(frm, text="Authenticate", command=self.authenticate_button_callback) + self.authenticate_button.grid(column=0, row=0) + self.account_label = ttk.Label(frm) + self.account_label.grid(column=1, row=0) ttk.Label(frm, text="Template").grid(column=0, row=1) ttk.Button(frm, text="Open", command=self.template_editor.template_editor.load_template).grid(column=1, row=1) @@ -54,21 +58,38 @@ def __init__(self, master): ttk.Button(frm, text="Open", command=self.load_email_list).grid(column=1, row=2) ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=3) + + self.update_authenticate_label() - def authenticate_button(self): + def authenticate_button_callback(self): """Callback for the authentication button, logs out if already authenticated.""" if not self.creds or not self.creds.valid: self.authenticate() else: self.log_out() - self.creds = gmail_gui.get_creds(global_token_path, global_creds_path) # Clear the credentials variable def authenticate(self): self.creds = gmail_gui.get_creds(global_token_path, global_creds_path, root=self) + self.update_authenticate_label() def log_out(self): if messagebox.askyesno("Log out?", "Would you like to log out?"): Path(global_token_path).unlink(missing_ok=True) + self.creds = gmail_gui.get_creds(global_token_path, global_creds_path) # Clear the credentials variable + self.update_authenticate_label() + + def update_authenticate_label(self): + """Update the authenticate button text to show if you are logged in or not.""" + if not self.creds or not self.creds.valid: + self.authenticate_button.config(text="Authenticate") + self.account_label.config(text="") + else: + self.authenticate_button.config(text="Log Out") + profile = gmail.get_user_info(self.creds) + if profile != None: + self.account_label.config(text=f"Logged in as {profile['emailAddress']}") + else: + self.account_label.config(text=f"Unable to retrieve E-mail address") def edit_template(self): """Opens the template editor""" From 855841e62078055755f51c302aa280e60e2b82ef Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:27:09 -0400 Subject: [PATCH 064/110] Refocus main window when the authentication flow is complete --- src/email_draft_generator/gui/gmail_gui.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/email_draft_generator/gui/gmail_gui.py b/src/email_draft_generator/gui/gmail_gui.py index 3f48d5b..2d046b8 100644 --- a/src/email_draft_generator/gui/gmail_gui.py +++ b/src/email_draft_generator/gui/gmail_gui.py @@ -58,4 +58,6 @@ def get_creds(token_path, creds_path, root=None): creds = flow.run_local_server(port=0) # Save the credentials for the next run gmail.write_token(creds, token_path) + # Refocus the main window + root.parent.focus_force() return creds From 6a8ae24edda4d6cd0e00e883ad61f74deb5964ba Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:28:18 -0400 Subject: [PATCH 065/110] Adjust the UI spacing so things look a bit nicer --- src/email_draft_generator/gui/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index de75b98..50a0b0d 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -48,7 +48,7 @@ def __init__(self, master): self.authenticate_button = ttk.Button(frm, text="Authenticate", command=self.authenticate_button_callback) self.authenticate_button.grid(column=0, row=0) self.account_label = ttk.Label(frm) - self.account_label.grid(column=1, row=0) + self.account_label.grid(column=1, row=0, columnspan=2) ttk.Label(frm, text="Template").grid(column=0, row=1) ttk.Button(frm, text="Open", command=self.template_editor.template_editor.load_template).grid(column=1, row=1) From 538f60aba37ef9f56909926ed0603d52092c4178 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:32:28 -0400 Subject: [PATCH 066/110] Add a save as button to the standalone template editor --- src/email_draft_generator/gui/template_editor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index 490039f..2c02fb0 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -196,7 +196,8 @@ def __init__(self, parent, template: EmailTemplate | None = None, *, popup=False else: ttk.Button(buttons_frame, text="Open", command=self.load_template).grid(row=0, column=0) ttk.Button(buttons_frame, text="Save", command=self.save_template).grid(row=0, column=1) - ttk.Button(buttons_frame, text="Exit", command=self.quit_with_prompt).grid(row=0, column=2) + ttk.Button(buttons_frame, text="Save As...", command=self.save_template_as).grid(row=0, column=2) + ttk.Button(buttons_frame, text="Exit", command=self.quit_with_prompt).grid(row=0, column=3) self.template_editor = TemplateEditor(self, template) self.template_editor.grid(row=1, column=0, sticky="nsew") From 16f37514cf8f7eb3f4650539a6562fe9b60e6a0d Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:37:41 -0400 Subject: [PATCH 067/110] Update readme to include GUI instructions --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9773f60..da04677 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ pip3 install email-draft-generator ## Building from source Install the `build` tool with pip and run `python3 -m build` to build the package. -## Usage -The utility provides two binaries: `email-generator` and `email-list-parser`. +## Usage (command line) +The utility provides two command-line binaries: `email-generator` and `email-list-parser`. ### email-generator `email-generator` takes a JSON-formatted list of E-mail addresses and recipient names, formats them according to the template JSON, and uploads them to Gmail. To set up the Google API, run it once (you will need to provide a valid list of E-mail addresses for it to run), and it will guide you through setting this up. Most of the usage specifics are described in the usage help, which you can show by running `email-generator -h`. @@ -64,4 +64,7 @@ Run the program once, and it will guide you through setting up the Google API. Copy and paste the table into `data/email-list.txt`. ### Run the program Run `run.sh` (can be run by double-clicking as well) -The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. \ No newline at end of file +The first time it is run, you will need to authenticate with the account that you want to upload the drafts to. A browser window should be opened automatically to do this in (if it is not, copy and paste the URL from the terminal window into your browser). The authentication flow may not work in Firefox or other Gecko-based browsers, so try Chrome, Safari, or another Chromium- or Webkit-based browser if it doesn't work for you. + +## Usage (GUI) +The utility provides two GUI binaries: `email-generator-gui` and `email-template-editor-gui`. These take no command line arguments. \ No newline at end of file From 4cb85c65d44c078828368f7a261836cc55549355 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:42:04 -0400 Subject: [PATCH 068/110] Update `pyproject.toml` since this has mostly split off from upstream --- pyproject.toml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 56b5c5b..b122066 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,6 @@ authors = [ # This should be your name or the names of the organization who currently maintains the project, and a valid email address corresponding to the name listed. maintainers = [ - { name = "Brandon Clague", email = "94200657+fodfodfod@users.noreply.github.com" }, { name = "Max Nargang", email = "CoffeeCoder1@outlook.com" }, ] @@ -44,9 +43,9 @@ dependencies = [ ] [project.urls] -"Homepage" = "https://github.com/fodfodfod/Email-Generator" -"Bug Reports" = "https://github.com/fodfodfod/Email-Generator/issues" -"Source" = "https://github.com/fodfodfod/Email-Generator" +"Homepage" = "https://github.com/CoffeeCoder1/Email-Generator" +"Bug Reports" = "https://github.com/CoffeeCoder1/Email-Generator/issues" +"Source" = "https://github.com/CoffeeCoder1/Email-Generator" [project.scripts] email-generator = "email_draft_generator.main:main" From e8916028bdc28799376f52220c1a5eb7b3025c25 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 16:43:34 -0400 Subject: [PATCH 069/110] Update development status to Beta --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b122066..ebd2ad3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ # 3 - Alpha # 4 - Beta # 5 - Production/Stable - "Development Status :: 3 - Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Customer Service", "Topic :: Communications :: Email :: Mailing List Servers", "License :: OSI Approved :: MIT License", From e99ed93b4004505c961cff68c9883d3d12cc5bdf Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 19:12:34 -0400 Subject: [PATCH 070/110] Add a script to package with PyInstaller --- package.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 package.py diff --git a/package.py b/package.py new file mode 100755 index 0000000..40c715a --- /dev/null +++ b/package.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +import PyInstaller.__main__ + +PyInstaller.__main__.run(['src/email_draft_generator/gui/run.py', '--onedir', '--windowed', '-n', 'E-mail Draft Generator']) From 128ea8d5091de54a1b24cf259794c94c5e60cee6 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 19:13:52 -0400 Subject: [PATCH 071/110] Add noconfirm flag to PyInstaller command --- package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.py b/package.py index 40c715a..f6f88e1 100755 --- a/package.py +++ b/package.py @@ -2,4 +2,4 @@ import PyInstaller.__main__ -PyInstaller.__main__.run(['src/email_draft_generator/gui/run.py', '--onedir', '--windowed', '-n', 'E-mail Draft Generator']) +PyInstaller.__main__.run(['src/email_draft_generator/gui/run.py', '--onedir', '--windowed', '-n', 'E-mail Draft Generator', '--noconfirm']) From 7b27988411586a6e539858a7c6a9769da8f6593a Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 19:17:56 -0400 Subject: [PATCH 072/110] Add PyInstaller as an optional dependency --- pyproject.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ebd2ad3..036439b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,9 +18,7 @@ authors = [ ] # This should be your name or the names of the organization who currently maintains the project, and a valid email address corresponding to the name listed. -maintainers = [ - { name = "Max Nargang", email = "CoffeeCoder1@outlook.com" }, -] +maintainers = [{ name = "Max Nargang", email = "CoffeeCoder1@outlook.com" }] # For a list of valid classifiers, see https://pypi.org/classifiers/ classifiers = [ @@ -42,6 +40,9 @@ dependencies = [ "json-fix", ] +[project.optional-dependencies] +packaging = ["pyinstaller"] + [project.urls] "Homepage" = "https://github.com/CoffeeCoder1/Email-Generator" "Bug Reports" = "https://github.com/CoffeeCoder1/Email-Generator/issues" From b10baa7d37a16ad73084beb033c6ddcd6db930a4 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 19:20:18 -0400 Subject: [PATCH 073/110] Build PyInstaller packages with CI --- .github/workflows/python-build.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 1338c9a..9ae26e5 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -26,6 +26,29 @@ jobs: with: name: distribution-archives path: dist/* + + # Builds binaries with pyinstaller + pyinstaller: + strategy: + matrix: + os: ['ubuntu', 'windows', 'macos'] + runs-on: ${{ matrix.os }}-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5.1.0 + with: + python-version: '3.12' + - name: Install dependencies + run: pip install .[packaging] + - name: Build executable + run: ./package.py + - name: Upload a Build Artifact + uses: actions/upload-artifact@v4.3.3 + with: + name: package-${{ matrix.os }} + path: dist/* + # Creates a release if the commit has a tag associated with it release: needs: build @@ -43,6 +66,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') with: files: dist/* + # Publish to PyPI if the commit has a tag associated with it publish: needs: build From 5169730b3e8ad5c4fe407a7bd13ae6ade4c6b500 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 19:22:33 -0400 Subject: [PATCH 074/110] Add a run file that PyInstaller can point to --- src/email_draft_generator/gui/run.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/email_draft_generator/gui/run.py diff --git a/src/email_draft_generator/gui/run.py b/src/email_draft_generator/gui/run.py new file mode 100644 index 0000000..da5ad0e --- /dev/null +++ b/src/email_draft_generator/gui/run.py @@ -0,0 +1,6 @@ +# Runs the GUI +# Needed so pyinstaller works + +import email_draft_generator.gui.main as main + +main.main() From d1c41b8e0a34ce87ad0c1bed443edcd9775fe017 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 22:24:40 -0400 Subject: [PATCH 075/110] Create an icon --- icon.png | Bin 0 -> 41223 bytes icon.svg | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 icon.png create mode 100644 icon.svg diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..07bebb340b09c10b89bbecfcdb2e8e1585d09a34 GIT binary patch literal 41223 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 literal 0 HcmV?d00001 diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..2301b11 --- /dev/null +++ b/icon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + From a2ec45fe8b3af8640a70eb32163bfdb70993263a Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 22:29:07 -0400 Subject: [PATCH 076/110] Include the icon in the package --- package.py | 11 ++++++++++- pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/package.py b/package.py index f6f88e1..bfdcf5d 100755 --- a/package.py +++ b/package.py @@ -2,4 +2,13 @@ import PyInstaller.__main__ -PyInstaller.__main__.run(['src/email_draft_generator/gui/run.py', '--onedir', '--windowed', '-n', 'E-mail Draft Generator', '--noconfirm']) +PyInstaller.__main__.run([ + 'src/email_draft_generator/gui/run.py', + '--onedir', + '--windowed', + '-n', + 'E-mail Draft Generator', + '--noconfirm', + '--icon', + 'icon.png', +]) diff --git a/pyproject.toml b/pyproject.toml index 036439b..fd3ba53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dependencies = [ ] [project.optional-dependencies] -packaging = ["pyinstaller"] +packaging = ["pyinstaller", "pillow"] [project.urls] "Homepage" = "https://github.com/CoffeeCoder1/Email-Generator" From e52a546e31234a9a82618b5d7878a8642c8a10a7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Mon, 26 Aug 2024 22:31:19 -0400 Subject: [PATCH 077/110] Move the icon to the assets directory --- icon.png => assets/icon.png | Bin icon.svg => assets/icon.svg | 0 package.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename icon.png => assets/icon.png (100%) rename icon.svg => assets/icon.svg (100%) diff --git a/icon.png b/assets/icon.png similarity index 100% rename from icon.png rename to assets/icon.png diff --git a/icon.svg b/assets/icon.svg similarity index 100% rename from icon.svg rename to assets/icon.svg diff --git a/package.py b/package.py index bfdcf5d..0f4f1f0 100755 --- a/package.py +++ b/package.py @@ -10,5 +10,5 @@ 'E-mail Draft Generator', '--noconfirm', '--icon', - 'icon.png', + 'assets/icon.png', ]) From 2a55621718144c76979c37c0fb9088080bf467a2 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 09:39:30 -0400 Subject: [PATCH 078/110] Add a way to save errored E-mail recipients to a file --- src/email_draft_generator/email_drafter.py | 13 ++++++++++--- src/email_draft_generator/gmail.py | 4 +++- src/email_draft_generator/gui/main.py | 20 +++++++++++++++++++- src/email_draft_generator/main.py | 3 ++- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 322dc37..0362fa6 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -9,11 +9,18 @@ class EmailDrafter: """Utility class to draft E-mails""" - @classmethod - def generate_drafts(cls, recipients, template: EmailTemplate, creds, progressbar: ttk.Progressbar | None = None): + def __init__(self): + self.errors = [] + + def generate_drafts(self, recipients, template: EmailTemplate, creds, progressbar: ttk.Progressbar | None = None, error_button: ttk.Button | None = None): + self.errors = [] with concurrent.futures.ProcessPoolExecutor() as executor: for recipient in recipients: - gmail.create_draft(creds, template.create_email_body(recipient)) + draft = gmail.create_draft(creds, template.create_email_body(recipient)) + if draft[1] != None: + self.errors.append(draft[1]) + if error_button != None: + error_button.config(state='normal') if progressbar != None: progressbar.step() if progressbar != None: diff --git a/src/email_draft_generator/gmail.py b/src/email_draft_generator/gmail.py index 2fd7669..01f70f6 100644 --- a/src/email_draft_generator/gmail.py +++ b/src/email_draft_generator/gmail.py @@ -74,6 +74,7 @@ def get_creds(token_path, creds_path): def create_draft(creds, body): """Creates an email draft with the provided body""" + error_output = None try: # Create Gmail API client service = build("gmail", "v1", credentials=creds) @@ -84,7 +85,8 @@ def create_draft(creds, body): except HttpError as error: print(f"An error occurred: {error}") draft = None - return draft + error_output = error + return [draft, error_output] def get_user_info(creds): diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 50a0b0d..69a0fb2 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -36,6 +36,7 @@ def __init__(self, master): self.pack() self.parent = master + self.errors = [] # Frame for the main app content frm = self @@ -58,8 +59,12 @@ def __init__(self, master): ttk.Button(frm, text="Open", command=self.load_email_list).grid(column=1, row=2) ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=3) + self.error_button = ttk.Button(frm, text="View Errors", command=self.view_errors, state='disabled') + self.error_button.grid(column=1, row=3) self.update_authenticate_label() + + self.email_drafter = EmailDrafter() def authenticate_button_callback(self): """Callback for the authentication button, logs out if already authenticated.""" @@ -139,8 +144,21 @@ def send_emails(self): self.drafting_progressbar.grid(column=0, row=4) # Thread allows the UI to continue to work while this runs - t = threading.Thread(target=EmailDrafter.generate_drafts, args=(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds, self.drafting_progressbar)) + t = threading.Thread(target=self.email_drafter.generate_drafts, args=(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds, self.drafting_progressbar, self.error_button)) t.start() + + def view_errors(self): + if len(self.email_drafter.errors) > 1: + message = f"There were {len(self.email_drafter.errors)} error while sending E-mails. Would you like to save this to a file, so you can fix them and send them again?" + else: + message = f"There was {len(self.email_drafter.errors)} errors while sending E-mails. Would you like to save these to a file, so you can fix them and send them again?" + + if messagebox.askyesno("Errors", message): + error_output_path = filedialog.asksaveasfilename(title="Select where to save the list of failed E-mails", defaultextension=".json") + if error_output_path == None or error_output_path == '': + return + with open(error_output_path, "w") as error_file: + json.dump(self.email_drafter.errors, error_file) def main(): diff --git a/src/email_draft_generator/main.py b/src/email_draft_generator/main.py index 58dd076..8b8a724 100644 --- a/src/email_draft_generator/main.py +++ b/src/email_draft_generator/main.py @@ -39,4 +39,5 @@ def main(): creds = gmail.get_creds(global_token_path, global_creds_path) print("Generating and uploading E-mails") - EmailDrafter.generate_drafts(recipients, template, creds) + email_drafter = EmailDrafter() + email_drafter.generate_drafts(recipients, template, creds) From df04e418adfdb81472fbc1ddeab4d0f7b4985ac8 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 15:45:23 -0400 Subject: [PATCH 079/110] Fix the error output functionality --- src/email_draft_generator/email_drafter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 0362fa6..2ceb7c9 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -18,7 +18,7 @@ def generate_drafts(self, recipients, template: EmailTemplate, creds, progressba for recipient in recipients: draft = gmail.create_draft(creds, template.create_email_body(recipient)) if draft[1] != None: - self.errors.append(draft[1]) + self.errors.append(recipient) if error_button != None: error_button.config(state='normal') if progressbar != None: From 72c0d9b5d96f8511590a63c1d8d7c7f393b1b08a Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 15:51:35 -0400 Subject: [PATCH 080/110] Move a parameter to a class --- src/email_draft_generator/email_drafter.py | 9 +++++---- src/email_draft_generator/gui/main.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/email_draft_generator/email_drafter.py b/src/email_draft_generator/email_drafter.py index 2ceb7c9..c45b4f8 100644 --- a/src/email_draft_generator/email_drafter.py +++ b/src/email_draft_generator/email_drafter.py @@ -9,18 +9,19 @@ class EmailDrafter: """Utility class to draft E-mails""" - def __init__(self): + def __init__(self, error_button: ttk.Button | None = None): self.errors = [] + self.error_button = error_button - def generate_drafts(self, recipients, template: EmailTemplate, creds, progressbar: ttk.Progressbar | None = None, error_button: ttk.Button | None = None): + def generate_drafts(self, recipients, template: EmailTemplate, creds, progressbar: ttk.Progressbar | None = None): self.errors = [] with concurrent.futures.ProcessPoolExecutor() as executor: for recipient in recipients: draft = gmail.create_draft(creds, template.create_email_body(recipient)) if draft[1] != None: self.errors.append(recipient) - if error_button != None: - error_button.config(state='normal') + if self.error_button != None: + self.error_button.config(state='normal') if progressbar != None: progressbar.step() if progressbar != None: diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 69a0fb2..6ee717e 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -64,7 +64,7 @@ def __init__(self, master): self.update_authenticate_label() - self.email_drafter = EmailDrafter() + self.email_drafter = EmailDrafter(self.error_button) def authenticate_button_callback(self): """Callback for the authentication button, logs out if already authenticated.""" @@ -144,7 +144,7 @@ def send_emails(self): self.drafting_progressbar.grid(column=0, row=4) # Thread allows the UI to continue to work while this runs - t = threading.Thread(target=self.email_drafter.generate_drafts, args=(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds, self.drafting_progressbar, self.error_button)) + t = threading.Thread(target=self.email_drafter.generate_drafts, args=(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds, self.drafting_progressbar)) t.start() def view_errors(self): From fca0d2498fa297d23bd998f7a5b08242e99a55db Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 16:38:24 -0400 Subject: [PATCH 081/110] Update the UI layout Center the progressbar and make it a bit wider. --- src/email_draft_generator/gui/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 6ee717e..7dac5cd 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -140,8 +140,8 @@ def send_emails(self): if not hasattr(self, 'email_list'): self.load_email_list() - self.drafting_progressbar = ttk.Progressbar(self, orient='horizontal', maximum=len(self.email_list)) - self.drafting_progressbar.grid(column=0, row=4) + self.drafting_progressbar = ttk.Progressbar(self, orient='horizontal', maximum=len(self.email_list), length=300) + self.drafting_progressbar.grid(column=0, row=4, columnspan=3) # Thread allows the UI to continue to work while this runs t = threading.Thread(target=self.email_drafter.generate_drafts, args=(self.email_list, self.template_editor.template_editor.template_editor.template, self.creds, self.drafting_progressbar)) From a961a628bf116be53f62572804b63bac46f7eddd Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 17:09:03 -0400 Subject: [PATCH 082/110] Update the icon to be a bit closer to the MacOS icon style --- assets/icon.png | Bin 41223 -> 61711 bytes assets/icon.svg | 210 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 169 insertions(+), 41 deletions(-) diff --git a/assets/icon.png b/assets/icon.png index 07bebb340b09c10b89bbecfcdb2e8e1585d09a34..dc763fb3e044878a59e23d307c6b32da83cdcfe0 100644 GIT binary patch literal 61711 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 {9L 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 Yy{vbx{W5O_HaSNOO$_o6x?cXj05g72V*mgE literal 41223 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 diff --git a/assets/icon.svg b/assets/icon.svg index 2301b11..980963e 100644 --- a/assets/icon.svg +++ b/assets/icon.svg @@ -14,11 +14,12 @@ inkscape:export-ydpi="260.09601" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + inkscape:current-layer="layer4" + showguides="false" /> + id="defs1"> + + + + + + + + + + + + + + + + + transform="matrix(0.88120635,0,0,0.88120635,9.9875689,-0.96977556)"> + + - - - - - - + id="layer4" + inkscape:label="Foreground" + transform="translate(-0.45344123,1.0435699)"> + + + + + + + + + + From a2e93de091142e486bb220f16e88e431992b13b6 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 17:14:34 -0400 Subject: [PATCH 083/110] Update the icon Very small change, but I added a shadow to the letter flap and rounded the corner a bit. --- assets/icon.png | Bin 61711 -> 70545 bytes assets/icon.svg | 24 ++++++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/assets/icon.png b/assets/icon.png index dc763fb3e044878a59e23d307c6b32da83cdcfe0..49dc38b84663b1c06fa7afa81234b4f209b3bf4d 100644 GIT binary patch literal 70545 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 XGieVlU&)X=Ed_-R%(;oT8Grtkfa*K_`y-A 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 H;TiS6uLU|G literal 61711 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 {9L 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 Yy{vbx{W5O_HaSNOO$_o6x?cXj05g72V*mgE diff --git a/assets/icon.svg b/assets/icon.svg index 980963e..94a9d92 100644 --- a/assets/icon.svg +++ b/assets/icon.svg @@ -27,15 +27,15 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="1.1397116" - inkscape:cx="67.560954" - inkscape:cy="230.32143" + inkscape:zoom="0.97097439" + inkscape:cx="201.85908" + inkscape:cy="85.996089" inkscape:window-width="1920" inkscape:window-height="1172" inkscape:window-x="0" inkscape:window-y="43" inkscape:window-maximized="1" - inkscape:current-layer="layer4" + inkscape:current-layer="layer3" showguides="false" /> @@ -105,9 +105,9 @@ id="filter5" inkscape:label="filter1" x="-0.092606063" - y="-0.10725273" + y="-0.13711675" width="1.1846861" - height="1.2149254"> + height="1.2890912"> @@ -176,11 +176,19 @@ sodipodi:type="rect" /> + Date: Tue, 27 Aug 2024 17:26:44 -0400 Subject: [PATCH 084/110] Add styling to the error button --- src/email_draft_generator/gui/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 7dac5cd..0beddd5 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -42,6 +42,11 @@ def __init__(self, master): frm = self frm.grid() + style = ttk.Style() + + # Error button style + style.map("Error.TButton", background=[("disabled", "red")]) + # Create a template editor and hide it self.template_editor = TemplateEditorPopup(self) self.template_editor.withdraw() @@ -59,7 +64,7 @@ def __init__(self, master): ttk.Button(frm, text="Open", command=self.load_email_list).grid(column=1, row=2) ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=3) - self.error_button = ttk.Button(frm, text="View Errors", command=self.view_errors, state='disabled') + self.error_button = ttk.Button(frm, text="View Errors", command=self.view_errors, state="disabled", style="Error.TButton") self.error_button.grid(column=1, row=3) self.update_authenticate_label() From bf0c0c381b4065570ac489274ef24af9aefe9271 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 17:37:16 -0400 Subject: [PATCH 085/110] Use `__main__.py` instead of `run.py` for the pyinstaller target --- package.py | 2 +- src/email_draft_generator/gui/run.py | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 src/email_draft_generator/gui/run.py diff --git a/package.py b/package.py index 0f4f1f0..b7ec6ee 100755 --- a/package.py +++ b/package.py @@ -3,7 +3,7 @@ import PyInstaller.__main__ PyInstaller.__main__.run([ - 'src/email_draft_generator/gui/run.py', + 'src/email_draft_generator/gui/__main__.py', '--onedir', '--windowed', '-n', diff --git a/src/email_draft_generator/gui/run.py b/src/email_draft_generator/gui/run.py deleted file mode 100644 index da5ad0e..0000000 --- a/src/email_draft_generator/gui/run.py +++ /dev/null @@ -1,6 +0,0 @@ -# Runs the GUI -# Needed so pyinstaller works - -import email_draft_generator.gui.main as main - -main.main() From 919ed7ebdecb4cfc57d65e68d4217785ec37e06b Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 17:39:39 -0400 Subject: [PATCH 086/110] Fix a bug where the program spawns multiple instances of itself The problem was caused by a problem with multiprocessing and PyInstaller, and this fixes that. --- src/email_draft_generator/gui/__main__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/email_draft_generator/gui/__main__.py b/src/email_draft_generator/gui/__main__.py index 6f8e230..d920be1 100644 --- a/src/email_draft_generator/gui/__main__.py +++ b/src/email_draft_generator/gui/__main__.py @@ -1,4 +1,8 @@ +import multiprocessing from email_draft_generator.gui import main if __name__ == "__main__": + # Pyinstaller fix - fixes a problem where multiprocessing will cause multiple instances of the program to spawn + multiprocessing.freeze_support() + main.main() From 37f799fa5a260d040c663cd28345fcd00c608776 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 17:43:30 -0400 Subject: [PATCH 087/110] Fix Windows builds Windows doesn't support the shebang in the Python script, so this calls `python3` explicitly in the CI workflow. --- .github/workflows/python-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 13a0070..94edf04 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -42,7 +42,7 @@ jobs: - name: Install dependencies run: pip install .[packaging] - name: Build executable - run: ./package.py + run: python3 package.py - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 with: From 290d8f083946dfd1056b2451d20488f56fae26f5 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 17:55:31 -0400 Subject: [PATCH 088/110] Use a specfile for pyinstaller --- .github/workflows/python-build.yml | 2 +- .gitignore | 2 +- package.py | 14 -------- pyinstaller.spec | 53 ++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 16 deletions(-) delete mode 100755 package.py create mode 100644 pyinstaller.spec diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 94edf04..42b4d98 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -42,7 +42,7 @@ jobs: - name: Install dependencies run: pip install .[packaging] - name: Build executable - run: python3 package.py + run: pyinstaller --noconfirm pyinstaller.spec - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 with: diff --git a/.gitignore b/.gitignore index 76ef23d..dd7589f 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,7 @@ MANIFEST # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest -*.spec +#*.spec # Installer logs pip-log.txt diff --git a/package.py b/package.py deleted file mode 100755 index b7ec6ee..0000000 --- a/package.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -import PyInstaller.__main__ - -PyInstaller.__main__.run([ - 'src/email_draft_generator/gui/__main__.py', - '--onedir', - '--windowed', - '-n', - 'E-mail Draft Generator', - '--noconfirm', - '--icon', - 'assets/icon.png', -]) diff --git a/pyinstaller.spec b/pyinstaller.spec new file mode 100644 index 0000000..10e3d2c --- /dev/null +++ b/pyinstaller.spec @@ -0,0 +1,53 @@ +# -*- mode: python ; coding: utf-8 -*- + +a = Analysis( + ['src/email_draft_generator/gui/__main__.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) + +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='E-mail Draft Generator', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=['assets/icon.png'], +) + +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='E-mail Draft Generator', +) + +app = BUNDLE( + coll, + name='E-mail Draft Generator.app', + icon='assets/icon.png', + bundle_identifier=None, +) From 0ebbefcad573d8ada2c9ed24bf4f1b912709f3a2 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 18:03:21 -0400 Subject: [PATCH 089/110] Add a version to the MacOS package metadata --- pyinstaller.spec | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyinstaller.spec b/pyinstaller.spec index 10e3d2c..49bffa2 100644 --- a/pyinstaller.spec +++ b/pyinstaller.spec @@ -1,5 +1,7 @@ # -*- mode: python ; coding: utf-8 -*- +import importlib.metadata + a = Analysis( ['src/email_draft_generator/gui/__main__.py'], pathex=[], @@ -50,4 +52,5 @@ app = BUNDLE( name='E-mail Draft Generator.app', icon='assets/icon.png', bundle_identifier=None, + version=importlib.metadata.version('email-draft-generator'), ) From c410e9ee4b64bd454cb2d766ec01394863360563 Mon Sep 17 00:00:00 2001 From: Apollo Nargang Date: Tue, 27 Aug 2024 19:08:16 -0400 Subject: [PATCH 090/110] Wrap MacOS build in a DMG Makes it a bit easier to install and more "mac-like". --- .github/workflows/python-build.yml | 39 +++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 42b4d98..c0c807d 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -31,7 +31,7 @@ jobs: pyinstaller: strategy: matrix: - os: ['ubuntu', 'windows', 'macos'] + os: ['ubuntu', 'windows'] runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v4 @@ -48,6 +48,43 @@ jobs: with: name: package-${{ matrix.os }} path: dist/* + + # Builds for MacOS binaries with pyinstaller (MacOS is different enough that it has to be a seperate step) + pyinstaller-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5.1.0 + with: + python-version: '3.12' + - name: Install dependencies + run: | + pip install .[packaging] + brew update + brew install create-dmg + - name: Build executable + run: pyinstaller --noconfirm pyinstaller.spec + - name: Create DMG + run: | + mkdir -p dist/dmg + cp -r dist/*.app dist/dmg + create-dmg \ + --volname "E-mail Draft Generator" \ + --volicon "assets/icon.png" \ + --window-pos 200 120 \ + --window-size 600 300 \ + --icon-size 100 \ + --icon "E-mail Draft Generator.app" 175 120 \ + --hide-extension "E-mail Draft Generator.app" \ + --app-drop-link 425 120 \ + "dist/E-mail Draft Generator.dmg" \ + "dist/dmg/" + - name: Upload a Build Artifact + uses: actions/upload-artifact@v4.3.3 + with: + name: package-macos + path: dist/*.dmg # Creates a release if the commit has a tag associated with it release: From 806d513e19d9a9bf8490c96d9ee993c35815e269 Mon Sep 17 00:00:00 2001 From: Apollo Nargang Date: Tue, 27 Aug 2024 19:14:10 -0400 Subject: [PATCH 091/110] Combine pyinstaller jobs Makes the CI a bit easier to maintain and the CI graph a bit prettier. --- .github/workflows/python-build.yml | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index c0c807d..0a38b4d 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -31,7 +31,7 @@ jobs: pyinstaller: strategy: matrix: - os: ['ubuntu', 'windows'] + os: ['ubuntu', 'windows', 'macos'] runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v4 @@ -43,30 +43,11 @@ jobs: run: pip install .[packaging] - name: Build executable run: pyinstaller --noconfirm pyinstaller.spec - - name: Upload a Build Artifact - uses: actions/upload-artifact@v4.3.3 - with: - name: package-${{ matrix.os }} - path: dist/* - - # Builds for MacOS binaries with pyinstaller (MacOS is different enough that it has to be a seperate step) - pyinstaller-macos: - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5.1.0 - with: - python-version: '3.12' - - name: Install dependencies + - name: Create DMG + if: runner.os == 'macOS' run: | - pip install .[packaging] brew update brew install create-dmg - - name: Build executable - run: pyinstaller --noconfirm pyinstaller.spec - - name: Create DMG - run: | mkdir -p dist/dmg cp -r dist/*.app dist/dmg create-dmg \ @@ -83,8 +64,8 @@ jobs: - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 with: - name: package-macos - path: dist/*.dmg + name: package-${{ matrix.os }} + path: dist/* # Creates a release if the commit has a tag associated with it release: From 522597801a01170aa6c44d172aaba6f8d4de833f Mon Sep 17 00:00:00 2001 From: Apollo Nargang Date: Tue, 27 Aug 2024 19:19:13 -0400 Subject: [PATCH 092/110] Clean up the MacOS build artifacts --- .github/workflows/python-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 0a38b4d..72c5a1c 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -49,7 +49,7 @@ jobs: brew update brew install create-dmg mkdir -p dist/dmg - cp -r dist/*.app dist/dmg + mv dist/*.app dist/dmg create-dmg \ --volname "E-mail Draft Generator" \ --volicon "assets/icon.png" \ @@ -61,6 +61,7 @@ jobs: --app-drop-link 425 120 \ "dist/E-mail Draft Generator.dmg" \ "dist/dmg/" + rm -r "dist/E-mail Draft Generator" "dist/dmg" - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 with: From 8889ef7d243000331f038df1120f2a10a5787caa Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Tue, 27 Aug 2024 19:32:45 -0400 Subject: [PATCH 093/110] Update icon Add a splash of color and adjust the scaling a bit. --- assets/icon.png | Bin 70545 -> 74792 bytes assets/icon.svg | 45 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/assets/icon.png b/assets/icon.png index 49dc38b84663b1c06fa7afa81234b4f209b3bf4d..b52bcf8eb1ae2be9b7aab6eed5d58e475af306c9 100644 GIT binary patch literal 74792 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�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 z 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

lQVF<6a&StK%MJn#f?HmGW{xw1HI6v9aZ*N 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 bllNhv(Bsu9A){CRU0g$5(+dP0=Li26P4=oU literal 70545 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 XGieVlU&)X=Ed_-R%(;oT8Grtkfa*K_`y-A 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 H;TiS6uLU|G diff --git a/assets/icon.svg b/assets/icon.svg index 94a9d92..8fb804a 100644 --- a/assets/icon.svg +++ b/assets/icon.svg @@ -27,30 +27,46 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="0.97097439" - inkscape:cx="201.85908" - inkscape:cy="85.996089" + inkscape:zoom="1.7599721" + inkscape:cx="176.99144" + inkscape:cy="201.42364" inkscape:window-width="1920" inkscape:window-height="1172" inkscape:window-x="0" inkscape:window-y="43" inkscape:window-maximized="1" - inkscape:current-layer="layer3" + inkscape:current-layer="layer1" showguides="false" /> + + + + + @@ -121,6 +137,15 @@ x2="50.423676" y2="76.675323" gradientUnits="userSpaceOnUse" /> + + transform="matrix(0.91609648,0,0,0.91609648,3.3395348,5.9180452)"> Date: Wed, 28 Aug 2024 19:36:56 -0400 Subject: [PATCH 094/110] Add error messages while importing templates --- src/email_draft_generator/gui/template_editor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/email_draft_generator/gui/template_editor.py b/src/email_draft_generator/gui/template_editor.py index 2c02fb0..7c31f76 100644 --- a/src/email_draft_generator/gui/template_editor.py +++ b/src/email_draft_generator/gui/template_editor.py @@ -229,7 +229,10 @@ def load_template(self): # Parse template with open(self.template_path) as template_file: - self.template_editor.set_template(EmailTemplate.from_file(template_file)) + try: + self.template_editor.set_template(EmailTemplate.from_file(template_file)) + except Exception as ex: + messagebox.showerror(message=str(ex)) self.parent.wm_title("Template Editor - " + os.path.basename(self.template_path)) From 3e6df8fd15d43fdb56f586b7cf2195fd23fadfdb Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 19:44:17 -0400 Subject: [PATCH 095/110] Remove error button styling Since the error button style doesn't work right anyway, this just removes it entirely. --- src/email_draft_generator/gui/main.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 0beddd5..62fc4f0 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -42,11 +42,6 @@ def __init__(self, master): frm = self frm.grid() - style = ttk.Style() - - # Error button style - style.map("Error.TButton", background=[("disabled", "red")]) - # Create a template editor and hide it self.template_editor = TemplateEditorPopup(self) self.template_editor.withdraw() @@ -64,7 +59,7 @@ def __init__(self, master): ttk.Button(frm, text="Open", command=self.load_email_list).grid(column=1, row=2) ttk.Button(frm, text="Draft E-mails", command=self.send_emails).grid(column=0, row=3) - self.error_button = ttk.Button(frm, text="View Errors", command=self.view_errors, state="disabled", style="Error.TButton") + self.error_button = ttk.Button(frm, text="View Errors", command=self.view_errors, state="disabled") self.error_button.grid(column=1, row=3) self.update_authenticate_label() From d17b00de63f5379140f86a53d5f22efa5cb3a739 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 19:53:45 -0400 Subject: [PATCH 096/110] Create a different style of icon for Windows and Linux targets --- assets/icon.png | Bin 74792 -> 64229 bytes assets/icon.svg | 35 +----- assets/icon_macos.png | Bin 0 -> 74792 bytes assets/icon_macos.svg | 244 ++++++++++++++++++++++++++++++++++++++++++ pyinstaller.spec | 2 +- 5 files changed, 249 insertions(+), 32 deletions(-) create mode 100644 assets/icon_macos.png create mode 100644 assets/icon_macos.svg diff --git a/assets/icon.png b/assets/icon.png index b52bcf8eb1ae2be9b7aab6eed5d58e475af306c9..6361fe1b36236ccc0b2a81e06f4649853c4e6406 100644 GIT binary patch literal 64229 zcmeEui93{S|NcGJD3lhZL}dv@g+$qsWvtoD-XbAn&oX98n@Tjch$#CyvTtMbw8%QL zGZp>8761+SK!KA!G`N6A0!3NiYZT#;9husMDfWpGUl)U_W zf^OZo@1f)$==pB>k~joOLGUYjwhuBEC&J(En;oS7C7Ow3@2V_3_2%Sf<9%YPd-kg7 zy?Rvmwc;hu^+%6jUr)w%6kj&(MZG{Be))Wd+02WkI{^kc;kGvi3Pt>#dyTk1@&(^c zCZ|#3^Pi=sJ1)-`m6xZ{qRUG#<;#bfO5WC%^fcfR%O8u26=2{NA=J~d`reD2R}i!s z&siAw642%P_dAM5>fbj(x?BnW{sSZhGyczu1W5WnFN`74|Gbcf1pf0v6!pK${BLjm z-GTqb&Hs|&e}&?IMf882;Xe)Ge_iwc2Skyb3lP(myaM=I*9HfBZL>3zZ8C7 zJsgq3 zgPq$j-?iNWWu->M@j$N*^06#F@{SKeN(XkTV{9PV#(&H)HB^LGPn9w+P5P?97|bh#_Rkk?_rArSF6g%iHe=6mQxgmLknux<~B3z%KPDrqZB#}+)WG*bY!$8 zcf93s23L4NHj%7RCyiqAkW+T8I0`=#QG=l8J24#w{n^B5=Jfs%hek#hi+Ip(&+d`I zIHM_l@fo^MhK5${TCwO~T7%bYdyCw5^Vg#S(7@D+jE82U+igNEJM3F+n+0_<@dHx> zmza0tJs1d1?!zqXjl4>!nYTJGFm?WgzX&Un3t7hli$z^Jvx|Y{Lg4gN>V|_wg9YKe zCW&MIKS(mQ#*i+0AvLML8ClRul;5I8xC-l3;V_A!@G@zMlSQ+Wbi+s_?nx)|R-XEZn*w7cb*G5lOhQ)foL5%OqK}!y>2r-Nbv<>Q7Xx%>|e*t&c3U7+X8R z%VZ>^$y3-m?oHOB&l0_BF=-u%)=pV(pUi4Fn|9!L7==3CBDdB2RagM^c&*)HOeM}Q zhc@&RQ9xpdat{qB<$jTtsG){_oopi}4Om!rOjUq8nSWQ-!E>K2N7je4E&B*)Rv7}8 z>9pcMQ64;69vI%k3Q{Z}?U+9@aBM}{dXBbv1>R<=Y2SA?lHxR5p=gKJPF{bVi!^qu zqekb85#{sfBO_Fvth5m+Si)89IOFlT#f!;nPTbKxD7SlbMBNLNwMWZ}1$w}) zPXL|HuPw!yZ;CFb-EQqfyC$!rbJ;%-w{_?lY9koiZd4EX4)XN%TKTn2_uY((E|ztv z!9$aTLmj6_M1Jpu<4q#W`uaO;h3aLXjH8hMInLP7v}w$5(Ph_BBv

(p7XZVn1F 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

+cHzWJJ^rRCW)Fkj{U!GTwgmYAFsX>o7D}F3 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 z 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 Z8m2drYmxC()d$_AsgcEjynQaA{|8rozF`0W literal 74792 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�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 z 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

lQVF<6a&StK%MJn#f?HmGW{xw1HI6v9aZ*N zjb-1yA+ql%ffPjB8TIGh2KvWX8EOo$!92ml3HE||eP9q8=K?JO)vJHL#w)T`Gp&;% z9fylEicV$`C*BYz^!*kHwn8+%9 zSTk2e4A2}JQ0Y2%x-x-Wmrd8uapX4Rbe z{>^bOJ~i*~cC`C=(C|%T0ln^GpDCC0aJ*;Tm8+pS+e{A~fkUSQ^2F1fq*?HFXaSq2 zEa6M#a+99`QFsn9W}&RAl2{Z!Qchd~ zPhJH=RYee2s!1VvqvCt<>2#u9%7d~;MzPb=a?gvng;%eM7y!Mc1q_7X?u3DHiWXpO zY-_@}KwG@hrALn*m9P8?H?F#Rv;~dbg5k0mfK-kx`yS@T@Wa=lVpkH%-?9;K> zo6%+e9@m&Czfa|F-W-ASnhf$Dn}V+OvLoaKpd-0Me&ou_awbOMDpMmhpPK&6NnrO zc3CRFZ09Ae9D}K+1hCtBbaC?zRX%4EGjCag{W~wrOmk6Ptogu}_+itb-wzA8SfG+< z1?EtnVjN>=BQtrJK{F&lEEOoczRsNxK0S9*(XrkuCD6 zwD_wJ;2k{KwW{t@r^+er8#gGXJN5*_NC8qg!z7nm4tt)Wy_p4&W>!f_Np{^Lw3R$T z$pK@6PoBR^3!48oWroy9{ApD$o@zEDrh0pKb|JC*Ug1PJn#%$_F@LDBVu}xzONfT7 z{7e0IDkSO7ojdVk602-1BcCN{0YN&~wu8)37F1?$35;=Dh@|04Rd&*^{4AQPO1MDz zk{)sB*S!M8`K~hG3ux^CiSBaeSK|JyTe@yObt7W+w>U7Y=-4V-YETEZ%0@hRFAj!w zp%IabfW&0i6$5??fW}GIN*%tn=F;Uyw84AV^YEnSTIH9VX+{U$NmIOzPgz=7AF~qp z1Z&)XvBP#^IL^mZTBp9IK>ihs?JS4UI%t~b{OfNqXJi)!c&bdj!i~EB;bcYp9?c~( zvT~rQ6#2I;ziw9+fG&6bUMTy#S|0J+9ZFQq#dgbLI7hon98bXNf<8ww@Z=35=ymou zaW*36dXx>rdNV8_-h&^S9|SQE_*a2)#E^=7;6X<_j+TR|r7kPLE>A?Y;4eij_v97M zgR9ho|2(1#T6SzXyabF4iY7QrEyhvkQqjSRHZa01WaXpSIGDgS3XLi8(*-xsrHL!vC>1z;^*%~o zRn^pnt=KpWzJ=lZ4oEJiMstX*mIy{Y{3 zdVHJ6vCBVtSLEtFuu#k2v7DXxF5JZ7@3U?czk2K~C8&p10v1o85JG`IC3t9;R^- z)ID`>ym`t3kXIK-&#wVB==&3V@je7vOLPPR;WXTHsVjb!Y5q9MxatPWWm=PqVSKOol4K1JY&5n~$PB$H~H7{{GOo9ZOG+XobVZF{yHcIyA7+(g#}3BatcI zfmG1nJAPCq3A_tdoskjkdcS!<(eD76eEX((=xVL*&j$)umc`~{><)$4?G2V^1jz4 zg{t6nH%I)lj{R`m6~9kg4cy`2FCR?`H*#1KSpZKMPj~`omM9GLNys_A-@uD8*v^~D zIOi)O9n9l$|8brKi50(ZHIpmUax=Xyl(AvXTIon9 zC=2kiqK7x5GLsIC#QPrAVvKBLGWu$k1AJAb7e++Z>H6;H#IQ^g-#B*tlU(ba11Q1Q z`oVd)7tZ4PYi34^obO?zDP)A|L*HpiMOJ65cu9lBGM<-+RjW*w8lrD3>tO5i*@X+4r&Y{Y;=w*o#$kl zH!^o!AH)p!&u;2dro&`*)TA;S$(u;HNgG>6zMF-C!{g1k^+Lmu?GOZ1f`-OzgfNfIj( zFu`FY+3jj0nx2}Zw+nt)-Iap+$wnG80CYp?KxA=%)^H0fb{O|=cW1BBDr1_M3(%(l zplR)3T~oN!7|(aclxrrJv5lH1E;Bx|jeomt?Blypk$0n_YV5XX0wA#AdkSoY-_7kHRalD$6q>9ZfD- z4Xqx$Hv>6qI{aNdt;xJ&_KzoENM#yWV>MT8HjJ9eM=6>e1nk8wsci3sVX>EytfWznJ4Rez-X{>K>wP)k_l8X8{8Qw z_FCD~SmHZz9ER=d78Lh9u6}XXb-O3;LE-BG9UmZ3+Sxz$0s?$2R2ZP($%IjyLTO`U8j@5fMUP$%KdTff8|mq z$&qa7!zv78sb{_LU~?+w>LZ(I31A`%3=V!;KtmMA<^J}$5IDrT&>D#D;(@`X6;)8r zWkEJ(KhFqDVYv*khAG8)QHpTYXEx|cCRcj3@fV8da>uaU6WYqr8+mp(|E{)DwpYlE zvU`g-Iuvc4Z=|3}cdfhb)m#zj51MZb1Wt)Rh(R);O4hjb0WT?jooD!dmA$g4s(-ER zz9&3VLbXOr(YhbtA(0I-HdFX|g}!FvNFgDig=8_t2{5nWIk~h_C$gPG@8s?SP+ASp1Xz3P0Q(xM*;w83j-9}^&ls7ckie0gK= zt8JG_i|5l!z+V^TS!z)JCFcM4tYHz8Ym2ljhG8BG-kWz+Y|e@5FZQx!j2hru?JvBt zUNSEP4(MqLwX<{q-udkSpXO2rT}uP{$6XsC7d2v*diSNG{1aN4iZ^HQ&=p6qOi1JE zd3SMsHO{y1pu7_hrgQnItEr8@yzu%5u!;x;!F?`wMT>$~ulfUf^L(zk5vXSqH$zDe zevbeNpy7oRfao>u98zjuP|7a<7Q{M8mkmpN9(>p^2tak`H8Rafd+zJreDA`Ha=)>p zaK-Wyz&x{U`bxCpBzgCZ^+mhhZdz7y>cNjFxck&oezSkxjWc_*GVffGYQ>cMrGZ_& zEs1+emmF}pkKwtu&|ky6T?;5nyCh>yCjq|l_W9jNR{+t`wt>3%wQ5?gNTqsMh|II~ z`vr_R_=Q$^ZG+r!XKSgn@zQ*-ooHb6HpRvR#;U3z!G%m zR3^-bjod8n-u-ZJ{+7`vTH)0L5UIAvL=2N^^luG6CqZNw15Hya2wWQiPk%da0Wan; zDjvL`R{um4AA+Nhp%L|{I@TV*qnUw_-sY;3|{@mX#(vZdG75MSA0nj5Bw_{hoUTds6fF!-Ed0D`GGZ81neQ zO*@q((z1wollX34@$2_DFlAU=EjCYK6a2B>$2~~6%Nb^VD|zR67@=kh-QW*^Ae&W% z%^`zV^hs!xwsw}1Zk4!>EcX+o7G5uj5ef?sYyZyzwxi_}Ic@M48v^N&P5*GZ)}I26 zNdqa5r0AgMbJDj=qIT@#WbZ$EU&MESMPV_o^#fBGGF(W5#ycH-6nd66dU*0x`#ZtV zS*Kori5Fm*#kl8gDD-xOk|`2Q0#X1F9^s(7)v?kC@!gZkna!M7k+lR|K4)=}#+m)x zTjWdMWo5O2Y#+EO@*VBZuLblXPy_g6<277j-#tIsnn>y%NT#_QdCL+4U$0i!m>G58 z!=7CyZwN?f8M2#TbI3Q=Apstp}rTwI@nN2jZQ#FJS(y#KLN?14ct*ter6rx9GC$|_lu5C`#l%5 zu0O1q2#UhcHb5oU8lH8C!FUBIW)q$j)Y0C~FMp*;aAt*UJFmIo5VdkGzr|>i+gzOz zZFz*DczfJfU*5s4W&~IRvN#A)C^K4=fo}s>8{S}Igp;L74wiHmuJ^W8lo#tHGP!{X@y$BKX^~?mBIE~gZ!b8?OIV*o35d{HcER% zZ2uV&dVDaZUB0O8hFuu>XbOuNZ0X1y{k@t}A;!aGa8!f&R3-opF_X(`P?(|t_%UZy$ym<%aY$SkdfNJVPOd(`wfcoF}V`u3Qf!EoW`uiy0H7A z2Uku>J#)xAb4v$4D{?XhKTU>XgL9c&9P$Mif1!%+2iYn?1NUx@ntE)r#&LKhslZ%` zRUA=opoNuw3_Sh(=6yVt&M$$<3i;MQ*mhc@tHNoLQ`eWnn8~P{lf=n47;!P&bhjVo z2D~s*1&Cgob{)0@Nq0Ludz+GT^ICDN2?DDXWj^3vbe^+rcs7>un-DkuZTiEs4k`x} zz4$&-N)4Y$xk?^L(q|;czJ6KPy(^SBAJXpk=nQ8ajMBAf-8wy3!3wH>#nBBgG$@S{ zVcL=0OOxm+|BrqXohQ*z3M8;NfkCbY+DA54y0yaFnGnHu%OS%RoVp%Q|5K+$2wxRl zG~cuNYKRUt~vCNUEh83C#iWDp0ZXfwZ$a(^Bjsc{f%^nLEnihGRW|f{VM9Rvo_;`*s zuWlp_Cvri%dAo~mP1yXGFhaP{?aji)!r(^|0&}Q60pEAkRy3qSh<^vAoiPgk07XPw z3;pGKP_qj|6kJHITV-pYCCey2|1C1xjac({WK|aTU=uTp++`G%yMUKpQ8!?*Cdf=< zpd`qB3)v*9X~kM3usX7*63E$FmVoU2Sm*g?G$m-n9qY#Qw^#hpi1P~}p zPHo$F7f^K2G*}|01HkpNi+}sI7H;HBjDvGv7m&M7FGUg!djZf@B{J#RfLrXPncq5P zwWx0wW#G8Q=GE5iD_jPwgd4*`9A_73v2gKu&nx+pbCKo;#O}Fdrw#W!_a4 zB}h!ckyj4Xt`0Jh)uO?4NoLk0;$OJ)Sh~N&WA3L=kUZPbI!p@5^HCJom(nS^EXP*0 z+UVnnO8B{YIYc;*nd+AC_#8bSa`k_?01pIW)x2XNeK&fv^Ptqk4%lv%jo`Bk0Q$ZO z9m9--D|sF+Rv!zO1}2;Nx6|X6KMpgbpBZ|0=N$on=h(NU2}rom0<CeWDtdp*)z6{ZC{|1|TgB!{w$6jr%Now@*eZTXO@#<75 zgy+RcQbw@KP_E_)&Q=>YQ8zxK8k|&!T+hVm?m@-Wo3oI{5;m%FEU-tW50fAt>x`5% zMjf3|=<&$U{y6XJWXr3)@C5pV)&SC*Ad7r^0;LrCFCHMg7t#s3ZZmjp-SLhc^tf7m zR#**rqI^u2gp#i|lx#)@X8H;W--VGkI#b1SYIFrw;HIiRp1lh35Dd?D)aMm2A6?e%CA^Pv8wqa*7s_BHXG{a zI=sK^@@+T_di#qA;5tXSWEqL&R?Iz6{4l9p2@5iR+Q3&uMa3P^>|PK{AA>Lku`rYf z>4!Le?XtWs5l8@iUDk^9`?B+b`=@(b*A^sL=SQvFbBF=wV_1VtFd@)?v}JeNf<|WB zjl796{;H#48QL7i=8dfHWh|!AW+=CEVXUxIB;ydwP(TYS>U^KYzY-+EUt*o;wS5p& zFXA5vh%72et*B=?CPg~cY$b*gv9IDdvkZ~Dmx}bRMrqgoE{B;k8qz^IaX0x+jD#cx z#r6tTpO<3$?na7sm3e8BI=u$rfGjTO{jUv`uycmA-Ybs}RDM7K0HkmN+T&uKlev{K zbOR^aEutNJH6$$)7w|ND!=(&3&l{cRa%F0n48Xm>s)BsBo*|h5LXR$5h&5+sp-x`x0f5a;^!bU!%NMN8|@+_BK>Cvn#TRY3pktQ$BlC8Mn{*jVrFP z3af$C=hpB8T+T!$(09sVgZNLpD;-B!%*P+kn*kv8hr!&Q)g;`F5zV`g{-GxEDVhri zc|R&^t~sAe81{)+iECh@in+Jk-)oX~-aZ=I%h^Cv{!%ry-;Hk&;zQSR)pF$n!+X%} z08!8=R4xb$_SIk6$jSVyI3=ye62*}`^5Wg6O9USFV!(a$m#s45X(ZLzj@7p^&$0Lmue?VW{){5KjjT><)xQh59ua#K1 z2Th1`sJMQ`(D?(rw%CIgObts!-QX-KpDO9|16vp?lV5UAPmI1e7xBX*?Nw@dd3k&_ z{(9f(0VTqzjl)!S-8NLs6vZBG#0B4mx=I0bWvCp1zS*XjwpiLKGd1r=h~d+DCZjl8ieREgV?KN2f zv@b@Gigba5c}{KVAce9TOFuBqi_Pwa=$*b}$bIvnv!B)@>|ibKK$;XaJGx;45KUCl zK$umRZb|DQwB3HhjJr?b#na8;-^+&1G;~G)M=omqx`^T0p#dOFt9NO?O{De4*es}M z5Sb%Fb3DD}FS7>H{YciCL7$~O@fj}Cb?E+`tyL!J2GueZh8#8bckAx&7OXbe(p~Zn zr2UXzU228;uNWu|@x!;?xxieAHUxrzO^U&~qvp3BuNJ3g-cSEzbn{HalCcp>hoMW6 zXDr9Cyr3Tly?rBP(LboOpVL{#7Z505e5PASb!XijdKBRoukp)|O9OevkLh2x>NydA=#-C&ss1Aupt!V2? zdNPVMlb}W6PWMnU^|i!m9$R2hZ~39QzLx>rK%h~eL;;;^+Tf^|g5SSJCBM0JaSEEO zZ*Fac3sQpYaD)jwq<$l*XZhs6oPwtlf#tltn0PxxEaUwu!XxFabiL_RW@}k)^1e$C}5p zlEHr)((6LVg6nnps1{}ljcw&l78LA5R=g&ZBW~|05I|} zDLTqQs-;575J4834-H}{bA#O3(=Z|hEl%jL!0Pb%<23Ntjo2t?O`Rs7_5idIzc9<; z7p$F}oSrRr&_x-*QEH{H&dYfk;t8NTRRz|tC~PnLM#lF+eCAI);jFQRJ6pBwqiGjx zp8(qDYH!R4Si%kb4mvFu`!03Gt@__X5kQ?vhw^3uy==&k&U*8e0v{H9?CoLdCqZ+^ z1BYRy9dtox^iX)2L79emLe&*hTrAM_v_kiHqMJZNixy&aSN62OlP$8hLo5PR(;S$# zZ-8S7K-|;lJ;6oJD^3Zjjf=&PoGQa(MZ4B6D%p%Lu?&_;6b||rv4BQbEu<)UKyMCF zdK`)^jfVP%lWs16p|1oYGXF$KJ0Keu>4IObh-d?W z8ntxvqN&EMz_#;i(im}vRlfe!h!_t&S)cJS((XBpU3V3o*q^W{NVz6Ji_ig_|0D>xsvcs{7C@jrY7&eC5;E%UUd6{cBX0GbkI0;` z`AA95OQgipeAF28xnei|JnddaYUN(I_y-{&P#>U|iOPB^^qzLnn4jJN0YVei-tFcF z89=vrI#1iEy1G%SD9Ng~H3VyMUOTP~uc&bGtdkhFxW!b#H5910)N%l-vqpVG(p2xC z@AC(%(EkHIfgO-m>>bfHP(7a9Lzw53!@g5!pyPc9Sc^huR~Dq>fRREQlDzV3BN)sC z!*QBF0CC7}d9PxL_XL1yUEu%F4hTUDACb%^zJop@ycjb_CT1~$H)2DmW#8haS_)^E zABJyHqp`hMzPT{^2F4hB0c0IGo{?4rtOEqBLb_iGCgIr-AHASK+zCC3l(5a3Cx9~l zo%^5I)*<}G*M8mpGZP(BnG5)fk|Y4s4=;7GI!mikbb_gWf}3EArl2aB3~6^Ukodco zcPj#3_W|+Rydd#!=<9BdAAzF!J5e3IPS-s+vzmP*In&FkKU1@lymC@ECVI=Z3swtu z2v(n#sUE?*N#W?zV~}A-=uq8HzSzH;q5bW=vNX0~-7%M%D&lOZ==MXab7Q8zp~TI9 zxmj>U-PIn?ie2_D%A1c&uj9Wej7S5CNwaB{hfW&eUNl<{u428JM-53(n^?G&>9R_8 zF2q@~h32{pEG7IV=MY6z1vTaEWcd%j?5g>F+$e8nA`##>Ak=IFJ8{;7#YO1ZyoF=J zO?wH}=NKwr;e?Sb`A)Hgt~x?7(q0EkouJBQe_dyHEF5_WUb_-G~WK`yGBs_x}at=a2l(s*9%ZE&G&5oj0O zwz7?0db-;WS+D4Hny*0VGulUCmPmNOksk=@;{q_NP9ug+O zx6$jQC$Ig&cebX8ge?u+^kD!Cv%@E3URWDU(R)k09kctCqM*#Q2hWr?2w|_b&D?!N zy&FXnw9G#WF~&-Y57RZNH9d?gdYyjbUvmPl)cUtS$8f{s`E(Di;iv@gH?1m3RdcU90c@naiNTVVAn!Lag!rZYYXsC2g4ONoo+l=N)%7cY_|1QF+rOalQMAtg3=u< z`LJRCH+4yW_d2vscaZxBwqdArM|=Y4B_C3r;ZZ+zC`B7u67~ z2E{tNm9o`uKd(HhUp1rzg4DJ5(jluNSxpwD2evbg=30;5+-dJ!m8T!>_CyOL=xPZV zOrc9K1%yKM%BQX4AZ~K^C8w@qMqVwa#dX!x!KVnLrDqM8UCeXKaZ3Bs=Cffzp;@VN zDtzAS%1gYxApZ)S%&)6|e|L5#Kzd9_fGlDBpu6dySn)$bw+Jge{P-X*))5MXvcz!# z*)gB`IpS&wVeGO5UM1&XZ%Cf50rlAH5&!T7aJP=9#IcA%Qs; zbL_)PoFt9Y_o?XwJ)A@*o{2S!=r7BL6-#Hi$-)b&4@(xF8!US;`qs z&&c=z)3g0yUZoc-yEjLO?G+(L3>@|u9Rt0lPtQ(xj_)DKC$T5)Pfi_Okly>+oo9MXu5CanAjae?iIX8we$jgDWu@F(@D_N@M3eYzB$V zjgf`8`PDd~6)sMqeucVYM8a-T$v+&rdcWCI4k={d)(^Mg5)VC$x4DyUEkZwIUoXMs z>1mOsjTje*OAKx>#o06m0wEVMfFTR+QUzy=(D~IcSLW~m&d2%PTUqIKW-{q69A*w^ zpX$a5s%@&CA6L2d_cY2e%a?k+ia{UJy_5_IhY&Om0S?b% z-+V|Hh8i?$B_$}0DwTXsfKM^w;lrZpw?;XgwEk{_-3~hW>%u0?+pb*&lX-^C7_fp> zRaGI`*ZlM3*ji%<(B;YyS|4Q`1_pW0#s7sg-zlI+5BmM>D0?_??n`=3j$+zQ7b`aL z?lkf2?|9Ek_*+D+BcJiT!fD0VFmn_#Noq=-dhiV#mqnx*KhG=60ME}vs-yDeHB<{D zdQJ{Pno;5iXNERnu>(5wxCm6=uu`eiKxn=j0%;@+CC4DQa|c~N0D|wwCngHnme1@L z+fFy&T=}fBxOavNQ$ZUTYsuk{-7v`29&)t0#9Jd`Z`~EJ?-ECmG~)ML+Byz7HacyU zZ87gDW0-^P;>xV)TiwNuRUc==?r}F@Y`PQS8#*P2I68+HFjke=3axa$@=n>iqep`5 zb`tZ-2oT4Cq|=ri=6QBH|X8QJlPuc#j69;B#4WgA7MdA$^6X|6=|b4N+HV$Sb`ll@-kn#tQi*>-Fb>;K(2{LI zKT?Hyvr^mT3*@n0wrE^BgiCZ5@>_Fn;Ta6OMQr~{US$k>ag>S$JxqjkA+z?L0_3ti zUccNi^9)xrGUSymNOyP>!Ekx3$GO76#7GvXfWmq!gZk%#ZyV7XM>tF4rd2m;$Dj{T z{GWJ?6^XhKa~tbP!xz)c#Koe51`FBO{uI8xu*3y)ukeo<=YM|~ z#hHD3VLG7FIL7I&BL=@y{Kt`X>Q@k_u6+7`emQZ2889A1o{lQm_zL2z2G!txyzXh@ zUAF2LS(|!IV|!5P0%!%0p2T!$xFSg)b)kRO{$lBE$ysop>HN2)WR$rv z?@iAzSpnz@qJOM#=z07fen6TZmz}!kkE0%P=yL9TE^li0__Ry~i#QXKm!OEQ=4+|* z(^Y@DKWYF;$e`c+|9oaDW~K6={K2!_Q9MQOEc&W+p3f!@Jf<5kQtF$vhXf=v-T(ce znjaIFl4oBJzn2(k{-0aX6-Y$+LQ=7Der@Mh?{T0_Bo?cTRNS5yv{FX99W*djvU}Q6 zz5brX=rZLyK|k2NPVnogd({zMibGW_UgB3g#nH ztHTOcnW0Adf+Qng_O9(m^vmb}`#{%TKYFtN{h@_DG4w!O#i5#jLnl3OJLn-0bUIs} zM}HZf#}Z}!`wIX2`#@~Gw-xp|X6Cdq$<-2#fRdm@{DrD^4*fBy`tS@~P;* z(E0;i#CaYm^^bGbcMBbh+(ojxk(%JyvlzKc})p+oQT;@f~RJ|?@1H%cV@Se9Y~1! ze=ii0guMcVV~7Qpm~cpkb?(q690?#KOu|3U%dz4S^gll3Ny7&y^nlA=c&WK#oB4JR z40DAw^Q1jL^;~!<5;6bp?-Y4hhL`@xPqpN^$%ftj!I76_Zs8n%Mk{_aS|j>eU*vgv zBSPJ5jWH}Z()cz5wnWR5(kV@+lt=b4SB?B8&Ngkssfco8R$Rto&EN9aK1AG)w#Cqp z&;@uHiS?f>aV>N6Td;lW;8Co;T#mK}-$(RSSnmUH`!W* zG2M80-e(?43QF7Y#K_Dk9hRvk`;D7Xele~CuHaa)366~bu#U|9+?PIKmY_+<&kh}t zV}72KQf1S%G{=#a8VmTH7kpe@J8yO^Uz#;WN)3epSS;>ZzfLfhb9}xE4V7m9oZsGX z$OlJ?7RQms&)VCIWizLAoT$au+pauBH(Rn7>bzqyRbzcG#VNvX*Bh?Gbd8@tf)Ep> z+PqwGSS)GN0SRm%c-iTl(}$AJeQ>+pA5mJi-6#3f1w8Ia@M}J6@_J0+2pcwKYBhFx z$(LSd@fg0|tk$$>)E|U^Fv!HA2;GhvO#QKj_UhH}(zccqpW&aMH^?kCYrNadjU}$S zv)#+&Q@z_%a&a+p;@xBQ;P#{`GIXP;y6i?)GJt_Atds(MoJ2p#XwUYa)w@YKdd|llhjE5&93^J}VxbkC3 zHo=<9-{NDgryUqOPnr;F5MA|xs5KAdtEouIhJEwRCL8nQ8yt6v)5;=KTq*;+XD8O$ zYzTI$5QXj16SDk)QhZ(bSip|df1IA_sOM)-YJSe9X^bdgEq)T1nQCoxx1r<)i_&XT zs)wVyZUDG_wg-h<6Ogb!bX}!51^$gL-k+b_Qb2TT##pOs`H(=pd1_0zaf4#WQ}PYR zdMmc~A$zNvf;*DiHggiyZ=+G+ARxIo8vs}9N(J(YXhT52nCee0v3%vO0gZ6tz^~Mt zf}FC;84KZitz`Ky_pSovU(qiKrLD=Vm*Hn$uFHer0*HF9Fn})RFsO*zfeO(3YsxQs z>@7}v-GwHD?;hdNQQE=gUyAhg;qbt?v7&P}qu%)L(h8FgDebaYWK{j9y1@vozxQ0V zVEq^Tgtj;ps9cT}uUxdRnb*$6h%agKrNrRA(_>a;u_BQyEYT_N{I{ry{^)BBtR%^@ zOVlvyO99dS^vj|>*G@6^%pUYUb;;)kvjVb5U=%RlLc*A+hn8E^In=>{F3Gu`&evLh z_cj=9I{G$iYt+v8C(koEkmPQ!EY?!R(J)kS^Urym4l>vC!wsy1WPlFAN$L5INjHKBfN)aQUTXX6vW4aBn`acNB#~H_TyzGjW zbc~j7SbBZVYnn;>JV%9B*ADo}_J$I8{u8KWeeoM(Yw(g)-EnE34M~FZ3sH;F(K@a}-tRGcSWNzR|S+wf}Pc8;&{$t!I;Dl;OY)q8%B z*U9otz*z^6p-H~~mf-(#0bcr!C>yg@j}S9|HZ5gh7R~SSy;K70D$m_m1cnmAYtp+Yrz&tD8<%+hM+l|>r{9!CQ(baC$C*?b zF|{Lt5ICa#OXEz-k+Fh`=yFhP0JK+cR|4m7y%&@c<<#-4p+mC|-6KT(p6~_i@f~o9 zraNXlzzppf57yIhpKe3u;9I6Lw#PoB&t_cH(je`-zm2yO00+eHWN-VDK>tfEU#o7a z{aY%a0CGq`;hitKhQaj)!4Oaf#3;zWn3Z#^a!KrZqTpm&w78m2T9d1?KseKzc=ViC zg4dOQEhagm!gpcmLSrK3t_=aA8UtM3ZmXhNmLV5PkKL1aDX56tGe5^V?`nrkEzXdiZ$ zbRGC%&c&m1qQvz%OZYy<3X<&R7QYF}mHSTEyrs(XjHsw1%}v>TFE?O48XXuHueQmR zoU)tHARk3N>Wh7lsm$Jl*0Em=ryyeQ=6lZ@hkePYIyRDhhgj1W-Ia1k+ug-g8iysO zoPd33c%kl*@=ad>Qnm-C@7AxTJTt69x}|;RQ^_8Z53n1kQ$9rD2{m{Ghjr*P$B_5{ z#<4#3j&t(-Fgp0=ZhgtNm*zyRr~b^X)=Zy0oBs2$M*OeWJ(-E&D7q+_eLT>i+Wg~V z%e2_??xjyxL>l8YEXgaMmCp7_K@cuO50=E4}&YQe9@wu?sz89(TEYxX%{y z{V>8u7u!6Q{4JvY9Vn)Ifb!+wwLE>1CTN_qtT9$!P*GPgTwY>+>4I}#v_fCg&%d4d zahrQqy-w2mhei%XpeA77r4I_7Q*0P%_y*M6sE!9M;LZF?*UTR8?)6Ozex4`a6OhSv z;NJwFw`n-LFTeCMhCfETMy!-FH3S3|PkuI=5HQwc)W_PU__@)7U-oU7M1CVBR9~{1)X~4KmL>wrfw>|RzP!iRW&$<%IXR}AU zz^6}t9^dE4S&g55LJ8k@kgBw^pM^`jZMQDZLSxU3PLpW)GA3^`YiId@ZG~4^MqfzH zD+OEbo~!4-*&Hny+P8Qh{)vLEs?DQ_eg;Q>*{|&yIol?f13=QD0?wL>I?}*u4)^ba z0N?=a1Vjgb2_AI?lRhoDu&SgGC#u}PoXgyD|Gpx;z2tbwO(1Du%k4PP$qW63@=d%y zz#G5(;SO`CEa)o<#wMI6qK8JXKSFZYSK+Bs{{1H#zZo~z6+Y^Ves@Isjwe0udK%jb zWCG;T=a!~FfX3q#ImM2VE`p_dCt}7X0F7Rfn@PJSoSysl>f39(p6=IYZhPsrEN$z(O0b#v$yTU(YLVNsFGq2Gho_d7W&s z@}I2UvaU;#JtLqw^MZ*>h(2}BM+dM73n5`)fACothf&Dwa=8^2kzJ!!ZH6q3aTWg) zeltybl}Gq8e8c~_LP>~xVV|(CoBnu?h+Wx@BW0d39Q#|AA%|~S9v(~?p-4Uyz?8*W zxRth=o$DH1(KfZ|is&~g$t8kn5RnQ&tb7`H268!A`g&@I98XGdrtt z2g^;lI-PB_H$TpF$CU@R|4)1G8P!x5wTtdRkS4_jC;~x2R6u-1Kxv66U5cO}9Yq91 zKzb7r6~syvl^PTTX+gTwAc~@NL691xh7wvrP1$$l{l5F1GRC>*jB&^PcliMU_Fj9H zx#pbfdFGs(V0{3*7$=Ht0N8LnfR17-?+jR!_H#g)^>l!v7lL9ZmLyPj0F+3|PiW|4 zaSC-whUSr;MEP<&TGcN0FQZpLOcnd^uT6P2kmOHh@I`Xo_a~vo!)c zmE?z$-)qM&0bu{;aIzxNZ=7>OA(@4?#s_D&@w40Br#W}3!kjp`_stVOpH~%Oy*dH|K+m5Y5yMV2 zeDjZsf7?Ib$p9o|Q-#K?LBI~|19ivyfp^J{^_~ZTTfHFI{!(TCA}Ku1^k4u;w8eI1 z9?^o)*9K-kNA~(+Z#KV8cSwHYM#G0fY`CCPqw0f|&3@eV}wNi&upc_AQ~UUrqQpSSvMbzGG)+vI$zC#tYcUc=)Wb z(=QOdLjZ}qr3)ZjGRYYb41m44)q+5RV^WwC2t=tbTCi(-TXCpmr z^7tSP%SHUh(pIKrI8^6M`q{fLhfoh(_uVs*?qOHC|5Zj;46m^0SD-xl>~RRo1r7KX zMINj+x=OH@m+tpq6R_Z<*uzFAQRGt&ENvcn+D?E!CQl_u(O&ymQrd0 z7IM5710JdO2d?Ds_1#Ef$t_&)8uK2S^~JV|KXRr?Va~D>5hp_@;#p^HUrmOtL4eYx z_9xgYZJId@CD2A4rOkQxY^ENfbAPN?Y~%Hxsj3&9&VtT=Y!4~ zIj9Hzo`5%BbccZhcDdZcAhG;C`X(0P(dxxt(RWKcED%J`b?9Tyd-!iFi|fHXJs9y4 z_}`bKocH1E)#wGU^sJ7NAK(SwhDt5{V9Mn&yp4gf9~QpPolnRy zjjh`*Vx9}j<=yQ)5~mI`^*-Vokb3YQP%SVoDH1&XR1(B0#e&fs zRoM;vB^yI1N)1WN<#^*$U)cKr+vKq=XSeEsxN(s)F3718c#+|~#q*}yB;rV}N~-pW zP6RNu33$48*aoyXy-FCe?8RZ#RelN)CNq7b{?4_P1Z>ZACR(i<;B8sVL< z;G{@b<4XDc;fNb@b;WYOVvQ3Hf|8R3z=6+A52NIhm=n9|w|;oIs+$52-`+tZu;*Is z!919(e0=1i(zPL@O+#o%YRim^&eDW?`z=35G#LpTmr*EgCA$7F4WgT+$7UPBFSK<> zJ&nIjK*D>#YN=lnK=@g6eS97P<^8=!JmwraNs7N+dK^(_QlmGUk^1tW@vHR98>U+R zO)ZwR4Kv4{3HaXS`Km(so?XCTUzc5oWc$$H1XxdR?@6zl#Rc|#AbO^{!g@kb);y6U zhbmie0@2SeS)A?yz!`ga*tg+*QY!Lp{Sd+9{p%g&3i^cp58q=~9PCOZtO=qFxjTk2 zNi|Bw1o(}Dw-M&lTC2Z>6uDOAc~_i7V0YP)cG12itz61Qe&Ea>S{U|Flc;IkHFt%i zU+Frv4)L{7%>Jm9)_-SswDL0)<)vFIU2Q6}FYj(#3l*%6SYF~{rcvM4``CtY3qL_Z zV=Md=i+voYwh;y~7EI_)$P{zBh3J!BUVpK{^ztbanqrDv&n4qeT`18wlT6(9{-LBFjZ zNdi|bXf=oFs>k#k>TvAq{B%Pr=VC4#xw~{KiCL?+tYr6Uo{KpeFuhmi-_jI$K;d1H z?-goH5^b%`Gvs__u`67i7jPnbGlDaDF8Y#d|XYLS}~ zN>RI8sJC=R&pTpOjk%U(O&hJLno8i}fKXOibD_5{;JXj}_BLDlFu(umD`3;({sh+{-{EYq$8L2>Y;=E!2%D!CiPOHxVSAj=p*B+9 z43KLEPP2p0VpP)0jf+Q4mv&|x_~rLT^kwRO;yHuQR^xRJF=n|YK%>z$oQ4*$YG$5GybvUd;;XEBaMCZ#7#Vuta`FNwrZMbl5U%hxba>26kt({6@eGs@X+|MH zDz6YGPZn}0JB|ud$K>}r=@1Sk>)v~1@frJzpPXoV%3+_gP34{M>w3(3M~Fa?g%V~j z;N}Ns^FXNZ&-j8z9pSyTeh`rb0a>(JjDeWoKjK47cP&Bc*XhO?RIeUqtGl(Jz3~0%fgD)%T-Xt?&e9FF^W2tpN;JIjLGSQl|&hPEX~e6+nCX z!CyQ*hu?Yr@HDD1JOHrQK}q8|;I&sgu?;Zj%~!ot5c9+|znD^(0fz9t(qrycL>wh) zhYJy*C&ov5Vt^s%CD&cY8 zPo;{znW<}-oZT23LtO9f`-HU19+>K%FE?|KBP>WB)d>?O2m_TJw45EE42x}?Z{Po% zojAum_A_ZhW=iHxHR14g6GeTpEkRAUF=@WWx2U&b(&*KD(?B`O)gC8}KuYmg*!O@C zK-mwTke73>ES21V@yQ|N?=m8( z=JUPibT=N@xWE2zBj7!op5Aopv3)0xXq$yf?SE9b+L+FH5GdhYxhXuMw{X1)P|V>0 z#|>=%%86G8TdjTtOr9~c;nnC7YAkgP`%I*$=Vjwk^EnJ;p|s0STa2M>$;7G$Z>x$& zwQGI-c8CXiBcS6pf5bwp^6sfGcea(N=`(t&${s{0nZHg_ejs&VQrr-MjU)-iYy;Ow zyu7aBL7j(j-c!s{)_{ihN8gy}P8T*g2J!4tkwAS?$4!CU-bHL>w`gO6RwXv zhv66nwPQo_^eV8=TUA4$Pe!4ZAO|9Tf{PI|&&?vl^R(FKuAfW(ikl)OZUnP>c0L7m zw@B9M%Dwf2Ta3f-Y62oJ9xE?Tt}2~oX0sGk2ra)v-ISi*64*u>>NzlLV*iDwqGWsif9u zmb6CCVh&g$o2-Oekc@AVyBM4woB`9Q$#(>ioz?(_6d+!vEP30+SdV+ZZ)NoGLe+UY za6d02-~50KfsehWN3YL^k`WE54HD!X!Xbq;Kn|C`8a~UiaZ+JXI#{PW>$1$mUrnje{{aLK!?~Fzgsp`W`EE0x}BLHrWy9dPiG;ZuAWL#QW zfUvjmoy?i$sUaw+Y3v%S8L))XB6n@pdi5QLysVTUmtK${b#q-6q?FG80~ndBy=ic7 zz`Bc-0Z2Y$i(7;&<|YmO@gDxts8rfKDeV%R=7PXk0VevW&ZrTN#_UyQ9z#T^;9RSH z?bRHF#^eOrF5q0YTw#LRDxQ}n!Ic8O>eke5q#6b^Q(A|_8dM`CS3R}T>whLAt7@am{U{2JU17LG~+c0 zkX?Vxf3f}dMlRQ<(z4x%%2Xqct6urH8w>e9Cbf_lopy-ERHQJOE0d<3@&V8qmrK(! z&w^ryS&P$;>(EX3Z4r6%Qv9)zDoeAD1GBGRIw;0vsCU&}g1aU_$^j5%_jlt32w!Wy zBU)N42z ziQYT5Z=yhLn1>NlZ8K^Fek5z4IJqn_B$f-ZWyc-qIa}pfP~njUZkenDfQ=vdks^}m z&-eKi#q)=0z-HBRh!ikoYlRx?JWV$?;aqn5c97Y*U_9;dvsxnR7AVKz+d|sx42#)i zkn1h}ImmqsHpzj%fuxDzS1q3BBD#u@1Vg0y-( zD{GZ22Wc>S8&^orlRH+9#%$LrhPW_TiLU#9KsJtD-XU6$g0;mVxnpsIvT7RS&d|eC zv)qjuf>4*yYU~?vL!3X9QNJ6rZDW(Q$x?nXBSzg+eu9vfUw*w(PasBNN}E)Ij@;dO zFNK4l@!K>-L}Tv^@z=9?;aG#9Dl|c!(~xCj+S2w zua-MH`4UiaCRabD)Ax)1l4|_P3=O=6ZE?pgs!eN3L4&726ZOhA|cP+dv;H2?C5zimlA6<4ce>Hx02aw(6Zd6;L12O_(wg^76fFxZHB?t4CfbBFJ6B`?#LFADYJf_~0Y8 zFR@!;&qT21fLvnY%0<((vwO@;k0iIbU+gu!K0N+F52?a;0l{0Ef4Tru=6}AJrW4dd zYq$a`s{MAD7TQ*=8V&8Q{awEnp*=H91({q`1*8p&Dk0($H7r9EGQ#}ZN!c+~9J9>< z0#q4U_}}rFbErexmlb<;9KZn!I_Z4-ttu%O!||X0`*-9=5#VwNdWmCy|F4!%>|b!Z zh1owaygck5nMl1EI?}*OXl+XyFguV4&;N^N9$ObgnHP6%*no!iS{Af#?2o$ub@j`z zALRe&82g7g$N#>6cf}jEr;p&+H$4R$CP?T+NI>BQk|5Rqf*$Hi^c4HEKmFGTfMfB$ zYPiu8qQ6Xqz%w5jNc0f@^FA^}_9#^bH>sb8x;lGd@X7!2|Gs-;C!p{)6ZXT%d;i-) zSSga(bG^gNv%w69RA>J?6Z!wpB@Futh`p-eKTW`@;?7MT!7+^ip2%J=L0m%)`y;NS z>)#cWMX~>m+kKKN(@fy^d;q)GxO2*viwkaSzZAr2Un%HU%mC8AGwt?=D>L+ikHPyk zEi1O$+V0^2Z-lu7-o&lglY0?Cw(MEEtxMVoUkl>4;UYn4A3}0aG0;h3Ld5KR*pWbqh1q1# zqJJY{C08iwrLEk=SqB-2T=dClF|=oWbKXwy&dKz9f;2(!=mgas`pN!Up=$BFoKk%Da3KOboO`@4afeDvUNV?{eY5EgGd#@%{^&j5o7`y{ryA2w1`d zU9@%+JgwCpCXT7%U)Y7fc(>V(Db3KoOwzt~ET#d$#LSp6e$?F4v)Y`f=^5t2&fm%X5m&dv*I!MDGcjJQYpWrWvUgu3u^(vcs1V0E_iH8uin zt>|2v_DuoYR#N2-On7r8czK$~+E0)y4+HcG<5bY^(G$B+hsD0Jn~))d>3JVh&?u19 z5&OB4K~@Sc=gN`P;nA1ZFGx)KQDiKV?(aBbx(i4z^~lYbJ4Kg|SGbt<+|Kw$)x3sl z%zSte@doWfZ1J0JdTtWyx!67n`cUq5{q~)nl99r*tf$){hahrB;aB-k&GkMp?wEx= z-~uSzo75eidVX6GPN;cH?K3Smgu28HH)<}{a^KX76wXku3$SeSU|%?uciv2Ohth;P zRQfbj7b|p?GgIS$2jXiHudoBp;l<4rr5|53B!?N5R3*xI9@x?4-pze<)hL=EPB=u- zGZcr(hV$Q)v4$TGEe<#oT@ebJ9R}?WTIF34M3?$CH^kM=VQssmQbx~< z@SRaqAH8eE(uBZe$N#`ci+c@rR&-^Vd)~S^HZ^7h`A+^Uu|Rtb!pfbUZt`M zV{lp%wbmQtgFpiLhO|nkB`&qMDopyc9gaZc`fM2mAIG+D;o_2PtHAm~Enb{9C*K!z92U52<0CTIMqbGb8r z!$4{Ke2<5ZT_^_Xa~V&>>-#{5q3w=_!(mwz*v6qlz^5VslL<(<5lh-S z)<@n|5_?DMW5^XXQy~AD5_Upf5ej>qXq^;j=DrG~p6yuNAN}ajJ1QfVcyOA4=wjGX zBNh%Or}oy4ku9L;4UMO6jXm(>$1XzR=^utCm%S@uv}a0)w9erdk#%dOY1pv<6EQ{Kngw_h;Rqk}a6P!fSIZSna2 zmLjiHqJt)!*v&zE3}tGpmRHJz@7hf~DIcUs!_1h0xW-HsA<8HCvw7X789%2^Ouu`) z3fOTWEUXJ!5ovJGzG^)`U}-Cvbf(-rxciuvdJyQqRppB0^XRKs%A>gAdbIq`$BR8& z>X7=;n?6tLJWo{H-aMXUp{go8YOPJ?=5a!w9(cMI6KuHXC>7h+RlMX zf6tj2l%fy&z1URKioquLEjWhsC(GfPuQD>uf@%3Wmn&r>`BZUT)S5p^_&O(|2E&c< zZhr4*cnx#i7|=m4=7mvWAP?xq_xk$$!GJ)*WI%6rvp_G?pY%52W(?J%iuzBfjn8^M7&-s_)U{ z$_zPni%i)E6RfSr|i^- zW&F7!Uwrja(Uor+*mZEjY<|Vh%^)dy-{H5xC3sa?^%`$P;|XDi<~S&dGLyr2-no6} z=Ef!gPg{5nq%CIPY~@5o&N{3~g?n~jW~C9BpsB5>4u#G0ZKCrHML{EjFZKXd-N3K& zm4+AZY!ud3A0zS>BWeR?^MD^LPS>4gc5YpFD4P?Hb=bCC8mOF%OmysReFpmSbH1hR zYoCX;Q-$h{*v*-c(?_?%E`UkBq39J~#qZo#BDY>lEUL`~p=ry70%85CdN5nLaNHN3 z7GdRZ(&C^@eqRNv_{yVtwxW%NO1-}e2%m~XZYxU=LF>53wjbK>EtO!md|K3I&_$b_ zX@bs(#zo=(P%#<8C<1?`h|UMk!P>uFqbnmDL9=!25f5oKP)Fs~2^wP8Zzl?q_L=)j zK)Tr1yilmT_q;KUKS^xIaMfBzYAqH}oR|UTEuJW^U}2@M~+?5h+yRF7Y9#zirUwJ9I#jQgIA@ z*qA*e0XZc2N#Mv-P3guoQ=EQK;U|Kh8!%QUhk*9{bRt{9T=HiBiCfJP!_)z#6quyK zfg3gO*ytQW2&-|i2jtK&&fl7wZy8pL1-=1h;G%WTy2DD>>qWlVEY>Y)jK$GR{><-4 zs6I(`>Ae9RE>s$xq)oOx(kj4qJ!9*ecBDd=3ulE0VYEOfl*KlC)(1jMYIj7S*-OXtm zKv8V`nkG)#2%-K7sP%1jB^CV6Pt>Xf`px-ses8`$;ofp z4}v(4{@O;*RJ@?~N!`0n3iV(sPS2r_ZtVi8LfSrOCR6EnU~nIQ_+OEP2m5swacCO*LZ6>eJYmty43qeEwNNh<26K((rV zFpQm_j6AoO`xoJ1fw#&9z1ed!bS28N7v!C(0c9Dr}tJtV}(`Cnkk~lwz4A_#Ypq? zLeq}n%D>#N;Z-yEn^WLlU$6_g$m=iE9JFoH(|F5f=rcAeXvLidt~6qhKk&B7!<>(_ zzcrL+xrk1Gy7^m8azvwK=C7nZu-_-g0%Mo%je&i0Pe!JHzt3CD;4oZR6DvE01V;xsOcN{5yRX~?Ha~zAU2{s{9YB~+^@Sy@&o<;`}6z!|9UO!Me2=1|CPOp*RpMQUF>YraHW4nLDsa4W{&uUGcfV4!a z#W7l%Wlh)#Drr~d3YUb}peiwtv9_eeO21MZvNF#O>hU8D|Ks8tm8B~A7X(Cj zl-ES&1E=jJhnmx14`LY0PwX0MC}Xcm;u$?lgx?vXFjlyZmKyT!DtB`F*t*hnm z_XO)Uyc~en-9#0sGz<>T+83M@&}BI%g=|4X9DqqHfiqS7I%HXL$*LLm2;`%Tr`lCyDx` z^K!v&qZT#ytCM|z;pC1Sf;!4t6cH|@-8V@`K3<|lFE1z}JWPf@*&$TD#Lpbms=T&T z!z6{%?C=qACu`AZr+~m#ID1R7w@GpM!VrGsQ_z?DaSpWH5eJ3Yb!_$1@GO|hmX{}i z2pP)v0O)JDjdCu>a5-x`Ku9}asj4RQ3UE5=Hh=Wh7Ju@gRCt_c#r!Sbf(@gvzqG?| z81VE+9ddxq|182qo6E~`A}r~nEP6bY3Gb`k=WNSk z{^{_T{04UVdqJSKze$i1P`Ttt{fyADIc&t3U+ek#ET$n928Kwu%uLD;06Iz3N}OTU zj)PA^vPUHEb|@lJrLgOjv5Z{)&dubYpb2$=gsc~hRA5B@552DefSj9|2Y(MYeXRHNJDP|*= zoBd|T3HuWe6n7mQNYRX;A-I3vKc4V!VbZje)~gLGoGmOWCILMxZn=zePc^&Vik+;m zfsg(>6e-r0niOfRC7{0g0ytzu3inYW7~hBu%+7|<-gPj~i@F-n_-)=InE$aL4iTTl zpIL%Fcr%DIJAflwap#-$Gb}eWEe8!JS>u^0@SlMKfHWSOi`85kQ^7aPdwcQtElppU z+$FkKW@NSaERyFl8E)JI?TmY1iFk*=438jg?xRZ67oqNr7m>nx5%3H=lsdYcP{mpV z?xewYr2_!sBv=(&zw&NaTP;Q}H*1_{kRz;GvE|F&cP9AYY%i!8=0HJWsQn0xOKPPg zMot5f0uQ%@Id07tZ%^SPNZk6-`et)vT}}w|r2Vp6j6J-01z&ruJxEH(&yHEEvWoBB zR)WOta^Mh_Cy`&J{d0PmM1*TR5Ax$dbt}qy-ppL zJV_8od6?j`G0uH>r^?`gad_n$al6P5PyeOnzghz##CKLo+*@tHewxU7EtR5vaz8Lc zg~05cg>{EmS@JMHv?C3e<%*Az7<(S!DoM;}0Af66XWRCE>@pS0=k5e}>#Lj>>Q+K+d=T_e+iCD3m83 z#$L2BO?b>?hR9@W5Vtq9KLz`*+>)pRxa?K)7^@gbMt>4%Gj|BT`T3Es)8@>6W^99; z_YhGRHqrquUClv`Y!hAsekkQ3?l0A}cC1{efn^4h%M&v;EdQew;dP0DvUMtOQ;h8d zz0}1L_~Akbl{bZ^1Y)1U3A-Q#h)aZP;Ra8f8YIRm{ha;9`r8>!ro65r2P~<`0zXja zL$ocWBwZe+_yu7Z+sShmU8ISHz*(Nr1!fx(zP^sva%!FcBB}rZ1Hm&ZjTxpOvJjZQ zaa;%o&L$n4vg51L;0`KyH7Ie5+t}=C=uJ0*ByhDlyOV#^lfoHxPSu{w7xP~hbhK>0 z%2jO0wQm%EWz=O~f`^;2JRGy$AX(wM0H~?KjCzVw@k&u7tDW;ZIFYD`qD+ za9sHh!P!(4V<8sT$0bbRd9zk#c6R0E9=O#5p43vpvI<83nz9c-rMC4}Hf3SIL7?}N zrP_0|7iLkLhqSy`@K&4pqT7~?L@+{Jz+DrZRSq)SgiGwj*4gjabzL{7dwt&av?1d9 z153wXLpN;zx|7o#T+E8M*AF|<*MH_p4elG)pDud}Ya%fAYUh64hM!_}z*=%Cey1SB zhw7v;1tSocG}=ttwnoHklT+A~26j$s$*ywq>`XcH8t@`so3uS&stf<}!rEyAATM8r z-)VYwU`OAf2~%j>&8jPmXcTm{1qt!n3+doKokVpWfJ&Zm=v6&?WOk65j;DW7BTh#Z zV>{o)>&jIz?}HYjO{{ajOAQBhu32ktzMleUmyy8V&TZzpV)?#Woxey zWe|4v#xCxA1tWLg#w|Za&meOjJb4H@`b70SP7}Oib2n1PgzGVDcp|pvb(+sFx)N)o zs%~!K8L0wba0#kt5y0*g+7_4=k;=AXJdAT2zdB23Cf-j+Sc$ywwX79(w@jy$>H#0Y!cun>!Z?EYTPpaAuF|JTl9Hr@FL*sF;7`7$5=>H_J;>}U=NUJI7_Y8J8h?kfeXF~dTljO8s1c*b z5Jf<>Wx*j2aoN-Zwx#4r-KEg2TI}`}pi@?CT026fcn{0*fb|#2OrGog6H_8lAT?4l z{?@MFi5Tj8)AvZ5Vqu~lgIc(buiET9KrxeNWJzNl4*=K*JZp0o5;}cMjN^1=QK5jj z3=gmq<2jr%%zDG1Q(}D5I~{yG<{g)pI+#(<9Q}V9pSU;rYsTp$C;)3QHo*xfzuxop zs)4kwbxL$4A>9A_!-9zN+36P*wu*UgI&N>p%J=s0(FRy$BNHT-}yNP|1@?C z{`SMIVXRlSGyHSuo(#Xf<*sG-J~w^{Qwi+M{#5NcYS$zy7l2U_q4fKTL;VXj)h+<3 z6nwPVbY?L=sF%1EV*fWo1iH~qDL%qTx6vhD!m1lVn0!?o+%&V?3ujf!F~|#zKZSK9 z5dZXx>hPTZaxIuV+@o}6?R{tX>@BwwVV|j{cD~AWtA{|f0R8Jl6Axl$*YpwF0i@VIanY#)W?d5SFseJg4|hUlK5_#v) ztD3Xa$MoUx41L#nLFgo@lsq>(Q)KBZwK*x9G;Jj(hjw2`6g| zyZ|&PxrgI4t7JdlKd_iez1;T9?Y{%pt0gmzm8Mp`!0x4rP<2P`WS|yhiA;AWP6R0< z!3l|7@PV;^+AqO%o^a6)NSBZG?l8+Hi{;a~58nHZ6W3(>W_Q=0nnKor~#v z`LGUwnFtNG)1~t3^#*6+sy5A11mpJZyihE=s6J8I%`A5T@ekRe&DhaO z7%rD@V^OC+n`5pr^fy1W7?eL;0f#dX+tTaBA%PC`3puG)duU*;WQ?sF}s&!-kqd z80*QMh!lL#A)Xd-o^lJCC@_)YaeW;bUbpZT7_K&A{SILiJ*UYtX5~4cPy+usaBj9@$Vn_+D3J=%qzso5R2D-H zdU1acnT%fpd^my6;^pA$a1ZA-g4 zxFwU$7GU;HLHg+GWk9GJ&nkHor9xBs{NUDPJ>l$LR+}gSq7s@>nIS|2Ys{~Rj0X)Z zoyHo)2^axw4&!IRAgT* z$9T*>0pzbroA2WtTC-Q<0pT)jY;~#Ilt(y7!5bClmKvZ?BeijF{n=B6?UxYlzWGOa zRA?dDA3X1=2tDNd)1%GW&`GjwvS1gZ&hjm0wEt<^(7~q>JMM#vf8Dgk&_XmMI4O&{ z60Ot&00cLdKV>_+qos^A$I7yt0t|*BI~L$^M5`{AhY!2s8Mv!gM_4$hF#Rsd6Fpy% z?GgfTdodXb5-7;@!A`2??4L5Fu4rqttvul{)l|#DsYCFqfAsN&=}D>hPRp-Vs~L602uR^V`U0Q(jF!#JYMc1piwYUosxHT z;#_s+Kw*lG96j=s(WZkXKERjmfiM^N?>82rM@#lxB6C6y3leqpTG7Uzh01sVQLcLa z{#i8PA(|g@jteLhyR>i~B*d4${Q@K!I(u~etqKQ3-u)LGpgi_&c1eI=&Np#F&RxgG z-@^YHH}?p{&4G(?i~q*C{GSA)VZh}8(Lu4l|Ibl)?56&Yg5v<~1bX#<2k-s=xBY)I bllNhv(Bsu9A){CRU0g$5(+dP0=Li26P4=oU diff --git a/assets/icon.svg b/assets/icon.svg index 8fb804a..e6c5d80 100644 --- a/assets/icon.svg +++ b/assets/icon.svg @@ -28,14 +28,14 @@ inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" inkscape:zoom="1.7599721" - inkscape:cx="176.99144" - inkscape:cy="201.42364" + inkscape:cx="163.35486" + inkscape:cy="157.10476" inkscape:window-width="1920" inkscape:window-height="1172" inkscape:window-x="0" inkscape:window-y="43" inkscape:window-maximized="1" - inkscape:current-layer="layer1" + inkscape:current-layer="layer4" showguides="false" /> @@ -107,15 +107,6 @@ stroke_width_bottom="1" front_thickness="1" back_thickness="0.25" /> - - - + transform="matrix(1.1745591,0,0,1.1745591,-8.3446292,-9.09765)"> !KC3-K>B3h#NnG`$`K@g&M5@ke>Izsg5 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�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 z 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

lQVF<6a&StK%MJn#f?HmGW{xw1HI6v9aZ*N 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 bllNhv(Bsu9A){CRU0g$5(+dP0=Li26P4=oU literal 0 HcmV?d00001 diff --git a/assets/icon_macos.svg b/assets/icon_macos.svg new file mode 100644 index 0000000..8fb804a --- /dev/null +++ b/assets/icon_macos.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pyinstaller.spec b/pyinstaller.spec index 49bffa2..205383e 100644 --- a/pyinstaller.spec +++ b/pyinstaller.spec @@ -50,7 +50,7 @@ coll = COLLECT( app = BUNDLE( coll, name='E-mail Draft Generator.app', - icon='assets/icon.png', + icon='assets/icon_macos.png', bundle_identifier=None, version=importlib.metadata.version('email-draft-generator'), ) From b6320f393b648d53d7665d39ade57e1290b329ed Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:03:19 -0400 Subject: [PATCH 097/110] Add pyinstaller builds to GitHub releases --- .github/workflows/python-build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 72c5a1c..7b442cf 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -70,7 +70,7 @@ jobs: # Creates a release if the commit has a tag associated with it release: - needs: build + needs: [build, pyinstaller] if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: @@ -78,7 +78,6 @@ jobs: - name: Download build uses: actions/download-artifact@v4.1.7 with: - name: distribution-archives path: dist - name: Create release uses: softprops/action-gh-release@v2 From 2302df5cd8aa5f0efef2400852c32384c8b3b48a Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:05:09 -0400 Subject: [PATCH 098/110] Change version number --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fd3ba53..56d92e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "email_draft_generator" -version = "0.0.4" +version = "0.1.0" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" license = { file = "LICENSE" } From 6aeab81e65d993fe755cf7e50319984091589ad7 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:13:56 -0400 Subject: [PATCH 099/110] Add permissions needed for PyPI publishing --- .github/workflows/python-build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 7b442cf..cc5492c 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -90,6 +90,8 @@ jobs: needs: build if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest + permissions: + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing steps: - uses: actions/checkout@v4 - name: Download build From 18e586222c162e6e0eaaa120e3bf33c7a80e57a3 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:14:55 -0400 Subject: [PATCH 100/110] Merge release artifacts --- .github/workflows/python-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index cc5492c..50fd804 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -79,6 +79,7 @@ jobs: uses: actions/download-artifact@v4.1.7 with: path: dist + merge-multiple: true - name: Create release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') From 80fdc16377cef75fb5c2cb7e86ac1275203eea6f Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:15:51 -0400 Subject: [PATCH 101/110] Update release number --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 56d92e7..1cab212 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "email_draft_generator" -version = "0.1.0" +version = "0.1.1" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" license = { file = "LICENSE" } From 04dc40947ca71fb89f6b0f37304fb1e31ee5bb84 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:30:50 -0400 Subject: [PATCH 102/110] Compress Linux releases as tar.gz files --- .github/workflows/python-build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 50fd804..d359a37 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -62,6 +62,13 @@ jobs: "dist/E-mail Draft Generator.dmg" \ "dist/dmg/" rm -r "dist/E-mail Draft Generator" "dist/dmg" + - name: Create .tar.gz + if: runner.os == 'Linux' + run: | + mkdir release-archives + tar -czvf release-archives/email-draft-generator-linux-x86_64.tar.gz -C dist + rm -r "dist/E-mail Draft Generator" + cp release-archives/*.tar.gz dist - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 with: From 1c581d9e42eaa982124074cd17deae05d5f71004 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Wed, 28 Aug 2024 20:32:12 -0400 Subject: [PATCH 103/110] Add a source file to the tar command --- .github/workflows/python-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index d359a37..9fac881 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -66,7 +66,7 @@ jobs: if: runner.os == 'Linux' run: | mkdir release-archives - tar -czvf release-archives/email-draft-generator-linux-x86_64.tar.gz -C dist + tar -czvf release-archives/email-draft-generator-linux-x86_64.tar.gz -C dist . rm -r "dist/E-mail Draft Generator" cp release-archives/*.tar.gz dist - name: Upload a Build Artifact From e7e763a3c29e06adc651cde93b0a56d96c461562 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 20:06:33 -0400 Subject: [PATCH 104/110] Add the icon in Tk --- src/email_draft_generator/gui/main.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 62fc4f0..51acc2e 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -5,6 +5,8 @@ import concurrent.futures from pathlib import Path import threading +from PIL import ImageTk +import platform import tkinter as tk from tkinter import ttk @@ -166,5 +168,14 @@ def main(): root = tk.Tk() root.title("E-mail Generator") root.resizable(False, False) + + # App icon + if platform.system() == 'Darwin': # Show a different icon on MacOS than anywhere else + icon_file = 'assets/icon_macos.png' + else: + icon_file = 'assets/icon.png' + photo = ImageTk.PhotoImage(file=icon_file) + root.wm_iconphoto(False, photo) # type: ignore + app = App(root) app.mainloop() From 9f2c81d742c2d30bfc0551566165c24ad8d57581 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 20:21:18 -0400 Subject: [PATCH 105/110] Bundle the icon in the PyInstaller archive --- pyinstaller.spec | 7 ++++++- src/email_draft_generator/gui/main.py | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pyinstaller.spec b/pyinstaller.spec index 205383e..8ffa6cf 100644 --- a/pyinstaller.spec +++ b/pyinstaller.spec @@ -2,11 +2,16 @@ import importlib.metadata +added_files = [ + ('assets/icon.png', 'email_draft_generator/gui/assets'), + ('assets/icon_macos.png', 'email_draft_generator/gui/assets'), +] + a = Analysis( ['src/email_draft_generator/gui/__main__.py'], pathex=[], binaries=[], - datas=[], + datas=added_files, hiddenimports=[], hookspath=[], hooksconfig={}, diff --git a/src/email_draft_generator/gui/main.py b/src/email_draft_generator/gui/main.py index 51acc2e..73dc864 100644 --- a/src/email_draft_generator/gui/main.py +++ b/src/email_draft_generator/gui/main.py @@ -2,8 +2,10 @@ import json import mimetypes import os +from os import path import concurrent.futures from pathlib import Path +import sys import threading from PIL import ImageTk import platform @@ -174,6 +176,10 @@ def main(): icon_file = 'assets/icon_macos.png' else: icon_file = 'assets/icon.png' + + if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): + icon_file = path.join(path.dirname(__file__), icon_file) + photo = ImageTk.PhotoImage(file=icon_file) root.wm_iconphoto(False, photo) # type: ignore From 2d624d6eeac7e775b7c4b26d3a10281c3ce721f9 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 22:37:20 -0400 Subject: [PATCH 106/110] Package Windows builds in self-extracting executables --- .github/workflows/python-build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 9fac881..dd7c1b2 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -69,6 +69,11 @@ jobs: tar -czvf release-archives/email-draft-generator-linux-x86_64.tar.gz -C dist . rm -r "dist/E-mail Draft Generator" cp release-archives/*.tar.gz dist + - name: Create self-extracting executable + if: runner.os == 'Windows' + run: | + "C:\Program Files\7-Zip\7z.exe" a email-draft-generator-windows-sfx-x86_64.exe -mx5 -sfx7z.sfx "dist\E-mail Draft Generator" + move email-draft-generator-windows-sfx-x86_64.exe dist - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 with: From 925b72e35b9e586452c5e0b7d750a9d8d79fb26f Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 22:43:10 -0400 Subject: [PATCH 107/110] Try a fix to get 7-zip working under Powershell --- .github/workflows/python-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index dd7c1b2..843df3a 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -72,7 +72,7 @@ jobs: - name: Create self-extracting executable if: runner.os == 'Windows' run: | - "C:\Program Files\7-Zip\7z.exe" a email-draft-generator-windows-sfx-x86_64.exe -mx5 -sfx7z.sfx "dist\E-mail Draft Generator" + & "C:\Program Files\7-Zip\7z.exe" a email-draft-generator-windows-sfx-x86_64.exe -mx5 -sfx "dist\E-mail Draft Generator" move email-draft-generator-windows-sfx-x86_64.exe dist - name: Upload a Build Artifact uses: actions/upload-artifact@v4.3.3 From e66f55f1a91f9ea82002c37e78ca06bae6b817ff Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 22:49:11 -0400 Subject: [PATCH 108/110] Create a zip archive of the Windows build --- .github/workflows/python-build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 843df3a..35a15fa 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -43,7 +43,7 @@ jobs: run: pip install .[packaging] - name: Build executable run: pyinstaller --noconfirm pyinstaller.spec - - name: Create DMG + - name: Create .dmg if: runner.os == 'macOS' run: | brew update @@ -69,6 +69,11 @@ jobs: tar -czvf release-archives/email-draft-generator-linux-x86_64.tar.gz -C dist . rm -r "dist/E-mail Draft Generator" cp release-archives/*.tar.gz dist + - name: Create .zip + if: runner.os == 'Windows' + run: ! + Compress-Archive -Path "dist\E-mail Draft Generator" -DestinationPath email-draft-generator-windows-x86_64.zip + move email-draft-generator-windows-x86_64.zip dist - name: Create self-extracting executable if: runner.os == 'Windows' run: | From 84b80a60f14840a2f1785056a0c7ee4e4a1dea85 Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 22:49:56 -0400 Subject: [PATCH 109/110] Fix workflow file syntax --- .github/workflows/python-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 35a15fa..eedb90e 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -71,7 +71,7 @@ jobs: cp release-archives/*.tar.gz dist - name: Create .zip if: runner.os == 'Windows' - run: ! + run: | Compress-Archive -Path "dist\E-mail Draft Generator" -DestinationPath email-draft-generator-windows-x86_64.zip move email-draft-generator-windows-x86_64.zip dist - name: Create self-extracting executable From e62e2621ace45b654f1e581077bd586c4b2bb13f Mon Sep 17 00:00:00 2001 From: Max Nargang Date: Thu, 29 Aug 2024 22:53:21 -0400 Subject: [PATCH 110/110] Increment version number --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1cab212..6148c2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "email_draft_generator" -version = "0.1.1" +version = "0.1.2" description = "A utility to generate E-mail drafts from a list of E-mail addresses." readme = "README.md" license = { file = "LICENSE" }