Odoo Help


This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


How to send a message programmatically?

on 2/26/13, 4:40 PM 14,326 views

I am trying to set up some notifications in an addon that go directly to a specified user's OpenERP inbox. I was able to post a message to one of the document streams but I need to send a message to a user's inbox.

The following code adds a message to a (hardcoded) user's document (Sales > Customers, remove filter) message stream and not their inbox:

user = self.pool.get("res.users").browse(cr, uid, 1)
user.message_post(context=context, body="Hi, this message is showing up in the wrong place")

Does anyone have pointers to get my message to go to the right place?

On 2/28/13, 11:32 AM

I have figured it out on a very basic level; I am able to send messages based on partner ID (not on user ID).

post_vars = {'subject': "Message subject",
             'body': "Message body",
             'partner_ids': [(4, 3)],} # Where "4" adds the ID to the list 
                                       # of followers and "3" is the partner ID 
thread_pool = self.pool.get('mail.thread')
        cr, uid, False,

I'm still getting my feet wet with OpenERP development so I can't explain this code as thoroughly as I would like - any help with that would be appreciated!

What needs to be known is that a user is a partner, res.users inherit of res.partner.

Camptocamp SA
on 2/28/13, 12:54 PM

What you do here is using the message_post method which will call create method of mail.message object.

You could make this call on any model which inherit from mail_thread. However, in your case, as you don't define thread_id, your message won't be attached to any model.

Camptocamp SA
on 2/28/13, 12:58 PM

When passing arguments to create a mail.message, you have to use the strange notation for m2m to assign partners to your message. And if you look in mail.message, the field partner_ids is for Recipients.

Camptocamp SA
on 2/28/13, 1:01 PM

I see that mail.message has type 'notification' this might be better than 'comment'

Camptocamp SA
on 2/28/13, 1:14 PM

Two things here : 1/ active_model_pool.message_post(cr, uid, thread_id, ...) posts a new message on the record given by thread_id in active_model_pool; all followers will be notified 2/ specifying partner_ids pushes a notification (on the Inbox and by email, according to its preferences) to some specific partners

Thibault Delavallee (tde)
on 2/28/13, 1:31 PM

I edited the python style plus used 'notification' instead of 'comment'

Camptocamp SA
on 2/28/13, 3:19 PM

Hello sir i have created message as you mentioned like that but i want to send message with record id if i click that id it should transfer control to that particular record like sales order confirmation message please how can i do it

Vinod Kumar
on 2/19/16, 5:03 AM
Ethan Furman
On 11/19/13, 2:13 PM

Thanks, Allison. Using your work I was able to figure out a few more details.

First, the model should inherit from mail_thread:

class some_table(osv.Model):
    _inherit = ['mail.thread']

Then, when you want to post a message that only goes to the current discussion:

self.message_post(cr, uid, ids, body=body, context=context)

and if you want the message notification to go to all followers:

records = self._get_followers(cr, uid, ids, None, None, context=context)
followers = records[ids[0]]['message_follower_ids']
self.message_post(cr, uid, ids, body=body,

The value for partner_ids can be one of:

  • [(4, id), (4, id), (...)]
  • [(6, 0, (id1, id2, id3), (...)]
  • (id1, id2, id3, id4)

or some combination thereof.


Yannick Vaucher

--Yannick Vaucher--
| 5 7 9
Lausanne, Switzerland
--Yannick Vaucher--
Yannick Vaucher
On 2/28/13, 1:13 PM

Here, I'm creating a notification for 3 partners (let's suppose they are users)

/!\ Warning this isn't a good solution, it was more for test purpose, as it bypasses mail_thread.post_message logic. Prefer the solution of Allison.

recipient_ids = [2, 4, 6]

recipient_links = [(4, partner_id) for partner_id in recipient_ids]
model_data_obj = self.pool.get('ir.model.data')
ref = model_data_obj.get_object_reference(cr, uid, 'mail', 'mt_comment')

message_data = {
    'type': 'notification',
    'subject': "Message subject",
    'body': "Message body",
    'partner_ids': recipient_links,
    'subtype_id': ref,

msg_obj = self.pool.get('mail.message')
msg_obj.create(cr, uid, message_data)

Actually using mail_message.create() bypasses some of the logic contained in message_post. Unless you have some specific needs, you should use message_post instead of directly create a mail_message when trying to create messages and notifications. You can post on a 'void' resource (mail.thread, no thread_id) to create a private conversation or push to some specific partners.

Thibault Delavallee (tde)
on 2/28/13, 1:40 PM

Thanks for the precision. I see that the bypassed logic is for attachments, thread and parent_id. So for simple notifications wouldn't that be ok?

Camptocamp SA
on 2/28/13, 1:56 PM

It looks like this code will in fact create an OpenERP message (as visible in Settings > Technical > Messages) but not deliver it to the user. To get it to deliver to the inbox 'subtype_id' needs to be added to the message_data dictionary. For my testing purposes I hardcoded the value as 1 (which is what subtype="mt_comment" evaluated to in my first example)

on 2/28/13, 2:53 PM

Ok so it is cleaner to call the message_post method than hardcoding the subtype_id. Unless you really want to get the subtype_id this way:

model_data_obj = self.pool.get('ir.model.data')
ref = model_data_obj.get_object_reference(cr, uid, 'mail', 'mt_comment')
Camptocamp SA
on 2/28/13, 3:08 PM

Indeed, the subtype is used to filter the followers of the document that will receive a notification of the message. message_post has an argument subtype that is the xml_id of the subtype; 'mail.mt_comment' is the xml_id of 'Discussions'; we generally use it for user input. In your addon, you may define specific subtypes (mail.message.subtype). Examples of subtypes can be found in crm/crm_lead_data.xml (Stage Changed, Lead Won, ...).

Thibault Delavallee (tde)
on 3/1/13, 4:58 AM

message_post() does not send E-Mails to followers for me even if i do use a subtype?!? What i do: Create a New Lead AND assign a Sales Team: # Create a new Lead (request.registry is deprocated - should use request.env instead) values['section_id'] = request.env.ref('website.salesteam_website_sales').id newlead = request.registry['crm.lead'].create(request.cr, SUPERUSER_ID, values, request.context) Because of the Sales Team there are three Followers for the newly created lead Post a message with message_post() I would expect that all followers of the new lead will receive an e-mail BUT THEY DONT?!? The normal E-Mail (the one for the lead creation is send via E-Mail but messge_post() does not send E-Mails?!? What do i need to do to send E-Mails also when posting a message through code?!? Here is how i call the message_post: leadrecord.message_post(body=recordtext, subject=values['name'], type='email', subtype='mt_lead_create', content_subtype='plaintext') Also tried with: leadrecord.message_post(body=recordtext, subject=values['name'], type='notification', content_subtype='plaintext') Message is posted BUT no E-Mails are send :(

Michael Karrer
on 12/2/14, 2:14 PM

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

1 follower(s)


Asked: 2/26/13, 4:40 PM
Seen: 14326 times
Last updated: 10/18/15, 1:45 AM