itsulu-blog-publisher/PORTING.md
Nicholas Riegel d0e974a25b port(14.0): mail template -> Jinja2, view attrs -> Odoo 14 domains
First static porting pass for the Odoo 14.0 branch:
- data/mail_template_data.xml: revert from 17.0 qweb (type="html",
  <t t-out>) to Odoo 14 Jinja2 (${...}, % if, % for)
- views: convert 6 Odoo-17-style invisible="state == '...'" attributes
  to Odoo 14 attrs="{'invisible': [domain]}" (blog_topic, blog_generation_log)
- PORTING.md: tick completed items, note remaining (data-test-id RNG,
  blog.post.content on 14, pytest pinning for Py3.7)

Static pass only — not yet verified on a live Odoo 14 instance.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 11:31:11 -04:00

2.5 KiB

Porting status — Odoo 14.0 branch

This branch targets Odoo Community 14.0 — the version ITSulu runs in production. It was seeded from the 17.0 baseline and the Odoo-14 porting is tracked here. Until every item is verified, treat this branch as work in progress — do not deploy to the production 14.0 instance unverified.

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)

  • .odoo-series = 14.0
  • Dockerfile base image = odoo:14.0
  • manifest version prefix = 14.0. (via bump-version.sh)

API porting checklist (verify on a real Odoo 14.0 instance)

  • Mail template syntax — reverted to Jinja2. data/mail_template_data.xml restored to Odoo 14's Jinja2 (${...}, % if, % for) instead of the 17.0 qweb type="html".
  • View conditional attributes → attrs. Converted the 6 Odoo-17-style invisible="state == '…'" attributes (blog_topic, blog_generation_log) to Odoo 14 attrs="{'invisible': [domain]}".
  • [~] Mail render API. Odoo 14 _render_field(field, res_ids, engine='jinja') exists — the tests' _render_field('subject', [id]) should work now that the template is Jinja. Verify live.
  • [~] Python: 'ImageResult | None' in image_router.py is a quoted (3.7-safe) annotation; no walrus / 3.9 subscript generics found.
  • data-test-id attributes in views — confirm Odoo 14 RNG accepts them (Playwright-only; may need removal/guarding on 14).
  • blog.post body field name on 14.0 (the 17.0 baseline writes content — confirm 14.0).
  • @api.model_create_multi, name_get, and other ORM signatures valid on 14.0.
  • ir.cron + mail data XML formats.
  • pytest / pytest-odoo / pytest-bdd versions compatible with odoo:14.0's Python 3.7.
  • Full test suite green on a 14.0 template DB (K8s job, §8, base image odoo:14.0).

How to work this branch

  1. Stand up a 14.0 template DB (mirror §8, base image odoo:14.0).
  2. Start with the mail template (Jinja revert) and the render API — those are the biggest deltas.
  3. Run the suite, fix one Odoo-API difference at a time.
  4. Record each gotcha in CLAUDE.md §12 tagged with the series.
  5. When green, cut a release on this branch (bump-version.sh → tag 14.0-vX.Y.Z).