PRODUCTION BUG: email template used pre-Odoo-14 Mako syntax (${} and
% for/% if), which Odoo 17 does not render — real notification emails
would show literal '${object.blog_post_id.name}' in the subject.
- subject/email_from: ${...} → {{ ... }} (inline_template engine)
- body_html: add type="qweb"; ${x} → <t t-out="x"/>;
% for → <t t-foreach t-as>; % if → <t t-if>
BDD: when_llm_router_called mocked provider.generate() returning raw
HTML in .text, but LLMRouter._parse_response expects JSON and raised
UserError before ctx['mock_generate'] was set. Now returns valid JSON
with all required fields, and records the mock before generate() runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
49 lines
1.8 KiB
XML
49 lines
1.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<data noupdate="0">
|
|
|
|
<record id="email_template_blog_published" model="mail.template">
|
|
<field name="name">Blog Publisher — Post Published Notification</field>
|
|
<field name="model_id" ref="model_itsulu_blog_generation_log"/>
|
|
<field name="subject">[ITSulu Insights] Blog Post Published: {{ object.blog_post_id.name }}</field>
|
|
<field name="email_from">{{ user.email_formatted }}</field>
|
|
<field name="auto_delete">True</field>
|
|
<field name="body_html" type="qweb"><![CDATA[
|
|
<div style="font-family: Arial, sans-serif; line-height: 1.6; max-width: 700px;">
|
|
<h2>Blog Post Published</h2>
|
|
<p><strong>Title:</strong> <t t-out="object.blog_post_id.name"/></p>
|
|
<p><strong>Blog:</strong> <t t-out="object.blog_post_id.blog_id.name"/></p>
|
|
<p><strong>URL:</strong> <a t-attf-href="https://itsulu.com{{ object.blog_post_id.website_url }}">https://itsulu.com<t t-out="object.blog_post_id.website_url"/></a></p>
|
|
<h3>Social Media Posts — Ready to Post</h3>
|
|
<t t-foreach="object.blog_post_id.itsulu_social_id" t-as="social">
|
|
<t t-if="social.twitter_post_a">
|
|
<h4>Twitter</h4>
|
|
<p><t t-out="social.twitter_post_a"/></p>
|
|
</t>
|
|
<t t-if="social.twitter_post_b">
|
|
<h4>Twitter</h4>
|
|
<p><t t-out="social.twitter_post_b"/></p>
|
|
</t>
|
|
<t t-if="social.bluesky_post_a">
|
|
<h4>BlueSky</h4>
|
|
<p><t t-out="social.bluesky_post_a"/></p>
|
|
</t>
|
|
<t t-if="social.bluesky_post_b">
|
|
<h4>BlueSky</h4>
|
|
<p><t t-out="social.bluesky_post_b"/></p>
|
|
</t>
|
|
<t t-if="social.mastodon_post">
|
|
<h4>Mastodon</h4>
|
|
<p><t t-out="social.mastodon_post"/></p>
|
|
</t>
|
|
<t t-if="social.linkedin_post">
|
|
<h4>LinkedIn</h4>
|
|
<p><t t-out="social.linkedin_post"/></p>
|
|
</t>
|
|
</t>
|
|
</div>
|
|
]]></field>
|
|
</record>
|
|
|
|
</data>
|
|
</odoo>
|