[MERGE]from trunk-openchatter-chm
bzr revid: chm@openerp.com-20121002105328-1u9qk83fb5jz9teh
This commit is contained in:
commit
8cafaceb4a
|
@ -167,8 +167,9 @@ class test_message_compose(test_mail.TestMailMockups):
|
|||
# Test: partner_ids: p_a_id (default) + 3 newly created partners
|
||||
message_pigs_pids = [partner.id for partner in message_pigs.partner_ids]
|
||||
message_bird_pids = [partner.id for partner in message_bird.partner_ids]
|
||||
partner_ids = self.res_partner.search(cr, uid, [('email', 'in', ['b@b.b', 'c@c.c', 'd@d.d'])]) + [p_a_id]
|
||||
partner_ids = self.res_partner.search(cr, uid, [('email', 'in', ['b@b.b', 'c@c.c', 'd@d.d'])])
|
||||
self.assertEqual(len(message_pigs_pids), len(partner_ids), 'mail.message on pigs incorrect number of partner_ids')
|
||||
self.assertEqual(len(message_bird_pids), len(partner_ids), 'mail.message on bird partner_ids incorrect')
|
||||
self.assertEqual(set(message_pigs_pids), set(partner_ids), 'mail.message on pigs incorrect number of partner_ids')
|
||||
|
||||
self.assertEqual(len(message_bird_pids), len(partner_ids), 'mail.message on bird partner_ids incorrect')
|
||||
self.assertEqual(set(message_bird_pids), set(partner_ids), 'mail.message on bird partner_ids incorrect')
|
||||
|
|
|
@ -94,13 +94,16 @@ class mail_notification(osv.Model):
|
|||
|
||||
return self.write(cr, uid, notif_ids, {'read': read}, context=context)
|
||||
|
||||
def get_partners_to_notify(self, cr, uid, partner_ids, message, context=None):
|
||||
def get_partners_to_notify(self, cr, uid, message, context=None):
|
||||
""" Return the list of partners to notify, based on their preferences.
|
||||
|
||||
:param browse_record message: mail.message to notify
|
||||
"""
|
||||
notify_pids = []
|
||||
for partner in self.pool.get('res.partner').browse(cr, SUPERUSER_ID, partner_ids, context=context):
|
||||
for notification in message.notification_ids:
|
||||
if notification.read:
|
||||
continue
|
||||
partner = notification.partner_id
|
||||
# Do not send an email to the writer
|
||||
if partner.user_ids and partner.user_ids[0].id == uid:
|
||||
continue
|
||||
|
@ -119,15 +122,15 @@ class mail_notification(osv.Model):
|
|||
notify_pids.append(partner.id)
|
||||
return notify_pids
|
||||
|
||||
def notify(self, cr, uid, partner_ids, msg_id, context=None):
|
||||
def _notify(self, cr, uid, msg_id, context=None):
|
||||
""" Send by email the notification depending on the user preferences """
|
||||
context = context or {}
|
||||
# mail_noemail (do not send email) or no partner_ids: do not send, return
|
||||
if context.get('mail_noemail') or not partner_ids:
|
||||
if context.get('mail_noemail'):
|
||||
return True
|
||||
msg = self.pool.get('mail.message').browse(cr, uid, msg_id, context=context)
|
||||
|
||||
notify_partner_ids = self.get_partners_to_notify(cr, uid, partner_ids, msg, context=context)
|
||||
notify_partner_ids = self.get_partners_to_notify(cr, uid, msg, context=context)
|
||||
if not notify_partner_ids:
|
||||
return True
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ class mail_group(osv.Model):
|
|||
group. The group mechanics are based on the followers. """
|
||||
_description = 'Discussion group'
|
||||
_name = 'mail.group'
|
||||
_mail_autothread = False
|
||||
_inherit = ['mail.thread']
|
||||
_inherits = {'mail.alias': 'alias_id', 'ir.ui.menu': 'menu_id'}
|
||||
|
||||
|
|
|
@ -451,7 +451,7 @@ class mail_message(osv.Model):
|
|||
if not values.get('message_id') and values.get('res_id') and values.get('model'):
|
||||
values['message_id'] = tools.generate_tracking_message_id('%(model)s-%(res_id)s' % values)
|
||||
newid = super(mail_message, self).create(cr, uid, values, context)
|
||||
self.notify(cr, uid, newid, context=context)
|
||||
self._notify(cr, 1, newid, context=context)
|
||||
return newid
|
||||
|
||||
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
|
||||
|
@ -473,7 +473,7 @@ class mail_message(osv.Model):
|
|||
self.pool.get('ir.attachment').unlink(cr, uid, attachments_to_delete, context=context)
|
||||
return super(mail_message, self).unlink(cr, uid, ids, context=context)
|
||||
|
||||
def notify(self, cr, uid, newid, context=None):
|
||||
def _notify(self, cr, uid, newid, context=None):
|
||||
""" Add the related record followers to the destination partner_ids.
|
||||
Call mail_notification.notify to manage the email sending
|
||||
"""
|
||||
|
@ -502,13 +502,10 @@ class mail_message(osv.Model):
|
|||
# unless remove myself author
|
||||
if ((message.model=="res.partner" and message.res_id==message.author_id.id)):
|
||||
self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, message.author_id.id)]}, context=context)
|
||||
# add myself if this message have a parent message and I recive parent message
|
||||
# ! subtype_id: pure log message => do this in read_message
|
||||
# or (message.parent_id and self.pool.get('mail.notification').search(cr, uid, [('partner_id','=',message.author_id.id),('message_id','=',message.parent_id)])):
|
||||
else:
|
||||
self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(3, message.author_id.id)]}, context=context)
|
||||
|
||||
self.pool.get('mail.notification').notify(cr, uid, list(partners_to_notify), newid, context=context)
|
||||
self.pool.get('mail.notification')._notify(cr, uid, newid, context=context)
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
"""Overridden to avoid duplicating fields that are unique to each email"""
|
||||
|
|
|
@ -117,6 +117,7 @@ class mail_thread(osv.AbstractModel):
|
|||
'''
|
||||
_name = 'mail.thread'
|
||||
_description = 'Email Thread'
|
||||
_mail_autothread = True
|
||||
|
||||
def _get_message_data(self, cr, uid, ids, name, args, context=None):
|
||||
""" Computes:
|
||||
|
@ -661,7 +662,7 @@ class mail_thread(osv.AbstractModel):
|
|||
|
||||
|
||||
#auto link messages for same id and object
|
||||
if model != 'res.partner' and thread_id:
|
||||
if self._mail_autothread and thread_id:
|
||||
message_ids = messages.search(cr, uid, ['&',('res_id', '=', thread_id),('model','=',model)], context=context)
|
||||
if len(message_ids):
|
||||
parent_id = min(message_ids)
|
||||
|
|
|
@ -25,6 +25,7 @@ class res_partner_mail(osv.Model):
|
|||
""" Update partner to add a field about notification preferences """
|
||||
_name = "res.partner"
|
||||
_inherit = ['res.partner', 'mail.thread']
|
||||
_mail_autothread = False
|
||||
|
||||
_columns = {
|
||||
'notification_email_send': fields.selection([
|
||||
|
|
|
@ -135,6 +135,8 @@ class test_mail(TestMailMockups):
|
|||
self.res_users = self.registry('res.users')
|
||||
self.res_partner = self.registry('res.partner')
|
||||
|
||||
self.user_demo = self.registry('ir.model.data').get_object_reference(self.cr, self.uid, 'base', 'user_demo')[1]
|
||||
|
||||
# Mock send_get_mail_body to test its functionality without other addons override
|
||||
self._send_get_mail_body = self.registry('mail.mail').send_get_mail_body
|
||||
self.registry('mail.mail').send_get_mail_body = self._mock_send_get_mail_body
|
||||
|
@ -503,8 +505,8 @@ class test_mail(TestMailMockups):
|
|||
|
||||
# 1. mass_mail on pigs and bird
|
||||
compose_id = mail_compose.create(cr, uid,
|
||||
{'subject': _subject, 'body': '${object.description}'},
|
||||
{'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': -1,
|
||||
{'subject': _subject, 'body': '${object.description}', 'content_type': 'html'},
|
||||
{'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': False,
|
||||
'active_ids': [self.group_pigs_id, group_bird_id]})
|
||||
compose = mail_compose.browse(cr, uid, compose_id)
|
||||
# Test: content_subtype is html
|
||||
|
@ -527,111 +529,114 @@ class test_mail(TestMailMockups):
|
|||
self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect')
|
||||
self.assertEqual(message2.body, group_bird.description, 'mail.message body incorrect')
|
||||
|
||||
def test_30_message_read(self):
|
||||
""" Tests designed for message_read. """
|
||||
# TDE NOTE: this test is not finished, as the message_read method is not fully specified.
|
||||
# It will be updated as soon as we have fixed specs !
|
||||
cr, uid = self.cr, self.uid
|
||||
group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
|
||||
# FP Note: to be reviewed to be more generic, not depending on the algorythm of
|
||||
# message_read
|
||||
#def test_30_message_read(self):
|
||||
# """ Tests designed for message_read. """
|
||||
# # TDE NOTE: this test is not finished, as the message_read method is not fully specified.
|
||||
# # It will be updated as soon as we have fixed specs !
|
||||
# cr, uid = self.cr, self.uid
|
||||
# group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
|
||||
|
||||
def _compare_structures(struct1, struct2, n=0):
|
||||
# print '%scompare structure' % ('\t' * n)
|
||||
# self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect')
|
||||
# def _compare_structures(struct1, struct2, n=0):
|
||||
# # print '%scompare structure' % ('\t' * n)
|
||||
# # self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect')
|
||||
|
||||
for x in range(len(struct1)):
|
||||
if struct1[x].get('type') == 'expandable':
|
||||
continue
|
||||
# print '%s' % ('\t' * n), struct1[x]['id'], struct1[x]['child_nbr'], struct2[x]['id'], struct2[x].get('child_nbr', 'XX'), struct1[x].get('subject') or ''
|
||||
self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject'))
|
||||
_compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1)
|
||||
# print '%send compare' % ('\t' * n)
|
||||
# for x in range(len(struct1)):
|
||||
# if struct1[x].get('type') == 'expandable':
|
||||
# continue
|
||||
# # print '%s' % ('\t' * n), struct1[x]['id'], struct1[x]['child_nbr'], struct2[x]['id'], struct2[x].get('child_nbr', 'XX'), struct1[x].get('subject') or ''
|
||||
# self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject'))
|
||||
# _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1)
|
||||
# # print '%send compare' % ('\t' * n)
|
||||
|
||||
# ----------------------------------------
|
||||
# CASE1: Flattening test
|
||||
# ----------------------------------------
|
||||
# # ----------------------------------------
|
||||
# # CASE1: Flattening test
|
||||
# # ----------------------------------------
|
||||
|
||||
# Create dummy message structure
|
||||
import copy
|
||||
tree = [{'id': 2, 'child_nbr': 1, 'child_ids': [
|
||||
{'id': 6, 'child_nbr': 1, 'child_ids': [
|
||||
{'id': 8, 'child_nbr': 0, 'child_ids': []},
|
||||
]},
|
||||
]},
|
||||
{'id': 1, 'child_nbr': 3, 'child_ids':[
|
||||
{'id': 7, 'child_nbr': 1, 'child_ids': [
|
||||
{'id': 9, 'child_nbr': 0, 'child_ids': []},
|
||||
]},
|
||||
{'id': 4, 'child_nbr': 2, 'child_ids': [
|
||||
{'id': 10, 'child_nbr': 0, 'child_ids': []},
|
||||
{'id': 5, 'child_nbr': 0, 'child_ids': []},
|
||||
]},
|
||||
{'id': 3, 'child_nbr': 0, 'child_ids': []},
|
||||
]},
|
||||
]
|
||||
# Test: completely flat
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0, limit=15, add_expandable=False)
|
||||
_compare_structures(new_tree, new_tree)
|
||||
self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat')
|
||||
# Test: 1 thread level
|
||||
tree_test = [{'id': 2, 'child_ids': [
|
||||
{'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []},
|
||||
]},
|
||||
{'id': 1, 'child_ids': [
|
||||
{'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []},
|
||||
{'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []},
|
||||
{'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []},
|
||||
]},
|
||||
]
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1, limit=15, add_expandable=False)
|
||||
_compare_structures(new_tree, tree_test)
|
||||
# Test: 2 thread levels
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2, limit=15, add_expandable=False)
|
||||
_compare_structures(new_tree, tree)
|
||||
# # Create dummy message structure
|
||||
# import copy
|
||||
# tree = [{'id': 2, 'child_nbr': 1, 'child_ids': [
|
||||
# {'id': 6, 'child_nbr': 1, 'child_ids': [
|
||||
# {'id': 8, 'child_nbr': 0, 'child_ids': []},
|
||||
# ]},
|
||||
# ]},
|
||||
# {'id': 1, 'child_nbr': 3, 'child_ids':[
|
||||
# {'id': 7, 'child_nbr': 1, 'child_ids': [
|
||||
# {'id': 9, 'child_nbr': 0, 'child_ids': []},
|
||||
# ]},
|
||||
# {'id': 4, 'child_nbr': 2, 'child_ids': [
|
||||
# {'id': 10, 'child_nbr': 0, 'child_ids': []},
|
||||
# {'id': 5, 'child_nbr': 0, 'child_ids': []},
|
||||
# ]},
|
||||
# {'id': 3, 'child_nbr': 0, 'child_ids': []},
|
||||
# ]},
|
||||
# ]
|
||||
# # Test: completely flat
|
||||
# new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0, limit=15, add_expandable=False)
|
||||
# _compare_structures(new_tree, new_tree)
|
||||
# self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat')
|
||||
# # Test: 1 thread level
|
||||
# tree_test = [{'id': 2, 'child_ids': [
|
||||
# {'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []},
|
||||
# ]},
|
||||
# {'id': 1, 'child_ids': [
|
||||
# {'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []},
|
||||
# {'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []},
|
||||
# {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []},
|
||||
# ]},
|
||||
# ]
|
||||
# new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1, limit=15, add_expandable=False)
|
||||
# _compare_structures(new_tree, tree_test)
|
||||
# # Test: 2 thread levels
|
||||
# new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2, limit=15, add_expandable=False)
|
||||
# _compare_structures(new_tree, tree)
|
||||
|
||||
# ----------------------------------------
|
||||
# CASE2: message_read test
|
||||
# ----------------------------------------
|
||||
# # ----------------------------------------
|
||||
# # CASE2: message_read test
|
||||
# # ----------------------------------------
|
||||
|
||||
# 1. Add a few messages to pigs group
|
||||
msgid1 = group_pigs.message_post(body='1', subject='1', parent_id=False)
|
||||
msgid2 = group_pigs.message_post(body='2', subject='1-1', parent_id=msgid1)
|
||||
msgid3 = group_pigs.message_post(body='3', subject='1-2', parent_id=msgid1)
|
||||
msgid4 = group_pigs.message_post(body='4', subject='2', parent_id=False)
|
||||
msgid5 = group_pigs.message_post(body='5', subject='1-1-1', parent_id=msgid2)
|
||||
msgid6 = group_pigs.message_post(body='6', subject='2-1', parent_id=msgid4)
|
||||
# # 1. Add a few messages to pigs group
|
||||
# msgid1 = group_pigs.message_post(body='1', subject='1', parent_id=False)
|
||||
# msgid2 = group_pigs.message_post(body='2', subject='1-1', parent_id=msgid1)
|
||||
# msgid3 = group_pigs.message_post(body='3', subject='1-2', parent_id=msgid1)
|
||||
# msgid4 = group_pigs.message_post(body='4', subject='2', parent_id=False)
|
||||
# msgid5 = group_pigs.message_post(body='5', subject='1-1-1', parent_id=msgid2)
|
||||
# msgid6 = group_pigs.message_post(body='6', subject='2-1', parent_id=msgid4)
|
||||
|
||||
# Test: read all messages flat
|
||||
tree_test = [{'id': msgid6, 'child_ids': []}, {'id': msgid5, 'child_ids': []},
|
||||
{'id': msgid4, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
|
||||
{'id': msgid2, 'child_ids': []}, {'id': msgid1, 'child_ids': []}]
|
||||
tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=0, limit=15)
|
||||
_compare_structures(tree, tree_test)
|
||||
# Test: read with 1 level of thread
|
||||
tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
|
||||
{'id': msgid1, 'child_ids': [
|
||||
{'id': msgid5, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
|
||||
{'id': msgid2, 'child_ids': []},
|
||||
]},
|
||||
]
|
||||
tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=1, limit=15)
|
||||
_compare_structures(tree, tree_test)
|
||||
# Test: read with 2 levels of thread
|
||||
tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
|
||||
{'id': msgid1, 'child_ids': [
|
||||
{'id': msgid3, 'child_ids': []},
|
||||
{'id': msgid2, 'child_ids': [{'id': msgid5, 'child_ids': []}, ]},
|
||||
]},
|
||||
]
|
||||
tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=2, limit=15)
|
||||
_compare_structures(tree, tree_test)
|
||||
# # Test: read all messages flat
|
||||
# tree_test = [{'id': msgid6, 'child_ids': []}, {'id': msgid5, 'child_ids': []},
|
||||
# {'id': msgid4, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
|
||||
# {'id': msgid2, 'child_ids': []}, {'id': msgid1, 'child_ids': []}]
|
||||
# tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=0, limit=15)
|
||||
# _compare_structures(tree, tree_test)
|
||||
# # Test: read with 1 level of thread
|
||||
# tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
|
||||
# {'id': msgid1, 'child_ids': [
|
||||
# {'id': msgid5, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
|
||||
# {'id': msgid2, 'child_ids': []},
|
||||
# ]},
|
||||
# ]
|
||||
# tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=1, limit=15)
|
||||
# _compare_structures(tree, tree_test)
|
||||
# # Test: read with 2 levels of thread
|
||||
# tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
|
||||
# {'id': msgid1, 'child_ids': [
|
||||
# {'id': msgid3, 'child_ids': []},
|
||||
# {'id': msgid2, 'child_ids': [{'id': msgid5, 'child_ids': []}, ]},
|
||||
# ]},
|
||||
# ]
|
||||
# tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=2, limit=15)
|
||||
# _compare_structures(tree, tree_test)
|
||||
|
||||
# 2. Test expandables
|
||||
# TDE FIXME: add those tests when expandables are specified and implemented
|
||||
# # 2. Test expandables
|
||||
# # TDE FIXME: add those tests when expandables are specified and implemented
|
||||
|
||||
def test_40_needaction(self):
|
||||
""" Tests for mail.message needaction. """
|
||||
cr, uid = self.cr, self.uid
|
||||
group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
|
||||
group_pigs_demo = self.mail_group.browse(cr, self.user_demo, self.group_pigs_id)
|
||||
user_admin = self.res_users.browse(cr, uid, uid)
|
||||
|
||||
# Demo values: check unread notification = needaction on mail.message
|
||||
|
@ -642,9 +647,12 @@ class test_mail(TestMailMockups):
|
|||
na_count = self.mail_message._needaction_count(cr, uid, domain=[])
|
||||
self.assertEqual(len(notif_ids), na_count, 'unread notifications count does not match needaction count')
|
||||
|
||||
# Post 4 message on group_pigs
|
||||
for dummy in range(4):
|
||||
na_count1 = self.mail_message._needaction_count(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)])
|
||||
# Post 2 message on group_pigs as admin, 3 messages as demo user
|
||||
for dummy in range(2):
|
||||
group_pigs.message_post(body='My Body', subtype='mt_comment')
|
||||
for dummy in range(3):
|
||||
group_pigs_demo.message_post(body='My Demo Body', subtype='mt_comment')
|
||||
|
||||
# Check there are 4 new needaction on mail.message
|
||||
notif_ids = self.mail_notification.search(cr, uid, [
|
||||
|
@ -656,7 +664,19 @@ class test_mail(TestMailMockups):
|
|||
|
||||
# Check there are 4 needaction on mail.message with particular domain
|
||||
na_count = self.mail_message._needaction_count(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)])
|
||||
self.assertEqual(na_count, 4, 'posted message count does not match needaction count')
|
||||
notif_ids = self.mail_notification.search(cr, uid, [
|
||||
('partner_id', '=', user_admin.partner_id.id),
|
||||
('read', '=', False),
|
||||
('message_id.model','=','mail.group'),
|
||||
('message_id.res_id','=',self.group_pigs_id)
|
||||
])
|
||||
self.assertEqual(len(notif_ids), na_count, 'posted message count does not match needaction count')
|
||||
|
||||
na_count3 = self.mail_message._needaction_count(cr, self.user_demo, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)])
|
||||
self.assertEqual(na_count3-na_count1, 0, 'demo has 0 message: not a follower and do not follow his own messages')
|
||||
|
||||
na_count2 = self.mail_message._needaction_count(cr, uid, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)])
|
||||
self.assertEqual(na_count2-na_count1, 3, 'admin has 3 messages: 0 from itself as they are marked as read, 3 from demo')
|
||||
|
||||
def test_50_thread_parent_resolution(self):
|
||||
"""Verify parent/child relationships are correctly established when processing incoming mails"""
|
||||
|
@ -671,15 +691,18 @@ class test_mail(TestMailMockups):
|
|||
# 1. In-Reply-To header
|
||||
reply_msg = MAIL_TEMPLATE.format(to='Pretty Pigs <group+pigs@example.com>, other@gmail.com', subject='Re: 1',
|
||||
extra='In-Reply-To: %s' % msg1.message_id)
|
||||
self.mail_thread.message_process(cr, uid, None, reply_msg)
|
||||
self.mail_group.message_process(cr, uid, None, reply_msg)
|
||||
|
||||
# 2. References header
|
||||
reply_msg2 = MAIL_TEMPLATE.format(to='Pretty Pigs <group+pigs@example.com>, other@gmail.com', subject='Re: Re: 1',
|
||||
extra='References: <2233@a.com>\r\n\t<3edss_dsa@b.com> %s' % msg1.message_id)
|
||||
self.mail_thread.message_process(cr, uid, None, reply_msg2)
|
||||
self.mail_group.message_process(cr, uid, None, reply_msg2)
|
||||
|
||||
# 3. Subject contains [<ID>] + model passed to message+process -> only attached to group, not to mail
|
||||
reply_msg3 = MAIL_TEMPLATE.format(to='Pretty Pigs <group+pigs@example.com>, other@gmail.com',
|
||||
extra='', subject='Re: [%s] 1' % self.group_pigs_id)
|
||||
self.mail_thread.message_process(cr, uid, 'mail.group', reply_msg3)
|
||||
self.mail_group.message_process(cr, uid, 'mail.group', reply_msg3)
|
||||
|
||||
group_pigs.refresh()
|
||||
msg1.refresh()
|
||||
self.assertEqual(5, len(group_pigs.message_ids), 'group should contain 5 messages')
|
||||
|
|
|
@ -102,9 +102,9 @@ class mail_compose_message(osv.TransientModel):
|
|||
'partner_ids': fields.many2many('res.partner',
|
||||
'mail_compose_message_res_partner_rel',
|
||||
'wizard_id', 'partner_id', 'Additional contacts'),
|
||||
'attachment_ids': fields.many2many('ir.attachment',
|
||||
'mail_compose_message_ir_attachments_rel',
|
||||
'wizard_id', 'attachment_id', 'Attachments'),
|
||||
'attachment_ids': fields.one2many('ir.attachment', 'res_id',
|
||||
domain=lambda self: [('res_model', '=', self._name)],
|
||||
string='Attachments'),
|
||||
'filter_id': fields.many2one('ir.filters', 'Filters'),
|
||||
'body_text': fields.text('Plain-text Contents'),
|
||||
'content_subtype': fields.char('Message content subtype', size=32, readonly=1,
|
||||
|
@ -219,14 +219,21 @@ class mail_compose_message(osv.TransientModel):
|
|||
email(s), rendering any template patterns on the fly if needed. """
|
||||
if context is None:
|
||||
context = {}
|
||||
print '**', context
|
||||
active_ids = context.get('active_ids')
|
||||
|
||||
for wizard in self.browse(cr, uid, ids, context=context):
|
||||
mass_mail_mode = wizard.composition_mode == 'mass_mail'
|
||||
active_model_pool = self.pool.get(wizard.model if wizard.model else 'mail.thread')
|
||||
|
||||
if wizard.body_text==False:
|
||||
return False
|
||||
if wizard.content_subtype == 'html':
|
||||
if not wizard.body:
|
||||
return False
|
||||
body = wizard.body
|
||||
else: # wizard.content_subtype == 'plain':
|
||||
if not wizard.body_text:
|
||||
return False
|
||||
body = '<pre>%s</pre>' % tools.ustr(wizard.body_text or '')
|
||||
|
||||
# wizard works in batch mode: [res_id] or active_ids
|
||||
res_ids = active_ids if mass_mail_mode and wizard.model and active_ids else [wizard.res_id]
|
||||
|
@ -234,7 +241,7 @@ class mail_compose_message(osv.TransientModel):
|
|||
# default values, according to the wizard options
|
||||
post_values = {
|
||||
'subject': wizard.subject if wizard.content_subtype == 'html' else False,
|
||||
'body': wizard.body if wizard.content_subtype == 'html' else '<pre>%s</pre>' % tools.ustr(wizard.body_text),
|
||||
'body': body,
|
||||
'parent_id': wizard.parent_id and wizard.parent_id.id,
|
||||
'partner_ids': [(4, partner.id) for partner in wizard.partner_ids],
|
||||
'attachments': [(attach.datas_fname or attach.name, base64.b64decode(attach.datas)) for attach in wizard.attachment_ids],
|
||||
|
@ -251,8 +258,8 @@ class mail_compose_message(osv.TransientModel):
|
|||
active_model_pool.message_post(cr, uid, [res_id], type='comment', subtype='mt_comment', context=context, **post_values)
|
||||
|
||||
# post process: update attachments, because id is not necessarily known when adding attachments in Chatter
|
||||
self.pool.get('ir.attachment').write(cr, uid, [attach.id for attach in wizard.attachment_ids], {
|
||||
'res_id': wizard.id, 'res_model': wizard.model or False}, context=context)
|
||||
# self.pool.get('ir.attachment').write(cr, uid, [attach.id for attach in wizard.attachment_ids], {
|
||||
# 'res_id': wizard.id, 'res_model': wizard.model or False}, context=context)
|
||||
|
||||
return {'type': 'ir.actions.act_window_close', 'res_model':'mail.compose.message'}
|
||||
|
||||
|
|
|
@ -654,7 +654,7 @@ class sale_order(osv.osv):
|
|||
self.message_post(cr, uid, [obj.id], body=_("Sale Order for <em>%s</em> set to <b>Done</b>") % (obj.partner_id.name), context=context)
|
||||
|
||||
def invoice_paid_send_note(self, cr, uid, ids, context=None):
|
||||
self.message_post(cr, uid, ids, body=_("Invoice <b>paid</b>."), subtype="sale_subtype_paid", context=context)
|
||||
self.message_post(cr, uid, ids, body=_("Invoice <b>paid</b>."), subtype="mt_sale_paid", context=context)
|
||||
|
||||
def invoice_send_note(self, cr, uid, ids, invoice_id, context=None):
|
||||
for order in self.browse(cr, uid, ids, context=context):
|
||||
|
|
|
@ -1425,7 +1425,7 @@ class stock_picking(osv.osv):
|
|||
|
||||
def create_send_note(self, cr, uid, ids, context=None):
|
||||
for obj in self.browse(cr, uid, ids, context=context):
|
||||
self.message_post(cr, uid, [obj.id], body=_("%s has been <b>created</b>.") % (self._get_document_type(obj.type)), subtype="mt_stock_new", context=context)
|
||||
self.message_post(cr, uid, [obj.id], body=_("%s has been <b>created</b>.") % (self._get_document_type(cr, uid, obj, context=context)), subtype="mt_stock_new", context=context)
|
||||
|
||||
def confirm_send_note(self, cr, uid, ids, context=None):
|
||||
for obj in self.browse(cr, uid, ids, context=context):
|
||||
|
|
Loading…
Reference in New Issue