[IMP] mail: make followers API explicit
Purpose of this commit is to always call followers API with explicit parameters about existing followers management (check_existing and existing_policy parameters). It makes code easier to read and maintain. LINKS Task 1933771 Task 2078313 Co-Authored-By: Thibault Delavallée <tde@odoo.com> Co-Authored-By: Rémy Voet <ryv@odoo.com>
This commit is contained in:
co-authored by
Rémy Voet
parent
59619987e9
commit
e3ff7a49ae
@@ -228,7 +228,7 @@ GROUP BY fol.id%s""" % (
|
||||
# --------------------------------------------------
|
||||
|
||||
def _insert_followers(self, res_model, res_ids, partner_ids, partner_subtypes, channel_ids, channel_subtypes,
|
||||
customer_ids=None, check_existing=False, existing_policy='skip'):
|
||||
customer_ids=None, check_existing=True, existing_policy='skip'):
|
||||
""" Main internal method allowing to create or update followers for documents, given a
|
||||
res_model and the document res_ids. This method does not handle access rights. This is the
|
||||
role of the caller to ensure there is no security breach.
|
||||
@@ -243,9 +243,19 @@ GROUP BY fol.id%s""" % (
|
||||
"""
|
||||
sudo_self = self.sudo().with_context(default_partner_id=False, default_channel_id=False)
|
||||
if not partner_subtypes and not channel_subtypes: # no subtypes -> default computation, no force, skip existing
|
||||
new, upd = self._add_default_followers(res_model, res_ids, partner_ids, channel_ids, customer_ids=customer_ids)
|
||||
new, upd = self._add_default_followers(
|
||||
res_model, res_ids,
|
||||
partner_ids, channel_ids,
|
||||
customer_ids=customer_ids,
|
||||
check_existing=check_existing,
|
||||
existing_policy=existing_policy)
|
||||
else:
|
||||
new, upd = self._add_followers(res_model, res_ids, partner_ids, partner_subtypes, channel_ids, channel_subtypes, check_existing=check_existing, existing_policy=existing_policy)
|
||||
new, upd = self._add_followers(
|
||||
res_model, res_ids,
|
||||
partner_ids, partner_subtypes,
|
||||
channel_ids, channel_subtypes,
|
||||
check_existing=check_existing,
|
||||
existing_policy=existing_policy)
|
||||
if new:
|
||||
sudo_self.create([
|
||||
dict(values, res_id=res_id)
|
||||
@@ -255,7 +265,8 @@ GROUP BY fol.id%s""" % (
|
||||
for fol_id, values in upd.items():
|
||||
sudo_self.browse(fol_id).write(values)
|
||||
|
||||
def _add_default_followers(self, res_model, res_ids, partner_ids, channel_ids=None, customer_ids=None):
|
||||
def _add_default_followers(self, res_model, res_ids, partner_ids, channel_ids=None, customer_ids=None,
|
||||
check_existing=True, existing_policy='skip'):
|
||||
""" Shortcut to ``_add_followers`` that computes default subtypes. Existing
|
||||
followers are skipped as their subscription is considered as more important
|
||||
compared to new default subscription.
|
||||
@@ -263,6 +274,8 @@ GROUP BY fol.id%s""" % (
|
||||
:param customer_ids: optional list of partner ids that are customers. It is used if computing
|
||||
default subtype is necessary and allow to avoid the check of partners being customers (no
|
||||
user or share user). It is just a matter of saving queries if the info is already known;
|
||||
:param check_existing: see ``_add_followers``;
|
||||
:param existing_policy: see ``_add_followers``;
|
||||
|
||||
:return: see ``_add_followers``
|
||||
"""
|
||||
@@ -276,7 +289,7 @@ GROUP BY fol.id%s""" % (
|
||||
c_stypes = dict.fromkeys(channel_ids or [], default.ids)
|
||||
p_stypes = dict((pid, external.ids if pid in customer_ids else default.ids) for pid in partner_ids)
|
||||
|
||||
return self._add_followers(res_model, res_ids, partner_ids, p_stypes, channel_ids, c_stypes, check_existing=True, existing_policy='skip')
|
||||
return self._add_followers(res_model, res_ids, partner_ids, p_stypes, channel_ids, c_stypes, check_existing=check_existing, existing_policy=existing_policy)
|
||||
|
||||
def _add_followers(self, res_model, res_ids, partner_ids, partner_subtypes, channel_ids, channel_subtypes,
|
||||
check_existing=False, existing_policy='skip'):
|
||||
@@ -296,7 +309,7 @@ GROUP BY fol.id%s""" % (
|
||||
|
||||
* skip: simply skip existing followers, do not touch them;
|
||||
* force: update existing with given subtypes only;
|
||||
* replace: replace existing with nex subtypes (like force without old / new follower);
|
||||
* replace: replace existing with new subtypes (like force without old / new follower);
|
||||
* update: gives an update dict allowing to add missing subtypes (no subtype removal);
|
||||
"""
|
||||
_res_ids = res_ids or [0]
|
||||
|
||||
@@ -260,7 +260,9 @@ class MailThread(models.AbstractModel):
|
||||
|
||||
# subscribe uid unless asked not to
|
||||
if not self._context.get('mail_create_nosubscribe'):
|
||||
default_followers = self.env['mail.followers']._add_default_followers(self._name, [], self.env.user.partner_id.ids, customer_ids=[])[0][0]
|
||||
default_followers = self.env['mail.followers']._add_default_followers(
|
||||
self._name, [], self.env.user.partner_id.ids, customer_ids=[],
|
||||
check_existing=False, existing_policy='skip')[0][0]
|
||||
for values in vals_list:
|
||||
message_follower_ids = values.get('message_follower_ids') or []
|
||||
message_follower_ids += [(0, 0, fol_vals) for fol_vals in default_followers]
|
||||
@@ -2726,7 +2728,7 @@ class MailThread(models.AbstractModel):
|
||||
if not subtype_ids:
|
||||
self.env['mail.followers']._insert_followers(
|
||||
self._name, self.ids, partner_ids, None, channel_ids, None,
|
||||
customer_ids=customer_ids)
|
||||
customer_ids=customer_ids, check_existing=True, existing_policy='skip')
|
||||
else:
|
||||
self.env['mail.followers']._insert_followers(
|
||||
self._name, self.ids,
|
||||
|
||||
Reference in New Issue
Block a user