audit_log.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # -*- encoding: utf-8 -*-
  2. ##############################################################################
  3. #
  4. # OpenERP, Open Source Management Solution
  5. # Copyright (C) 2010 Smile (<http://www.smile.fr>). All Rights Reserved
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. #
  20. ##############################################################################
  21. from openerp import api, fields, models, _
  22. from openerp.exceptions import Warning
  23. from openerp.tools.safe_eval import safe_eval as eval
  24. class AuditLog(models.Model):
  25. _name = 'audit.log'
  26. _description = 'Audit Log'
  27. _order = 'create_date desc'
  28. name = fields.Char('Resource Name', size=256, compute='_get_name')
  29. create_date = fields.Datetime('Date', readonly=True)
  30. user_id = fields.Many2one('res.users', 'User', required=True, readonly=True)
  31. model_id = fields.Many2one('ir.model', 'Object', required=True, readonly=True)
  32. res_id = fields.Integer('Resource Id', readonly=True)
  33. method = fields.Char('Method', size=64, readonly=True)
  34. data = fields.Text('Data', readonly=True)
  35. data_html = fields.Html('HTML Data', readonly=True, compute='_render_html')
  36. @api.one
  37. def _get_name(self):
  38. if self.model_id and self.res_id:
  39. record = self.env[self.model_id.model].browse(self.res_id).exists()
  40. if record:
  41. self.name = record.display_name
  42. else:
  43. data = eval(self.data or '{}')
  44. rec_name = self.env[self.model_id.model]._rec_name
  45. if rec_name in data['new']:
  46. self.name = data['new'][rec_name]
  47. elif rec_name in data['old']:
  48. self.name = data['old'][rec_name]
  49. else:
  50. self.name = 'id=%s' % self.res_id
  51. else:
  52. self.name = ''
  53. @api.multi
  54. def _format_value(self, field, value):
  55. self.ensure_one()
  56. if not value and field.type not in ('boolean', 'integer', 'float'):
  57. return ''
  58. if field.type == 'selection':
  59. selection = field.selection
  60. if callable(selection):
  61. selection = getattr(self.env[self.model_id.model], selection)()
  62. return dict(selection).get(value, value)
  63. if field.type == 'many2one' and value:
  64. return self.env[field.comodel_name].browse(value).exists().display_name or value
  65. if field.type == 'reference' and value:
  66. res_model, res_id = value.split(',')
  67. return self.env[res_model].browse(int(res_id)).exists().display_name or value
  68. if field.type in ('one2many', 'many2many') and value:
  69. return ', '.join([self.env[field.comodel_name].browse(rec_id).exists().display_name or str(rec_id)
  70. for rec_id in value])
  71. if field.type == 'binary' and value:
  72. return '&lt;binary data&gt;'
  73. return value
  74. @api.multi
  75. def _get_label(self, field):
  76. label = field.string
  77. lang = self.env.user.lang
  78. translated_label = ''
  79. if lang != 'en_US':
  80. params = ('%s,%s' % (field.model_name, field.name), 'field', lang, label)
  81. translated_label = self.env['ir.translation'].sudo()._get_source(*params)
  82. return translated_label or label
  83. @api.multi
  84. def _get_content(self):
  85. self.ensure_one()
  86. content = []
  87. data = eval(self.data or '{}')
  88. model_obj = self.env[self.model_id.model]
  89. for fname in set(data['new'].keys() + data['old'].keys()):
  90. field = model_obj._fields.get(fname) or model_obj._inherit_fields.get(fname)
  91. old_value = self._format_value(field, data['old'].get(fname, ''))
  92. new_value = self._format_value(field, data['new'].get(fname, ''))
  93. label = self._get_label(field)
  94. content.append((label, old_value, new_value))
  95. return content
  96. @api.one
  97. def _render_html(self):
  98. if self.method == 'write':
  99. thead = ''
  100. for head in (_('Nombre'), _('Valor Anterior'), _('Nuevo Valor')):
  101. thead += '<th>%s</th>' % head
  102. thead = '<thead><tr class="oe_list_header_columns">%s</tr></thead>' % thead
  103. tbody = ''
  104. for line in self._get_content():
  105. row = ''
  106. for item in line:
  107. row += '<td>%s</td>' % item
  108. tbody += '<tr>%s</tr>' % row
  109. tbody = '<tbody>%s</tbody>' % tbody
  110. self.data_html = '<table class="oe_list_content">%s%s</table>' % (thead, tbody)
  111. @api.multi
  112. def unlink(self):
  113. raise Warning(_('You cannot remove audit logs!'))