Hey everyone,
With the release of Frappe v16, I wanted to highlight what I think is one of the most underrated but impactful architectural improvements: the introduction of extend_doctype_class.
The Pain Point: The “Override War”
Until now, we’ve relied heavily on override_doctype_class via hooks.py. While powerful, it had a major flaw in multi-app environments. If App A and App B both tried to override Sales Invoice, the last one in installaed apps would win, completely wiping out the other’s logic.
Maintaining custom apps across updates often felt like a balancing act—one core update or app installation could break your entire inheritance chain.
The v16 Solution: Mixins and Stacking
The new extend_doctype_class allows us to add methods, properties, and validations as mixins.
Why this is a massive upgrade:
-
Non-Destructive: You aren’t replacing the core class; you are extending it.
-
Stackable: Multiple apps can now extend the same DocType. Frappe handles the stacking based on the app installation order.
-
Cleaner Code: It encourages a mixin-based approach which is much more Pythonic and easier to unit test.
Real-World Impact
For those of us managing complex ERPNext deployments with 5+ custom apps, this finally makes the system feel “pluggable” without the fear of internal collisions. It’s a huge step toward making Frappe a more robust enterprise framework.
