How to Implement Record Rules vs. Access Rights  in Odoo?

Understanding of Record Rules vs. Access Rights in Odoo

✅ What’s the Difference?

Feature
Access Rights
Record Rules
Scope Model-level (create, read, write, delete) Record-level (row-level access control)
Where Defined ir.model.access.csv or UI (Settings > Technical > Security > Access Controls) In UI (Settings > Technical > Security > Record Rules)
What It Controls If a user can access a model Which records the user can access
Enforced On ORM operations ORM filters & queries

📌 Real Use Case 1: Sales User should not delete Sale Orders

✅ Access Right Setup:

In ir.model.access.csv for model sale.order:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

sales_order_user,sales_order_user,model_sale_order,sales_team.group_sale_user,1,1,1,0

  • This allows reading, writing, creating Sale Orders, but prevents deleting.

📌 Real Use Case 2: User should only see their own customers

✅ Record Rule Setup:

Model: res.partner

 [(‘user_id’, ‘=’, user.id)]
  • Only allows users to view customers assigned to them.
  • This does not restrict the model access; it filters visible records.

🧪 Realistic Combined Scenario

Imagine you have a project.task model:

  • Access Right gives the user rights to read/write.
  • Record Rule restricts visibility to only tasks in projects where the user is a member.

Example Rule:

[(‘project_id.user_ids’, ‘in’, [user.id])]

This ensures that:

  • User can only view/write tasks where they are a project member.
  • Even with write access, they cannot modify tasks outside their scope.

✅ Summary Table

Feature
Access Rights
Record Rules
Setup Location ir.model.access.csv / UI UI (Record Rules)
Granularity Coarse (whole model) Fine (specific records)
Applies To CRUD permissions Filtering domain per user
Skipped When Using sudo() Using sudo()
Enforced In ORM methods Search, browse, write, etc.

⚠️ Best Practices

  • Always define both access rights and record rules.
  • Use record rules for dynamic record visibility.
  • Use access rights for controlling general actions like delete/write.