samai_business_manager - Technical Schema
Technical Truth File - Exact specifications, no interpretation
Module Identification
Technical Name: samai_business_manager
Version: 18.0.4.0.0
Category: SAM AI/Business Units
License: LGPL-3
Application: True
Sequence: 1
Dependencies
'depends': [
'base',
'web',
]
Models
1. samai.business.unit
File: models/business_unit.py
| Field |
Type |
Description |
| name |
Char |
Business Unit name (required) |
| technical_name |
Char |
Technical identifier |
| sequence |
Integer |
Display order |
| is_enabled |
Boolean |
Visibility control |
| icon |
Char |
Menu icon class |
| description |
Text |
Business Unit description |
| menu_ids |
One2many |
Claimed menus |
| user_ids |
Many2many |
Assigned users |
| default_action_id |
Many2one |
Default landing action |
File: models/business_unit_menu.py
| Field |
Type |
Description |
| business_unit_id |
Many2one |
Parent Business Unit |
| menu_id |
Many2one |
Claimed ir.ui.menu |
| sequence |
Integer |
Display order |
| original_parent_id |
Many2one |
Original menu parent (for restoration) |
File: models/custom_menu.py
| Field |
Type |
Description |
| name |
Char |
Custom menu name |
| business_unit_id |
Many2one |
Parent Business Unit |
| menu_id |
Many2one |
Generated ir.ui.menu |
| variant_ids |
One2many |
Contact variants |
File: models/custom_menu.py
| Field |
Type |
Description |
| name |
Char |
Variant name (e.g., "Leads") |
| custom_menu_id |
Many2one |
Parent Custom Menu |
| domain |
Char |
Filter domain |
| action_id |
Many2one |
Generated window action |
File: models/ir_ui_menu.py
| Method |
Purpose |
| _load_menus_blacklist() |
Override to hide disabled Business Unit menus |
Wizards
samai.business.system.builder
File: wizard/system_builder.py
| Field |
Type |
Description |
| business_unit_ids |
Many2many |
Units to enable |
| mode |
Selection |
'enable' or 'disable' |
| Method |
Purpose |
| action_apply() |
Apply enable/disable changes |
Security
Groups
group_business_unit_user - Read-only access to Business Units
group_business_unit_admin - Full access to manage Business Units
Access Rules (ir.model.access.csv)
| Model |
User Access |
Admin Access |
| samai.business.unit |
Read |
Full |
| samai.business.unit.menu |
Read |
Full |
| samai.business.unit.custom.menu |
Read |
Full |
| samai.business.unit.contact.variant |
Read |
Full |
| samai.business.system.builder |
None |
Full (base.group_system) |
File: utils/platform_service.py
Enums
class PlatformType(Enum):
DOCKER = "docker"
WINDOWS = "windows"
LINUX = "linux"
MACOS = "macos"
UNKNOWN = "unknown"
Functions
| Function |
Parameters |
Returns |
Description |
get_platform_type() |
None |
PlatformType |
Detect current platform |
get_log_path(env=None) |
Optional env |
Path |
Platform-appropriate log directory |
restart_service(env=None) |
Optional env |
Tuple[bool, str] |
Restart Odoo service |
kill_odoo_processes() |
None |
Tuple[int, List[str]] |
Kill stale Odoo workers |
clear_odoo_logs(env=None) |
Optional env |
int |
Clear log files, return count |
is_docker() |
None |
bool |
Quick Docker detection |
get_data_dir(env=None) |
Optional env |
Path |
Odoo data directory |
1. Check /.dockerenv file exists → DOCKER
2. Check platform.system() == 'Windows' → WINDOWS
3. Check platform.system() == 'Darwin' → MACOS
4. Check platform.system() == 'Linux' → LINUX
5. Fallback → UNKNOWN
Assets
web.assets_backend
'web.assets_backend': [
'samai_business_manager/static/src/css/system_builder_modal.css',
'samai_business_manager/static/src/components/business_unit_selector/business_unit_selector.xml',
'samai_business_manager/static/src/components/business_unit_selector/business_unit_selector.js',
]
Data Files
| File |
Purpose |
data/business_units.xml |
Default Business Units (Sales, Accounting, HR, etc.) |
data/menu_claims.xml |
Initial menu → Business Unit assignments |
data/custom_menus.xml |
Contact variant templates |
security/security.xml |
Security groups definition |
Hooks
post_init_hook
File: __init__.py
def post_init_hook(cr, registry):
# Initialize default Business Units and menu claims
# Called after module installation
Views
| View |
Type |
Model |
| business_unit_tree |
Tree |
samai.business.unit |
| business_unit_form |
Form |
samai.business.unit |
| business_unit_kanban |
Kanban |
samai.business.unit |
| business_unit_menu_tree |
Tree |
samai.business.unit.menu |
| system_builder_form |
Form |
samai.business.system.builder |
| business_dashboard |
QWeb |
N/A (client action) |
Architecture Notes
v4.0 Consolidation
- Merged
samai_business_management into this module
- Single source of truth for Business Unit navigation
- Uses
_load_menus_blacklist() standard extension
- Menus hidden until Business Unit enabled
- No phantom menus in app switcher
v2.0 Navigation Change
- Removed parallel dropdown navigation (systray switcher)
- All navigation via native ir.ui.menu
- Scales to 10K+ users
Usage Examples
from odoo.addons.samai_business_manager.utils import platform_service
# Detect platform
platform = platform_service.get_platform_type()
# Get log path
log_path = platform_service.get_log_path()
# Restart service
success, message = platform_service.restart_service()
Enable Business Unit Programmatically
unit = env['samai.business.unit'].search([('technical_name', '=', 'sales')])
unit.is_enabled = True
env['ir.ui.menu'].clear_caches() # Refresh menu blacklist
Last Updated: 2025-01-26
Verified Against: manifest.py, security/ir.model.access.csv, models/*.py