Code Odoo có những quy ước rất riêng: version manifest phải đúng dạng 19.0.x.y.z, không dùng print() mà dùng logger, mỗi model nên có _description... Nhớ hết bằng đầu thì mệt và dễ sót. Tốt hơn là để máy tự kiểm trước mỗi commit. Sau khi đã có khung module từ scaffold, bài này cắm thêm hai công cụ giữ code luôn sạch: pre-commit và pylint-odoo.
Hai công cụ, hai vai trò
pre-commit: một khung chạy các "hook" kiểm tra tự động ngay trước mỗigit commit. Có lỗi thì commit bị chặn lại. Nó gom nhiều công cụ (xoá khoảng trắng thừa, kiểm YAML, chạy linter...) vào một file cấu hình.pylint-odoo: một plugin chopylintthêm hàng loạt checker riêng cho Odoo — bắt đúng những lỗi "rất Odoo" mà pylint thường không biết.
Cấu hình
Đặt một file .pre-commit-config.yaml ở gốc repo:

Hình 1: .pre-commit-config.yaml khai hai nhóm hook: bộ dọn cơ bản (khoảng trắng, cuối file, YAML) và pylint_odoo. Sau pre-commit install, mỗi lần git commit các hook chạy tự động; commit chỉ đi qua khi mọi kiểm tra sạch.
Chạy thật — pylint-odoo bắt được gì?
Tôi tạo một module kho_demo cài vài lỗi cố ý (version sai dạng, khai file không tồn tại, dùng print, thiếu tác giả) rồi chạy pylint-odoo phiên bản 10.0.11 thật:

Hình 2: Output thật. Các mã bắt đầu bằng số 8 (C8101, C8106, F8101, C8112, W8116) là checker riêng của pylint-odoo — pylint thường không có. Đáng chú ý: C8106 bắt version sai dạng, F8101 phát hiện file khai trong data nhưng không tồn tại, W8116 cấm dùng print. Cuối cùng pylint chấm điểm code từ 0 đến 10 để bạn theo dõi.
Vài checker Odoo đáng nhớ
| Mã | Ý nghĩa |
|---|---|
C8106 |
Version manifest sai định dạng (19.0.x.y.z) |
W8116 |
Dùng print — hãy dùng logging |
F8101 |
File khai trong data nhưng không tồn tại |
C8103 |
Tên method không đúng quy ước (thiếu tiền tố phù hợp) |
W8110 |
Thiếu _description cho model |
Những cái này bắt đúng lỗi hay gặp khi mới viết module — thứ mà chạy Odoo lên mới lòi ra, còn linter thì báo ngay lúc code.
Vì sao đáng cài?
- Nhất quán cả nhóm: mọi người commit code cùng một chuẩn, không tranh cãi về style.
- Bắt lỗi sớm: sai version manifest hay khai thiếu file — biết ngay tại máy, không phải đợi CI hay chạy Odoo mới thấy.
- Không tốn công: cài một lần, hook tự chạy mãi. Muốn bỏ qua một lần đặc biệt thì
git commit --no-verify.
Chỉnh độ nghiêm
Không phải cảnh báo nào cũng cần bật. Tạo file .pylintrc (hoặc mục trong pyproject.toml) để tắt các mã bạn không quan tâm và chỉ giữ những checker Odoo quan trọng:
[MESSAGES CONTROL]
disable=all
enable=manifest-version-format,print-used,resource-not-exist,
manifest-required-author,attribute-string-redundant
Cách này thường dùng thực tế: tắt hết, chỉ bật các checker Odoo cốt lõi để tránh nhiễu bởi hàng trăm cảnh báo style của pylint.
Nhớ ba ý
pre-commitchạy kiểm tra tự động trước mỗi commit;pylint-odoothêm checker riêng cho Odoo — cài một lần, giữ code sạch mãi.- Các mã bắt đầu bằng số 8 (
C8106version,W8116print,F8101file thiếu) là checker Odoo-riêng, bắt đúng lỗi mà pylint thường bỏ qua. - Dùng
.pylintrcvớidisable=allrồienablevài checker cốt lõi để tránh nhiễu và tập trung vào lỗi thật sự quan trọng.
Công cụ tự động bắt lỗi tĩnh rồi, nhưng có những bug chỉ lộ khi chạy. Phần sau học cách debug Python trong Odoo bằng pdb/ipdb — dừng chương trình đúng chỗ và soi từng biến.