feature: async PDF export of validated specs #20

Merged
Gilles merged 1 commit from feature/pdf-export into master 2026-10-30 18:41:43 +00:00
Owner

Closes #19.

Résumé

  • apps.exports : PdfTemplate (organisation XOR projet, projet prioritaire), PdfExportJob (statut pending/running/done/failed).
  • Rendu sandboxé (jinja2.sandbox.ImmutableSandboxedEnvironment, même pattern que poulpinou/rendering.py, volontairement dupliqué plutôt qu'importé -- voir le commentaire dans apps/exports/rendering.py), puis WeasyPrint HTML -> PDF, avec un url_fetcher restreint au schéma data: (pas de SSRF via un template admin-editable).
  • API : pdf-templates/ (CRUD + actions resolve et preview), pdf-export-jobs/ (POST pour lancer, GET pour le statut, download/ une fois terminé -- jamais d'URL de stockage directe).
  • Introduit Celery + RabbitMQ dans ce projet pour la première fois (vhost dédié thierryade, service thierryade-worker). Pas de django-celery-beat : ses versions récentes ne supportent pas encore Django 6.1, et il n'y a aucune tâche périodique à planifier pour l'instant.

Suivi

Frontend (admin des templates + bouton d'export) dans une PR séparée sur thierryade/frontend.

Plan de test

  • tox (tests + lint + format-check + bandit) en local, hors l'environnement py315 (Python 3.15 absent de ce poste de dev).
  • 141 tests passent (24 nouveaux sur apps.exports).
  • CI (nouvelle étape d'installation des dépendances système WeasyPrint dans le job test).

🤖 Generated with Claude Code

https://claude.ai/code/session_013EeueXTWCT4Y6EbeideZcm

Closes #19. ## Résumé - `apps.exports` : `PdfTemplate` (organisation XOR projet, projet prioritaire), `PdfExportJob` (statut pending/running/done/failed). - Rendu sandboxé (`jinja2.sandbox.ImmutableSandboxedEnvironment`, même pattern que `poulpinou/rendering.py`, volontairement dupliqué plutôt qu'importé -- voir le commentaire dans `apps/exports/rendering.py`), puis WeasyPrint HTML -> PDF, avec un `url_fetcher` restreint au schéma `data:` (pas de SSRF via un template admin-editable). - API : `pdf-templates/` (CRUD + actions `resolve` et `preview`), `pdf-export-jobs/` (POST pour lancer, GET pour le statut, `download/` une fois terminé -- jamais d'URL de stockage directe). - Introduit Celery + RabbitMQ dans ce projet pour la première fois (vhost dédié `thierryade`, service `thierryade-worker`). Pas de `django-celery-beat` : ses versions récentes ne supportent pas encore Django 6.1, et il n'y a aucune tâche périodique à planifier pour l'instant. ## Suivi Frontend (admin des templates + bouton d'export) dans une PR séparée sur `thierryade/frontend`. ## Plan de test - [x] `tox` (tests + lint + format-check + bandit) en local, hors l'environnement `py315` (Python 3.15 absent de ce poste de dev). - [x] 141 tests passent (24 nouveaux sur `apps.exports`). - [ ] CI (nouvelle étape d'installation des dépendances système WeasyPrint dans le job `test`). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_013EeueXTWCT4Y6EbeideZcm
feature: async PDF export of validated specs (#19)
All checks were successful
ci / test (pull_request) Successful in 3m6s
ci / e2e (pull_request) Has been skipped
ci / docker (pull_request) Has been skipped
ci / deploy (pull_request) Has been skipped
7a43c08ca7
Adds apps.exports: PdfTemplate (scoped to an organization or a
project, project overrides organization), PdfExportJob (Celery task,
rendered via a sandboxed Jinja2 environment mirroring poulpinou's own
rendering.py, then WeasyPrint HTML->PDF). Introduces Celery/RabbitMQ
to this project for the first time (dedicated "thierryade" vhost,
thierryade-worker service) -- no django-celery-beat yet, its recent
releases don't support this project's Django 6.1 pin and there's no
periodic task to schedule.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EeueXTWCT4Y6EbeideZcm
Author
Owner
<!-- argus-link-bot:thierryade/backend --> 📊 [Rapports Argus pour cette PR](https://reports.stationmyr.net/thierryade/backend/pr/20)
Gilles merged commit ff8fc27ece into master 2026-10-30 18:41:43 +00:00
Gilles deleted branch feature/pdf-export 2026-10-30 18:41:43 +00:00
Sign in to join this conversation.
No description provided.