You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
# -*- coding: utf-8 -*-
|
|
# Copyright 2018 Akretion - Benoît Guillot
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import fields, models, api, exceptions, _
|
|
import hashlib
|
|
from collections import OrderedDict
|
|
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = "res.partner"
|
|
|
|
version_hash = fields.Char(readonly=True, copy=False)
|
|
date_version = fields.Datetime(string='Date version', readonly=True)
|
|
|
|
@api.multi
|
|
def get_address_version(self):
|
|
"""
|
|
Get a versioned partner corresponding to the partner fields.
|
|
If no versioned partner exists, create a new one.
|
|
"""
|
|
self.ensure_one()
|
|
version_hash = self.get_version_hash()
|
|
versioned_partner = self.with_context(active_test=False).search(
|
|
[('version_hash', '=', version_hash)])
|
|
if versioned_partner:
|
|
return versioned_partner
|
|
default = {
|
|
'active': False,
|
|
'version_hash': version_hash,
|
|
'parent_id': self.parent_id and self.parent_id.id or self.id,
|
|
'date_version': fields.Datetime.now(),
|
|
}
|
|
versioned_partner = self.copy(default=default)
|
|
return versioned_partner
|
|
|
|
def get_version_fields(self):
|
|
return [
|
|
'name', 'street', 'street2', 'zip', 'city', 'country_id',
|
|
'parent_id'
|
|
]
|
|
|
|
def get_version_hash(self):
|
|
version_fields = self.get_version_fields()
|
|
version = OrderedDict()
|
|
for field in version_fields:
|
|
if field == 'parent_id':
|
|
parent_id = self.parent_id and self.parent_id.id or self.id
|
|
version[field] = parent_id
|
|
elif self[field]:
|
|
version[field] = self[field]
|
|
version_hash = hashlib.md5(str(version)).hexdigest()
|
|
return version_hash
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
version_fields = self.get_version_fields()
|
|
has_written_versioned_fields = any(
|
|
(f in version_fields) for f in vals.keys()
|
|
)
|
|
for partner in self:
|
|
if partner.version_hash and has_written_versioned_fields:
|
|
raise exceptions.UserError(_(
|
|
"You can't modify a versioned field %s on the versioned "
|
|
"partner %s.") % (version_fields, partner.name))
|
|
return super(ResPartner, self).write(vals)
|