[FIX] mail: hide 'View' button in mail

Expected Behaviour

When a user get a mail from the data cleaning about records to examine, the View button should be linked to the same url as the 'here' hyperlink or not be in the e-mail.

Observed behaviour

Clicking the link in the View button lead to an error page

Reproducibility

This bug can be reproduced following these steps:

1. Duplicate a contact
2. Wait for the scheduled task to launch
3. Click on the View button of the mail you'll get about te duplicate

Problem Root Cause

This issue is coming from the way we create the 'View' and 'View Task' button, and can't be changed easily. The easier way to fix this issue is then to hide these button

Related Issues/PR

opw-2674138

closes odoo/odoo#83284

X-original-commit: 3a61747b366a315488837e2e560b305e89217dbd
Signed-off-by: Hendrickx Anthony (anhe) <anhe@odoo.com>
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
anhe-odoo
2022-02-01 10:54:23 +00:00
committed by Thibault Delavallée
parent 5fb6200f46
commit b358c3debb
2 changed files with 47 additions and 2 deletions
+13 -2
View File
@@ -2558,11 +2558,12 @@ class MailThread(models.AbstractModel):
Groups has a default value that you can find in mail_thread
``_notify_get_recipients_classify`` method.
"""
is_thread_notification = self._notify_get_recipients_thread_info(msg_vals=msg_vals)['is_thread_notification']
return [
[
'user',
lambda pdata: pdata['type'] == 'user',
{'has_button_access': True}
{'has_button_access': is_thread_notification}
], [
'portal',
lambda pdata: pdata['type'] == 'portal',
@@ -2624,9 +2625,10 @@ class MailThread(models.AbstractModel):
# fill group_data with default_values if they are not complete
for group_name, group_func, group_data in groups:
is_thread_notification = self._notify_get_recipients_thread_info(msg_vals=msg_vals)['is_thread_notification']
group_data.setdefault('active', True)
group_data.setdefault('actions', list())
group_data.setdefault('has_button_access', True)
group_data.setdefault('has_button_access', is_thread_notification)
group_data.setdefault('notification_is_customer', False)
group_data.setdefault('notification_group_name', group_name)
group_data.setdefault('recipients', list())
@@ -2645,6 +2647,15 @@ class MailThread(models.AbstractModel):
return [group_data for _group_name, _group_func, group_data in groups
if group_data['recipients']]
def _notify_get_recipients_thread_info(self, msg_vals=None):
""" Tool method to compute thread info used in ``_notify_classify_recipients``
and its sub-methods. """
res_model = msg_vals['model'] if msg_vals and 'model' in msg_vals else self._name
res_id = msg_vals['res_id'] if msg_vals and 'res_id' in msg_vals else self.ids[0] if self.ids else False
return {
'is_thread_notification': res_model and (res_model != 'mail.thread') and res_id
}
@api.model
def _notify_encode_link(self, base_link, params):
secret = self.env['ir.config_parameter'].sudo().get_param('database.secret')
@@ -177,6 +177,40 @@ class TestMessagePost(TestMailCommon, TestRecipients):
self.assertNotIn('body', emp_info['button_access']['url'])
self.assertNotIn('subject', emp_info['button_access']['url'])
# test when notifying on non-records (e.g. MailThread._message_notify())
for model, res_id in ((self.test_record._name, False),
(self.test_record._name, 0), # browse(0) does not return a valid recordset
(False, self.test_record.id),
(False, False),
('mail.thread', False),
('mail.thread', self.test_record.id)):
msg_vals.update({
'model': model,
'res_id': res_id,
})
# note that msg_vals wins over record on which method is called
notify_msg_vals = dict(msg_vals, **link_vals)
classify_res = self.test_record._notify_get_recipients_classify(
pdata, 'Test', msg_vals=notify_msg_vals)
# find back information for partner
partner_info = next(item for item in classify_res if item['recipients'] == self.partner_1.ids)
emp_info = next(item for item in classify_res if item['recipients'] == self.partner_employee.ids)
# check there is no access button
self.assertFalse(partner_info['has_button_access'])
self.assertFalse(emp_info['has_button_access'])
# test on falsy records (False model cannot be browsed, skipped)
if model:
record_falsy = self.env[model].browse(res_id)
classify_res = record_falsy._notify_get_recipients_classify(
pdata, 'Test', msg_vals=notify_msg_vals)
# find back information for partner
partner_info = next(item for item in classify_res if item['recipients'] == self.partner_1.ids)
emp_info = next(item for item in classify_res if item['recipients'] == self.partner_employee.ids)
# check there is no access button
self.assertFalse(partner_info['has_button_access'])
self.assertFalse(emp_info['has_button_access'])
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_post_needaction(self):
(self.user_employee | self.user_admin).write({'notification_type': 'inbox'})