54 lines
2.0 KiB
Python
Executable File
54 lines
2.0 KiB
Python
Executable File
# Copyright 2016-2018 Tecnativa - Pedro M. Baeza
|
|
# Copyright 2021 Tecnativa - Víctor Martínez
|
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
|
|
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = "res.partner"
|
|
|
|
# add indexes for better performance on record rules
|
|
user_id = fields.Many2one(index=True)
|
|
|
|
def _remove_key_followers(self, partner):
|
|
for record in self.mapped("commercial_partner_id"):
|
|
# Look for delivery and invoice addresses
|
|
childrens = record.child_ids.filtered(
|
|
lambda x: x.type in {"invoice", "delivery"}
|
|
)
|
|
(childrens + record).message_unsubscribe(partner_ids=partner.ids)
|
|
|
|
def _add_followers_from_salesmen(self):
|
|
"""Sync followers in commercial partner + delivery/invoice contacts."""
|
|
for record in self.commercial_partner_id:
|
|
followers = (record.child_ids + record).user_id.partner_id
|
|
# Look for delivery and invoice addresses
|
|
childrens = record.child_ids.filtered(
|
|
lambda x: x.type in {"invoice", "delivery"}
|
|
)
|
|
(childrens + record).message_subscribe(partner_ids=followers.ids)
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
"""Sync followers on contact creation."""
|
|
records = super().create(vals_list)
|
|
records._add_followers_from_salesmen()
|
|
return records
|
|
|
|
def write(self, vals):
|
|
"""If the salesman is changed, first remove the old salesman as follower
|
|
of the key contacts (commercial + delivery/invoice), and then sync for
|
|
the new ones.
|
|
|
|
It performs as well the followers sync on contact type change.
|
|
"""
|
|
if "user_id" in vals:
|
|
for record in self.filtered("user_id"):
|
|
record._remove_key_followers(record.user_id.partner_id)
|
|
result = super().write(vals)
|
|
if "user_id" in vals or vals.get("type") in {"invoice", "delivery"}:
|
|
self._add_followers_from_salesmen()
|
|
return result
|