Generate DocType Controller
Create document controller classes with lifecycle methods following Frappe patterns.
When to Use
- Need business logic for DocType
- Want lifecycle hooks (validate, before_insert, etc.)
- Prefer class-based controllers
- Need reusable methods
Core Patterns
1. Controller Structure
from frappe_microservice.controller import DocumentController
import frappe
class SalesOrder(DocumentController):
def validate(self):
if not self.customer:
self.throw("Customer is required")
self.calculate_total()
def before_insert(self):
if not self.status:
self.status = 'Draft'
if not self.transaction_date:
self.transaction_date = frappe.utils.today()
def after_insert(self):
self.send_order_notification()
def calculate_total(self):
self.grand_total = sum(item.amount for item in self.items) if self.items else 0
2. Register Controller
from frappe_microservice.controller import setup_controllers
app = create_microservice("my-service")
setup_controllers(app, controllers_directory="./controllers")
3. Lifecycle Methods
Available: before_validate, validate, before_insert, after_insert, before_update, after_update, before_save, after_save, before_delete, on_trash, on_cancel, on_submit
4. Helper Methods
self.throw(message)- Raise validation errorself.get(field, default=None)- Get field valueself.set(field, value)- Set field valueself.has_value_changed(fieldname)- Check if changedself.get_value_before_save(fieldname)- Get old value
Key Patterns
- Validation: Use
validate()for business rules - Defaults: Set in
before_insert() - Notifications: Send in
after_insert()orafter_update() - Calculations: Create reusable methods
- Error Handling: Use
self.throw()for validation errors
File Naming
- File:
sales_order.py→ Class:SalesOrder→ DocType:Sales Order
Remember: This skill is model-invoked. Claude will use it autonomously when detecting controller development needs.