- test_blog_schedule._make_mock_llm_response set .text but not .body_html;
_create_blog_post writes body_html into blog.post.content. Odoo 14 rejects
the unset MagicMock ("can't adapt type 'MagicMock'") where 17 stringified it.
Set body_html/raw_text on the mock (fixes 6 TestBlogScheduleExecution tests).
- test_generation_uses_fewer_than_50_queries: Odoo 14 issues ~54 framework
queries vs 17's <50; raise the 14.0 budget to 60 (still catches N+1).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- views/blog_schedule_views.xml: web_ribbon invisible="active" (Odoo 17
bare-expr syntax) -> attrs="{'invisible': [('active','=',True)]}".
This was the view-validation error blocking module install on Odoo 14.
- tests: Odoo 14 TransactionCase exposes self.env in setUp(), not cls.env
in setUpClass() (that pattern is Odoo 15+). Converted all 13 setUpClass
blocks across 6 test files to setUp(self) + self.env/self.factory.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Restructure project files to follow the addon layout:
- Move models to addons/itsulu_blog_publisher/models/
- Move services (LLM providers, routers) to addons/itsulu_blog_publisher/services/
- Move wizards to addons/itsulu_blog_publisher/wizards/
- Move views (XML templates) to addons/itsulu_blog_publisher/views/
- Move data (cron, mail templates) to addons/itsulu_blog_publisher/data/
- Move security (ACL) to addons/itsulu_blog_publisher/security/
- Move tests and factories to addons/itsulu_blog_publisher/tests/
- Move BDD features to addons/itsulu_blog_publisher/features/
- Create __init__.py files for all Python packages
This enables proper Odoo module discovery and import structure.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>