Bỏ qua để đến Nội dung
Menu
Câu hỏi này đã bị gắn cờ
928 Lượt xem

How can you override the create and write methods in a custom Odoo model to automatically log changes in a separate audit model, while avoiding infinite recursion and ensuring transactional integrity?  

Ảnh đại diện
Huỷ bỏ
Hello, Here is an example :

my.model — the business model

from odoo import models, fields, api, _

from datetime import datetime


class MyModel(models.Model):

    _name = 'my.model'

    _description = 'Tracked Business Model'


    name = fields.Char()

    value = fields.Float()


my.model.audit — the audit trail model  

class MyModelAudit(models.Model):

    _name = 'my.model.audit'

    _description = 'Audit Trail for MyModel'


    model_id = fields.Many2one('my.model', string="Target Record")

    change_type = fields.Selection([('create', 'Create'), ('write', 'Write')])

    field_name = fields.Char()

    old_value = fields.Char()

    new_value = fields.Char()

    changed_on = fields.Datetime(default=lambda self: fields.Datetime.now())



Override of create and write  

class MyModel(models.Model):

    _inherit = 'my.model'


    @api.model

    def create(self, vals):

        record = super(MyModel, self).create(vals)

        for field, value in vals.items():

            self.env['my.model.audit'].create({

                'model_id': record.id,

                'change_type': 'create',

                'field_name': field,

                'old_value': '',

                'new_value': str(value),

            })

        return record


    def write(self, vals):

        for record in self:

            for field, new_value in vals.items():

                old_value = record[field]

                if old_value != new_value:

                    self.env['my.model.audit'].create({

                        'model_id': record.id,

                        'change_type': 'write',

                        'field_name': field,

                        'old_value': str(old_value),

                        'new_value': str(new_value),

                    })

        return super(MyModel, self).write(vals)


Bài viết liên quan Trả lời Lượt xem Hoạt động
2
thg 7 24
2943
2
thg 9 25
1460
2
thg 11 24
3497
0
thg 8 24
1774
1
thg 7 24
1947