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.
121 lines
5.1 KiB
121 lines
5.1 KiB
# -*- coding: utf-8 -*-
|
|
# © 2017 Therp BV <http://therp.nl>
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
from openerp import _, api, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class ResPartnerRelation(models.Model):
|
|
_inherit = 'res.partner.relation'
|
|
|
|
def relation_exists(self, left, type_rel):
|
|
relation = self.search([
|
|
('left_partner_id', '=', left),
|
|
('type_id', '=', type_rel),
|
|
])
|
|
return relation
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
part_mod = self.env['res.partner']
|
|
type_relation = self.env.ref(
|
|
'partner_multi_relation_parent.parent_relation_type'
|
|
).id
|
|
for this in self:
|
|
if this.type_id != type_relation:
|
|
continue
|
|
# check that whatever relation will come out of this write does
|
|
# not exist already , but check only if type_id doesn't change, if
|
|
# it does we don't care about uniqueness
|
|
if this.left_partner_id.type != 'contact':
|
|
raise UserError(_(
|
|
"Only contact types are allowed in relation of type %s"
|
|
"you are trying to make a ' %s ' relation with a partner"
|
|
"of type %s" % (
|
|
relation.type_id.name,
|
|
relation.type_id.name,
|
|
this.left_partner_id.type
|
|
)))
|
|
if vals.get('type_id', this.type_id) == type_relation:
|
|
relation = this.relation_exists(
|
|
vals.get('left_partner_id', this.left_partner_id),
|
|
type_relation,
|
|
vals.get('right_partner_id', this.right_partner_id)
|
|
)
|
|
if relation:
|
|
raise UserError(_(
|
|
"The relation you are creating exists and has id %s"
|
|
"there can only be one relation of type %s" % (
|
|
str(relation.id), relation.type_id.name
|
|
)))
|
|
if 'type_id' in vals and vals['type_id'] != type_relation:
|
|
this.left_partner_id.with_context(
|
|
no_relation_update=True
|
|
).write({'parent_id': False})
|
|
elif 'right_partner_id' in vals and 'left_partner_id' not in vals:
|
|
new_parent = vals.get('right_partner_id')
|
|
contact_id = this.left_partner_id
|
|
contact_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': new_parent}
|
|
)
|
|
elif 'left_partner_id' in vals and 'right_partner_id' not in vals:
|
|
old_contact_id = part_mod.browse(this.left_partner_id)
|
|
old_contact_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': False}
|
|
)
|
|
contact_id = part_mod.browse(vals['left_partner_id'])
|
|
contact_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': this.right_partner_id}
|
|
)
|
|
elif 'left_partner_id' in vals and 'right_partner_id' in vals:
|
|
old_contact_id = this.left_partner_id
|
|
old_contact_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': False}
|
|
)
|
|
contact_id = part_mod.browse(vals['left_partner_id'])
|
|
contact_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': vals['right_partner_id']},
|
|
)
|
|
res = super(ResPartnerRelation, self).write(vals=vals)
|
|
return res
|
|
|
|
@api.multi
|
|
def unlink(self):
|
|
type_relation = self.env.ref(
|
|
'partner_multi_relation_parent.parent_relation_type'
|
|
).id
|
|
for this in self:
|
|
if this.type_id.id != type_relation:
|
|
continue
|
|
this.left_partner_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': False}
|
|
)
|
|
res = super(ResPartnerRelation, self).unlink()
|
|
return res
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
type_relation = self.env.ref(
|
|
'partner_multi_relation_parent.parent_relation_type'
|
|
).id
|
|
current = self.relation_exists(
|
|
vals['left_partner_id'],
|
|
type_relation,
|
|
)
|
|
if current:
|
|
# we are creating a relation but one already exists, raise an
|
|
# exception to warn the user relations of type_relation must be
|
|
# unique.
|
|
raise UserError(_(
|
|
"The relation you are creating exists and has id %s"
|
|
"there can only be one relation of type %s" % (
|
|
str(current.id), current.type_id.name
|
|
)))
|
|
# there is no relation, so we can create it, but we must update
|
|
# the parent_id of the left contact of this new relation
|
|
res = super(ResPartnerRelation, self).create(vals=vals)
|
|
if res.type_id.id == type_relation:
|
|
res.left_partner_id.with_context(no_relation_update=True).write(
|
|
{'parent_id': vals['right_partner_id']}
|
|
)
|
|
return res
|