From b970ac537717c25593c9cfc2ff622e192e3668f4 Mon Sep 17 00:00:00 2001 From: tcprod Date: Sat, 4 Apr 2026 14:54:29 +0200 Subject: [PATCH] edit requirements.txt, edit README.md, change to pymysql --- .gitignore | 5 ++- README.md | 7 ++-- activity_diagram.svg | 2 +- ezgg_badge_generator.py | 10 +++--- config.toml => helpers/config.toml.example | 0 helpers/puffy.otf | Bin 0 -> 34340 bytes requirements.txt | 4 +-- services/BadgeGeneratorService.py | 3 ++ services/DatabaseService.py | 40 ++++++++++----------- 9 files changed, 38 insertions(+), 33 deletions(-) rename config.toml => helpers/config.toml.example (100%) create mode 100644 helpers/puffy.otf diff --git a/.gitignore b/.gitignore index d91c3ff..ee25f7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ .venv test.pdf .idea -files \ No newline at end of file +files +config.toml +venv +__pycache__ diff --git a/README.md b/README.md index a55611c..cfc8bb5 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ ### Step 1: Preparing configuration -Prepare the `config.toml` at the base of the repository. It is important to adjust the database configuration as well as the `browser_path`. +Use the example configuration at `helpers/config.example.toml` to create a `config.toml` at the base of the repository. +It is important to adjust the database configuration as well as the `browser_path`. The script has only been tested with the Chrome browser. The system running the script needs access to the database server, or a current local database instance must be running. ### Step 2: Install dependencies -Use `pip install -r requirements.txt` to install the requirements. The usage of a venv is recommended. +Use `pip install -r requirements.txt` to install the requirements. The use of a venv is recommended. +Install the `helpers/puffy.otf` font on your system. ### Step 3: Execute @@ -15,5 +17,6 @@ Execute `ezgg_badge_generator.py`. ### Further +The diagram shows the process of the script. ![activity diagram](activity_diagram.svg) \ No newline at end of file diff --git a/activity_diagram.svg b/activity_diagram.svg index 60256af..06f2cdd 100644 --- a/activity_diagram.svg +++ b/activity_diagram.svg @@ -1,4 +1,4 @@ -
Load user data from database
Load user data from...
Insert user data to svg template
Insert user data to...
Embed the user-svg into the html template
Embed the user-svg i...
Generate user-badge pdf
Generate user-badge...
A browser is needed to generate a PDF.

Make sure to adjust the key valuei 
`browser_path` in config.toml.
A browser is needed to generate a PD...
Text is not SVG - cannot display
\ No newline at end of file +
Load user data from database
Load user data from...
Insert user data to svg template
Insert user data to...
Embed the user-svg into the html template
Embed the user-svg i...
Generate user-badge pdf
Generate user-badge...
A browser is needed to generate a PDF.

Make sure to adjust the key value 
`browser_path` in config.toml.
A browser is needed to generate a PD...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/ezgg_badge_generator.py b/ezgg_badge_generator.py index bd879a5..575b77e 100644 --- a/ezgg_badge_generator.py +++ b/ezgg_badge_generator.py @@ -1,14 +1,12 @@ -import asyncio - from services.DatabaseService import DatabaseService from services.BadgeGeneratorService import BadgeGeneratorService -async def main(): +def main(): db = DatabaseService("config.toml") - await db.init_db_pool() + db.init_db() - badges = await db.get_user_badges() + badges = db.get_user_badges() badge_generator = BadgeGeneratorService("config.toml") @@ -21,4 +19,4 @@ async def main(): if __name__ == "__main__": - asyncio.run(main()) + main() diff --git a/config.toml b/helpers/config.toml.example similarity index 100% rename from config.toml rename to helpers/config.toml.example diff --git a/helpers/puffy.otf b/helpers/puffy.otf new file mode 100644 index 0000000000000000000000000000000000000000..70c6d4195a85fa4b9d747853055500b8b79624d6 GIT binary patch literal 34340 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 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 6612794..c050e27 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -aiomysql~=0.3.2 -Jinja2~=3.1.6 \ No newline at end of file +Jinja2~=3.1.6 +PyMySQL~=1.1.2 \ No newline at end of file diff --git a/services/BadgeGeneratorService.py b/services/BadgeGeneratorService.py index f76f036..d29d2e5 100644 --- a/services/BadgeGeneratorService.py +++ b/services/BadgeGeneratorService.py @@ -69,6 +69,9 @@ class BadgeGeneratorService: f"--print-to-pdf={output_path.resolve()}", html_path.resolve() ], check=True) + except FileNotFoundError: + logger.error(f"Browser not found. {self.browser_path}") + exit(-1) finally: html_path.unlink(missing_ok=True) diff --git a/services/DatabaseService.py b/services/DatabaseService.py index 501291d..a8ad32e 100644 --- a/services/DatabaseService.py +++ b/services/DatabaseService.py @@ -1,7 +1,7 @@ import logging import tomllib -import aiomysql -from typing import Optional +import pymysql +from typing import Optional, List, Dict logger = logging.getLogger(__name__.split(".")[-1]) @@ -12,30 +12,28 @@ class DatabaseService: config = tomllib.load(f) self.db_config = config["database"] - self._pool: Optional[aiomysql.Pool] = None + self._conn: Optional[pymysql.Connection] = None - async def init_db_pool(self): - self._pool = await aiomysql.create_pool( + def init_db(self): + self._conn = pymysql.connect( host=self.db_config["db_host"], port=self.db_config["db_port"], user=self.db_config["db_user"], password=self.db_config["db_password"], - db=self.db_config["db_name"], - minsize=1, - maxsize=40, - autocommit=True - ) + database=self.db_config["db_name"], + cursorclass=pymysql.cursors.DictCursor) logger.info("Connected to database.") - async def get_user_badges(self) -> list: - async with self._pool.acquire() as conn: - async with conn.cursor(aiomysql.DictCursor) as cursor: - await cursor.execute( - """SELECT u.user_id, u.user_name, s.seat_id, upp.picture - FROM users AS u - LEFT JOIN seats AS s - ON u.user_id = s.`user` - LEFT JOIN user_profile_picture AS upp + def get_user_badges(self) -> List[Dict]: + with self._conn.cursor() as cursor: + cursor.execute( + """SELECT u.user_id, u.user_name, s.seat_id, upp.picture + FROM users AS u + LEFT JOIN seats AS s + ON u.user_id = s.`user` + LEFT JOIN user_profile_picture AS upp ON u.user_id = upp.user_id;""" - ) - return await cursor.fetchall() + ) + user_badges = cursor.fetchall() + logger.info(f"Got {len(user_badges)} user badges from database.") + return user_badges