Ở bài statusbar ta đặt câu hỏi: trạng thái hiện ra rồi, nhưng ai đổi, khi nào, đổi từ gì sang gì? Câu trả lời nằm ở khung bên phải mỗi form Odoo — chatter. Nó ghi lịch sử thay đổi, cho đăng ghi chú và tin nhắn, hiện hoạt động cần làm, và cho người theo dõi nhận thông báo. Tất cả gắn thẳng vào bản ghi. Và để có nó, bạn gần như không viết code. Bài này bật chatter cho thẻ thành viên và xem nó tự ghi lại mọi thứ.

Ba bước để có chatter

# 1) Model PHẢI kế thừa mail.thread (+ mail.activity.mixin nếu muốn hoạt động)
class TheThanhVien(models.Model):
    _name = 'quan.the.thanh.vien'
    _inherit = ['mail.thread', 'mail.activity.mixin']

    # 2) tracking=True: đổi field này sẽ TỰ ghi log vào chatter
    diem = fields.Integer('Điểm tích luỹ', tracking=True)
    trang_thai = fields.Selection([...], tracking=True)
<!-- 3) View: chỉ cần MỘT thẻ <chatter/> sau </sheet> -->
<sheet> ... </sheet>
<chatter/>

Ảnh chụp mã Python và XML nền tối, phần Python lớp TheThanhVien kế thừa mail chấm thread và mail chấm activity chấm mixin, field diem kiểu Integer có tracking bằng True và field trang_thai Selection có tracking bằng True với chú thích đổi field sẽ tự ghi log vào chatter, phần XML sau thẻ sheet đóng có một thẻ chatter, phần cuối gọi message_post đăng tin với body và subject và message_subscribe để partner theo dõi, kèm chú thích rằng với tracking chỉ cần gán diem bằng 150 là chatter tự log 120 sang 150

Hình 1: Ba bước. (1) model _inherit mail.thread (điều kiện tiên quyết — không có nó thì không có message_ids). (2) tracking=True trên field: mỗi lần field đổi, chatter tự ghi "giá trị cũ → mới". (3) một thẻ <chatter/> trong form. Đăng ghi chú/tin bằng message_post; cho ai đó theo dõi bằng message_subscribe.

Xem thật: chatter ghi lại mọi thứ

Mình đổi điểm VIP-0001 (120→150), đổi trạng thái (Mới cấp→Đang dùng), và đăng một ghi chú. Đây là chatter thật:

Ảnh chụp form Odoo thẻ VIP-0001 với khung chatter bên phải, phía trên có ba nút Gửi tin Ghi chú Hoạt động, mục Hoạt động đã lên kế hoạch hiện việc Đến hạn trong 3 ngày Gọi mời gia hạn thẻ VIP kèm nút Hoàn tất Chỉnh sửa Hủy, mục Hôm nay hiện hai bản ghi của OdooBot lúc 19 giờ 55, bản ghi thứ nhất log thay đổi 120 mũi tên 150 Điểm tích luỹ và Mới cấp mũi tên Đang dùng Trạng thái, bản ghi thứ hai là ghi chú Khách phản hồi tốt đề xuất nâng hạng Vàng

Hình 2: Chatter chạy thật (khung phải). Trên cùng: nút Gửi tin / Ghi chú / Hoạt động. Mục Hoạt động đã lên kế hoạch hiện việc "Gọi mời gia hạn thẻ VIP" (đến hạn 3 ngày). Mục Hôm nay là dòng thời gian: dòng đầu là log thay đổi tự động — "120 → 150 (Điểm tích luỹ)" và "Mới cấp → Đang dùng (Trạng thái)" nhờ tracking=True; dòng dưới là ghi chú mình đăng. Không dòng nào phải tự vẽ.

Điểm mạnh nhất: dòng "120 → 150" và "Mới cấp → Đang dùng" tự sinh khi mình gán field. Không viết một dòng log nào — chỉ tracking=True. Đây là kiểm toán (audit trail) miễn phí cho mọi thay đổi quan trọng.

Ba khả năng của chatter

  • Theo dõi thay đổi (tracking): field có tracking=True tự ghi mỗi lần đổi giá trị, kèm ai và khi nào. Dùng cho field quan trọng (trạng thái, số tiền, người phụ trách).
  • Tin nhắn & ghi chú: Gửi tin (message) gửi cho người theo dõi (có thể ra email); Ghi chú (log note) chỉ nội bộ. Gọi bằng message_post(body=..., subject=..., message_type='comment'|'notification').
  • Người theo dõi (followers): message_subscribe(partner_ids=[...]) cho ai đó "theo dõi" bản ghi — họ nhận thông báo khi có tin mới. Số người theo dõi hiện ở góc chatter.
  • Hoạt động (từ mail.activity.mixin): việc cần làm gắn bản ghi (xem bài activity) hiện ngay trên chatter.

Vài lưu ý Odoo 19

  • <chatter/> là cú pháp gọn của Odoo 19 — trước đây phải viết một khối <div class="oe_chatter"> với ba field message_follower_ids, activity_ids, message_ids. Giờ chỉ một thẻ.
  • Không có mail.thread thì <chatter/> lỗi — thiếu field message_ids. Nhớ _inherit và depends có 'mail'.
  • tracking=True chỉ log field bạn đánh dấu — đừng bật tràn lan, chỉ field đáng theo dõi, tránh chatter ngập log vụn.
  • message_post gửi thật khi có người theo dõi — cẩn thận trong test/script để không gửi email ngoài ý muốn.
  • tracking có thể kèm thứ tự: tracking=10, tracking=20... để sắp thứ tự các field trong một log gộp.

Ba ý mang về

  1. Chatter là khung lịch sử + trao đổi bên phải form; để có nó cần model _inherit mail.thread và một thẻ <chatter/> trong view (Odoo 19 gọn còn một thẻ).
  2. tracking=True trên field tự ghi log thay đổi vào chatter ("120 → 150", "Mới cấp → Đang dùng") — kiểm toán miễn phí, không viết code log. Đã chứng minh trên VIP-0001.
  3. Chatter còn cho đăng tin/ghi chú (message_post), người theo dõi (message_subscribe) và hoạt động (từ mail.activity.mixin) — tất cả gắn thẳng vào bản ghi.

Ta đã dựng gần trọn một form nghiệp vụ đầy đủ. Lần sau quay lại chủ đề quyền: Phần sau mổ xẻ thuộc tính groups trên field và phần view — cách ẩn một field, một nút, hay cả một tab chỉ cho đúng nhóm người dùng được thấy.