Blog
-
Security & Access Control
Multi-Company in Odoo: company_id, allowed_company_ids, and the Cross-Company Contamination Bug
6 min readA user logged into two companies at once can accidentally put company B's product on a company A sales order — unless the model's relational fields are explicitly told to check. Three distinct mechanisms, each solving a different multi-company problem.
-
Module Development
ir.sequence: Generating Reference Numbers Without Two Orders Getting the Same Number
5 min readOdoo's default sequence implementation is fast because it's built on a PostgreSQL SEQUENCE — which also means a rolled-back transaction can leave a permanent gap. The 'no gap' alternative trades that guarantee for real table locks.
-
Module Development
_inherit vs _inherits in Odoo: Same Table or a New One With a Hidden Foreign Key
5 min read_inherit adds fields to a model's existing table. _inherits creates a genuinely new model that transparently proxies another one's fields through an auto-generated many2one. Confusing them shows up as a field that mysteriously lives on the wrong table.
-
Module Development
The Odoo CSV Import Trick That Makes Re-Importing the Same File Safe
6 min readAdd an 'id' (External ID) column to an import file and Odoo updates existing records instead of duplicating them on the next run — the same mechanism external IDs use everywhere else, applied to bulk data loading.
-
Security & Access Control
Why Checking One Box in Odoo's Users Screen Grants Three Groups at Once
5 min readres.groups has its own inheritance mechanism — implied_ids — separate from access rights or record rules. It's why enabling one permission checkbox silently grants others, and why removing a group later doesn't always take back what it implied.
-
QWeb & Reports
QWeb's t-foreach Loop Variables, and the Three That Are Quietly Deprecated
5 min readline_index, line_size, line_first, line_last — every t-foreach loop gets a full set of automatic variables beyond the item itself. Three of the most commonly copy-pasted ones (_odd, _even, _parity) are deprecated.
-
Module Development
Where Did That Record Go? Odoo's active Field and the Searches That Silently Skip It
5 min readA record with active=False isn't deleted — it's just invisible to every default search, including yours. No error, no warning, just an empty result where a row used to be.
-
Module Development
Computed Fields in Odoo: store=True, @api.depends, and Why a Value Goes Stale
5 min readA computed field only recomputes when a field actually listed in @api.depends changes. Miss one — especially a path through a relation — and the value silently stops updating, with no error at all.
-
Integrations & API
How Odoo's External API Authentication Actually Works (XML-RPC and JSON-RPC)
6 min readauthenticate() doesn't start a session — it hands back a plain uid you resend, in full, on every single call after it. Understanding that shapes how any external integration against Odoo should actually be built.
-
Module Development
One2many vs Many2many in Odoo: Why One Needs a Field the Other Doesn't
6 min readA one2many is a view into a many2one that already exists elsewhere — it creates no column of its own. A many2many creates and owns a real junction table. Picking the wrong one shows up as a field that mysteriously won't save.
-
QWeb & Reports
Why Your Odoo Report Shows the Wrong Currency (and How the Monetary Widget Actually Decides)
6 min readA monetary field with no explicit display_currency doesn't error — it silently falls back to the company's currency. On a multi-currency document, that's precisely the wrong number with a confident-looking format.
-
Security & Access Control
sudo(), with_context(), and with_user(): Odoo's Three Environment Modifiers, Not Interchangeable
6 min readsudo() bypasses access rights and record rules. with_user() actually changes who's performing the action. with_context() changes neither — it just passes extra metadata. Mixing them up causes real security and data bugs.
-
Module Development
A Practical Checklist to Ship Your First Odoo Module to Production
7 min readEverything worth double-checking before a custom Odoo module goes live, in the order it actually bites people — manifest and dependencies, security, views and reports, and what changes once real users depend on it.
-
Deployment & Operations
Why Odoo Scheduled Actions Don't Run At All (It's Usually the Server, Not the Cron Job)
7 min readBefore touching nextcall, doall, or numbercall, rule out the two server-level reasons Odoo's cron worker never picks up any job at all — they produce the exact same symptom and have nothing to do with the job's own configuration.
-
Module Development
The Odoo __manifest__.py File, Key by Key
8 min readEvery real key __manifest__.py accepts, what each one actually controls, and the one ordering mistake in `data` that breaks an install in a confusing way.
-
Security & Access Control
Why Can't This User See a Record They Should? Odoo's Three Layers of Access Control, Explained
12 min readA user swears the record exists. You can see it fine. They can not. Here is exactly which of Odoo access rights, record rules, or field security is blocking them, and how to check each one in order.
-
Announcements
Welcome to IrKit
1 min readA quick intro to the hub of free micro-tools for Odoo developers, starting with the Domain Filter Builder.