Engagements Cookbook
Tutorial business app for custom-module authors in sumeru_custom_addons/addons/engagement_cookbook/. Models a client engagements practice while teaching widgets, views, depends, model inherit, view xpath inherit, and event bridges.
Scaffold vs cookbook
make new MODULE=x | engagement_cookbook | |
|---|---|---|
| Models | 1 stub | 6 business models + partner inherit |
| Views | list, form, kanban | All 10 view types + search |
| Depends | base | base, contacts, hr, mail |
| Use when | Starting production work | Learning full addon patterns |
Get it running
From sumeru_custom_addons/:
make setupmake install MODULES=engagement_cookbookmake runOpen Engagements Cookbook in the launcher. Demo engagements, deliverables, milestones, sites, and partners load from data/demo.xml.
Models
| Model | Business role |
|---|---|
engagement.project | Client engagement — workflow, budget, relations, chatter |
engagement.deliverable | Billable lines (line_total computed) |
engagement.milestone | Calendar + gantt milestones |
engagement.site | Map markers linked to projects |
engagement.tag | Labels (M2M on projects) |
engagement.service.line | Consulting / implementation / support |
Partner inherit: PartnerEngagement extends core.partner with engagement_tier and strategic_account (models/partner_extend.go).
Module dependencies
| Module | Purpose |
|---|---|
base | Companies, users, partners, security |
contacts | Partner UI + view inherit parent |
hr | Lead consultant on engagements |
mail | Chatter on engagement form |
Menus
| Section | Menu | View modes |
|---|---|---|
| Operations → Engagements | action_engagement_project | kanban, list, form, calendar, gantt |
| Operations → Deliverables | action_engagement_deliverable | list, form |
| Planning → Milestones | action_engagement_milestone | calendar, gantt, list, form |
| Planning → Client sites | action_engagement_site | map, list, form |
| Analytics → Engagement analysis | action_engagement_analysis | graph, pivot, cohort, list |
| Clients → Contacts (extended) | action_engagement_contacts | list, form, kanban |
| Configuration | Tags, Service lines, About | manager |
Inheritance examples
Model inherit
PartnerEngagement in models/partner_extend.go:
type PartnerEngagement struct { sdk.Model `sumeru:"inherit=core.partner"` EngagementTier sdk.Selection[EngagementTier] `sumeru:"string=Engagement Tier,default=standard"` StrategicAccount sdk.Boolean `sumeru:"string=Strategic Account,default=false"`}Run make generate then -u engagement_cookbook so schema sync adds columns to core_partner.
See also: kernel demo in sumeru/addons/contacts/models/partner_extend.go and Model inherit how-to.
View inherit
views/partner_inherit_views.xml xpath on contacts.view_core_partner_form:
<record id="view_engagement_partner_inherit" model="sys.view">
<field name="inherit_id" ref="contacts.view_core_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='phone']" position="after">
<field name="engagement_tier" string="Engagement Tier"/>
<field name="strategic_account" string="Strategic Account"/>
</xpath>
</field>
</record>Event bridge
hooks.go promotes client tier when a project reaches done:
func init() {
event.Subscribe("record.updated", onProjectDoneUpdatePartner)
}See sale_crm in sumeru_addons for production bridge modules.
View-type file map
| Type | File |
|---|---|
| list / form / kanban / search / graph / pivot / calendar / gantt / cohort | views/*_view.xml |
| milestones | views/event_views.xml |
| map | views/place_views.xml |
| deliverables | views/line_views.xml |
| partner inherit | views/partner_inherit_views.xml |
Cross-module relations
After changing depends or typed relations:
make generatemake update MODULES=engagement_cookbook