diff --git a/docker/Dockerfile b/docker/Dockerfile
index ce21b6f83..4c1514b27 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -77,6 +77,11 @@ RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
-r /tmp/openspp-requirements.txt
# Download and install Odoo (cache the tarball to avoid re-downloading)
+# --no-deps: Odoo's runtime dependencies are already installed above from its
+# requirements.txt, which carries the correct per-Python-version pins. Odoo's
+# setup.py additionally declares an unpinned PyPDF2; resolving it installs
+# legacy PyPDF2 3.x, which odoo.tools.pdf then selects over pypdf and which
+# crashes multi-record PDF printing (OP#1168).
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
--mount=type=cache,target=/tmp/downloads,sharing=locked \
set -eux; \
@@ -91,7 +96,7 @@ RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
mv /opt/odoo /opt/odoo-src; \
mkdir -p /opt/odoo; \
mv /opt/odoo-src /opt/odoo/odoo; \
- uv pip install -e /opt/odoo/odoo
+ uv pip install --no-deps -e /opt/odoo/odoo
# Download OCA dependencies in builder (cache tarballs to avoid re-downloading)
RUN --mount=type=cache,target=/tmp/downloads,sharing=locked \
diff --git a/spp_base_common/README.rst b/spp_base_common/README.rst
index be0d2e0a4..9a77499d1 100644
--- a/spp_base_common/README.rst
+++ b/spp_base_common/README.rst
@@ -120,6 +120,17 @@ Dependencies
Changelog
=========
+19.0.2.0.2
+~~~~~~~~~~
+
+- test: add a regression test guarding the PDF backend selected by
+ ``odoo.tools.pdf``. The Docker image accidentally shipped legacy
+ PyPDF2 3.x next to pypdf; Odoo prefers PyPDF2 when importable, and its
+ removed 1.x API (``numPages``/``getPage``) crashes multi-record PDF
+ printing with a ``DeprecationError`` (OP#1168). The fix is in
+ ``docker/Dockerfile`` (``--no-deps`` on the Odoo editable install);
+ this test fails on any image that regresses.
+
19.0.2.0.1
~~~~~~~~~~
diff --git a/spp_base_common/__manifest__.py b/spp_base_common/__manifest__.py
index a3dba3e53..09e67451d 100644
--- a/spp_base_common/__manifest__.py
+++ b/spp_base_common/__manifest__.py
@@ -5,7 +5,7 @@
{
"name": "OpenSPP Base (Common)",
"category": "OpenSPP/Core",
- "version": "19.0.2.0.1",
+ "version": "19.0.2.0.2",
"sequence": 1,
"author": "OpenSPP.org",
"website": "https://github.com/OpenSPP/OpenSPP2",
diff --git a/spp_base_common/readme/HISTORY.md b/spp_base_common/readme/HISTORY.md
index 44df7f972..2812444f2 100644
--- a/spp_base_common/readme/HISTORY.md
+++ b/spp_base_common/readme/HISTORY.md
@@ -1,3 +1,7 @@
+### 19.0.2.0.2
+
+- test: add a regression test guarding the PDF backend selected by `odoo.tools.pdf`. The Docker image accidentally shipped legacy PyPDF2 3.x next to pypdf; Odoo prefers PyPDF2 when importable, and its removed 1.x API (`numPages`/`getPage`) crashes multi-record PDF printing with a `DeprecationError` (OP#1168). The fix is in `docker/Dockerfile` (`--no-deps` on the Odoo editable install); this test fails on any image that regresses.
+
### 19.0.2.0.1
- fix(security): add `groups="base.group_system"` to the existing `` override in `views/main_view.xml`. Out of the box the Apps top-level menu has no group restriction and is visible to every logged-in user, violating the OP#951 audit's `Apps: no` rows. The override here is the single authoritative declaration for this menu's attributes in the OpenSPP install (sequence, custom OpenSPP icon, and now group_ids); doing the gating anywhere upstream (e.g. a `post_init_hook` in `spp_security`) is unreliable because this `