Jelajahi Sumber

[#1] Embed Roboto and RobotoMono fonts into compiled PDFs

Lange François 3 minggu lalu
induk
melakukan
62ba1d6678
34 mengubah file dengan 69 tambahan dan 43 penghapusan
  1. TEMPAT SAMPAH
      Project.pdf
  2. TEMPAT SAMPAH
      Retro Planning.pdf
  3. TEMPAT SAMPAH
      docs/Backup_Procedure.pdf
  4. TEMPAT SAMPAH
      docs/Data_Ingestion.pdf
  5. TEMPAT SAMPAH
      docs/Final_Report.pdf
  6. TEMPAT SAMPAH
      docs/Installation_Guide.pdf
  7. TEMPAT SAMPAH
      docs/Operator_Installation_Guide.pdf
  8. TEMPAT SAMPAH
      docs/Scrum_Artifacts.pdf
  9. TEMPAT SAMPAH
      docs/Scrum_Daily.pdf
  10. TEMPAT SAMPAH
      docs/Scrum_Plan.pdf
  11. TEMPAT SAMPAH
      docs/Scrum_Retro.pdf
  12. TEMPAT SAMPAH
      docs/Scrum_Review.pdf
  13. TEMPAT SAMPAH
      docs/Scrum_Wiki.pdf
  14. TEMPAT SAMPAH
      docs/Start_Stop_Procedures.pdf
  15. TEMPAT SAMPAH
      docs/Technical_Document.pdf
  16. TEMPAT SAMPAH
      docs/Test_Cases_Sprint8.pdf
  17. TEMPAT SAMPAH
      docs/URL_Formats.pdf
  18. TEMPAT SAMPAH
      docs/User_Description.pdf
  19. TEMPAT SAMPAH
      docs/User_Guide.pdf
  20. TEMPAT SAMPAH
      docs/WSL_Deployment.pdf
  21. TEMPAT SAMPAH
      docs/Wiki_Home.pdf
  22. TEMPAT SAMPAH
      docs/architecture.pdf
  23. TEMPAT SAMPAH
      docs/disaster_recovery_plan.pdf
  24. TEMPAT SAMPAH
      docs/distributed_deployment.pdf
  25. TEMPAT SAMPAH
      docs/docker_connection.pdf
  26. TEMPAT SAMPAH
      docs/fonts/Roboto-Bold.ttf
  27. TEMPAT SAMPAH
      docs/fonts/Roboto-Regular.ttf
  28. TEMPAT SAMPAH
      docs/fonts/RobotoMono-Regular.ttf
  29. 34 36
      docs/project_report.md
  30. TEMPAT SAMPAH
      docs/project_report.pdf
  31. TEMPAT SAMPAH
      docs/retro_planning.pdf
  32. TEMPAT SAMPAH
      docs/taiga_audit_report.pdf
  33. TEMPAT SAMPAH
      docs/zabbix_monitoring.pdf
  34. 35 7
      scripts/generate_pdfs.py

TEMPAT SAMPAH
Project.pdf


TEMPAT SAMPAH
Retro Planning.pdf


TEMPAT SAMPAH
docs/Backup_Procedure.pdf


TEMPAT SAMPAH
docs/Data_Ingestion.pdf


TEMPAT SAMPAH
docs/Final_Report.pdf


TEMPAT SAMPAH
docs/Installation_Guide.pdf


TEMPAT SAMPAH
docs/Operator_Installation_Guide.pdf


TEMPAT SAMPAH
docs/Scrum_Artifacts.pdf


TEMPAT SAMPAH
docs/Scrum_Daily.pdf


TEMPAT SAMPAH
docs/Scrum_Plan.pdf


TEMPAT SAMPAH
docs/Scrum_Retro.pdf


TEMPAT SAMPAH
docs/Scrum_Review.pdf


TEMPAT SAMPAH
docs/Scrum_Wiki.pdf


TEMPAT SAMPAH
docs/Start_Stop_Procedures.pdf


TEMPAT SAMPAH
docs/Technical_Document.pdf


TEMPAT SAMPAH
docs/Test_Cases_Sprint8.pdf


TEMPAT SAMPAH
docs/URL_Formats.pdf


TEMPAT SAMPAH
docs/User_Description.pdf


TEMPAT SAMPAH
docs/User_Guide.pdf


TEMPAT SAMPAH
docs/WSL_Deployment.pdf


TEMPAT SAMPAH
docs/Wiki_Home.pdf


TEMPAT SAMPAH
docs/architecture.pdf


TEMPAT SAMPAH
docs/disaster_recovery_plan.pdf


TEMPAT SAMPAH
docs/distributed_deployment.pdf


TEMPAT SAMPAH
docs/docker_connection.pdf


TEMPAT SAMPAH
docs/fonts/Roboto-Bold.ttf


TEMPAT SAMPAH
docs/fonts/Roboto-Regular.ttf


TEMPAT SAMPAH
docs/fonts/RobotoMono-Regular.ttf


+ 34 - 36
docs/project_report.md

@@ -1,5 +1,3 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
-
 # Capstone Project Report & File Documentation
 # Capstone Project Report & File Documentation
 
 
 > [!NOTE]
 > [!NOTE]
@@ -29,40 +27,40 @@ Below is an exhaustive catalog of every critical file in the repository, detaili
 
 
 | File Path | Purpose & Technical Responsibility | Commit | Author | Commit Date | Last Commit Message |
 | File Path | Purpose & Technical Responsibility | Commit | Author | Commit Date | Last Commit Message |
 | :--- | :--- | :--- | :--- | :--- | :--- |
 | :--- | :--- | :--- | :--- | :--- | :--- |
-| **app.py**<br>`./app.py` | Core Streamlit Web Application. Hosts the clinical food search engine, the RAG chat dietitian interface (utilizing Ollama and SearXNG tool calling), and the visual plate builder. | `3e5cddb` | Lange François | 2026/05/22 09:47:33 | *TG-221 #closed - Refactor Ask Chat system prompt to use Chain of Thought (CoT) reasoning for higher clinical accuracy* |
-| **ingest_csv.py**<br>`./ingest_csv.py` | High-performance background database loader. Stream-reads and batch-inserts the 3GB OpenFoodFacts dataset into MySQL using Pandas chunking and optimizes indices post-load. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **unit_converter.py**<br>`./unit_converter.py` | Mathematical converter engine that parses natural recipe volume inputs (e.g. cups, spoons) and converts them to metric weights based on macro density mappings. | `ea04a85` | lanfr144 | 2026/05/08 08:57:06 | *TG-86: finalize system pre-initialization, auto-pull LLM, egg scales* |
-| **snmp_notifier.py**<br>`./snmp_notifier.py` | Observability SNMP utility. Formulates and transmits raw SNMP trap payloads to the central Zabbix monitoring server on critical application failures. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **configure_zabbix_alerts.py**<br>`./configure_zabbix_alerts.py` | DevOps provisioning script. Uses the Zabbix API to automatically set up host groups, custom templates, items, triggers, actions, and media types for alerts. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **configure_zabbix_email.py**<br>`./configure_zabbix_email.py` | Security & Monitoring. Configures email media types and SMTP server routes for Zabbix alert notifications on system downtime. | `ade82af` | lanfr144 | 2026/05/18 14:08:27 | *TG-196: Full security refactor, Taiga sync, and Data pipeline automation* |
-| **zabbix_telemetry.py**<br>`./zabbix_telemetry.py` | Monitoring agent daemon. Queries active application statistics, memory, and query timers to supply Zabbix telemetry indicators. | `ade82af` | lanfr144 | 2026/05/18 14:08:27 | *TG-196: Full security refactor, Taiga sync, and Data pipeline automation* |
-| **check_users.py**<br>`./check_users.py` | Security utility. Verifies user accounts inside the MySQL `users` table and checks password hashing complexity. | `7766898` | lanfr144 | 2026/04/29 14:39:55 | *Add check users script* |
-| **rotate_passwords.py**<br>`./rotate_passwords.py` | Administrative credential utility. Cycles and re-encrypts database passwords within the `.env` secret file. | `ade82af` | lanfr144 | 2026/05/18 14:08:27 | *TG-196: Full security refactor, Taiga sync, and Data pipeline automation* |
-| **myloginpath.py**<br>`./myloginpath.py` | MySQL credential companion helper that simplifies the generation of encrypted login path configuration profiles. | `4655c26` | lanfr144 | 2026/04/29 08:30:03 | *Add untracked project files and configs* |
-| **data_sync.sh**<br>`./data_sync.sh` | Master pipeline coordinator. Supports download fetching in --online mode and local file processing in offline fallback mode. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **backup_db.sh**<br>`./backup_db.sh` | Resiliency backup automation. Runs mysqldump on user tables inside the active container and prunes backups older than 7 days. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **reset.sh**<br>`./reset.sh` | Teardown script. Wipes local temporary containers and prunes volume locks during crashes. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **proper_reset.sh**<br>`./proper_reset.sh` | High-level administrative wipe script that brings the entire network stack and repositories back to a pristine state. | `776d6a6` | lanfr144 | 2026/04/29 12:44:49 | *Add proper reset* |
-| **deploy.sh**<br>`./deploy.sh` | Naked OS installation guide. Installs necessary system packages, Python venv libraries, and native Ollama. | `a54dc25` | lanfr144 | 2026/04/22 15:01:17 | *TG-21: Update deploy.sh to include requests connectivity dependency.* |
-| **start_batch_ingest.sh**<br>`./start_batch_ingest.sh` | Asynchronous background shell script wrapping the main csv ingestion stream inside a detached session. | `00f1d63` | lanfr144 | 2026/04/24 07:50:40 | *Fix python virtual env paths* |
-| **download_csv.sh**<br>`./download_csv.sh` | Downloader helper script that fetches specific smaller subsets of OpenFoodFacts CSV files. | `1a3cdca` | lanfr144 | 2026/05/05 07:14:54 | *fix: resolve pip encoding issue and add exec permissions to download script* |
-| **master_trigger.sh**<br>`./master_trigger.sh` | Orchestrator script that wakes and verifies multiple secondary subservices in sequence. | `38a83a1` | lanfr144 | 2026/04/23 10:50:37 | *Deployment Finalization: Vitamin schemas, Green UI, and Taiga tools* |
-| **manage_services.sh**<br>`./manage_services.sh` | DevOps service manager script. Handles automated, sequential startup, shutdown, restart, and health checking of all container elements in the stack. | `78a1c2c` | Lange François | 2026/05/22 07:55:19 | *docs: Hardening, hybrid landscape, documentation index, and US-203 Taiga tasks alignment* |
-| **generate_docs.py**<br>`./generate_docs.py` | Dynamic doc generator. Generates and mirrors all markdown manuals under `/docs` with live Git log metadata injection. | `09c5304` | Lange François | 2026/05/22 09:19:09 | *TG-220 TG-221 TG-222 #closed - Upgrade Ollama to Qwen2.5-7B, refactor backend prompts for XML scratchpad reasoning, and implement response parsing* |
-| **docker-compose.yml**<br>`./docker-compose.yml` | Main 10-container Docker orchestration map defining MySQL, App UI, Ollama Engine, SearXNG, Nginx proxy, Airflow stack, and Zabbix server suites. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **docker-compose_skip.yml**<br>`./docker-compose_skip.yml` | Resilient 8-container offline/local single-node orchestration manifest. | `264d274` | lanfr144 | 2026/05/21 09:43:09 | *TG-442: Sync resilience configurations, resolve SearXNG crash, and update docs with dynamic custom Git log ID and tag* |
-| **docker-compose-wsl.yml**<br>`./docker-compose-wsl.yml` | WSL2-specific Docker Compose configuration file. Configures services with a +20 port shift to guarantee zero port conflicts on developer workstations. | `c52c6a1` | Lange François | 2026/05/31 15:41:22 | *docs: add WSL installation runbook, WSL compose file with shifted ports, and Taiga JSON export* |
-| **alembic.ini**<br>`./alembic.ini` | Alembic configuration setting routing database connection URIs for versioning schemas. | `73f7a04` | lanfr144 | 2026/04/24 16:18:55 | *Optimize horizontal partitioning to slice into 8-column chunks bypassing InnoDB limits* |
-| **my.cnf**<br>`./my.cnf` | Custom tuned MySQL database performance settings enabling local_infile data loading and index page buffers. | `86c76e2` | lanfr144 | 2026/04/17 10:26:35 | *TG-1: Fix MySQL 8.0 startup crash by removing premature validate_password plugin config* |
+| **app.py**<br>`./app.py` | Core Streamlit Web Application. Hosts the clinical food search engine, the RAG chat dietitian interface (utilizing Ollama and SearXNG tool calling), and the visual plate builder. | `6b02c9a` | Lange François | 2026/06/14 20:40:11 | *[#1] Configure dynamic git filters, add WSL setup runbooks/telemetry, and clean dead files* |
+| **ingest_csv.py**<br>`./ingest_csv.py` | High-performance background database loader. Stream-reads and batch-inserts the 3GB OpenFoodFacts dataset into MySQL using Pandas chunking and optimizes indices post-load. | `6b02c9a` | Lange François | 2026/06/14 20:40:11 | *[#1] Configure dynamic git filters, add WSL setup runbooks/telemetry, and clean dead files* |
+| **unit_converter.py**<br>`./unit_converter.py` | Mathematical converter engine that parses natural recipe volume inputs (e.g. cups, spoons) and converts them to metric weights based on macro density mappings. | `e758e4f` | Lange François | 2026/06/15 04:29:33 | *[#1] Update regenerated documentation PDFs and Git filters placeholders* |
+| **snmp_notifier.py**<br>`./snmp_notifier.py` | Observability SNMP utility. Formulates and transmits raw SNMP trap payloads to the central Zabbix monitoring server on critical application failures. | `58c3849` | Lange François | 2026/06/12 10:06:29 | *[#1] chore: update default models, rewrite allergen check to use cached LLM, and update README grading layout* |
+| **configure_zabbix_alerts.py**<br>`./configure_zabbix_alerts.py` | DevOps provisioning script. Uses the Zabbix API to automatically set up host groups, custom templates, items, triggers, actions, and media types for alerts. | `58c3849` | Lange François | 2026/06/12 10:06:29 | *[#1] chore: update default models, rewrite allergen check to use cached LLM, and update README grading layout* |
+| **configure_zabbix_email.py**<br>`./configure_zabbix_email.py` | Security & Monitoring. Configures email media types and SMTP server routes for Zabbix alert notifications on system downtime. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **zabbix_telemetry.py**<br>`./zabbix_telemetry.py` | Monitoring agent daemon. Queries active application statistics, memory, and query timers to supply Zabbix telemetry indicators. | `e758e4f` | Lange François | 2026/06/15 04:29:33 | *[#1] Update regenerated documentation PDFs and Git filters placeholders* |
+| **check_users.py**<br>`./check_users.py` | Security utility. Verifies user accounts inside the MySQL `users` table and checks password hashing complexity. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **rotate_passwords.py**<br>`./rotate_passwords.py` | Administrative credential utility. Cycles and re-encrypts database passwords within the `.env` secret file. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **myloginpath.py**<br>`./myloginpath.py` | MySQL credential companion helper that simplifies the generation of encrypted login path configuration profiles. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **data_sync.sh**<br>`./data_sync.sh` | Master pipeline coordinator. Supports download fetching in --online mode and local file processing in offline fallback mode. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **backup_db.sh**<br>`./backup_db.sh` | Resiliency backup automation. Runs mysqldump on user tables inside the active container and prunes backups older than 7 days. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **reset.sh**<br>`./reset.sh` | Teardown script. Wipes local temporary containers and prunes volume locks during crashes. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **proper_reset.sh**<br>`./proper_reset.sh` | High-level administrative wipe script that brings the entire network stack and repositories back to a pristine state. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **deploy.sh**<br>`./deploy.sh` | Naked OS installation guide. Installs necessary system packages, Python venv libraries, and native Ollama. | `6b02c9a` | Lange François | 2026/06/14 20:40:11 | *[#1] Configure dynamic git filters, add WSL setup runbooks/telemetry, and clean dead files* |
+| **start_batch_ingest.sh**<br>`./start_batch_ingest.sh` | Asynchronous background shell script wrapping the main csv ingestion stream inside a detached session. | `6b02c9a` | Lange François | 2026/06/14 20:40:11 | *[#1] Configure dynamic git filters, add WSL setup runbooks/telemetry, and clean dead files* |
+| **download_csv.sh**<br>`./download_csv.sh` | Downloader helper script that fetches specific smaller subsets of OpenFoodFacts CSV files. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **master_trigger.sh**<br>`./master_trigger.sh` | Orchestrator script that wakes and verifies multiple secondary subservices in sequence. | `6b02c9a` | Lange François | 2026/06/14 20:40:11 | *[#1] Configure dynamic git filters, add WSL setup runbooks/telemetry, and clean dead files* |
+| **manage_services.sh**<br>`./manage_services.sh` | DevOps service manager script. Handles automated, sequential startup, shutdown, restart, and health checking of all container elements in the stack. | `6b02c9a` | Lange François | 2026/06/14 20:40:11 | *[#1] Configure dynamic git filters, add WSL setup runbooks/telemetry, and clean dead files* |
+| **generate_docs.py**<br>`./generate_docs.py` | Dynamic doc generator. Generates and mirrors all markdown manuals under `/docs` with live Git log metadata injection. | `ef4111d` | Lange François | 2026/06/14 20:56:15 | *[#1] Configure mirror repositories and dynamic git filter sanitization* |
+| **docker-compose.yml**<br>`./docker-compose.yml` | Main 10-container Docker orchestration map defining MySQL, App UI, Ollama Engine, SearXNG, Nginx proxy, Airflow stack, and Zabbix server suites. | `80c89df` | Lange François | 2026/06/12 08:46:09 | *[#1] chore: pass LLM_MODEL env var and mount .env to app service in docker-compose configs* |
+| **docker-compose_skip.yml**<br>`./docker-compose_skip.yml` | Resilient 8-container offline/local single-node orchestration manifest. | `80c89df` | Lange François | 2026/06/12 08:46:09 | *[#1] chore: pass LLM_MODEL env var and mount .env to app service in docker-compose configs* |
+| **docker-compose-wsl.yml**<br>`./docker-compose-wsl.yml` | WSL2-specific Docker Compose configuration file. Configures services with a +20 port shift to guarantee zero port conflicts on developer workstations. | `80c89df` | Lange François | 2026/06/12 08:46:09 | *[#1] chore: pass LLM_MODEL env var and mount .env to app service in docker-compose configs* |
+| **alembic.ini**<br>`./alembic.ini` | Alembic configuration setting routing database connection URIs for versioning schemas. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **my.cnf**<br>`./my.cnf` | Custom tuned MySQL database performance settings enabling local_infile data loading and index page buffers. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
 | **.env**<br>`./.env` | Secret storage container holding encrypted MySQL user passwords and active environment flags. | `ca3877d` | lanfr144 | 2026/05/13 11:15:42 | *Stop save the .env file* |
 | **.env**<br>`./.env` | Secret storage container holding encrypted MySQL user passwords and active environment flags. | `ca3877d` | lanfr144 | 2026/05/13 11:15:42 | *Stop save the .env file* |
-| **.gitattributes**<br>`./.gitattributes` | Git clean/smudge layout mapping enabling automatic tracking of dynamic $Id$ metadata expansion within version files. | `0cfdf52` | lanfr144 | 2026/05/07 09:54:17 | *TG-85: enable export-subst for Format string git identification* |
-| **requirements.txt**<br>`./requirements.txt` | Python runtime dependency catalog storing strict library versioning constraints. | `bb2ac28` | lanfr144 | 2026/05/11 07:59:05 | *fix requirements.txt encoding for fpdf2* |
-| **INSTALL_WSL.md**<br>`./INSTALL_WSL.md` | WSL2 deployment guide. Provides step-by-step instructions for installing and deploying the application inside WSL2 with port shifts. | `c52c6a1` | Lange François | 2026/05/31 15:41:22 | *docs: add WSL installation runbook, WSL compose file with shifted ports, and Taiga JSON export* |
-| **taiga/local-food-ai-1-36f35ff9-da1b-4eb5-9309-058448c998ad.json**<br>`./taiga/local-food-ai-1-36f35ff9-da1b-4eb5-9309-058448c998ad.json` | Historical Taiga Agile export. Contains the complete project history, including all closed user stories, tasks, and sprint configurations. | `c52c6a1` | Lange François | 2026/05/31 15:41:22 | *docs: add WSL installation runbook, WSL compose file with shifted ports, and Taiga JSON export* |
-| **scripts/generate_pdfs.py**<br>`./scripts/generate_pdfs.py` | PDF document builder. Converts all markdown documentation manuals under `/docs` into high-fidelity PDF format with expanded Git version headers. | `78a1c2c` | Lange François | 2026/05/22 07:55:19 | *docs: Hardening, hybrid landscape, documentation index, and US-203 Taiga tasks alignment* |
-| **scripts/generate_project_report.py**<br>`./scripts/generate_project_report.py` | Technical project report generator. Automatically gathers codebase structure, Git commit metadata, and purpose records to construct the Project.pdf report. | `a7732e0` | Lange François | 2026/05/31 15:41:33 | *docs: add WSL runbook, WSL compose file, and Taiga JSON export to report catalog* |
-| **scripts/setup_deploy.py**<br>`./scripts/setup_deploy.py` | DevOps deployment script. Orchestrates local and VM container sets, verifying network connectivity and system parameters. | `0065125` | lanfr144 | 2026/05/20 08:52:08 | *TG-202: Add log rotation limits to prevent 100% disk usage* |
-| **scripts/taiga_sync_final.py**<br>`./scripts/taiga_sync_final.py` | Taiga automated synchronization helper. Pushes bug tickets, fills wiki pages, and assigns unassigned user stories. | `a4342d3` | lanfr144 | 2026/05/19 09:09:10 | *TG-198: Add Taiga consistency automation script for full Jira/Agile alignment* |
+| **.gitattributes**<br>`./.gitattributes` | Git clean/smudge layout mapping enabling automatic tracking of dynamic $Id$ metadata expansion within version files. | `60823f3` | Lange François | 2026/06/12 09:28:53 | *[#1] docs: update README.md grading criteria, add Technical Document and User Manual, fix app.py version parsing* |
+| **requirements.txt**<br>`./requirements.txt` | Python runtime dependency catalog storing strict library versioning constraints. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **INSTALL_WSL.md**<br>`./INSTALL_WSL.md` | WSL2 deployment guide. Provides step-by-step instructions for installing and deploying the application inside WSL2 with port shifts. | `ef4111d` | Lange François | 2026/06/14 20:56:15 | *[#1] Configure mirror repositories and dynamic git filter sanitization* |
+| **taiga/local-food-ai-1-36f35ff9-da1b-4eb5-9309-058448c998ad.json**<br>`./taiga/local-food-ai-1-36f35ff9-da1b-4eb5-9309-058448c998ad.json` | Historical Taiga Agile export. Contains the complete project history, including all closed user stories, tasks, and sprint configurations. | `d768ead` | Lange François | 2026/06/01 07:44:40 | *TG-221 #closed - Last commit to sync all the file to ship to the teacher.* |
+| **scripts/generate_pdfs.py**<br>`./scripts/generate_pdfs.py` | PDF document builder. Converts all markdown documentation manuals under `/docs` into high-fidelity PDF format with expanded Git version headers. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **scripts/generate_project_report.py**<br>`./scripts/generate_project_report.py` | Technical project report generator. Automatically gathers codebase structure, Git commit metadata, and purpose records to construct the Project.pdf report. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **scripts/setup_deploy.py**<br>`./scripts/setup_deploy.py` | DevOps deployment script. Orchestrates local and VM container sets, verifying network connectivity and system parameters. | `1701828` | Lange François | 2026/06/11 08:26:59 | *[TG-131] Purge database passwords from tracked files and format application versioning* |
+| **scripts/taiga_sync_final.py**<br>`./scripts/taiga_sync_final.py` | Taiga automated synchronization helper. Pushes bug tickets, fills wiki pages, and assigns unassigned user stories. | `744ffe8` | Lange François | 2026/06/11 10:34:49 | *[#1] chore: resolve security leak, configure dynamic versioning filters, update Streamlit and Flask applications to read version from %cd, update unit converter, ingestion, and search features, and export Taiga scrum data* |
 
 
 ---
 ---
 
 
@@ -81,4 +79,4 @@ An overview of the folder hierarchy organizing our microservice infrastructure:
 ## 4. Operational Next Steps (Day 2 Procedures)
 ## 4. Operational Next Steps (Day 2 Procedures)
 1. **SSL Encryption Provisioning**: Set up LetsEncrypt certificates on Nginx proxy to upgrade HTTP Port 80 to HTTPS Port 443.
 1. **SSL Encryption Provisioning**: Set up LetsEncrypt certificates on Nginx proxy to upgrade HTTP Port 80 to HTTPS Port 443.
 2. **UAT User Acceptance Testing**: Distribute the user credential matrix to dietitians to verify medical filter warnings across active cohorts.
 2. **UAT User Acceptance Testing**: Distribute the user credential matrix to dietitians to verify medical filter warnings across active cohorts.
-3. **Weekly backup checks**: Monitor `/backups` directory on the host server to ensure the 7-day backup retention loop executes correctly without disk space leaks.
+3. **Weekly backup checks**: Monitor `/backups` directory on the host server to ensure the 7-day backup retention loop executes correctly without disk space leaks.

TEMPAT SAMPAH
docs/project_report.pdf


TEMPAT SAMPAH
docs/retro_planning.pdf


TEMPAT SAMPAH
docs/taiga_audit_report.pdf


TEMPAT SAMPAH
docs/zabbix_monitoring.pdf


+ 35 - 7
scripts/generate_pdfs.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:generate_pdfs.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import os
 import glob
 import glob
 from markdown_pdf import MarkdownPdf
 from markdown_pdf import MarkdownPdf
@@ -12,6 +12,34 @@ def main():
         print("No markdown files found in docs/")
         print("No markdown files found in docs/")
         return
         return
         
         
+    # Resolve dynamic absolute paths for downloaded TrueType fonts
+    fonts_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'docs', 'fonts')).replace('\\', '/')
+    regular_font = f"{fonts_dir}/Roboto-Regular.ttf"
+    bold_font = f"{fonts_dir}/Roboto-Bold.ttf"
+    mono_font = f"{fonts_dir}/RobotoMono-Regular.ttf"
+    
+    user_css = f"""
+    @font-face {{
+        font-family: 'Roboto';
+        src: url('{regular_font}');
+    }}
+    @font-face {{
+        font-family: 'Roboto';
+        font-weight: bold;
+        src: url('{bold_font}');
+    }}
+    @font-face {{
+        font-family: 'RobotoMono';
+        src: url('{mono_font}');
+    }}
+    body {{
+        font-family: 'Roboto', sans-serif;
+    }}
+    code, pre {{
+        font-family: 'RobotoMono', monospace;
+    }}
+    """
+
     for md_file in md_files:
     for md_file in md_files:
         pdf_file = md_file.replace('.md', '.pdf')
         pdf_file = md_file.replace('.md', '.pdf')
         print(f"Converting {os.path.basename(md_file)} to PDF...")
         print(f"Converting {os.path.basename(md_file)} to PDF...")
@@ -51,17 +79,17 @@ def main():
                         landscape_part = '## 2. Project File Catalog & Documentation' + parts2[0]
                         landscape_part = '## 2. Project File Catalog & Documentation' + parts2[0]
                         portrait_part2 = '## 3. Directory Structure Map' + parts2[1]
                         portrait_part2 = '## 3. Directory Structure Map' + parts2[1]
                         
                         
-                        pdf.add_section(Section(portrait_part1, paper_size="A4"))
-                        pdf.add_section(Section(landscape_part, paper_size="A4-L"))
-                        pdf.add_section(Section(portrait_part2, paper_size="A4"))
+                        pdf.add_section(Section(portrait_part1, paper_size="A4"), user_css=user_css)
+                        pdf.add_section(Section(landscape_part, paper_size="A4-L"), user_css=user_css)
+                        pdf.add_section(Section(portrait_part2, paper_size="A4"), user_css=user_css)
                     else:
                     else:
                         print("WARNING: Could not find Directory Structure Map heading. Defaulting to full portrait.")
                         print("WARNING: Could not find Directory Structure Map heading. Defaulting to full portrait.")
-                        pdf.add_section(Section(md_content, paper_size="A4"))
+                        pdf.add_section(Section(md_content, paper_size="A4"), user_css=user_css)
                 else:
                 else:
                     print("WARNING: Could not find Project File Catalog heading. Defaulting to full portrait.")
                     print("WARNING: Could not find Project File Catalog heading. Defaulting to full portrait.")
-                    pdf.add_section(Section(md_content, paper_size="A4"))
+                    pdf.add_section(Section(md_content, paper_size="A4"), user_css=user_css)
             else:
             else:
-                pdf.add_section(Section(md_content, paper_size="A4"))
+                pdf.add_section(Section(md_content, paper_size="A4"), user_css=user_css)
                 
                 
             pdf.save(pdf_file)
             pdf.save(pdf_file)
             print(f"Saved {os.path.basename(pdf_file)}")
             print(f"Saved {os.path.basename(pdf_file)}")