Ở bài 196, model đã có menu để bấm. Nhưng có một mảnh không được quên, nếu không người dùng bấm vào sẽ nhận lỗi "không có quyền truy cập": quyền truy cập model. Ở bài 28 ta xem khái niệm Access Rights từ góc người dùng; giờ nhìn từ góc lập trình — chúng đến từ một file CSV đơn giản.

File ir.model.access.csv: mỗi dòng một mức quyền

Trong security/ir.model.access.csv, mỗi dòng cấp quyền cho một nhóm trên một model:

Bảng nội dung file ir.model.access.csv với các cột id, name, model_id:id, group_id:id, perm_read, perm_write, perm_create, perm_unlink; dòng access_the_nhanvien cho base.group_user đủ 4 quyền là 1; dòng access_the_portal cho base.group_portal chỉ perm_read là 1 còn lại 0

Hình 1: File ir.model.access.csv. Các cột: model_id:id (model nào — model_quan_the_thanh_vien, tiền tố model_ + tên bảng), group_id:id (nhóm nào), và bốn cột quyền perm_read / perm_write / perm_create / perm_unlink (đọc / sửa / tạo / xoá — 1 là có, 0 là không). Dòng đầu cho Nhân viên (base.group_user) đủ 4 quyền; dòng sau cho Khách portal (base.group_portal) chỉ đọc.

Đây là CSV thuần — mở bằng Excel/text editor đều được. Cú pháp field:id (như model_id:id) nghĩa là "trỏ tới bản ghi khác bằng external id", không phải nhập số.

Cài vào Odoo — quyền hiện đúng như khai

Sau khi cập nhật module, vào Cài đặt → Kỹ thuật → Quyền truy cập (cần Chế độ nhà phát triển), lọc theo model, thấy đúng hai dòng:

Màn hình Quyền truy cập trong Odoo lọc theo Thẻ thành viên, hai dòng: Thẻ thành viên - Khách portal chỉ đọc thuộc nhóm Vai trò Cổng thông tin chỉ tick Quyền xem; Thẻ thành viên - Nhân viên thuộc nhóm Vai trò Người dùng tick cả Quyền xem, Ghi, Tạo, Xóa

Hình 2: Hai dòng quyền trong Odoo. "Thẻ thành viên - Nhân viên" (nhóm Vai trò/Người dùng) tick cả Quyền xem / Ghi / Tạo / Xóa. "Thẻ thành viên - Khách portal (chỉ đọc)" (nhóm Cổng thông tin) chỉ tick Quyền xem. Đúng y như file CSV — người dùng thường sửa được, khách portal chỉ xem.

Điều gì xảy ra nếu quên khai quyền?

Đây là lỗi kinh điển của người mới viết module: tạo model, làm view, làm menu — nhưng quên file CSV. Kết quả: bấm menu, Odoo báo lỗi kiểu "bạn không được phép truy cập model này". Vì mặc định, model mới không cấp quyền cho ai cả — phải khai tường minh.

Nói cách khác: model mới luôn "khoá cửa" cho tới khi bạn khai CSV mở quyền cho đúng nhóm.

Access rights và record rules — hai tầng

Nhắc lại từ bài 28–30 để nối mạch:

  • Access rights (file CSV này): quyết định được làm gì trên cả model — đọc/ghi/tạo/xoá toàn bảng.
  • Record rules (ir.rule): quyết định thấy được dòng nào — ví dụ "chỉ thấy thẻ của khách mình phụ trách".

Access rights là hàng rào đầu tiên; record rules siết thêm theo từng dòng. Bài này lo tầng thứ nhất — thường là đủ cho model đơn giản.

Lưu ý khi viết CSV quyền

  • model_id:id = model_ + tên_bảng (dấu chấm trong _name đổi thành gạch dưới): quan.the.thanh.vien → model_quan_the_thanh_vien.
  • Nhớ khai file vào data của manifest, và nạp trước views (quyền có trước thì view mới hoạt động).
  • Ít nhất một dòng cho base.group_user nếu muốn nhân viên dùng được — quên là "khoá cửa".
  • Cẩn thận perm_unlink (xoá): thường chỉ cấp cho quản lý, tránh nhân viên xoá nhầm dữ liệu.

Nhớ ba ý

  1. ir.model.access.csv: mỗi dòng cấp đọc/ghi/tạo/xoá (perm_read/write/create/unlink, 1 hoặc 0) cho một nhóm trên một model.
  2. Model mới mặc định không có quyền — quên file CSV là người dùng bấm vào chỉ thấy lỗi truy cập; luôn khai ít nhất một dòng cho nhóm cần dùng.
  3. Đây là access rights (quyền trên cả model); muốn giới hạn theo từng dòng thì dùng thêm record rules (ir.rule).

Module đã có model, view, menu, quyền — đủ chạy một tính năng đơn giản. Nhưng dữ liệu thật luôn liên kết nhau (thẻ thuộc khách, khách có nhiều đơn). Phần sau đi sâu trường quan hệ: Many2one, One2many, Many2many — cách Odoo nối các bảng.