[REF] mail, various: rename subtype parameter of message_post to subtype_xmlid

PURPOSE

Clean posting process and improve mail.message definition and comprehension.

SPECIFICATIONS

In order to be more explicit subtype parameter is renamed to subtype_xmlid.
It therefore clearly indicates it should be a valid subtype Xml ID. Support
of ill formatted Xml IDs is removed because there is no reason to try to
add some random prefix. Give something that exists or go to hell, punk !

LINKS

Task ID 2071556
PR #38692
This commit is contained in:
Thibault Delavallée
2019-12-02 15:18:44 +00:00
parent 06f169a0ee
commit e2b33f460d
37 changed files with 101 additions and 106 deletions
+2 -2
View File
@@ -226,7 +226,7 @@ class Attendee(models.Model):
result = self.write({'state': 'accepted'})
for attendee in self:
if attendee.event_id:
attendee.event_id.message_post(body=_("%s has accepted invitation") % (attendee.common_name), subtype="calendar.subtype_invitation")
attendee.event_id.message_post(body=_("%s has accepted invitation") % (attendee.common_name), subtype_xmlid="calendar.subtype_invitation")
return result
def do_decline(self):
@@ -234,7 +234,7 @@ class Attendee(models.Model):
res = self.write({'state': 'declined'})
for attendee in self:
if attendee.event_id:
attendee.event_id.message_post(body=_("%s has declined invitation") % (attendee.common_name), subtype="calendar.subtype_invitation")
attendee.event_id.message_post(body=_("%s has declined invitation") % (attendee.common_name), subtype_xmlid="calendar.subtype_invitation")
return res
+4 -4
View File
@@ -562,13 +562,13 @@ class Challenge(models.Model):
challenge.message_post(
body=body_html,
partner_ids=challenge.mapped('user_ids.partner_id.id'),
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
email_layout_xmlid='mail.mail_notification_light',
)
if challenge.report_message_group_id:
challenge.report_message_group_id.message_post(
body=body_html,
subtype='mail.mt_comment')
subtype_xmlid='mail.mt_comment')
else:
# generate individual reports
@@ -586,13 +586,13 @@ class Challenge(models.Model):
challenge.message_notify(
body=body_html,
partner_ids=[user.partner_id.id],
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
email_layout_xmlid='mail.mail_notification_light',
)
if challenge.report_message_group_id:
challenge.report_message_group_id.message_post(
body=body_html,
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
email_layout_xmlid='mail.mail_notification_light',
)
return challenge.write({'last_report_date': fields.Date.today()})
+1 -1
View File
@@ -219,7 +219,7 @@ class Goal(models.Model):
self.message_notify(
body=body_html,
partner_ids=[self.user_id.partner_id.id],
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
email_layout_xmlid='mail.mail_notification_light',
)
+1 -1
View File
@@ -666,7 +666,7 @@ class HolidaysRequest(models.Model):
# Automatic validation should be done in sudo, because user might not have the rights to do it by himself
holiday_sudo.action_validate()
holiday_sudo.message_subscribe(partner_ids=[holiday._get_responsible_for_approval().partner_id.id])
holiday_sudo.message_post(body=_("The time off has been automatically approved"), subtype="mt_comment") # Message from OdooBot (sudo)
holiday_sudo.message_post(body=_("The time off has been automatically approved"), subtype_xmlid="mail.mt_comment") # Message from OdooBot (sudo)
elif not self._context.get('import_file'):
holiday_sudo.activity_update()
return holiday
@@ -608,7 +608,7 @@ class TestAccessRightsWrite(TestHrHolidaysAccessRightsCommon):
""" User may communicate on its own leaves, even if validated """
self.employee_leave.with_user(self.user_employee_id).message_post(
body='I haz messaging',
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
message_type='comment'
)
@@ -616,7 +616,7 @@ class TestAccessRightsWrite(TestHrHolidaysAccessRightsCommon):
self.employee_leave.with_user(self.user_employee_id).message_post(
body='I still haz messaging',
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
message_type='comment'
)
@@ -448,7 +448,7 @@ class Applicant(models.Model):
applicant.job_id.write({'no_of_hired_employee': applicant.job_id.no_of_hired_employee + 1})
applicant.job_id.message_post(
body=_('New Employee %s Hired') % applicant.partner_name if applicant.partner_name else applicant.name,
subtype="hr_recruitment.mt_job_applicant_hired")
subtype_xmlid="hr_recruitment.mt_job_applicant_hired")
applicant.message_post_with_view(
'hr_recruitment.applicant_hired_template',
values={'applicant': applicant},
+1 -1
View File
@@ -53,7 +53,7 @@ class MailChatController(BusController):
message = mail_channel.with_context(mail_create_nosubscribe=True).message_post(author_id=author_id,
email_from=email_from, body=body,
message_type='comment',
subtype='mail.mt_comment')
subtype_xmlid='mail.mt_comment')
return message and message.id or False
@route(['/mail/chat_history'], type="json", auth="public", cors="*")
+1 -1
View File
@@ -27,7 +27,7 @@ def _admin_password_warn(uid):
.message_post(
body=_("Your password is the default (admin)! If this system is exposed to untrusted users it is important to change it immediately for security reasons. I will keep nagging you about it!"),
message_type='comment',
subtype='mail.mt_comment'
subtype_xmlid='mail.mt_comment'
)
class Home(web.Home):
+4 -4
View File
@@ -280,7 +280,7 @@ class Channel(models.Model):
if not self.email_send:
notification = _('<div class="o_mail_notification">left <a href="#" class="o_channel_redirect" data-oe-id="%s">#%s</a></div>') % (self.id, self.name,)
# post 'channel left' message as root since the partner just unsubscribed from the channel
self.sudo().message_post(body=notification, subtype="mail.mt_comment", author_id=partner.id)
self.sudo().message_post(body=notification, subtype_xmlid="mail.mt_comment", author_id=partner.id)
return result
def _notify_get_groups(self):
@@ -780,7 +780,7 @@ class Channel(models.Model):
}
else:
notification = _('<div class="o_mail_notification">joined <a href="#" class="o_channel_redirect" data-oe-id="%s">#%s</a></div>') % (channel.id, channel.name,)
self.message_post(body=notification, message_type="notification", subtype="mail.mt_comment", author_id=partner.id)
self.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment", author_id=partner.id)
# broadcast the channel header to the added partner
self._broadcast(partner_ids)
@@ -861,7 +861,7 @@ class Channel(models.Model):
added = self.action_follow()
if added and self.channel_type == 'channel' and not self.email_send:
notification = _('<div class="o_mail_notification">joined <a href="#" class="o_channel_redirect" data-oe-id="%s">#%s</a></div>') % (self.id, self.name,)
self.message_post(body=notification, message_type="notification", subtype="mail.mt_comment")
self.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
if added and self.moderation_guidelines:
self._send_guidelines(self.env.user.partner_id)
@@ -886,7 +886,7 @@ class Channel(models.Model):
'channel_partner_ids': [(4, self.env.user.partner_id.id)]
})
notification = _('<div class="o_mail_notification">created <a href="#" class="o_channel_redirect" data-oe-id="%s">#%s</a></div>') % (new_channel.id, new_channel.name,)
new_channel.message_post(body=notification, message_type="notification", subtype="mail.mt_comment")
new_channel.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
channel_info = new_channel.channel_info('creation')[0]
self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', self.env.user.partner_id.id), channel_info)
return channel_info
+7 -8
View File
@@ -1777,7 +1777,7 @@ class MailThread(models.AbstractModel):
def message_post(self, *,
body='', subject=None, message_type='notification',
email_from=None, author_id=None, parent_id=False,
subtype_id=False, subtype=None, partner_ids=None, channel_ids=None,
subtype_xmlid=None, subtype_id=False, partner_ids=None, channel_ids=None,
attachments=None, attachment_ids=None,
add_sign=True, record_name=False,
**kwargs):
@@ -1791,8 +1791,6 @@ class MailThread(models.AbstractModel):
:param int parent_id: handle thread formation
:param int subtype_id: subtype_id of the message, mainly use fore
followers mechanism
:param int subtype: xmlid that will be used to compute subtype_id
if subtype_id is not given.
:param list(int) partner_ids: partner_ids to notify
:param list(int) channel_ids: channel_ids to notify
:param list(tuple(str,str), tuple(str,str, dict) or int) attachments : list of attachment tuples in the form
@@ -1814,7 +1812,9 @@ class MailThread(models.AbstractModel):
raise ValueError('message_post should only be call to post message on record. Use message_notify instead')
if 'model' in msg_kwargs or 'res_id' in msg_kwargs:
raise ValueError("message_post doesn't support model and res_id parameters anymore. Please call message_post on record")
raise ValueError("message_post doesn't support model and res_id parameters anymore. Please call message_post on record.")
if 'subtype' in kwargs:
raise ValueError("message_post doesn't support subtype parameter anymore. Please give a valid subtype_id or subtype_xmlid value instead.")
self = self.with_lang() # add lang to context imediatly since it will be usefull in various flows latter.
@@ -1832,11 +1832,10 @@ class MailThread(models.AbstractModel):
# Find the message's author
author_id, email_from = self._message_compute_author(author_id, email_from, raise_exception=True)
if subtype_xmlid:
subtype_id = self.env['ir.model.data'].xmlid_to_res_id(subtype_xmlid)
if not subtype_id:
subtype = subtype or 'mt_note'
if '.' not in subtype:
subtype = 'mail.%s' % subtype
subtype_id = self.env['ir.model.data'].xmlid_to_res_id(subtype)
subtype_id = self.env['ir.model.data'].xmlid_to_res_id('mail_mt_note')
# automatically subscribe recipients if asked to
if self._context.get('mail_post_autofollow') and partner_ids:
+1 -1
View File
@@ -104,7 +104,7 @@ class PublisherWarrantyContract(AbstractModel):
poster = user
for message in result["messages"]:
try:
poster.message_post(body=message, subtype='mt_comment', partner_ids=[user.partner_id.id])
poster.message_post(body=message, subtype_xmlid='mail.mt_comment', partner_ids=[user.partner_id.id])
except Exception:
pass
if result.get('enterprise_info'):
@@ -205,14 +205,14 @@ var ChatterComposer = BasicComposer.extend({
return new Promise(function (resolve, reject) {
self._super().then(function (message) {
message = _.extend(message, {
subtype: 'mail.mt_comment',
subtype_xmlid: 'mail.mt_comment',
message_type: 'comment',
context: _.defaults({}, self.context, session.user_context),
});
// Subtype
if (self.options.isLog) {
message.subtype = 'mail.mt_note';
message.subtype_xmlid = 'mail.mt_note';
}
// Partner_ids
+1 -1
View File
@@ -1496,7 +1496,7 @@ var Discuss = AbstractAction.extend({
var self = this;
var options = {};
if (this._selectedMessage) {
messageData.subtype = this._selectedMessage.isNote() ? 'mail.mt_note': 'mail.mt_comment';
messageData.subtype_xmlid = this._selectedMessage.isNote() ? 'mail.mt_note': 'mail.mt_comment';
messageData.subtype_id = false;
messageData.message_type = 'comment';
@@ -443,7 +443,7 @@ var Channel = SearchableThread.extend(ThreadTypingMixin, {
return this._super.apply(this, arguments).then(function (messageData) {
_.extend(messageData, {
message_type: 'comment',
subtype: 'mail.mt_comment',
subtype_xmlid: 'mail.mt_comment',
command: data.command,
});
return self._rpc({
@@ -331,7 +331,7 @@ var DocumentThread = Thread.extend({
_.extend(messageData, {
context: data.context,
message_type: data.message_type,
subtype: data.subtype || "mail.mt_comment",
subtype_xmlid: data.subtype_xmlid || "mail.mt_comment",
subtype_id: data.subtype_id,
});
return self._rpc({
+6 -6
View File
@@ -1008,8 +1008,8 @@ QUnit.test('chatter: post, receive and star messages', async function (assert) {
body: args.kwargs.body,
date: "2016-12-20 10:35:40",
id: messageID,
is_note: args.kwargs.subtype === 'mail.mt_note',
is_discussion: args.kwargs.subtype === 'mail.mt_comment',
is_note: args.kwargs.subtype_xmlid === 'mail.mt_note',
is_discussion: args.kwargs.subtype_xmlid === 'mail.mt_comment',
is_notification: false,
is_starred: false,
model: 'partner',
@@ -1403,8 +1403,8 @@ QUnit.test('chatter: post a message and switch in edit mode', async function (as
body: args.kwargs.body,
date: "2016-12-20 10:35:40",
id: 42,
is_note: args.kwargs.subtype === 'mail.mt_note',
is_discussion: args.kwargs.subtype === 'mail.mt_comment',
is_note: args.kwargs.subtype_xmlid === 'mail.mt_note',
is_discussion: args.kwargs.subtype_xmlid === 'mail.mt_comment',
is_starred: false,
model: 'partner',
res_id: 2,
@@ -3061,8 +3061,8 @@ QUnit.test('chatter: suggested partner auto-follow on message post', async funct
body: args.kwargs.body,
date: "2016-12-20 10:35:40",
id: messageID,
is_note: args.kwargs.subtype === 'mail.mt_note',
is_discussion: args.kwargs.subtype === 'mail.mt_comment',
is_note: args.kwargs.subtype_xmlid === 'mail.mt_note',
is_discussion: args.kwargs.subtype_xmlid === 'mail.mt_comment',
is_notification: false,
is_starred: false,
model: 'partner',
+1 -1
View File
@@ -24,6 +24,6 @@ class Channel(models.Model):
'name': 'OdooBot'
})
message = _("Hello,<br/>Odoo's chat helps employees collaborate efficiently. I'm here to help you discover its features.<br/><b>Try to send me an emoji :)</b>")
channel.sudo().message_post(body=message, author_id=odoobot_id, message_type="comment", subtype="mail.mt_comment")
channel.sudo().message_post(body=message, author_id=odoobot_id, message_type="comment", subtype_xmlid="mail.mt_comment")
self.env.user.odoobot_state = 'onboarding_emoji'
return channel
+1 -1
View File
@@ -86,7 +86,7 @@ def _message_post_helper(res_model, res_id, message, token='', _hash=False, pid=
message_post_args = dict(
body=message,
message_type=kw.pop('message_type', "comment"),
subtype=kw.pop('subtype', "mt_comment"),
subtype_xmlid=kw.pop('subtype_xmlid', "mail.mt_comment"),
author_id=author_id,
**kw
)
+2 -2
View File
@@ -930,8 +930,8 @@ class Task(models.Model):
return self.project_id.partner_id
return res
def rating_apply(self, rate, token=None, feedback=None, subtype=None):
return super(Task, self).rating_apply(rate, token=token, feedback=feedback, subtype="project.mt_task_rating")
def rating_apply(self, rate, token=None, feedback=None, subtype_xmlid=None):
return super(Task, self).rating_apply(rate, token=token, feedback=feedback, subtype_xmlid="project.mt_task_rating")
def _rating_get_parent_field_name(self):
return 'project_id'
+3 -3
View File
@@ -168,7 +168,7 @@ class RatingMixin(models.AbstractModel):
subtype_id=subtype_id
)
def rating_apply(self, rate, token=None, feedback=None, subtype=None):
def rating_apply(self, rate, token=None, feedback=None, subtype_xmlid=None):
""" Apply a rating given a token. If the current model inherits from
mail.thread mixin, a message is posted on its chatter. User going through
this method should have at least employee rights because of rating
@@ -178,7 +178,7 @@ class RatingMixin(models.AbstractModel):
:param float rate : the rating value to apply
:param string token : access token
:param string feedback : additional feedback
:param string subtype : xml id of a valid mail.message.subtype
:param string subtype_xmlid : xml id of a valid mail.message.subtype
:returns rating.rating record
"""
@@ -194,7 +194,7 @@ class RatingMixin(models.AbstractModel):
self.message_post(
body="<img src='/rating/static/src/img/rating_%s.png' alt=':%s/10' style='width:18px;height:18px;float:left;margin-right: 5px;'/>%s"
% (rate, rate, feedback),
subtype=subtype or "mail.mt_comment",
subtype_xmlid=subtype_xmlid or "mail.mt_comment",
author_id=rating.partner_id and rating.partner_id.id or None # None will set the default author in mail_thread.py
)
if hasattr(self, 'stage_id') and self.stage_id and hasattr(self.stage_id, 'auto_validation_kanban_state') and self.stage_id.auto_validation_kanban_state:
+1 -1
View File
@@ -159,7 +159,7 @@ class CustomerPortal(CustomerPortal):
if order_sudo and request.session.get('view_quote_%s' % order_sudo.id) != now and request.env.user.share and access_token:
request.session['view_quote_%s' % order_sudo.id] = now
body = _('Quotation viewed by customer %s') % order_sudo.partner_id.name
_message_post_helper('sale.order', order_sudo.id, body, token=order_sudo.access_token, message_type='notification', subtype="mail.mt_note")
_message_post_helper('sale.order', order_sudo.id, body, token=order_sudo.access_token, message_type='notification', subtype_xmlid="mail.mt_note")
values = {
'sale_order': order_sudo,
+4 -4
View File
@@ -15,7 +15,7 @@ class TestChatterTweaks(TestMailCommon, TestRecipients):
def test_post_no_subscribe_author(self):
original = self.test_record.message_follower_ids
self.test_record.with_user(self.user_employee).with_context({'mail_create_nosubscribe': True}).message_post(
body='Test Body', message_type='comment', subtype='mt_comment')
body='Test Body', message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertEqual(self.test_record.message_follower_ids.mapped('partner_id'), original.mapped('partner_id'))
self.assertEqual(self.test_record.message_follower_ids.mapped('channel_id'), original.mapped('channel_id'))
@@ -23,7 +23,7 @@ class TestChatterTweaks(TestMailCommon, TestRecipients):
def test_post_no_subscribe_recipients(self):
original = self.test_record.message_follower_ids
self.test_record.with_user(self.user_employee).with_context({'mail_create_nosubscribe': True}).message_post(
body='Test Body', message_type='comment', subtype='mt_comment', partner_ids=[self.partner_1.id, self.partner_2.id])
body='Test Body', message_type='comment', subtype_xmlid='mail.mt_comment', partner_ids=[self.partner_1.id, self.partner_2.id])
self.assertEqual(self.test_record.message_follower_ids.mapped('partner_id'), original.mapped('partner_id'))
self.assertEqual(self.test_record.message_follower_ids.mapped('channel_id'), original.mapped('channel_id'))
@@ -31,7 +31,7 @@ class TestChatterTweaks(TestMailCommon, TestRecipients):
def test_post_subscribe_recipients(self):
original = self.test_record.message_follower_ids
self.test_record.with_user(self.user_employee).with_context({'mail_create_nosubscribe': True, 'mail_post_autofollow': True}).message_post(
body='Test Body', message_type='comment', subtype='mt_comment', partner_ids=[self.partner_1.id, self.partner_2.id])
body='Test Body', message_type='comment', subtype_xmlid='mail.mt_comment', partner_ids=[self.partner_1.id, self.partner_2.id])
self.assertEqual(self.test_record.message_follower_ids.mapped('partner_id'), original.mapped('partner_id') | self.partner_1 | self.partner_2)
self.assertEqual(self.test_record.message_follower_ids.mapped('channel_id'), original.mapped('channel_id'))
@@ -100,7 +100,7 @@ class TestDiscuss(TestMailCommon, TestRecipients):
def test_set_message_done_user(self):
with self.assertSinglePostNotifications([{'partner': self.partner_employee, 'type': 'inbox'}], message_info={'content': 'Test'}):
message = self.test_record.message_post(
body='Test', message_type='comment', subtype='mail.mt_comment',
body='Test', message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.user_employee.partner_id.id])
message.with_user(self.user_employee).set_message_done()
self.assertMailNotifications(message, [{'notif': [{'partner': self.partner_employee, 'type': 'inbox', 'is_read': True}]}])
+8 -8
View File
@@ -149,7 +149,7 @@ class TestChannelFeatures(TestMailCommon):
self.assertEqual(self.test_channel.channel_partner_ids, self.env['res.partner'])
def test_channel_post_nofollow(self):
self.test_channel.message_post(body='Test', message_type='comment', subtype='mt_comment')
self.test_channel.message_post(body='Test', message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertEqual(self.test_channel.message_channel_ids, self.test_channel)
self.assertEqual(self.test_channel.message_partner_ids, self.env['res.partner'])
@@ -168,7 +168,7 @@ class TestChannelFeatures(TestMailCommon):
})
self._join_channel(self.test_channel, self.user_employee.partner_id | self.test_partner | nomail.partner_id)
with self.mock_mail_gateway():
self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment')
self.test_channel.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertSentEmail(self.test_channel.env.user.partner_id, [self.partner_employee, self.test_partner])
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@@ -178,7 +178,7 @@ class TestChannelFeatures(TestMailCommon):
self.test_channel.write({'email_send': False})
self._join_channel(self.test_channel, self.user_employee.partner_id | self.test_partner)
with self.mock_mail_gateway():
self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment')
self.test_channel.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertNotSentEmail()
self.assertEqual(len(self._mails), 0)
@@ -188,7 +188,7 @@ class TestChannelFeatures(TestMailCommon):
self.test_channel.write({'alias_name': False})
self.test_channel.message_subscribe([self.user_employee.partner_id.id, self.test_partner.id])
with self.mock_mail_gateway():
self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment')
self.test_channel.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertSentEmail(self.test_channel.env.user.partner_id, [self.test_partner])
@mute_logger('odoo.addons.mail.models.mail_mail')
@@ -323,10 +323,10 @@ class TestChannelModeration(TestMailCommon):
self.channel_1._update_moderation_email([email1], 'ban')
self.channel_1._update_moderation_email([email2], 'allow')
msg_admin = self.channel_1.message_post(message_type='email', subtype='mt_comment', author_id=self.partner_admin.id)
msg_moderator = self.channel_1.message_post(message_type='comment', subtype='mt_comment', author_id=self.partner_employee.id)
msg_email1 = self.channel_1.message_post(message_type='comment', subtype='mt_comment', email_from=formataddr(("MyName", email1)))
msg_email2 = self.channel_1.message_post(message_type='email', subtype='mt_comment', email_from=email2)
msg_admin = self.channel_1.message_post(message_type='email', subtype_xmlid='mail.mt_comment', author_id=self.partner_admin.id)
msg_moderator = self.channel_1.message_post(message_type='comment', subtype_xmlid='mail.mt_comment', author_id=self.partner_employee.id)
msg_email1 = self.channel_1.message_post(message_type='comment', subtype_xmlid='mail.mt_comment', email_from=formataddr(("MyName", email1)))
msg_email2 = self.channel_1.message_post(message_type='email', subtype_xmlid='mail.mt_comment', email_from=email2)
msg_notif = self.channel_1.message_post()
messages = self.env['mail.message'].search([('model', '=', 'mail.channel'), ('res_id', '=', self.channel_1.id)])
+2 -2
View File
@@ -626,14 +626,14 @@ class TestMailgateway(TestMailCommon):
record_msg = first_record.message_post(
subject='Discussion',
no_auto_thread=False,
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
)
self.assertEqual(record_msg.reply_to, formataddr(('%s %s' % (self.user_employee.company_id.name, first_record.name), '%s@%s' % ('catchall.test', 'test.com'))))
mail_msg = first_record.message_post(
subject='Replies to Record',
reply_to='groups@test.com',
no_auto_thread=True,
subtype='mail.mt_comment',
subtype_xmlid='mail.mt_comment',
)
self.assertEqual(mail_msg.reply_to, 'groups@test.com')
+4 -4
View File
@@ -360,13 +360,13 @@ class TestMessageAccess(TestMailCommon):
).with_context({'mail_create_nosubscribe': False})
# mark all as read clear needactions
group_private.message_post(body='Test', message_type='comment', subtype='mail.mt_comment', partner_ids=[emp_partner.id])
group_private.message_post(body='Test', message_type='comment', subtype_xmlid='mail.mt_comment', partner_ids=[emp_partner.id])
emp_partner.env['mail.message'].mark_all_as_read(domain=[])
na_count = emp_partner.get_needaction_count()
self.assertEqual(na_count, 0, "mark all as read should conclude all needactions")
# mark all as read also clear inaccessible needactions
new_msg = group_private.message_post(body='Zest', message_type='comment', subtype='mail.mt_comment', partner_ids=[emp_partner.id])
new_msg = group_private.message_post(body='Zest', message_type='comment', subtype_xmlid='mail.mt_comment', partner_ids=[emp_partner.id])
needaction_accessible = len(emp_partner.env['mail.message'].search([['needaction', '=', True]]))
self.assertEqual(needaction_accessible, 1, "a new message to a partner is readable to that partner")
@@ -388,13 +388,13 @@ class TestMessageAccess(TestMailCommon):
portal_partner = self.user_portal.partner_id.with_user(self.user_portal)
# mark all as read clear needactions
self.group_pigs.message_post(body='Test', message_type='comment', subtype='mail.mt_comment', partner_ids=[portal_partner.id])
self.group_pigs.message_post(body='Test', message_type='comment', subtype_xmlid='mail.mt_comment', partner_ids=[portal_partner.id])
portal_partner.env['mail.message'].mark_all_as_read(domain=[])
na_count = portal_partner.get_needaction_count()
self.assertEqual(na_count, 0, "mark all as read should conclude all needactions")
# mark all as read also clear inaccessible needactions
new_msg = self.group_pigs.message_post(body='Zest', message_type='comment', subtype='mail.mt_comment', partner_ids=[portal_partner.id])
new_msg = self.group_pigs.message_post(body='Zest', message_type='comment', subtype_xmlid='mail.mt_comment', partner_ids=[portal_partner.id])
needaction_accessible = len(portal_partner.env['mail.message'].search([['needaction', '=', True]]))
self.assertEqual(needaction_accessible, 1, "a new message to a partner is readable to that partner")
@@ -36,7 +36,7 @@ class TestMailResend(TestMailCommon):
[{'partner': partner, 'type': 'email', 'status': 'exception'} for partner in self.partners],
message_info={'message_type': 'notification'},
sim_error='connect_failure'):
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype='mail.mt_comment', message_type='notification')
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype_xmlid='mail.mt_comment', message_type='notification')
wizard = self.env['mail.resend.message'].with_context({'mail_message_to_resend': message.id}).create({})
self.assertEqual(wizard.notification_ids.mapped('res_partner_id'), self.partners, "wizard should manage notifications for each failed partner")
@@ -80,7 +80,7 @@ class TestMailResend(TestMailCommon):
def test_remove_mail_become_canceled(self):
# two failure sent on bus, one for each mail
with self.mock_mail_gateway(), self.assertBus([(self.cr.dbname, 'res.partner', self.partner_admin.id)] * 2):
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype='mail.mt_comment', message_type='notification')
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype_xmlid='mail.mt_comment', message_type='notification')
self.assertMailNotifications(message, [
{'content': '', 'message_type': 'notification',
@@ -102,7 +102,7 @@ class TestMailResend(TestMailCommon):
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_cancel_all(self):
with self.mock_mail_gateway(), self.assertBus([(self.cr.dbname, 'res.partner', self.partner_admin.id)] * 2):
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype='mail.mt_comment', message_type='notification')
message = self.test_record.with_user(self.user_admin).message_post(partner_ids=self.partners.ids, subtype_xmlid='mail.mt_comment', message_type='notification')
wizard = self.env['mail.resend.message'].with_context({'mail_message_to_resend': message.id}).create({})
# one update for cancell
+14 -14
View File
@@ -27,7 +27,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
(self.user_employee | self.user_admin).write({'notification_type': 'inbox'})
with self.assertSinglePostNotifications([{'partner': self.partner_employee, 'type': 'inbox'}], {'content': 'Body'}):
self.test_record.message_post(
body='Body', message_type='comment', subtype='mail.mt_comment',
body='Body', message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.user_employee.partner_id.id])
self.test_record.message_subscribe([self.partner_1.id])
@@ -35,14 +35,14 @@ class TestMessagePost(TestMailCommon, TestRecipients):
{'partner': self.partner_employee, 'type': 'inbox'},
{'partner': self.partner_1, 'type': 'email'}], {'content': 'NewBody'}):
self.test_record.message_post(
body='NewBody', message_type='comment', subtype='mail.mt_comment',
body='NewBody', message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.user_employee.partner_id.id])
with self.assertSinglePostNotifications([
{'partner': self.partner_1, 'type': 'email'},
{'partner': self.partner_portal, 'type': 'email'}], {'content': 'ToPortal'}):
self.test_record.message_post(
body='ToPortal', message_type='comment', subtype='mail.mt_comment',
body='ToPortal', message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.partner_portal.id])
def test_post_inactive_follower(self):
@@ -52,14 +52,14 @@ class TestMessagePost(TestMailCommon, TestRecipients):
self.test_record._message_subscribe(self.user_employee.partner_id.ids)
with self.assertSinglePostNotifications([{'partner': self.partner_employee, 'type': 'inbox'}], {'content': 'Test'}):
self.test_record.message_post(
body='Test', message_type='comment', subtype='mail.mt_comment')
body='Test', message_type='comment', subtype_xmlid='mail.mt_comment')
self.user_employee.active = False
# at this point, partner is still active and would receive an email notification
self.user_employee.partner_id._write({'active': False})
with self.assertPostNotifications([{'content': 'Test', 'notif': []}]):
self.test_record.message_post(
body='Test', message_type='comment', subtype='mail.mt_comment')
body='Test', message_type='comment', subtype_xmlid='mail.mt_comment')
@mute_logger('odoo.addons.mail.models.mail_mail')
def test_post_notifications(self):
@@ -74,7 +74,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
{'partner': self.partner_admin, 'type': 'email'}], {'content': _body}, mail_unlink_sent=True):
msg = self.test_record.with_user(self.user_employee).message_post(
body=_body, subject=_subject,
message_type='comment', subtype='mt_comment',
message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.partner_1.id, self.partner_2.id]
)
@@ -95,7 +95,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
msg = self.test_record.with_user(self.user_employee).message_post(
body='Test', subject='Test',
message_type='comment', subtype='mt_comment',
message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.partner_1.id, self.partner_2.id],
mail_auto_delete=False
)
@@ -126,7 +126,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
with self.mock_mail_gateway():
msg = self.test_record.with_user(self.user_employee).message_post(
body='Test', subject='Test',
message_type='comment', subtype='mt_comment',
message_type='comment', subtype_xmlid='mail.mt_comment',
attachment_ids=[_attach_1.id, _attach_2.id],
partner_ids=[self.partner_1.id],
attachments=_attachments,
@@ -155,7 +155,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
with self.mock_mail_gateway():
parent_msg = self.test_record.with_user(self.user_employee).message_post(
body='<p>Test</p>', subject='Test Subject',
message_type='comment', subtype='mt_comment')
message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertEqual(parent_msg.partner_ids, self.env['res.partner'])
self.assertNotSentEmail()
@@ -163,7 +163,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
with self.assertPostNotifications([{'content': '<p>Test Answer</p>', 'notif': [{'partner': self.partner_1, 'type': 'email'}]}]):
msg = self.test_record.with_user(self.user_employee).message_post(
body='<p>Test Answer</p>',
message_type='comment', subtype='mt_comment',
message_type='comment', subtype_xmlid='mail.mt_comment',
partner_ids=[self.partner_1.id],
parent_id=parent_msg.id)
@@ -177,7 +177,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
new_msg = self.test_record.with_user(self.user_employee).message_post(
body='<p>Test Answer Bis</p>',
message_type='comment', subtype='mt_comment',
message_type='comment', subtype_xmlid='mail.mt_comment',
parent_id=msg.id)
self.assertEqual(new_msg.parent_id.id, parent_msg.id, 'message_post: flatten error')
@@ -193,7 +193,7 @@ class TestMessagePost(TestMailCommon, TestRecipients):
]), patch.object(MailTestSimple, 'check_access_rights', return_value=True):
new_msg = self.test_record.with_user(self.user_portal).message_post(
body='<p>Test</p>', subject='Subject',
message_type='comment', subtype='mt_comment')
message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertEqual(new_msg.sudo().notified_partner_ids, (self.partner_1 | self.user_employee.partner_id))
@@ -201,14 +201,14 @@ class TestMessagePost(TestMailCommon, TestRecipients):
with self.assertRaises(AccessError):
self.test_record.with_user(self.user_portal).message_post(
body='<p>Test</p>', subject='Subject',
message_type='comment', subtype='mt_comment')
message_type='comment', subtype_xmlid='mail.mt_comment')
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.addons.mail.models.mail_thread')
def test_post_internal(self):
self.test_record.message_subscribe([self.user_admin.partner_id.id])
msg = self.test_record.with_user(self.user_employee).message_post(
body='My Body', subject='My Subject',
message_type='comment', subtype='mt_note')
message_type='comment', subtype_xmlid='mail.mt_note')
self.assertEqual(msg.partner_ids, self.env['res.partner'])
self.assertEqual(msg.notified_partner_ids, self.env['res.partner'])
+1 -1
View File
@@ -22,7 +22,7 @@ class TestOdoobot(TestMailCommon, TestRecipients):
'attachment_ids': [],
'message_type': 'comment',
'partner_ids': [],
'subtype': 'mail.mt_comment'
'subtype_xmlid': 'mail.mt_comment'
}
cls.odoobot_ping_body = '<a href="http://odoo.com/web#model=res.partner&amp;id=%s" class="o_mail_redirect" data-oe-id="%s" data-oe-model="res.partner" target="_blank">@OdooBot</a>' % (cls.odoobot.id, cls.odoobot.id)
cls.test_record_employe = cls.test_record.with_user(cls.user_employee)
+6 -6
View File
@@ -331,7 +331,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
with self.assertQueryCount(__system__=5, emp=6):
record.message_post(
body='<p>Test message_post as log</p>',
subtype='mail.mt_note',
subtype_xmlid='mail.mt_note',
message_type='comment')
@users('__system__', 'emp')
@@ -344,7 +344,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
body='<p>Test Post Performances basic</p>',
partner_ids=[],
message_type='comment',
subtype='mail.mt_comment')
subtype_xmlid='mail.mt_comment')
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
@users('__system__', 'emp')
@@ -357,7 +357,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
body='<p>Test Post Performances with an email ping</p>',
partner_ids=self.customer.ids,
message_type='comment',
subtype='mail.mt_comment')
subtype_xmlid='mail.mt_comment')
@users('__system__', 'emp')
@warmup
@@ -369,7 +369,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
body='<p>Test Post Performances with an inbox ping</p>',
partner_ids=self.user_test.partner_id.ids,
message_type='comment',
subtype='mail.mt_comment')
subtype_xmlid='mail.mt_comment')
@mute_logger('odoo.models.unlink')
@users('__system__', 'emp')
@@ -476,7 +476,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
record.message_post(
body='<p>Test Post Performances</p>',
message_type='comment',
subtype='mail.mt_comment')
subtype_xmlid='mail.mt_comment')
self.assertEqual(record.message_ids[0].body, '<p>Test Post Performances</p>')
self.assertEqual(record.message_ids[0].notified_partner_ids, self.partners | self.user_portal.partner_id)
@@ -823,7 +823,7 @@ class TestMailHeavyPerformancePost(BaseMailPerformance):
body='<p>Test body <img src="cid:cid1"> <img src="cid:cid2"></p>',
subject='Test Subject',
message_type='notification',
subtype=None,
subtype_xmlid=None,
partner_ids=partner_ids,
channel_ids=channel_ids,
parent_id=False,
@@ -40,7 +40,7 @@ class TestChannelPartnersNotification(common.TestMailCommon):
self.test_channel.write({'email_send': True})
self._join_channel(self.test_channel, self.test_partner)
with self.mock_mail_gateway():
self.test_channel.message_post(body="Test", message_type='comment', subtype='mt_comment')
self.test_channel.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment')
self.assertEqual(len(self._mails), 1, 'Number of mail incorrect. Should be equal to 1.')
for email in self._mails:
+3 -5
View File
@@ -37,7 +37,7 @@ class Blog(models.Model):
return res
@api.returns('mail.message', lambda value: value.id)
def message_post(self, *, parent_id=False, subtype=None, **kwargs):
def message_post(self, *, parent_id=False, subtype_id=False, **kwargs):
""" Temporary workaround to avoid spam. If someone replies on a channel
through the 'Presentation Published' email, it should be considered as a
note as we don't want all channel followers to be notified of this answer. """
@@ -45,10 +45,8 @@ class Blog(models.Model):
if parent_id:
parent_message = self.env['mail.message'].sudo().browse(parent_id)
if parent_message.subtype_id and parent_message.subtype_id == self.env.ref('website_blog.mt_blog_blog_published'):
if kwargs.get('subtype_id'):
kwargs['subtype_id'] = False
subtype = 'mail.mt_note'
return super(Blog, self).message_post(parent_id=parent_id, subtype=subtype, **kwargs)
subtype_id = self.env.ref('mail.mt_note').id
return super(Blog, self).message_post(parent_id=parent_id, subtype_id=subtype_id, **kwargs)
def all_tags(self, join=False, min_limit=1):
BlogTag = self.env['blog.tag']
@@ -53,7 +53,7 @@ class TestWebsiteBlogFlow(TestWebsiteBlogCommon):
body='Armande BlogUser Commented',
message_type='comment',
author_id=self.user_employee.partner_id.id,
subtype='mt_comment',
subtype_xmlid='mail.mt_comment',
)
self.assertIn(
self.user_employee.partner_id, test_blog_post.message_partner_ids,
+1 -1
View File
@@ -329,7 +329,7 @@ class WebsiteForum(WebsiteProfile):
post.with_context(mail_create_nosubscribe=True).message_post(
body=body,
message_type='comment',
subtype='mt_comment')
subtype_xmlid='mail.mt_comment')
return werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum), slug(question)))
@http.route('/forum/<model("forum.forum"):forum>/post/<model("forum.post"):post>/toggle_correct', type='json', auth="public", website=True)
+4 -4
View File
@@ -497,12 +497,12 @@ class Post(models.Model):
if 'content' in vals or 'name' in vals:
for post in self:
if post.parent_id:
body, subtype = _('Answer Edited'), 'website_forum.mt_answer_edit'
body, subtype_xmlid = _('Answer Edited'), 'website_forum.mt_answer_edit'
obj_id = post.parent_id
else:
body, subtype = _('Question Edited'), 'website_forum.mt_question_edit'
body, subtype_xmlid = _('Question Edited'), 'website_forum.mt_question_edit'
obj_id = post
obj_id.message_post(body=body, subtype=subtype)
obj_id.message_post(body=body, subtype_xmlid=subtype_xmlid)
if 'active' in vals:
answers = self.env['forum.post'].with_context(active_test=False).search([('parent_id', 'in', self.ids)])
if answers:
@@ -717,7 +717,7 @@ class Post(models.Model):
'email_from': self_sudo.create_uid.email_formatted, # use sudo here because of access to res.users model
'body': tools.html_sanitize(self.content, sanitize_attributes=True, strip_style=True, strip_classes=True),
'message_type': 'comment',
'subtype': 'mail.mt_comment',
'subtype_xmlid': 'mail.mt_comment',
'date': self.create_date,
}
new_message = question.with_context(mail_create_nosubscribe=True).message_post(**values)
@@ -69,7 +69,7 @@ class MailChannel(models.Model):
message = _('has left the conversation.')
leave_message = '%s %s' % (name, message)
self.message_post(author_id=self.env.ref('base.user_root').sudo().partner_id.id,
body=leave_message, message_type='comment', subtype='mt_comment')
body=leave_message, message_type='comment', subtype_xmlid='mail.mt_comment')
def message_post(self, **kwargs):
"""Override to mark the visitor as still connected.
@@ -398,7 +398,7 @@ class Channel(models.Model):
return res
@api.returns('mail.message', lambda value: value.id)
def message_post(self, *, parent_id=False, subtype=None, **kwargs):
def message_post(self, *, parent_id=False, subtype_id=False, **kwargs):
""" Temporary workaround to avoid spam. If someone replies on a channel
through the 'Presentation Published' email, it should be considered as a
note as we don't want all channel followers to be notified of this answer. """
@@ -408,10 +408,8 @@ class Channel(models.Model):
if parent_id:
parent_message = self.env['mail.message'].sudo().browse(parent_id)
if parent_message.subtype_id and parent_message.subtype_id == self.env.ref('website_slides.mt_channel_slide_published'):
if kwargs.get('subtype_id'):
kwargs['subtype_id'] = False
subtype = 'mail.mt_note'
return super(Channel, self).message_post(parent_id=parent_id, subtype=subtype, **kwargs)
subtype_id = self.env.ref('mail.mt_note').id
return super(Channel, self).message_post(parent_id=parent_id, subtype_id=subtype_id, **kwargs)
# ---------------------------------------------------------
# Business / Actions
+1 -1
View File
@@ -483,7 +483,7 @@ class Slide(models.Model):
slide.channel_id.with_context(mail_create_nosubscribe=True).message_post(
subject=subject,
body=html_body,
subtype='website_slides.mt_channel_slide_published',
subtype_xmlid='website_slides.mt_channel_slide_published',
email_layout_xmlid='mail.mail_notification_light',
)
return True