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ỗi git 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 cho pylint thê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:

Cấu hình giữ code sạch tự động bằng pre-commit và pylint-odoo: file .pre-commit-config.yaml ở gốc repo khai danh sách repos gồm pre-commit-hooks phiên bản v5.0.0 với các hook trailing-whitespace xoá khoảng trắng thừa, end-of-file-fixer, check-yaml; và repo OCA pylint-odoo phiên bản v10.0.11 với hook pylint_odoo là checker riêng cho Odoo; phần cài và kích hoạt gồm pip install pre-commit pylint-odoo, lệnh pre-commit install để cắm hook vào thư mục .git hooks, pre-commit run all-files để chạy tay toàn bộ, và cách chạy thẳng pylint với load-plugins pylint_odoo trên module kho_demo

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:

Output thật của pylint-odoo phiên bản 10.0.11 chạy trên module kho_demo bằng lệnh pylint load-plugins pylint_odoo: nhóm lỗi Odoo riêng có mã bắt đầu bằng số 8 gồm C8101 manifest thiếu tác giả bắt buộc, C8106 sai định dạng version 1.0 vì Odoo 19 cần dạng 19.0.x.y.z, F8101 file views kho_views.xml khai trong data nhưng không tồn tại, C8112 thiếu file README.rst, và W8116 trong models kho.py dòng 10 báo Print used hãy dùng logger thay vì print; nhóm lỗi Python chung gồm C0114 thiếu docstring cho module và C0115 thiếu docstring cho class; dòng cuối chấm điểm code 0.00 trên 10 giảm 8 điểm so với lần trước

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 ý

  1. pre-commit chạy kiểm tra tự động trước mỗi commit; pylint-odoo thêm checker riêng cho Odoo — cài một lần, giữ code sạch mãi.
  2. Các mã bắt đầu bằng số 8 (C8106 version, W8116 print, F8101 file thiếu) là checker Odoo-riêng, bắt đúng lỗi mà pylint thường bỏ qua.
  3. Dùng .pylintrc với disable=all rồi enable và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.