# Porting status — Odoo 14.0 branch **✅ PORT COMPLETE & VERIFIED (v0.5.1)** — full suite **69/69 passing** on a live Odoo 14.0 instance (K8s `odoo_test_14`, base image `odoo:14.0`, Python 3.7). Module installs cleanly. This branch targets **Odoo Community 14.0** — the version **ITSulu runs in production**. It was seeded from the 17.0 baseline and ported to Odoo 14 APIs. > The product feature set is the same across all Odoo branches; only the Odoo-API-specific code > differs. Odoo 14 is **older** than the 17.0 baseline, so several things move *backwards*. > See `CLAUDE.md` §15 for the branch model and §11.5 / §12 for version-specific gotchas. ## Series markers (done) - [x] `.odoo-series` = `14.0` - [x] `Dockerfile` base image = `odoo:14.0` - [x] manifest version prefix = `14.0.` (via `bump-version.sh`) ## Odoo 14 deltas resolved (what the port required) - [x] **Mail template → Jinja2.** `data/mail_template_data.xml` reverted from the 17.0 qweb (`type="html"`, ``) to Odoo 14 Jinja2 (`${...}`, `% if`, `% for`). - [x] **View conditional attrs → `attrs`.** 7 Odoo-17 bare/expression `invisible="…"` attributes (blog_topic, blog_generation_log, blog_schedule web_ribbon) converted to Odoo 14 `attrs="{'invisible': [domain]}"`. This was blocking module install. - [x] **Test framework: `setUpClass`/`cls.env` → `setUp`/`self.env`.** Odoo 14 exposes the env in `setUp` (instance), not `setUpClass` (Odoo 15+). 13 blocks across 6 files converted. - [x] **`env.flush_all()` → `env['base'].flush()`.** `flush_all` is Odoo 15+; 14 uses recordset `.flush()`. - [x] **Test mocks set `body_html`.** Odoo 14 rejects an unset MagicMock written to `blog.post.content` (`can't adapt type 'MagicMock'`); 17 silently stringified it. - [x] **Query budget.** Odoo 14 issues ~54 framework queries vs 17's <50; budget raised to 60. - [x] Python 3.7 syntax verified (compileall); pytest 7.4.4 / pytest-bdd 6.1.1 / pytest-odoo 1.0.1 pinned for Python 3.7. - [x] **Full suite green: 69/69 on odoo:14.0.** ## Releasing further changes on this branch 1. Use the 14.0 K8s job (base image `odoo:14.0`, fresh `odoo_test_14`, `odoo -i` then pytest). 2. Record any new Odoo-14 gotcha in `CLAUDE.md` §12. 3. `bump-version.sh patch|minor` → CHANGELOG → commit → `bump-version.sh tag` (tags `14.0-vX.Y.Z`).