From 021087c8cebef9cf8b74ff71ef1fe524ececb65b Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Thu, 15 Apr 2010 21:12:20 +0530 Subject: [PATCH] [IMP]: CRM email integration Improvement Generate client side email threats for each case bzr revid: mga@tinyerp.com-20100415154220-8xuzn32det2jd4oo --- addons/crm/crm.py | 20 ++--- addons/crm/crm_mailgate.py | 119 ++++++++++++++-------------- addons/crm/wizard/crm_send_email.py | 13 ++- 3 files changed, 77 insertions(+), 75 deletions(-) diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 81b6cc79f35..74f71f72931 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -501,20 +501,7 @@ class crm_case(osv.osv): self.write(cr, uid, [case.id], {'stage_id': s[section][st]}) return True - def history(self, cr, uid, ids, keyword, history=False, email=False, details=None, context={}): - """ - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of History’s IDs - @param context: A standard dictionary for contextual values""" - - cases = self.browse(cr, uid, ids, context=context) - return self.__history(cr, uid, cases, keyword=keyword, \ - history=history, email=email, details=details, \ - context=context) - - def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, context={}): + def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, message_id=False, context={}): """ @param self: The object pointer @param cr: the current row, from the database cursor, @@ -533,7 +520,8 @@ class crm_case(osv.osv): 'date': time.strftime('%Y-%m-%d %H:%M:%S'), 'model_id' : model_ids and model_ids[0] or False, 'res_id': case.id, - 'section_id': case.section_id.id + 'section_id': case.section_id.id, + 'message_id':message_id } obj = self.pool.get('crm.case.log') @@ -551,6 +539,7 @@ class crm_case(osv.osv): res = obj.create(cr, uid, data, context) return True _history = __history + history = __history def create(self, cr, uid, *args, **argv): @@ -849,6 +838,7 @@ class crm_case_history(osv.osv): 'email_to': fields.char('Email TO', size=84), 'email_from' : fields.char('Email From', size=84), 'log_id': fields.many2one('crm.case.log','Log',ondelete='cascade'), + 'message_id': fields.char('Message Id', size=1024, readonly=True, help="Message Id on Email Server.", select=True), } crm_case_history() diff --git a/addons/crm/crm_mailgate.py b/addons/crm/crm_mailgate.py index aef624d1bf5..5b8eaf2c5e8 100644 --- a/addons/crm/crm_mailgate.py +++ b/addons/crm/crm_mailgate.py @@ -38,81 +38,84 @@ class crm_cases(osv.osv): _name = "crm.case" _inherit = "crm.case" - def msg_new(self, cr, uid, msg): - - """ @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks + def message_new(self, cr, uid, msg, context): + """ + Automatically calls when new email message arrives + + @param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks """ - mailgate_obj = self.pool.get('mail.gateway') - msg_body = mailgate_obj.msg_body_get(msg) - msg_subject = mailgate_obj._decode_header(msg['Subject']) - msg_from = mailgate_obj._decode_header(msg['From']) - msg_cc = mailgate_obj._decode_header(msg['Cc']) - body = self.format_body(msg_body['body']) - data = { - 'name': msg_subject, + mailgate_pool = self.pool.get('email.server.tools') + + subject = msg.get('subject') + body = msg.get('body') + msg_from = msg.get('from') + priority = msg.get('priority') + + vals = { + 'name': subject, 'email_from': msg_from, - 'email_cc': msg_cc, + 'email_cc': msg.get('cc'), + 'description': body, 'user_id': False, - 'description': body, } - res = mailgate_obj.partner_get(cr, uid, msg_from) + if msg.get('priority', False): + vals['priority'] = priority + + res = mailgate_pool.get_partner(cr, uid, msg.get('from')) if res: - data.update(res) - res = self.create(cr, uid, data) - cases = self.browse(cr, uid, [res]) - self._history(cr, uid, cases, _('Receive'), history=True, details=body, email_from=msg_from) + vals.update(res) + res = self.create(cr, uid, vals, context) + cases = self.browse(cr, uid, [res]) + self._history(cr, uid, cases, _('Receive'), history=True, details=body, email_from=msg_from, message_id=msg.get('id')) return res - def msg_update(self, cr, uid, ids, msg, data={}, default_act='pending'): - - """ @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of update mail’s IDs """ - + def message_update(self, cr, uid, ids, msg, default_act='pending', context={}): + """ + @param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of update mail’s IDs + """ + + vals = { } if isinstance(ids, (str, int, long)): - select = [ids] - else: - select = ids - mailgate_obj = self.pool.get('mail.gateway') - msg_actions, body_data = mailgate_obj.msg_act_get(msg) - data.update({ - 'description': body_data, + ids = [ids] + + msg_from = msg['from'] + vals.update({ + 'description': msg['body'] }) - act = 'case_'+default_act - if 'state' in msg_actions: - if msg_actions['state'] in ['draft','close','cancel','open','pending']: - act = 'case_' + msg_actions['state'] + if msg.get('priority', False): + vals['priority'] = msg.get('priority') - for k1,k2 in [('cost','planned_cost'),('revenue','planned_revenue'),('probability','probability')]: - if k1 in msg_actions: - data[k2] = float(msg_actions[k1]) +# act = 'case_'+default_act +# if 'state' in msg_actions: +# if msg_actions['state'] in ['draft','close','cancel','open','pending']: +# act = 'case_' + msg_actions['state'] - if 'priority' in msg_actions: - if msg_actions['priority'] in ('1','2','3','4','5'): - data['priority'] = msg_actions['priority'] +# for k1,k2 in [('cost','planned_cost'),('revenue','planned_revenue'),('probability','probability')]: +# if k1 in msg_actions: +# data[k2] = float(msg_actions[k1]) - if 'partner' in msg_actions: - data['email_from'] = msg_actions['partner'][:128] - msg_from = self._decode_header(msg['From']) - res = self.write(cr, uid, select, data) - cases = self.browse(cr, uid, select) - self._history(cr, uid, cases, _('Receive'), history=True, details=body_data, email_from=msg['From']) - getattr(self,act)(cr, uid, select) + res = self.write(cr, uid, ids, vals) + cases = self.browse(cr, uid, ids) + message_id = context.get('message_id', False) + self._history(cr, uid, cases, _('Receive'), history=True, details=msg['body'], email_from=msg_from, message_id=message_id) + #getattr(self, act)(cr, uid, select) return res def emails_get(self, cr, uid, ids, context={}): - """ Get Emails - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param ids: List of email’s IDs - @param context: A standard dictionary for contextual values - + """ + Get Emails + @param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of email’s IDs + @param context: A standard dictionary for contextual values """ res = [] if isinstance(ids, (str, int, long)): diff --git a/addons/crm/wizard/crm_send_email.py b/addons/crm/wizard/crm_send_email.py index 93897246bf7..ac8e321c8c1 100644 --- a/addons/crm/wizard/crm_send_email.py +++ b/addons/crm/wizard/crm_send_email.py @@ -71,10 +71,14 @@ class crm_send_new_email(osv.osv_memory): attach = filter(lambda x: x, [data['doc1'], data['doc2'], data['doc3']]) attach = map(lambda x: x and ('Attachment'+str(attach.index(x)+1), base64.decodestring(x)), attach) + message_id = None + if context.get('mail', 'new') == 'new': case = case_pool.browse(cr, uid, res_id) + message_id = case.history_line[0].message_id else: hist = hist_obj.browse(cr, uid, res_id) + message_id = hist.message_id model = hist.log_id.model_id.model model_pool = self.pool.get(model) case = model_pool.browse(cr, uid, hist.log_id.res_id) @@ -84,7 +88,11 @@ class crm_send_new_email(osv.osv_memory): body = case_pool.format_body(body) email_from = data.get('email_from', False) - case_pool._history(cr, uid, [case], _('Send'), history=True, email=data['email_to'], details=body, email_from=email_from) + case_pool._history(cr, uid, [case], _('Send'), history=True, email=data['email_to'], details=body, email_from=email_from, message_id=message_id) + + x_headers = { + 'References':"%s" % (message_id) + } flag = tools.email_send( email_from, @@ -94,6 +102,7 @@ class crm_send_new_email(osv.osv_memory): attach=attach, reply_to=case.section_id.reply_to, openobject_id=str(case.id), + x_headers=x_headers ) if flag: if data['state'] == 'unchanged': @@ -111,7 +120,7 @@ class crm_send_new_email(osv.osv_memory): # raise osv.except_osv(_('Email!'), ("Email Successfully Sent")) # else: # raise osv.except_osv(_('Warning!'), _("Email not sent !")) - + return {} def default_get(self, cr, uid, fields, context=None):