Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
385 changes: 385 additions & 0 deletions .cursor/plans/audit-log-file-migration-plan.md

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,15 @@ docs/_build/

# Local release planning files (ignored)
.release/

# Cursor generated files
.cursor/generated/
.cursor/notes/
.cursor/temp/
.cursor/chat/
.cursor/composer/
.cursor/generated/
.cursor/memos/
.cursor/*.db
.cursor/*.json
.cursor/*.md
2 changes: 2 additions & 0 deletions spp_audit_log/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@
"depends": ["base", "mail", "g2p_registry_membership"],
"external_dependencies": {},
"data": [
"data/ir_config_parameter_data.xml",
"security/audit_log_security.xml",
"security/ir.model.access.csv",
"views/spp_audit_rule_views.xml",
"views/spp_audit_log_views.xml",
"views/res_config_settings_views.xml",
],
"assets": {},
"demo": [],
Expand Down
25 changes: 25 additions & 0 deletions spp_audit_log/data/ir_config_parameter_data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>

<!-- Default configuration for audit log file settings -->
<record id="audit_log_to_file_default" model="ir.config_parameter">
<field name="key">spp.audit_log_to_file</field>
<field name="value">False</field>
</record>

<record id="audit_log_file_path_default" model="ir.config_parameter">
<field name="key">spp.audit_log_file_path</field>
<field name="value">/var/log/odoo/audit.log</field>
</record>

<record id="audit_log_file_max_bytes_default" model="ir.config_parameter">
<field name="key">spp.audit_log_file_max_bytes</field>
<field name="value">10</field>
</record>

<record id="audit_log_file_backup_count_default" model="ir.config_parameter">
<field name="key">spp.audit_log_file_backup_count</field>
<field name="value">5</field>
</record>

</odoo>
1 change: 1 addition & 0 deletions spp_audit_log/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from . import spp_audit_rule
from . import spp_audit_log
from . import group
from . import res_config_settings
32 changes: 32 additions & 0 deletions spp_audit_log/models/res_config_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from odoo import fields, models


class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"

audit_log_to_file = fields.Boolean(
string="Enable File Logging",
config_parameter="spp.audit_log_to_file",
help="Enable logging audit records to JSON file instead of database",
)

audit_log_file_path = fields.Char(
string="Audit Log File Path",
default="/var/log/odoo/audit.log",
config_parameter="spp.audit_log_file_path",
help="Full path to the audit log file (JSON Lines format)",
)

audit_log_file_max_bytes = fields.Integer(
string="Max File Size (MB)",
default=10,
config_parameter="spp.audit_log_file_max_bytes",
help="Maximum size of log file in megabytes before rotation",
)

audit_log_file_backup_count = fields.Integer(
string="Backup Count",
default=5,
config_parameter="spp.audit_log_file_backup_count",
help="Number of backup files to keep during rotation",
)
25 changes: 17 additions & 8 deletions spp_audit_log/models/spp_audit_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError

from ..tools import audit_decorator
from ..tools import audit_decorator, is_file_logging_enabled, log_audit_to_file


class SppAuditRule(models.Model):
Expand Down Expand Up @@ -255,8 +255,8 @@ def get_audit_log_vals(self, res_id, method, data):

def log(self, method, old_values=None, new_values=None):
"""
The function logs changes made to a model's records by creating an audit log entry with
information about the user, model, record, method, and data.
The function logs changes made to a model's records by creating an audit log entry.
Logs are written to file if file logging is enabled, otherwise to database.

:param method: The "method" parameter is a string that represents the action or method being
logged. It could be a create, write, or delete action, for example
Expand All @@ -272,9 +272,18 @@ def log(self, method, old_values=None, new_values=None):
if old_values or new_values:
fields_to_log = self.field_to_log_ids.mapped("name")
data = self._format_data_to_log(old_values, new_values, fields_to_log)
audit_log = self.env["spp.audit.log"].sudo()
for rec in self:
for res_id in data:
audit_log_vals = rec.get_audit_log_vals(res_id, method, data)
audit_log.create(audit_log_vals)

# Check if file logging is enabled
if is_file_logging_enabled(self.env):
# Write to file for each audit rule and resource
for rec in self:
for res_id in data:
log_audit_to_file(self.env, rec, method, res_id, data[res_id])
else:
# Fallback to database logging
audit_log = self.env["spp.audit.log"].sudo()
for rec in self:
for res_id in data:
audit_log_vals = rec.get_audit_log_vals(res_id, method, data)
audit_log.create(audit_log_vals)
return
Loading
Loading