summaryrefslogtreecommitdiff
path: root/auditlog/models/log.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2023-02-06 15:29:55 +0700
committerstephanchrst <stephanchrst@gmail.com>2023-02-06 15:29:55 +0700
commit7cfed1e19f2e340d966ed2068176d21a0e8e9834 (patch)
treeec9077cb4f89d23378ef09f9da0adb7135548081 /auditlog/models/log.py
parent4b3b2d8b1a9a7a72fbe3d623e93dea3802ef0e56 (diff)
add audit log
Diffstat (limited to 'auditlog/models/log.py')
-rw-r--r--auditlog/models/log.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/auditlog/models/log.py b/auditlog/models/log.py
new file mode 100644
index 0000000..6093c77
--- /dev/null
+++ b/auditlog/models/log.py
@@ -0,0 +1,93 @@
+# Copyright 2015 ABF OSIELL <https://osiell.com>
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import _, api, fields, models
+from odoo.exceptions import UserError
+
+
+class AuditlogLog(models.Model):
+ _name = "auditlog.log"
+ _description = "Auditlog - Log"
+ _order = "create_date desc"
+
+ name = fields.Char("Resource Name", size=64)
+ model_id = fields.Many2one(
+ "ir.model", string="Model", index=True, ondelete="set null"
+ )
+ model_name = fields.Char(readonly=True)
+ model_model = fields.Char(string="Technical Model Name", readonly=True)
+ res_id = fields.Integer("Resource ID")
+ user_id = fields.Many2one("res.users", string="User")
+ method = fields.Char(size=64)
+ line_ids = fields.One2many("auditlog.log.line", "log_id", string="Fields updated")
+ http_session_id = fields.Many2one(
+ "auditlog.http.session", string="Session", index=True
+ )
+ http_request_id = fields.Many2one(
+ "auditlog.http.request", string="HTTP Request", index=True
+ )
+ log_type = fields.Selection(
+ [("full", "Full log"), ("fast", "Fast log")], string="Type"
+ )
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ """Insert model_name and model_model field values upon creation."""
+ for vals in vals_list:
+ if not vals.get("model_id"):
+ raise UserError(_("No model defined to create log."))
+ model = self.env["ir.model"].browse(vals["model_id"])
+ vals.update({"model_name": model.name, "model_model": model.model})
+ return super().create(vals_list)
+
+ def write(self, vals):
+ """Update model_name and model_model field values to reflect model_id
+ changes."""
+ if "model_id" in vals:
+ if not vals["model_id"]:
+ raise UserError(_("The field 'model_id' cannot be empty."))
+ model = self.env["ir.model"].browse(vals["model_id"])
+ vals.update({"model_name": model.name, "model_model": model.model})
+ return super().write(vals)
+
+
+class AuditlogLogLine(models.Model):
+ _name = "auditlog.log.line"
+ _description = "Auditlog - Log details (fields updated)"
+
+ field_id = fields.Many2one(
+ "ir.model.fields", ondelete="set null", string="Field", index=True
+ )
+ log_id = fields.Many2one(
+ "auditlog.log", string="Log", ondelete="cascade", index=True
+ )
+ old_value = fields.Text()
+ new_value = fields.Text()
+ old_value_text = fields.Text("Old value Text")
+ new_value_text = fields.Text("New value Text")
+ field_name = fields.Char("Technical name", readonly=True)
+ field_description = fields.Char("Description", readonly=True)
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ """Ensure field_id is not empty on creation and store field_name and
+ field_description."""
+ for vals in vals_list:
+ if not vals.get("field_id"):
+ raise UserError(_("No field defined to create line."))
+ field = self.env["ir.model.fields"].browse(vals["field_id"])
+ vals.update(
+ {"field_name": field.name, "field_description": field.field_description}
+ )
+ return super().create(vals_list)
+
+ def write(self, vals):
+ """Ensure field_id is set during write and update field_name and
+ field_description values."""
+ if "field_id" in vals:
+ if not vals["field_id"]:
+ raise UserError(_("The field 'field_id' cannot be empty."))
+ field = self.env["ir.model.fields"].browse(vals["field_id"])
+ vals.update(
+ {"field_name": field.name, "field_description": field.field_description}
+ )
+ return super().write(vals)