[REF] mail: improve implementation of message subscribe
This commit refactors mail.thread message_subscribe method. It is done for two purposes. First one is to optimize performance by using the new followers computation methods introduced recently. Second purpose is to clean the API of message_subscribe to make it simpler to use. This commit splits message_subscribe in two main parts : * _message_subscribe is a private method calling the follower new subscription methods and updating the record set; * message_subscribe is a public wrapper on _message_subscribe that adds access rights checks; Simplification comes by removing message_subscribe_users that was a shortcut to message_subscribe. Having a method to subscribe partners and channels is sufficient as we would like to avoid bloating the public API of mail.thread. A force parameter is also removed from message_subscribe as this implementation detail can be induced in the computation. Various addons using the removed methods are updated in order to use the new subscription API. They have the same functional behavior. This commit has a great impact when subscribing several followers. In a more general way all code using message_post is also optimized as posting a message generally implies subscribing followers. It also improves activity use as posting a message and subscribing new followers are common process in activities.
This commit is contained in:
@@ -1396,13 +1396,14 @@ class Meeting(models.Model):
|
||||
return super(Meeting, self.browse(thread_id)).message_post(**kwargs)
|
||||
|
||||
@api.multi
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, force=True):
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None):
|
||||
records = self.browse(get_real_ids(self.ids))
|
||||
return super(Meeting, records).message_subscribe(
|
||||
partner_ids=partner_ids,
|
||||
channel_ids=channel_ids,
|
||||
subtype_ids=subtype_ids,
|
||||
force=force)
|
||||
return super(Meeting, records).message_subscribe(partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=subtype_ids)
|
||||
|
||||
@api.multi
|
||||
def _message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, customer_ids=None):
|
||||
records = self.browse(get_real_ids(self.ids))
|
||||
return super(Meeting, records)._message_subscribe(partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=subtype_ids, customer_ids=customer_ids)
|
||||
|
||||
@api.multi
|
||||
def message_unsubscribe(self, partner_ids=None, channel_ids=None):
|
||||
|
||||
@@ -17,8 +17,7 @@ class NewLeadNotification(TestCrmCases):
|
||||
})
|
||||
|
||||
subtype = self.env.ref("crm.mt_salesteam_lead")
|
||||
sales_team_1.message_subscribe(partner_ids=[self.crm_salesman.partner_id.id], subtype_ids=[subtype.id])
|
||||
sales_team_1.message_subscribe(channel_ids=[channel_listen.id], subtype_ids=[subtype.id])
|
||||
sales_team_1.message_subscribe(partner_ids=[self.crm_salesman.partner_id.id], channel_ids=[channel_listen.id], subtype_ids=[subtype.id])
|
||||
|
||||
# Imitate what happens in the controller when somebody creates a new
|
||||
# lead from the website form
|
||||
|
||||
@@ -286,7 +286,7 @@ class Department(models.Model):
|
||||
department = super(Department, self.with_context(mail_create_nosubscribe=True)).create(vals)
|
||||
manager = self.env['hr.employee'].browse(vals.get("manager_id"))
|
||||
if manager.user_id:
|
||||
department.message_subscribe_users(user_ids=manager.user_id.ids)
|
||||
department.message_subscribe(partner_ids=manager.user_id.partner_id.ids)
|
||||
return department
|
||||
|
||||
@api.multi
|
||||
@@ -303,7 +303,7 @@ class Department(models.Model):
|
||||
manager = self.env['hr.employee'].browse(manager_id)
|
||||
# subscribe the manager user
|
||||
if manager.user_id:
|
||||
self.message_subscribe_users(user_ids=manager.user_id.ids)
|
||||
self.message_subscribe(partner_ids=manager.user_id.partner_id.ids)
|
||||
# set the employees's parent to the new manager
|
||||
self._update_employee_manager(manager_id)
|
||||
return super(Department, self).write(vals)
|
||||
|
||||
@@ -574,7 +574,7 @@ class HrExpenseSheet(models.Model):
|
||||
|
||||
def _add_followers(self):
|
||||
users = self._get_users_to_subscribe()
|
||||
self.message_subscribe_users(user_ids=users.ids)
|
||||
self.message_subscribe(partner_ids=users.mapped('partner_id').ids)
|
||||
|
||||
@api.model
|
||||
def _create_set_followers(self, values):
|
||||
|
||||
@@ -223,7 +223,7 @@ class HolidaysRequest(models.Model):
|
||||
def add_follower(self, employee_id):
|
||||
employee = self.env['hr.employee'].browse(employee_id)
|
||||
if employee.user_id:
|
||||
self.message_subscribe_users(user_ids=employee.user_id.ids)
|
||||
self.message_subscribe(partner_ids=employee.user_id.partner_id.ids)
|
||||
|
||||
@api.multi
|
||||
@api.constrains('holiday_status_id')
|
||||
|
||||
@@ -124,7 +124,7 @@ class HolidaysAllocation(models.Model):
|
||||
def add_follower(self, employee_id):
|
||||
employee = self.env['hr.employee'].browse(employee_id)
|
||||
if employee.user_id:
|
||||
self.message_subscribe_users(user_ids=employee.user_id.ids)
|
||||
self.message_subscribe(partner_ids=employee.user_id.partner_id.ids)
|
||||
|
||||
@api.multi
|
||||
@api.constrains('holiday_status_id')
|
||||
|
||||
@@ -36,29 +36,29 @@ class MaintenanceEquipment(models.Model):
|
||||
def create(self, vals):
|
||||
equipment = super(MaintenanceEquipment, self).create(vals)
|
||||
# subscribe employee or department manager when equipment assign to him.
|
||||
user_ids = []
|
||||
partner_ids = []
|
||||
if equipment.employee_id and equipment.employee_id.user_id:
|
||||
user_ids.append(equipment.employee_id.user_id.id)
|
||||
partner_ids.append(equipment.employee_id.user_id.partner_id.id)
|
||||
if equipment.department_id and equipment.department_id.manager_id and equipment.department_id.manager_id.user_id:
|
||||
user_ids.append(equipment.department_id.manager_id.user_id.id)
|
||||
if user_ids:
|
||||
equipment.message_subscribe_users(user_ids=user_ids)
|
||||
partner_ids.append(equipment.department_id.manager_id.user_id.partner_id.id)
|
||||
if partner_ids:
|
||||
equipment.message_subscribe(partner_ids=partner_ids)
|
||||
return equipment
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
user_ids = []
|
||||
partner_ids = []
|
||||
# subscribe employee or department manager when equipment assign to employee or department.
|
||||
if vals.get('employee_id'):
|
||||
user_id = self.env['hr.employee'].browse(vals['employee_id'])['user_id']
|
||||
if user_id:
|
||||
user_ids.append(user_id.id)
|
||||
partner_ids.append(user_id.partner_id.id)
|
||||
if vals.get('department_id'):
|
||||
department = self.env['hr.department'].browse(vals['department_id'])
|
||||
if department and department.manager_id and department.manager_id.user_id:
|
||||
user_ids.append(department.manager_id.user_id.id)
|
||||
if user_ids:
|
||||
self.message_subscribe_users(user_ids=user_ids)
|
||||
partner_ids.append(department.manager_id.user_id.partner_id.id)
|
||||
if partner_ids:
|
||||
self.message_subscribe(partner_ids=partner_ids)
|
||||
return super(MaintenanceEquipment, self).write(vals)
|
||||
|
||||
@api.multi
|
||||
@@ -105,7 +105,7 @@ class MaintenanceRequest(models.Model):
|
||||
def create(self, vals):
|
||||
result = super(MaintenanceRequest, self).create(vals)
|
||||
if result.employee_id.user_id:
|
||||
result.message_subscribe_users(user_ids=[result.employee_id.user_id.id])
|
||||
result.message_subscribe(partner_ids=[result.employee_id.user_id.partner_id.id])
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
@@ -113,7 +113,7 @@ class MaintenanceRequest(models.Model):
|
||||
if vals.get('employee_id'):
|
||||
employee = self.env['hr.employee'].browse(vals['employee_id'])
|
||||
if employee and employee.user_id:
|
||||
self.message_subscribe_users(user_ids=[employee.user_id.id])
|
||||
self.message_subscribe(partner_ids=[employee.user_id.partner_id.id])
|
||||
return super(MaintenanceRequest, self).write(vals)
|
||||
|
||||
@api.model
|
||||
|
||||
@@ -40,7 +40,7 @@ class ServerActions(models.Model):
|
||||
Model = self.env[action.model_id.model]
|
||||
if self.partner_ids or self.channel_ids and hasattr(Model, 'message_subscribe'):
|
||||
records = Model.browse(self._context.get('active_ids', self._context.get('active_id')))
|
||||
records.message_subscribe(self.partner_ids.ids, self.channel_ids.ids, force=False)
|
||||
records.message_subscribe(self.partner_ids.ids, self.channel_ids.ids)
|
||||
return False
|
||||
|
||||
@api.model
|
||||
|
||||
@@ -1849,7 +1849,7 @@ class MailThread(models.AbstractModel):
|
||||
partner_to_subscribe = partner_ids
|
||||
if self._context.get('mail_post_autofollow_partner_ids'):
|
||||
partner_to_subscribe = [p for p in partner_ids if p in self._context.get('mail_post_autofollow_partner_ids')]
|
||||
self.message_subscribe(list(partner_to_subscribe), force=False)
|
||||
self.message_subscribe(list(partner_to_subscribe))
|
||||
|
||||
# _mail_flat_thread: automatically set free messages to the first posted message
|
||||
MailMessage = self.env['mail.message']
|
||||
@@ -1908,7 +1908,7 @@ class MailThread(models.AbstractModel):
|
||||
|
||||
# Post-process: subscribe author
|
||||
if values['author_id'] and values['model'] and self.ids and values['message_type'] != 'notification' and not self._context.get('mail_create_nosubscribe'):
|
||||
self.message_subscribe([values['author_id']], force=False)
|
||||
self._message_subscribe([values['author_id']])
|
||||
|
||||
@api.multi
|
||||
def message_post_with_view(self, views_or_xmlid, **kwargs):
|
||||
@@ -2034,26 +2034,18 @@ class MailThread(models.AbstractModel):
|
||||
# ------------------------------------------------------
|
||||
|
||||
@api.multi
|
||||
def message_subscribe_users(self, user_ids=None, subtype_ids=None):
|
||||
""" Wrapper on message_subscribe, using users. If user_ids is not
|
||||
provided, subscribe uid instead. """
|
||||
if user_ids is None:
|
||||
user_ids = [self._uid]
|
||||
return self.message_subscribe(self.env['res.users'].browse(user_ids).mapped('partner_id').ids, subtype_ids=subtype_ids)
|
||||
|
||||
@api.multi
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, force=True):
|
||||
""" Add partners to the records followers. """
|
||||
# not necessary for computation, but saves an access right check
|
||||
if not partner_ids and not channel_ids:
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None):
|
||||
""" Main public API to add followers to a record set. Its main purpose is
|
||||
to perform access rights checks before calling ``_message_subscribe``. """
|
||||
if not self or (not partner_ids and not channel_ids):
|
||||
return True
|
||||
if partner_ids is None:
|
||||
partner_ids = []
|
||||
if channel_ids is None:
|
||||
channel_ids = []
|
||||
|
||||
# TDE CHECK THIS
|
||||
if not channel_ids and partner_ids and set(partner_ids) == set([self.env.user.partner_id.id]):
|
||||
partner_ids = partner_ids or []
|
||||
channel_ids = channel_ids or []
|
||||
adding_current = set(partner_ids) == set([self.env.user.partner_id.id])
|
||||
customer_ids = [] if adding_current else None
|
||||
|
||||
if not channel_ids and partner_ids and adding_current:
|
||||
try:
|
||||
self.check_access_rights('read')
|
||||
self.check_access_rule('read')
|
||||
@@ -2063,25 +2055,38 @@ class MailThread(models.AbstractModel):
|
||||
self.check_access_rights('write')
|
||||
self.check_access_rule('write')
|
||||
|
||||
partner_data = dict((pid, subtype_ids) for pid in partner_ids)
|
||||
channel_data = dict((cid, subtype_ids) for cid in channel_ids)
|
||||
gen, part = self.env['mail.followers']._add_follower_command(self._name, self.ids, partner_data, channel_data, force=force)
|
||||
self.sudo().write({'message_follower_ids': gen})
|
||||
for record in self.filtered(lambda self: self.id in part):
|
||||
record.write({'message_follower_ids': part[record.id]})
|
||||
return self._message_subscribe(partner_ids, channel_ids, subtype_ids, customer_ids=customer_ids)
|
||||
|
||||
def _message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, customer_ids=None):
|
||||
""" Main private API to add followers to a record set. This method adds
|
||||
partners and channels, given their IDs, as followers of all records
|
||||
contained in the record set.
|
||||
|
||||
If subtypes are given existing followers are erased with new subtypes.
|
||||
If default one have to be computed only missing followers will be added
|
||||
with default subtypes matching the record set model.
|
||||
|
||||
This private method does not specifically check for access right. Use
|
||||
``message_subscribe`` public API when not sure about access rights.
|
||||
|
||||
:param customer_ids: see ``_insert_followers`` """
|
||||
if not self:
|
||||
return True
|
||||
|
||||
if not subtype_ids:
|
||||
self.env['mail.followers']._insert_followers(
|
||||
self._name, self.ids, partner_ids, None, channel_ids, None,
|
||||
customer_ids=customer_ids)
|
||||
else:
|
||||
self.env['mail.followers']._insert_followers(
|
||||
self._name, self.ids,
|
||||
partner_ids, dict((pid, subtype_ids) for pid in partner_ids),
|
||||
channel_ids, dict((cid, subtype_ids) for cid in channel_ids),
|
||||
customer_ids=customer_ids, check_existing=True, existing_policy='force')
|
||||
|
||||
self.invalidate_cache()
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def message_unsubscribe_users(self, user_ids=None):
|
||||
""" Wrapper on message_subscribe, using users. If user_ids is not
|
||||
provided, unsubscribe uid instead. """
|
||||
if user_ids is None:
|
||||
user_ids = [self._uid]
|
||||
partner_ids = [user.partner_id.id for user in self.env['res.users'].browse(user_ids)]
|
||||
return self.message_unsubscribe(partner_ids)
|
||||
|
||||
@api.multi
|
||||
def message_unsubscribe(self, partner_ids=None, channel_ids=None):
|
||||
""" Remove partners from the records followers. """
|
||||
@@ -2224,10 +2229,10 @@ class MailThread(models.AbstractModel):
|
||||
|
||||
for pid, subtypes in new_partners.items():
|
||||
subtypes = list(subtypes) if subtypes is not None else None
|
||||
self.message_subscribe(partner_ids=[pid], subtype_ids=subtypes, force=(subtypes != None))
|
||||
self.message_subscribe(partner_ids=[pid], subtype_ids=subtypes)
|
||||
for cid, subtypes in new_channels.items():
|
||||
subtypes = list(subtypes) if subtypes is not None else None
|
||||
self.message_subscribe(channel_ids=[cid], subtype_ids=subtypes, force=(subtypes != None))
|
||||
self.message_subscribe(channel_ids=[cid], subtype_ids=subtypes)
|
||||
|
||||
# remove the current user from the needaction partner to avoid to notify the author of the message
|
||||
user_pids = [user.partner_id.id for user in to_add_users if user != self.env.user]
|
||||
|
||||
@@ -208,13 +208,13 @@ class MaintenanceEquipment(models.Model):
|
||||
def create(self, vals):
|
||||
equipment = super(MaintenanceEquipment, self).create(vals)
|
||||
if equipment.owner_user_id:
|
||||
equipment.message_subscribe_users(user_ids=[equipment.owner_user_id.id])
|
||||
equipment.message_subscribe(partner_ids=[equipment.owner_user_id.partner_id.id])
|
||||
return equipment
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if vals.get('owner_user_id'):
|
||||
self.message_subscribe_users(user_ids=[vals['owner_user_id']])
|
||||
self.message_subscribe(partner_ids=self.env['res.users'].browse(vals['owner_user_id']).partner_id.ids)
|
||||
return super(MaintenanceEquipment, self).write(vals)
|
||||
|
||||
@api.model
|
||||
@@ -377,8 +377,8 @@ class MaintenanceRequest(models.Model):
|
||||
|
||||
def _add_followers(self):
|
||||
for request in self:
|
||||
user_ids = (request.owner_user_id + request.technician_user_id).ids
|
||||
request.message_subscribe_users(user_ids=user_ids)
|
||||
partner_ids = (request.owner_user_id.partner_id + request.technician_user_id.partner_id).ids
|
||||
request.message_subscribe(partner_ids=partner_ids)
|
||||
|
||||
@api.model
|
||||
def _read_group_stage_ids(self, stages, domain, order):
|
||||
|
||||
@@ -358,16 +358,14 @@ class Project(models.Model):
|
||||
return super(Project, self).get_access_action(access_uid)
|
||||
|
||||
@api.multi
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, force=True):
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None):
|
||||
""" Subscribe to all existing active tasks when subscribing to a project """
|
||||
res = super(Project, self).message_subscribe(partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=subtype_ids, force=force)
|
||||
if not subtype_ids or any(subtype.parent_id.res_model == 'project.task' for subtype in self.env['mail.message.subtype'].browse(subtype_ids)):
|
||||
for partner_id in partner_ids or []:
|
||||
self.mapped('tasks').filtered(lambda task: not task.stage_id.fold and partner_id not in task.message_partner_ids.ids).message_subscribe(
|
||||
partner_ids=[partner_id], channel_ids=None, subtype_ids=None, force=False)
|
||||
for channel_id in channel_ids or []:
|
||||
self.mapped('tasks').filtered(lambda task: not task.stage_id.fold and channel_id not in task.message_channel_ids.ids).message_subscribe(
|
||||
partner_ids=None, channel_ids=[channel_id], subtype_ids=None, force=False)
|
||||
res = super(Project, self).message_subscribe(partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=subtype_ids)
|
||||
project_subtypes = self.env['mail.message.subtype'].browse(subtype_ids) if subtype_ids else None
|
||||
task_subtypes = project_subtypes.mapped('parent_id').ids if project_subtypes else None
|
||||
if not subtype_ids or task_subtypes:
|
||||
self.mapped('tasks').message_subscribe(
|
||||
partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=task_subtypes)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
|
||||
@@ -79,7 +79,7 @@ class TestPortalProject(TestPortalProjectBase):
|
||||
# Do: Donovan reads project -> ko (public ko employee)
|
||||
self.assertRaises(AccessError, pigs.sudo(self.user_public).read, ['user_id'])
|
||||
|
||||
pigs.message_subscribe_users(user_ids=[self.user_projectuser.id])
|
||||
pigs.message_subscribe(partner_ids=[self.user_projectuser.partner_id.id])
|
||||
|
||||
# Do: Alfred reads project -> ok (follower ok followers)
|
||||
prout = pigs.sudo(self.user_projectuser)
|
||||
@@ -93,7 +93,7 @@ class TestPortalProject(TestPortalProjectBase):
|
||||
'name': 'Pigs task', 'project_id': pigs.id
|
||||
})
|
||||
# not follower user should not be able to create a task
|
||||
pigs.sudo(self.user_projectuser).message_unsubscribe_users(user_ids=[self.user_projectuser.id])
|
||||
pigs.sudo(self.user_projectuser).message_unsubscribe(partner_ids=[self.user_projectuser.partner_id.id])
|
||||
self.assertRaises(AccessError, self.env['project.task'].sudo(self.user_projectuser).with_context({
|
||||
'mail_create_nolog': True}).create, {'name': 'Pigs task', 'project_id': pigs.id})
|
||||
|
||||
|
||||
@@ -25,9 +25,9 @@ class TestPortalProject(TestPortalProjectBase):
|
||||
self.assertRaises(AccessError, self.env['project.task'].sudo(self.user_noone).search, [('project_id', '=', pigs.id)])
|
||||
|
||||
# Data: task follower
|
||||
pigs.sudo(self.user_projectmanager).message_subscribe_users(user_ids=[self.user_portal.id])
|
||||
self.task_1.sudo(self.user_projectuser).message_subscribe_users(user_ids=[self.user_portal.id])
|
||||
self.task_3.sudo(self.user_projectuser).message_subscribe_users(user_ids=[self.user_portal.id])
|
||||
pigs.sudo(self.user_projectmanager).message_subscribe(partner_ids=[self.user_portal.partner_id.id])
|
||||
self.task_1.sudo(self.user_projectuser).message_subscribe(partner_ids=[self.user_portal.partner_id.id])
|
||||
self.task_3.sudo(self.user_projectuser).message_subscribe(partner_ids=[self.user_portal.partner_id.id])
|
||||
# Do: Chell reads project -> ok (portal ok public)
|
||||
pigs.sudo(self.user_portal).read(['user_id'])
|
||||
# Do: Donovan reads project -> ko (public ko portal)
|
||||
@@ -35,5 +35,5 @@ class TestPortalProject(TestPortalProjectBase):
|
||||
# Test: no access right to project.task
|
||||
self.assertRaises(AccessError, self.env['project.task'].sudo(self.user_public).search, [])
|
||||
# Data: task follower cleaning
|
||||
self.task_1.sudo(self.user_projectuser).message_unsubscribe_users(user_ids=[self.user_portal.id])
|
||||
self.task_3.sudo(self.user_projectuser).message_unsubscribe_users(user_ids=[self.user_portal.id])
|
||||
self.task_1.sudo(self.user_projectuser).message_unsubscribe(partner_ids=[self.user_portal.partner_id.id])
|
||||
self.task_3.sudo(self.user_projectuser).message_unsubscribe(partner_ids=[self.user_portal.partner_id.id])
|
||||
|
||||
@@ -26,7 +26,7 @@ class BaseFollowersTest(common.BaseFunctionalTest):
|
||||
test_record = self.test_record.sudo(self.user_employee)
|
||||
followed_before = test_record.search([('message_is_follower', '=', True)])
|
||||
self.assertFalse(test_record.message_is_follower)
|
||||
test_record.message_subscribe_users(user_ids=[self.user_employee.id])
|
||||
test_record.message_subscribe(partner_ids=[self.user_employee.partner_id.id])
|
||||
followed_after = test_record.search([('message_is_follower', '=', True)])
|
||||
self.assertTrue(test_record.message_is_follower)
|
||||
self.assertEqual(followed_before | test_record, followed_after)
|
||||
@@ -80,7 +80,7 @@ class BaseFollowersTest(common.BaseFunctionalTest):
|
||||
self.assertEqual(follower, test_record.message_follower_ids)
|
||||
self.assertEqual(follower.subtype_ids, self.mt_mg_nodef)
|
||||
|
||||
def test_followers_multiple_subscription(self):
|
||||
def test_followers_multiple_subscription_force(self):
|
||||
test_record = self.test_record.sudo(self.user_employee)
|
||||
|
||||
test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id], subtype_ids=[self.mt_mg_nodef.id])
|
||||
@@ -102,7 +102,7 @@ class BaseFollowersTest(common.BaseFunctionalTest):
|
||||
self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef)
|
||||
|
||||
# set new subtypes with force=False, meaning no rewriting of the subscription is done -> result should not change
|
||||
test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id], force=False)
|
||||
test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id])
|
||||
self.assertEqual(test_record.message_partner_ids, self.user_admin.partner_id)
|
||||
self.assertEqual(test_record.message_channel_ids, self.env['mail.channel'])
|
||||
self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef)
|
||||
|
||||
@@ -32,7 +32,7 @@ class TestMessagePost(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
_body, _body_alt, _subject = '<p>Test Body</p>', 'Test Body', 'Test Subject'
|
||||
|
||||
# subscribe second employee to the group to test notifications
|
||||
self.test_record.message_subscribe_users(user_ids=[self.user_admin.id])
|
||||
self.test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id])
|
||||
|
||||
msg = self.test_record.sudo(self.user_employee).message_post(
|
||||
body=_body, subject=_subject,
|
||||
@@ -61,7 +61,7 @@ class TestMessagePost(BaseFunctionalTest, MockEmails, TestRecipients):
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
def test_post_notifications_keep_emails(self):
|
||||
self.test_record.message_subscribe_users(user_ids=[self.user_admin.id])
|
||||
self.test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id])
|
||||
|
||||
msg = self.test_record.sudo(self.user_employee).message_post(
|
||||
body='Test', subject='Test',
|
||||
|
||||
@@ -99,7 +99,7 @@ class TestMailPerformance(TransactionCase):
|
||||
@users('admin', 'emp')
|
||||
@warmup
|
||||
def test_create_mail_simple(self):
|
||||
with self.assertQueryCount(admin=9, emp=9): # test_mail only: 9 - 9
|
||||
with self.assertQueryCount(admin=8, emp=8): # test_mail only: 8 - 8
|
||||
self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
|
||||
@users('admin', 'emp')
|
||||
@@ -160,7 +160,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
'default_res_model': 'mail.test.activity',
|
||||
})
|
||||
|
||||
with self.assertQueryCount(admin=27, emp=33): # test_mail only: 26 - 32
|
||||
with self.assertQueryCount(admin=11, emp=15): # test_mail only: 11 - 15
|
||||
activity = MailActivity.create({
|
||||
'summary': 'Test Activity',
|
||||
'res_id': record.id,
|
||||
@@ -176,7 +176,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_adv_activity_mixin(self):
|
||||
record = self.env['mail.test.activity'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=27, emp=33): # test_mail only: 26 - 32
|
||||
with self.assertQueryCount(admin=11, emp=15): # test_mail only: 11 - 15
|
||||
record.action_start('Test Start')
|
||||
|
||||
record.write({'name': 'Dupe write'})
|
||||
@@ -193,7 +193,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
self.user_test.write({'notification_type': 'email'})
|
||||
record = self.env['mail.test.track'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=88, emp=115): # test_mail only: 86 - 113
|
||||
with self.assertQueryCount(admin=86, emp=111): # test_mail only: 84 - 109
|
||||
record.write({
|
||||
'user_id': self.user_test.id,
|
||||
})
|
||||
@@ -203,7 +203,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_message_assignation_inbox(self):
|
||||
record = self.env['mail.test.track'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=48, emp=63): # test_mail only: 48 - 63
|
||||
with self.assertQueryCount(admin=47, emp=60): # com runbot 46 - 59 // test_mail only: 46 - 59
|
||||
record.write({
|
||||
'user_id': self.user_test.id,
|
||||
})
|
||||
@@ -223,7 +223,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_message_log_with_post(self):
|
||||
record = self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=27, emp=38): # test_mail only: 27 - 38
|
||||
with self.assertQueryCount(admin=24, emp=34): # test_mail only: 24 - 34
|
||||
record.message_post(
|
||||
body='<p>Test message_post as log</p>',
|
||||
subtype='mail.mt_note',
|
||||
@@ -234,7 +234,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_message_post_no_notification(self):
|
||||
record = self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=27, emp=38): # test_mail only: 27 - 38
|
||||
with self.assertQueryCount(admin=24, emp=34): # test_mail only: 24 - 34
|
||||
record.message_post(
|
||||
body='<p>Test Post Performances basic</p>',
|
||||
partner_ids=[],
|
||||
@@ -247,7 +247,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_message_post_one_email_notification(self):
|
||||
record = self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=78, emp=105): # com runbot 76 - 103 // test_mail only: 76 - 103
|
||||
with self.assertQueryCount(admin=75, emp=101): # com runbot 73 - 99 // test_mail only: 73 - 99
|
||||
record.message_post(
|
||||
body='<p>Test Post Performances with an email ping</p>',
|
||||
partner_ids=self.customer.ids,
|
||||
@@ -259,7 +259,7 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_message_post_one_inbox_notification(self):
|
||||
record = self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=40, emp=52): # com runbot 38 - 50 // test_mail only: 40 - 52
|
||||
with self.assertQueryCount(admin=37, emp=48): # com runbot 35 - 46 // test_mail only: 37 - 48
|
||||
record.message_post(
|
||||
body='<p>Test Post Performances with an inbox ping</p>',
|
||||
partner_ids=self.user_test.partner_id.ids,
|
||||
@@ -272,10 +272,10 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
def test_message_subscribe_default(self):
|
||||
record = self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
|
||||
with self.assertQueryCount(admin=7, emp=8): # test_mail only: 7 - 8
|
||||
with self.assertQueryCount(admin=6, emp=6): # test_mail only: 6 - 6
|
||||
record.message_subscribe(partner_ids=self.user_test.partner_id.ids)
|
||||
|
||||
with self.assertQueryCount(admin=19, emp=19): # test_mail only: 19 - 19
|
||||
with self.assertQueryCount(admin=3, emp=3): # test_mail only: 3 - 3
|
||||
record.message_subscribe(partner_ids=self.user_test.partner_id.ids)
|
||||
|
||||
@mute_logger('odoo.models.unlink')
|
||||
@@ -285,10 +285,10 @@ class TestAdvMailPerformance(TransactionCase):
|
||||
record = self.env['mail.test.simple'].create({'name': 'Test'})
|
||||
subtype_ids = (self.env.ref('test_mail.st_mail_test_simple_external') | self.env.ref('mail.mt_comment')).ids
|
||||
|
||||
with self.assertQueryCount(admin=7, emp=8): # test_mail only: 7 - 8
|
||||
with self.assertQueryCount(admin=5, emp=5): # test_mail only: 5 - 5
|
||||
record.message_subscribe(partner_ids=self.user_test.partner_id.ids, subtype_ids=subtype_ids)
|
||||
|
||||
with self.assertQueryCount(admin=19, emp=19): # test_mail only: 18 - 18
|
||||
with self.assertQueryCount(admin=14, emp=14): # test_mail only: 14 - 14
|
||||
record.message_subscribe(partner_ids=self.user_test.partner_id.ids, subtype_ids=subtype_ids)
|
||||
|
||||
|
||||
@@ -424,35 +424,33 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
self.assertEqual(rec.message_channel_ids, self.env['mail.channel'])
|
||||
|
||||
# subscribe new followers with forced given subtypes
|
||||
with self.assertQueryCount(admin=20, emp=21): # test_mail only: 20 - 21
|
||||
with self.assertQueryCount(admin=16, emp=16): # test_mail only: 16 - 16
|
||||
rec.message_subscribe(
|
||||
partner_ids=pids[:4],
|
||||
channel_ids=cids,
|
||||
subtype_ids=subtype_ids,
|
||||
subtype_ids=subtype_ids
|
||||
)
|
||||
|
||||
self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners[:4])
|
||||
self.assertEqual(rec.message_channel_ids, self.channel)
|
||||
|
||||
# subscribe existing and new followers with force=False, meaning only some new followers will be added
|
||||
with self.assertQueryCount(admin=11, emp=12): # test_mail only: 11 - 12
|
||||
with self.assertQueryCount(admin=8, emp=8): # test_mail only: 8 - 8
|
||||
rec.message_subscribe(
|
||||
partner_ids=pids[:6],
|
||||
channel_ids=cids,
|
||||
subtype_ids=None,
|
||||
force=False,
|
||||
subtype_ids=None
|
||||
)
|
||||
|
||||
self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners[:6])
|
||||
self.assertEqual(rec.message_channel_ids, self.channel)
|
||||
|
||||
# subscribe existing and new followers with force=True, meaning all will have the same subtypes
|
||||
with self.assertQueryCount(admin=48, emp=49): # test_mail only: 48 - 49
|
||||
with self.assertQueryCount(admin=42, emp=43): # test_mail only: 42 - 43
|
||||
rec.message_subscribe(
|
||||
partner_ids=pids,
|
||||
channel_ids=cids,
|
||||
subtype_ids=subtype_ids,
|
||||
force=True,
|
||||
subtype_ids=subtype_ids
|
||||
)
|
||||
|
||||
self.assertEqual(rec.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners)
|
||||
@@ -471,7 +469,7 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
})
|
||||
self.assertEqual(rec.message_partner_ids, self.partners | self.env.user.partner_id)
|
||||
|
||||
with self.assertQueryCount(admin=90, emp=119): # test_mail only: 88 - 117
|
||||
with self.assertQueryCount(admin=88, emp=115): # test_mail only: 86 - 113
|
||||
rec.write({'user_id': self.user_portal.id})
|
||||
|
||||
self.assertEqual(rec.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
|
||||
@@ -494,7 +492,7 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
customer_id = self.customer.id
|
||||
user_id = self.user_portal.id
|
||||
|
||||
with self.assertQueryCount(admin=318, emp=379): # com runbot: 318 - 378 // test_mail only: 311 - 372
|
||||
with self.assertQueryCount(admin=266, emp=317): #com runbot: 266 - 316 // test_mail only: 259 - 310
|
||||
rec = self.env['mail.test.full'].create({
|
||||
'name': 'Test',
|
||||
'umbrella_id': umbrella_id,
|
||||
@@ -523,7 +521,7 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
})
|
||||
self.assertEqual(rec.message_partner_ids, self.user_portal.partner_id | self.env.user.partner_id)
|
||||
|
||||
with self.assertQueryCount(admin=227, emp=264): # test_mail only: 223 - 260
|
||||
with self.assertQueryCount(admin=178, emp=205): # test_mail only: 174 - 201
|
||||
rec.write({
|
||||
'name': 'Test2',
|
||||
'umbrella_id': self.umbrella.id,
|
||||
@@ -561,7 +559,7 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
})
|
||||
self.assertEqual(rec.message_partner_ids, self.user_portal.partner_id | self.env.user.partner_id)
|
||||
|
||||
with self.assertQueryCount(admin=230, emp=268): # test_mail only: 225 - 264
|
||||
with self.assertQueryCount(admin=181, emp=210): # test_mail only: 176 - 205
|
||||
rec.write({
|
||||
'name': 'Test2',
|
||||
'umbrella_id': umbrella_id,
|
||||
@@ -595,7 +593,7 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
})
|
||||
self.assertEqual(rec.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
|
||||
|
||||
with self.assertQueryCount(admin=63, emp=90): # test_mail only: 61 - 88
|
||||
with self.assertQueryCount(admin=61, emp=86): # test_mail only: 59 - 84
|
||||
rec.write({
|
||||
'name': 'Test2',
|
||||
'customer_id': customer_id,
|
||||
|
||||
@@ -135,7 +135,7 @@ class WebsiteEventTrackController(http.Controller):
|
||||
'description': escape(post['description'])
|
||||
})
|
||||
if request.env.user != request.website.user_id:
|
||||
track.sudo().message_subscribe_users(user_ids=request.env.user.ids)
|
||||
track.sudo().message_subscribe(partner_ids=request.env.user.partner_id.ids)
|
||||
else:
|
||||
partner = request.env['res.partner'].sudo().search([('email', '=', post['email_from'])])
|
||||
if partner:
|
||||
|
||||
@@ -392,7 +392,7 @@ class Slide(models.Model):
|
||||
if not self.user_has_groups('website.group_website_publisher'):
|
||||
values['website_published'] = False
|
||||
slide = super(Slide, self).create(values)
|
||||
slide.channel_id.message_subscribe_users()
|
||||
slide.channel_id.message_subscribe(partner_ids=self.env.user.partner_id.ids)
|
||||
slide._post_publication()
|
||||
return slide
|
||||
|
||||
|
||||
Reference in New Issue
Block a user