Field-Level Change Histor
Track who changed which fields on any model, with full history and one-click revert
When a price, a status or a piece of master data changes and nobody knows who did it or what it was before, you have a compliance and trust gap that Odoo's chatter only partly fills. This module records every change on exactly the models and fields you choose — old value, new value, user and timestamp — in a searchable, retention-managed audit.log. Setup is self-service through audit.rule records, with no developer needed to turn tracking on. Crucially, any write change can be reverted from the log with one click (and the revert is itself audited), so the trail doubles as a recovery tool. Built-in activity reports, per-record timelines and a cron-based retention policy keep it useful for finance, IT and compliance teams that need accountability over critical data.
Key Features
Self-service audit rules per model and field
An audit.rule record points at any ir.model and a Many2many of ir.model.fields to watch; leave the field list empty and _tracked_field_names auto-selects every stored, non-computed field. Admins switch tracking on from the UI with no developer involved.
Captures create, write and unlink
An AbstractModel inheriting base hooks create, write and unlink, so every watched model is covered automatically. Per-rule log_create, log_write and log_unlink flags let you record only the operations you care about, with the pre-write value captured before super() runs.
Old and new value on every change
Each audit.log entry stores old_value_display, new_value_display plus the raw values, the field label and field type. Writes that don't actually change the value are skipped, so the log stays free of noise.
Human-readable values, not raw IDs
_audit_display resolves Many2one targets to their display_name and selection keys to their translated labels. Reviewers read 'Draft to Posted' or a partner name instead of cryptic IDs and technical codes.
One-click revert with audit of the revert
action_revert on a write entry coerces the stored old raw value back to the field's type and writes it to the live record, then marks the entry reverted. A computed can_revert gates this to supported field types, turning the log into a safe recovery tool.
Bulk revert wizard
audit.revert.wizard takes the entries selected in the log and, with restore_latest_only, groups them by (model, record, field) so a field is rolled back once to its prior value rather than chained step by step. It reports how many were restored and how many were skipped.
Activity report and per-record timeline
audit.report.wizard groups changes by model and operation over a date range with optional model/user filters, producing summary lines and a drill-down to matching entries. get_record_timeline and summarize_user_activity expose ordered history and per-user counts.
Retention cron and system-user noise control
Each rule has a retention_days value; the _cron_prune_logs scheduled job deletes audit.log rows older than that cutoff (0 keeps them forever). ignore_system_user drops changes made by base.user_root, and core technical models are excluded to prevent recursion.
Use Cases
Screenshots
Audit Rules
Why Choose This Module
When a price, a status or a key field changes and no one knows who did it or what it was before, you have a compliance and trust problem. This module records every change on the models and fields you choose — the old value, the new value, the user and the timestamp — in a searchable, prunable audit log. Each change can be reverted from the log with one click, and the revert is audited too. No developer needed to turn it on.
Specifications
- Compatible: Odoo 18.0 / 19.0
- License: OPL-1
- Languages: English
- Author: Pokutsoft
- Dependencies: base
- Support: support@pokutsoft.com
Update date: 2026-07-02