| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Invoicing (account) |
| Lines of code | 2389 |
| Technical Name |
us_doc_gen |
| License | OPL-1 |
| Website | https://unitsoft.ca |
| Versions | 17.0 18.0 19.0 |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Invoicing (account) |
| Lines of code | 2389 |
| Technical Name |
us_doc_gen |
| License | OPL-1 |
| Website | https://unitsoft.ca |
| Versions | 17.0 18.0 19.0 |
Unitsoft Document Generator
Generate professional DOCX contracts, invoices and reports directly from any Odoo record
Key Features
DOCX Templates with Jinja2
Upload any DOCX file as a template. Use familiar {{ o.field_name }} placeholders to insert data. Supports loops for line items, conditionals, and rich formatting.
Zero-Code Model Registration
Enable document generation for any Odoo model in 30 seconds. Just pick the model from a dropdown — the system auto-creates action menu entries and stat buttons on the form view.
Field Explorer
Built-in wizard that introspects any model and lists every available field with its Jinja2 tag, data type, and live example value. Copy-paste into your template — no need to read code.
Lenient Rendering
Undefined variables render as empty text — never crash your generation. False and None values are cleaned up automatically. Warnings are shown, document is always produced.
DOCX Preview
Preview generated documents directly in the browser without downloading. Powered by docx-preview.js — see your result instantly.
Document Lifecycle
Track every generated document with Draft / Sent / Signed status flow. Full chatter support with mail tracking. Link back to the source record at any time.
How It Works
| 1 |
Register a model Go to Document Generator → Configuration → Registered Models, pick crm.lead, account.move, or any model. Done — "Generate Document" now appears in the Action menu.
|
| 2 |
Create a DOCX template Design your document in Microsoft Word or LibreOffice. Insert placeholders like {{ o.name }}, {{ o.partner_id.name }}. Use the Field Explorer to discover all available fields.
|
| 3 |
Upload the template Go to Document Generator → Configuration → Templates, create a new template, select the target model, and upload your DOCX file. |
| 4 |
Generate! Open any record of that model → click Generate Doc stat button or Action → Generate Document → pick a template → download your document. That's it. |
Two Ways to Connect a Model
| Auto-Registration (No Code) | Python Mixin (Rich Context) | |
|---|---|---|
| Setup | Pick model from dropdown in UI | Inherit us.doc.mixin in Python |
| Template syntax | {{ o.field_name }} |
{{ custom_variable }} |
| Available data | All model fields via o |
Custom context dict from _prepare_doc_context() |
| Line items | {%tr for line in o.order_line %} |
{%tr for line in lines %} (pre-formatted) |
| Stat buttons | Auto-injected via OWL widget | Built into the mixin XML |
| Best for | Quick setup, simple documents | Complex documents, computed fields |
Template Syntax Quick Reference
| What | Syntax |
|---|---|
| Simple field | {{ o.name }} |
| Related field | {{ o.partner_id.name }} |
| Format date | {{ fmt_date(o.date_order) }} |
| Selection label | {{ sel_label(o, 'state') }} |
| Conditional | {%p if o.note %}{{ o.note }}{%p endif %} |
| Table row loop | {%tr for line in o.order_line %}...{%tr endfor %} |
| Default value | {{ o.phone or 'N/A' }} |
| Company info | {{ company.name }} |
| Current date | {{ fmt_date(today) }} |
| Current user | {{ user.name }} |
Universal Context Variables
Available in every template without any Python code
| Variable | Type | Description |
|---|---|---|
o | Recordset | The source record (also available as object and record) |
company | Recordset | Current company (res.company) |
user | Recordset | Current user (res.users) |
today | date | Today's date |
now | datetime | Current date and time |
fmt_date(val) | function | Format date as DD.MM.YYYY (customizable) |
sel_label(rec, field) | function | Get human-readable label for a selection field |
Field Explorer
Don't know which fields are available? Open the Field Explorer from any template form. It introspects the target model and shows:
- Every available field with its ready-to-use
{{ tag }} - Data type for each field (Char, Date, Many2one, etc.)
- Live example values from a real record
- Related model fields (one level deep)
- Loop syntax examples for One2many/Many2many fields
- Downloadable reference document with all placeholders
Pre-Built Sale Order Context
The module ships with a rich, pre-built context for Sale Orders via the Python mixin. Beyond simple field access, it provides:
- Pre-formatted lines —
lineslist withn,product,quantity,price_unit,subtotal,total, and more - Customer data —
customer_name,customer_street,customer_vat,customer_email, etc. - Shipping address —
shipping_name,shipping_street,shipping_city, etc. - Company data —
company_name,company_vat,company_street, etc. - Amounts —
amount_untaxed,amount_tax,amount_total,currency_symbol - Payment terms, salesperson info, tags, marketing sources
Want the same level of detail for another model? Implement _prepare_doc_context()
on your model for full control over the template context.
Technical Details
Requirements
- Odoo 18.0 Community or Enterprise
- Python package:
docxtpl(pip install docxtpl) - Depends: base, mail, sale, account
Models
us.doc.template— Template storage and renderingus.doc.generated— Generated documents with lifecycle trackingus.doc.model.registration— No-code model enablementus.doc.mixin— Abstract mixin for Python integrationus.doc.generate.wizard— Generation wizardus.doc.field.explorer.wizard— Field discovery tool
Rendering Engine
- Powered by docxtpl + Jinja2
- Full Jinja2 syntax: variables, loops, conditionals, filters
- Special docxtpl tags:
{%tr(table rows),{%p(paragraphs) - Lenient mode: undefined variables → empty (no crash)
- Auto-cleanup:
False/None→ empty string - Warnings shown as sticky notification after generation
Security
- Templates: read for all users, edit for administrators
- Generated documents: create/read/write for users, full access for admins
- Model registration: admin-only
- Multi-company support
Changelog
v18.0.1.0.0
- Initial release for Odoo 18
- DOCX template upload and Jinja2 rendering
- Sale Order mixin with rich pre-built context (60+ variables)
- Zero-code model registration (auto-creates actions and stat buttons)
- Universal template context (
{{ o.field_name }}for any model) - Field Explorer wizard with live introspection and reference generation
- Lenient rendering (undefined variables → empty, not crash)
- DOCX preview in browser (docx-preview.js)
- Document lifecycle tracking (Draft / Sent / Signed)
- Full chatter support (mail.thread)
- Multi-company support
Support
Need help? Have a feature request?
unitsoft.ca support@unitsoft.ca
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module