| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Employees (hr)
• Discuss (mail) |
| Lines of code | 180 |
| Technical Name |
viewed_records |
Viewed Records — Odoo 17 Module
Description
Viewed Records is a module for tracking which records have been opened by users across all Odoo models. It automatically saves the history of viewed form records, allows checking whether the user has seen a record, and shows the "viewed" status directly on the form.
How It Works
To enable tracking, the model must inherit the mixin
viewed.records.mixin, and the form must use the widget js_class="viewed_records".
When a user opens a form view, the module automatically creates a record in
viewed.record.history and updates the field is_viewed.
Models
viewed.record.history
- res_model — model name
- record_id — record ID
- user_id — user
- record_name — record display name
- record_url — direct form URL
viewed.records.mixin
Provides automatic tracking of viewed records.
- is_viewed — Boolean, computed field
JavaScript Widget
The widget is enabled by adding js_class="viewed_records"
and calls the method mark_as_viewed() upon form load.
Example of using js_class="viewed_records" inside a form:
<record id="view_task_form" model="ir.ui.view">
<field name="name">project.task.form</field>
<field name="model">project.task</field>
<field name="arch" type="xml">
<form js_class="viewed_records">
<field name="name"/>
</form>
</field>
</record>
Python Mixin
The mixin adds the computed field is_viewed and helper methods for tracking.
class ViewedRecordsMixin(models.AbstractModel):
_name = 'viewed.records.mixin'
is_viewed = fields.Boolean(string='Is Opened', compute='_compute_is_viewed')
@api.depends()
def _compute_is_viewed(self):
ViewedRecordsHistory = self.env['viewed.records.history']
for rec in self:
viewed = ViewedRecordsHistory.search([
('res_model', '=', self._name),
('record_id', '=', rec.id),
('user_id', '=', self.env.user.id),
], limit=1)
rec.is_viewed = bool(viewed)
Using the Mixin in Your Model
To enable this functionality on any model, simply add:
class ProjectTask(models.Model):
_name = 'project.task'
_inherit = ['project.task', 'viewed.records.mixin']
After that, the model receives:
- the field
is_viewed - automatic history tracking when opening the form
- list view highlighting for unread records
List View Decoration — Highlight Unread Records
The module supports visual highlighting of records that the user has not opened yet.
Example highlighting unread records in a list:
<record id="view_task_list" model="ir.ui.view">
<field name="name">project.task.list</field>
<field name="model">project.task</field>
<field name="arch" type="xml">
<list decoration-info="not is_viewed">
<field name="name"/>
<field name="is_viewed" column_invisible="1"/>
</list>
</field>
</record>
• Rows where is_viewed = False will be highlighted using the "info" decoration.
• This is useful for visually identifying unread tasks, tickets, leads, documents, etc.
Installation
Place the module into the addons/ directory and install it from the Apps menu.
Contact
Author: Saken Serdaly
Email: sakenever137@gmail.com
GitHub: github.com/sakenever137
Please log in to comment on this module