From f9945297255f59ee8864d3a12602a54f95cbb9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 11 Apr 2013 12:17:20 +0200 Subject: [PATCH] [IMP] mail: finding partner based on email: improved code for suggested partners, added somme comments and tests. bzr revid: tde@openerp.com-20130411101720-mumz152dsxvv1xbj --- addons/mail/mail_thread.py | 22 ++++++++---- addons/mail/static/src/js/mail.js | 3 +- addons/mail/tests/test_mail_gateway.py | 46 ++++++++++++++++++++++++-- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index c5ec5300b56..1cb3cc5d7e4 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -415,7 +415,9 @@ class mail_thread(osv.AbstractModel): return ret_dict def _message_find_partners(self, cr, uid, message, header_fields=['From'], context=None): - """ Find partners related to some header fields of the message. """ + """ Find partners related to some header fields of the message. + + TDE TODO: merge me with other partner finding methods in 8.0 """ partner_obj = self.pool.get('res.partner') partner_ids = [] s = ', '.join([decode(message.get(h)) for h in header_fields if message.get(h)]) @@ -427,6 +429,7 @@ class mail_thread(osv.AbstractModel): return partner_ids def _message_find_user_id(self, cr, uid, message, context=None): + """ TDE TODO: check and maybe merge me with other user finding methods in 8.0 """ from_local_part = tools.email_split(decode(message.get('From')))[0] # FP Note: canonification required, the minimu: .lower() user_ids = self.pool.get('res.users').search(cr, uid, ['|', @@ -878,7 +881,9 @@ class mail_thread(osv.AbstractModel): return result def message_get_partner_info_from_emails(self, cr, uid, emails, link_mail=False, context=None, res_id=None): - """ Wrapper with weird order parameter because of 7.0 fix. """ + """ Wrapper with weird order parameter because of 7.0 fix. + + TDE TODO: remove me in 8.0 """ return self.message_find_partner_from_emails(cr, uid, res_id, emails, link_mail=link_mail, context=context) def message_find_partner_from_emails(self, cr, uid, id, emails, link_mail=False, context=None): @@ -887,11 +892,12 @@ class mail_thread(osv.AbstractModel): it is meant to be used by the mail widget. :return dict: partner_ids and new_partner_ids - """ + + TDE TODO: merge me with other partner finding methods in 8.0 """ mail_message_obj = self.pool.get('mail.message') partner_obj = self.pool.get('res.partner') result = list() - if id: + if id and self._name != 'mail.thrad': obj = self.browse(cr, SUPERUSER_ID, id, context=context) else: obj = None @@ -908,13 +914,15 @@ class mail_thread(osv.AbstractModel): partner_info['partner_id'] = follower.id # second try: check in partners if not partner_info.get('partner_id'): - ids = partner_obj.search(cr, SUPERUSER_ID, [('email', '=', email_address)], context=context) + ids = partner_obj.search(cr, SUPERUSER_ID, [('email', 'ilike', email_address), ('user_ids', '!=', False)], limit=1, context=context) + if not ids: + ids = partner_obj.search(cr, SUPERUSER_ID, [('email', 'ilike', email_address)], limit=1, context=context) if ids: partner_info['partner_id'] = ids[0] result.append(partner_info) # link mail with this from mail to the new partner id - if link_mail and ids: + if link_mail and partner_info['partner_id']: message_ids = mail_message_obj.search(cr, SUPERUSER_ID, [ '|', ('email_from', '=', email), @@ -922,7 +930,7 @@ class mail_thread(osv.AbstractModel): ('author_id', '=', False) ], context=context) if message_ids: - mail_message_obj.write(cr, SUPERUSER_ID, message_ids, {'author_id': ids[0]}, context=context) + mail_message_obj.write(cr, SUPERUSER_ID, message_ids, {'author_id': partner_info['partner_id']}, context=context) return result def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification', diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index d715979c507..00681e81a78 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -620,7 +620,6 @@ openerp.mail = function (session) { // have unknown names -> call message_get_partner_info_from_emails to try to find partner_id var find_done = $.Deferred(); if (names_to_find.length > 0) { - // find_done = self.parent_thread.ds_thread._model.call('message_get_partner_info_from_emails', [names_to_find]); var values = { 'res_id': this.context.default_res_id, } @@ -672,7 +671,7 @@ openerp.mail = function (session) { if (new_names_to_find.length > 0) { var values = { 'link_mail': true, - 'res_id': this.context.default_res_id, + 'res_id': self.context.default_res_id, } find_done = self.parent_thread.ds_thread._model.call('message_get_partner_info_from_emails', [new_names_to_find], values); } diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py index a68011298c7..e4269d59d8b 100644 --- a/addons/mail/tests/test_mail_gateway.py +++ b/addons/mail/tests/test_mail_gateway.py @@ -83,7 +83,47 @@ Sylvie class TestMailgateway(TestMailBase): - def test_00_message_process(self): + def test_00_partner_find_from_email(self): + """ Tests designed for partner fetch based on emails. """ + cr, uid, user_raoul, group_pigs = self.cr, self.uid, self.user_raoul, self.group_pigs + + # -------------------------------------------------- + # Data creation + # -------------------------------------------------- + # 1 - Partner ARaoul + p_a_id = self.res_partner.create(cr, uid, {'name': 'ARaoul', 'email': 'test@test.fr'}) + + # -------------------------------------------------- + # CASE1: without object + # -------------------------------------------------- + + # Do: find partner with email -> first partner should be found + partner_info = self.mail_thread.message_find_partner_from_emails(cr, uid, None, ['Maybe Raoul '], link_mail=False)[0] + self.assertEqual(partner_info['full_name'], 'Maybe Raoul ', + 'mail_thread: message_find_partner_from_emails did not handle email') + self.assertEqual(partner_info['partner_id'], p_a_id, + 'mail_thread: message_find_partner_from_emails wrong partner found') + + # Data: add some data about partners + # 2 - User BRaoul + p_b_id = self.res_partner.create(cr, uid, {'name': 'BRaoul', 'email': 'test@test.fr', 'user_ids': [(4, user_raoul.id)]}) + + # Do: find partner with email -> first user should be found + partner_info = self.mail_thread.message_find_partner_from_emails(cr, uid, None, ['Maybe Raoul '], link_mail=False)[0] + self.assertEqual(partner_info['partner_id'], p_b_id, + 'mail_thread: message_find_partner_from_emails wrong partner found') + + # -------------------------------------------------- + # CASE1: with object + # -------------------------------------------------- + + # Do: find partner in group where there is a follower with the email -> should be taken + self.mail_group.message_subscribe(cr, uid, [group_pigs.id], [p_b_id]) + partner_info = self.mail_group.message_find_partner_from_emails(cr, uid, group_pigs.id, ['Maybe Raoul '], link_mail=False)[0] + self.assertEqual(partner_info['partner_id'], p_b_id, + 'mail_thread: message_find_partner_from_emails wrong partner found') + + def test_10_message_process(self): """ Testing incoming emails processing. """ cr, uid, user_raoul = self.cr, self.uid, self.user_raoul @@ -325,7 +365,7 @@ class TestMailgateway(TestMailBase): self.assertEqual(msg.body, '
\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n
', 'message_process: plaintext incoming email incorrectly parsed') - def test_10_thread_parent_resolution(self): + def test_20_thread_parent_resolution(self): """ Testing parent/child relationships are correctly established when processing incoming mails """ cr, uid = self.cr, self.uid @@ -370,7 +410,7 @@ class TestMailgateway(TestMailBase): self.assertEqual(6, len(group_pigs.message_ids), 'message_process: group should contain 6 messages') self.assertEqual(3, len(msg1.child_ids), 'message_process: msg1 should have 3 children now') - def test_20_private_discussion(self): + def test_30_private_discussion(self): """ Testing private discussion between partners. """ cr, uid = self.cr, self.uid