Odoo Tracker
Learning, research, implementation logs, bug fixes and module practice from the phase markdown roadmap.
Phase {activePhase.number} - {activePhase.title}
{activePhase.goal}
/* Odoo learning and implementation tracker */
const ODOO_TRACKER_STORAGE_KEY = 'ppt-odoo-tracker-v1';
const ODOO_SITE_FONT = "var(--ui-font)";
const ODOO_PHASES = [
{
id: 'phase-01-concepts',
number: '01',
title: 'Odoo Core Concepts',
source: 'odoo/phase_01_odoo_core_concepts.md',
color: '#38BDF8',
goal: 'Track which Odoo concepts are understood and which ones have been practiced in a real module.',
focus: ['Apps / Modules', 'Addons Path', 'Database', 'Models', 'Fields', 'ORM', 'Views', 'Actions', 'Menus', 'Security', 'Record Rules'],
tasks: [
'Learn - Apps, modules, addons path and how Odoo loads custom code',
'Learn - Database, company, user, group and basic system settings',
'Learn - Model, record, field types and relationships',
'Learn - ORM basics: create, search, browse, write, unlink and env',
'Learn - Views: list, form, search, kanban and view inheritance',
'Learn - Actions, menus and how users open a screen',
'Learn - Security: access rights, groups and record rules',
'Do - Read a core module such as sale, purchase, stock or account',
'Do - Create concept notes with one small code/example per concept',
'Do - Map one flow from menu to action to view to model to database table',
'Do - Setup custom module furniture_work_order for simple furniture production orders',
],
},
{
id: 'phase-02',
number: '02',
title: 'Builder: Content System & CRUD',
source: 'odoo/phase_02_content_system.md',
color: '#F5B96B',
goal: 'Turn static notes into real data management with create, edit, delete, search, filter and storage.',
focus: ['CRUD Concepts', 'CRUD Modules', 'CRUD Logs', 'CRUD Bugs', 'CRUD Snippets', 'CRUD Projects', 'Search / Filter', 'Data Relationships'],
tasks: [
'Choose local-first or cloud-friendly storage',
'Create content schema for concepts and modules',
'Add CRUD for concepts',
'Add CRUD for modules',
'Add CRUD for implementation logs',
'Add CRUD for bug and fix notes',
'Add CRUD for code snippets',
'Add CRUD for projects and labs',
'Add global search and filters',
'Build dashboard metrics from real data',
],
},
{
id: 'phase-03',
number: '03',
title: 'Power User: Research System',
source: 'odoo/phase_03_odoo_power_tracker.md',
color: '#A855F7',
goal: 'Make the tracker useful for real Odoo research, implementation decisions, debugging and weekly review.',
focus: ['Research Notes', 'Decision Log', 'Version Notes', 'Dependency Map', 'Checklist Templates', 'Learning Score', 'Weekly Review'],
tasks: [
'Create research notes entity',
'Create decision log entity',
'Track Odoo version differences',
'Create module dependency map',
'Create reusable checklist templates',
'Calculate learning score',
'Create weekly review page',
'Show open research questions',
'Show recent decisions and active implementation tasks',
],
},
{
id: 'phase-04',
number: '04',
title: 'Hero: Knowledge Platform',
source: 'odoo/phase_04_hero_platform.md',
color: '#22C55E',
goal: 'Turn Odoo Tracker into a production-ready personal platform and portfolio proof.',
focus: ['Production UI', 'Import / Export', 'Backup', 'AI Prompt Library', 'AI Context Export', 'Portfolio Mode', 'Analytics', 'Tags', 'Deployment Docs', 'Privacy'],
tasks: [
'Polish production-ready UI',
'Add import and export',
'Add manual backup system',
'Create AI prompt library',
'Create AI-ready context export',
'Create portfolio mode with public/private flags',
'Add analytics charts',
'Upgrade shared tag system',
'Write deployment docs',
'Add security and privacy controls',
],
},
];
const ODOO_ROADMAP_LEVELS = [
{ title: 'Level 1 - Odoo Basics', items: ['Docker install', 'Apps / Modules', 'PostgreSQL', 'addons path', 'model / field / view basics'] },
{ title: 'Level 2 - Custom Module Basics', items: ['scaffold', '__manifest__.py', 'model', 'tree view', 'form view', 'menu / action', 'access rights'] },
{ title: 'Level 3 - Business Modules', items: ['Sales', 'Purchase', 'Inventory', 'Manufacturing', 'Accounting basics'] },
{ title: 'Level 4 - Advanced Customization', items: ['model inheritance', 'XPath view inheritance', 'computed fields', 'onchange', 'constraints', 'record rules', 'QWeb report'] },
{ title: 'Level 5 - Deployment & Real Use', items: ['Docker Compose', 'PostgreSQL backup', 'Caddy reverse proxy', 'custom addons deployment', 'staging / production workflow'] },
];
const ODOO_STATUS_OPTIONS = [
{ value: 'Planned', label: 'Planned', icon: 'M12 6v6l4 2M21 12a9 9 0 11-2.6-6.4M21 4v6h-6', color: '#F59E0B', bg: 'rgba(245,158,11,0.13)' },
{ value: 'Doing', label: 'Doing', icon: 'M4 12h5l2-7 2 14 2-7h5', color: '#38BDF8', bg: 'rgba(56,189,248,0.13)' },
{ value: 'Done', label: 'Done', icon: 'M5 12l4 4L19 6', color: '#22C55E', bg: 'rgba(34,197,94,0.13)' },
{ value: 'Blocked', label: 'Blocked', icon: 'M12 9v4M12 17h.01M10.3 4.3L2.8 18a2 2 0 001.7 3h15a2 2 0 001.7-3L13.7 4.3a2 2 0 00-3.4 0z', color: '#EF4444', bg: 'rgba(239,68,68,0.13)' },
];
const ODOO_BEGINNER_PRACTICES = [
{
id: 'practice-furniture-work-order',
phaseId: 'phase-01-concepts',
title: 'Practice 01 - Furniture Work Order Module',
level: 'Beginner',
moduleName: 'furniture_work_order',
outcome: 'Create one installable module to track simple furniture production orders in a factory.',
files: [
'custom_addons/furniture_work_order/__manifest__.py',
'custom_addons/furniture_work_order/models/work_order.py',
'custom_addons/furniture_work_order/views/work_order_views.xml',
'custom_addons/furniture_work_order/security/ir.model.access.csv',
],
steps: [
'Create custom_addons/furniture_work_order with models, views and security folders.',
'Add __manifest__.py so Odoo can detect the module.',
'Create model furniture.work.order with product, customer, quantity, deadline and state fields.',
'Add ir.model.access.csv so normal users can read and edit records.',
'Add list/form views, action and menu item for work orders.',
'Restart Odoo, update Apps List, install furniture_work_order and create one work order.',
],
commands: [
'mkdir -p custom_addons/furniture_work_order/{models,views,security}',
'touch custom_addons/furniture_work_order/__init__.py custom_addons/furniture_work_order/models/__init__.py',
'./odoo-bin -d odoo_dev -u furniture_work_order --addons-path=addons,custom_addons',
],
checks: [
'Apps can find module furniture_work_order.',
'Menu Furniture Work Orders opens without access error.',
'You can create a work order for a table, chair, cabinet or custom item.',
'You can move the work order from Draft to In Progress or Done.',
'The database has a table named furniture_work_order.',
],
starterCode: `# __manifest__.py
{
'name': 'Furniture Work Order Practice',
'version': '1.0',
'category': 'Manufacturing',
'summary': 'Beginner module for tracking simple furniture work orders',
'depends': ['base'],
'data': [
'security/ir.model.access.csv',
'views/work_order_views.xml',
],
'application': True,
}
# __init__.py
from . import models
# models/__init__.py
from . import work_order
# models/work_order.py
from odoo import fields, models
class FurnitureWorkOrder(models.Model):
_name = 'furniture.work.order'
_description = 'Furniture Work Order'
name = fields.Char(required=True)
product_name = fields.Char(required=True)
customer_name = fields.Char()
quantity = fields.Integer(default=1)
deadline = fields.Date()
state = fields.Selection([
('draft', 'Draft'),
('in_progress', 'In Progress'),
('done', 'Done'),
], default='draft')
note = fields.Text()
active = fields.Boolean(default=True)
# security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_furniture_work_order,furniture.work.order,model_furniture_work_order,,1,1,1,1
# views/work_order_views.xml
Learning, research, implementation logs, bug fixes and module practice from the phase markdown roadmap.
{activePhase.goal}
Odoo Tracker
Phase {activePhase.number} - {activePhase.title}
{doneCount}/{totalCount} tasks
{practice.outcome}
{practice.commands.join('\n')}
{practice.starterCode}