addons-cm/docs/TEMPLATE_FIX_INDEX.md
snt 83b6cca09a [DOC] Add TEMPLATE_FIX_INDEX.md - Navigation guide for template fix documentation
Quick reference index for the website_sale_aplicoop template error fix:
- Links to detailed analysis (FIX_TEMPLATE_ERROR_SUMMARY.md)
- Links to best practices guide (QWEB_BEST_PRACTICES.md)
- One-page summary of problem, cause, and solution
- Quick reference cards for safe variable patterns
- Navigation structure for easy access to all fix-related docs

This file serves as the entry point for understanding the template fix
and accessing all related documentation in one place.
2026-02-16 23:11:27 +01:00

6.2 KiB

Template Error Fix - Complete Reference Index

Status: ✅ RESOLVED Module: website_sale_aplicoop v18.0.1.1.1 Date: 2026-02-16


📋 Problem & Solution

📚 Development Standards

  • Best Practices Guide: QWEB_BEST_PRACTICES.md
    • QWeb patterns and examples
    • Common pitfalls to avoid
    • Real-world code samples

🔧 Implementation Details

  • Modified File: website_templates.xml
    • Lines 1217-1224: Safe variable definitions
    • Template: eskaera_shop_products

📦 Git History

6fed863 [DOC] Add QWeb template best practices and error fix documentation
0a0cf5a [FIX] website_sale_aplicoop: Replace or operators with t-set safe variables
df57233 [FIX] website_sale_aplicoop: Fix NoneType error in eskaera_shop_products template

The Problem (Short Version)

Error: TypeError: 'NoneType' object is not callable

Cause: QWeb parsing of or operators in t-attf-* attributes fails when values are None

Example:

<!-- ❌ BROKEN -->
<form t-attf-data-price="{{ price1 or price2 or 0 }}">

The Solution (Short Version)

Pattern: Pre-compute safe values with t-set before using in attributes

Example:

<!-- ✅ FIXED -->
<t t-set="safe_price" t-value="price1 if price1 else (price2 if price2 else 0)"/>
<form t-attf-data-price="{{ safe_price }}">

Key Changes Summary

Aspect Before After
Pattern Inline or operators Pre-computed t-set
Error TypeError on None values Safe handling of None
Code lines 7 15
QWeb compatible ❌ No ✅ Yes
Testable ❌ Hard ✅ Easy

Files in This Series

  1. THIS FILE (TEMPLATE_FIX_INDEX.md)

    • Quick navigation and overview
    • Links to detailed documentation
    • Summary reference
  2. FIX_TEMPLATE_ERROR_SUMMARY.md

    • Complete analysis of the error
    • Step-by-step solution explanation
    • Verification and testing results
    • Debugging information
  3. QWEB_BEST_PRACTICES.md

    • QWeb template development guide
    • 3 None-safety patterns with examples
    • 3 Variable computation patterns
    • Common pitfalls and solutions
    • Real-world code examples
    • Summary reference table

When to Use Each Document

📋 Read FIX_TEMPLATE_ERROR_SUMMARY.md if:

  • You want to understand what the problem was
  • You need to verify the fix is applied
  • You're debugging similar template errors
  • You want the full error-to-solution journey

📚 Read QWEB_BEST_PRACTICES.md if:

  • You're writing new QWeb templates
  • You want to avoid similar issues in future
  • You need QWeb patterns and examples
  • You're doing code review of templates
  • You want to improve template code quality

🔧 Read template file directly if:

  • You need to modify the fixed code
  • You want to see the exact syntax
  • You're learning from working code

One-Page Summary

The Error

Traceback (most recent call last):
  File "...", line XX, in ...
    ValueError: TypeError: 'NoneType' object is not callable
  eskaera_shop_products template at line ...

The Root Cause

QWeb's t-attf-* (template attribute) directives evaluate expressions in a way that doesn't handle chained or operators well when values are None.

The Fix

Replace inline operators with pre-computed safe variables using t-set:

<!-- Before (broken) -->
<form t-attf-data-price="{{ price1 or price2 or 0 }}"/>

<!-- After (fixed) -->
<t t-set="safe_price" t-value="price1 if price1 else (price2 if price2 else 0)"/>
<form t-attf-data-price="{{ safe_price }}"/>

The Result

✅ Template loads without errors ✅ All tests passing ✅ Safe pattern documented ✅ Best practices established


Quick Reference Cards

Safe Variable Pattern

<t t-set="variable_name"
   t-value="preferred_value if preferred_value else fallback_value"/>

Safe Nested Access

<t t-set="safe_value"
   t-value="obj.nested.value if (obj and obj.nested) else default"/>

Safe Chained Fallback

<t t-set="safe_value"
   t-value="val1 if val1 else (val2 if val2 else (val3 if val3 else default))"/>

Testing the Fix

Verification Steps

  1. Module loads without parsing errors ✅
  2. Template compiles in ir.ui.view ✅
  3. Safe variables are present ✅
  4. All 85 unit tests pass ✅
  5. Docker services stable ✅

How to Re-verify

# Check template in database
docker-compose exec -T odoo odoo shell -d odoo -c /etc/odoo/odoo.conf << 'SHELL'
template = env['ir.ui.view'].search([('name', '=', 'Eskaera Shop Products')])
print('safe_display_price' in template.arch)  # Should print True
SHELL

Common Questions

Q: Why not just fix the template in code? A: We did - that's the fix! But the pattern is important for preventing future issues.

Q: Can I use this pattern in other templates? A: Yes! This is now the standard pattern for all Odoo templates in this project.

Q: What if I need more complex logic? A: You can chain multiple t-set statements, each computing one safe variable.

Q: Does this impact performance? A: No - t-set is evaluated once during template compilation, not on each render.



Navigation

docs/
├── TEMPLATE_FIX_INDEX.md (YOU ARE HERE)
├── FIX_TEMPLATE_ERROR_SUMMARY.md (Complete analysis)
├── QWEB_BEST_PRACTICES.md (Development guide)
├── README.md (Project documentation index)
└── ... (other documentation)

Last Updated: 2026-02-16 Status: ✅ Production Ready Version: Odoo 18.0.20251208