Odoo Debug: extension Chrome cho dev Odoo biết vì sao, ngay trên trang đang mở
Extension Chrome miễn phí cho Odoo 18, 19 và 20. Biết field đến từ module nào, view kế thừa nào làm field chỉ đọc, RPC nào lỗi, record rule nào chặn user và request nào bắn ra N+1, không cần mở shell hay grep XML.
Làm Odoo lâu, mình để ý phần lớn thời gian debug không nằm ở việc sửa code. Nó nằm ở việc đi tìm câu trả lời cho những câu hỏi rất nhỏ: field này do module nào thêm vào, vì sao nút này bị mờ, vì sao user kêu không lưu được.
Developer mode của Odoo chỉ cho biết trên màn hình đang có cái gì: tên field, tên model, id của view. Còn muốn biết vì sao nó như vậy thì vẫn phải mở shell, grep thư mục addons, đọc từng view kế thừa, hoặc bật log SQL rồi đoán.
Odoo Debug là extension Chrome mình viết để trả lời phần vì sao đó. Nó mở một panel ngay trên trang Odoo bạn đang làm việc, đọc dữ liệu từ chính server Odoo của tab đó, và trả lời theo đúng user đang đăng nhập (hoặc bất kỳ user nào bạn chọn để kiểm tra).
Video ở đầu bài (chưa tới hai phút) cho thấy panel hoạt động trên một database thật. Nếu không có nhiều thời gian, xem video là đủ hiểu extension làm gì.
Panel gồm những tab nào
Mỗi tab trả lời một loại câu hỏi mà dev Odoo gặp hằng ngày:
| Tab | Câu hỏi nó trả lời |
|---|---|
| Record | Field này là gì? Kiểu, giá trị, module định nghĩa nó và cái gì tính lại nó. |
| View | Vì sao field này chỉ đọc? Điều kiện nào, giá trị lúc này ra sao, view kế thừa nào đặt ra. |
| RPC | Lời gọi vừa rồi gửi gì? Toàn bộ JSON-RPC kèm thời gian và lỗi, sửa rồi gửi lại hoặc copy dạng cURL. |
| Security | Vì sao user này không mở được bản ghi? ACL hay record rule nào từ chối, nhóm nào sẽ cho phép. |
| Translations | Chuỗi này lấy từ đâu? Nguồn, chỗ cần sửa, độ phủ file .po, xuất và nhập. |
| Apps | Cài module này sẽ kéo theo những gì? Danh sách module cài kèm và tự cài theo, đúng như Odoo tính. |
| Menus | Màn hình kỹ thuật kia nằm ở đâu? Models, views, rules, crons, actions, mở bằng một cú bấm. |
| Perf | Vì sao màn hình chậm? Đọc kết quả profiler của Odoo, chỉ ra truy vấn N+1 và dòng code gây ra nó. |
| Code | Chạy thử đoạn ORM này thì ra sao? Console JavaScript hoặc Python, có chế độ chạy thử không lưu gì. |
Phần dưới đi qua các tình huống cụ thể, kèm ảnh chụp từng tab.
Field này từ đâu ra
Tình huống quen thuộc: mở form sale.order của khách và thấy một field lạ. Developer mode cho bạn tên kỹ thuật của field. Bước tiếp theo thường là grep toàn bộ addons để xem module nào khai báo nó, có compute hay related không, có module nào override lại không.
Tab Record làm phần đó thay bạn: kiểu field, giá trị hiện tại, module định nghĩa, field có stored hay compute không, nó phụ thuộc vào những field nào và khi đổi giá trị thì field nào bị tính lại. Ô tìm kiếm có bộ lọc Stored, Computed, Relational, Required để lọc nhanh trong hàng trăm field của model. Mẹo nhỏ: giữ phím Alt rồi click vào một field, nhãn của field, ô trong list hoặc một dòng thay đổi trong chatter để copy ngay tên kỹ thuật.
Vì sao field bị chỉ đọc
Với Odoo 17 trở lên, các điều kiện invisible, readonly, required viết thẳng trong view dưới dạng biểu thức Python, và một field có thể bị nhiều view kế thừa chỉnh lại. Khi khách hỏi vì sao không sửa được field, cách thủ công là mở từng view kế thừa và lần theo xpath.
Tab View cho thấy cùng lúc: điều kiện đang áp vào field, giá trị của biểu thức đó ngay lúc này (ví dụ state in ['cancel', 'sale'] đang đúng vì state = "sale"), và toàn bộ lịch sử field đi qua các view, view gốc nào đặt nó vào form, view kế thừa nào của module nào đã sửa nó, ở dòng nào.
RPC nào lỗi, gửi gì đi
Khi một nút bấm báo lỗi chung chung, bạn thường phải mở DevTools, lọc tab Network, tìm đúng request call_kw rồi đọc traceback trong JSON trả về.
Tab RPC liệt kê mọi lời gọi JSON-RPC của trang kèm model, method, thời gian và lỗi nếu có. Bạn có thể sửa tham số rồi gửi lại ngay trong panel, hoặc copy request dạng cURL để dán vào terminal hay gửi cho đồng nghiệp tái hiện lỗi.
User không mở được bản ghi
Đây là loại ticket tốn thời gian nhất với cả dev lẫn tư vấn chức năng. Lỗi AccessError chỉ nói user không có quyền, không nói ACL nào hay record rule nào chặn.
Tab Security dựng bảng quyền Read, Write, Create, Delete của user trên đúng bản ghi đang mở: rule nào áp dụng, user có nằm trong nhóm của rule đó không, rule nào khớp và rule nào từ chối. Phần quan trọng nhất là gợi ý nhóm cần thêm để user có quyền, kèm nút Try để thử trước. Bạn biết chắc thêm nhóm nào là đủ trước khi cấp quyền thật cho user.
Màn hình chậm vì N+1
Odoo có sẵn profiler nhưng đọc kết quả của nó khá mệt. Tab Perf đọc lại profile của từng request và tóm tắt: số câu SQL, thời gian SQL, thời gian Python. Nếu có một câu truy vấn chạy lặp lại nhiều lần trong một request, panel báo N+1, chỉ ra hàm và dòng code gây ra nó, kèm gợi ý cách sửa (đọc theo recordset, dùng mapped() hoặc read_group).
Bạn có thể đặt một request làm mốc trước khi sửa, rồi so sánh với request sau khi sửa để thấy số truy vấn giảm thật hay không.
Chạy thử ORM ngay trên trang
Tab Code là console chạy JavaScript hoặc Python trong ngữ cảnh của database đang mở. Bạn có thể đọc dữ liệu, gọi method của model, thử một đoạn ORM trước khi viết vào module. Mặc định code chạy ở chế độ dry run: code chạy thật trên server, sau đó mọi thay đổi bị rollback, nên bạn thấy đúng kết quả mà database không bị đụng tới. Chỉ khi bạn chủ động bật chế độ ghi thì thay đổi mới được lưu. Kết quả dạng bảng copy được ra CSV, Markdown hoặc JSON.
Bản đang phát triển còn có lịch sử 20 lần chạy gần nhất và lưu đoạn code hay dùng thành snippet.
Cài đặt
- Cài Odoo Debug từ Chrome Web Store. Extension chạy trên Chrome, Edge, Brave và các trình duyệt nhân Chromium khác, tự cập nhật khi có bản mới.
- Mở một trang của database Odoo 18, 19 hoặc 20 và đăng nhập.
- Bấm nút Odoo Debug ở góc dưới bên phải, hoặc nhấn
Alt+Shift+O. Từ thanh tiêu đề, panel có thể phóng toàn màn hình hoặc tách ra cửa sổ riêng.
Phím tắt nên nhớ:
| Phím tắt | Tác dụng |
|---|---|
Alt+Shift+O | Ẩn hoặc hiện panel |
Alt+Shift+D | Bật hoặc tắt debug mode của Odoo |
Alt + click | Copy tên kỹ thuật của field, cột hoặc dòng thay đổi trong chatter |
Muốn đổi phím tắt thì vào chrome://extensions/shortcuts.
Extension hỗ trợ Odoo 18.0, 19.0 và 20.0, cả Community lẫn Enterprise, chạy được với Odoo.sh, on-premise hay Docker. Chưa hỗ trợ Odoo 17 trở xuống, Firefox và Safari.
Dữ liệu của bạn đi đâu
Extension chạm vào database của công ty và của khách, nên đây là phần mình cẩn thận nhất:
- Chỉ nói chuyện với server Odoo của tab đang mở, bằng chính phiên đăng nhập của bạn. Không có backend riêng, không analytics, không tracking.
- Mặc định chỉ đọc. Extension chỉ ghi khi bạn bấm, và ghi với quyền của chính user bạn: áp một nhóm, cài một module, sửa một bản dịch, chạy Python ở chế độ ghi.
- Không đọc giá trị session cookie, chỉ đọc các cờ của nó.
Mã nguồn công khai trên GitHub để bạn tự kiểm tra. Extension miễn phí cho cá nhân và cho công việc nội bộ của công ty, kể cả khi dev của đối tác Odoo dùng trong dự án của khách. Chỉ không được bán lại hoặc đóng gói thành sản phẩm thu phí.
Góp ý
Repo nằm ở github.com/unclecatvn/extension-debug-odoo, ảnh chụp đầy đủ từng tab có trên odoo-debug.unclecatvn.com. Nếu gặp lỗi, mở issue kèm phiên bản Odoo, trang bạn đang mở và lỗi lấy từ tab RPC, mình sẽ xử lý nhanh hơn. Góp ý tính năng và pull request đều rất được hoan nghênh.