[FIX] Thread widget: cleaned function calls (using this.proxy) to avoid asynchronous...
[odoo/odoo.git] / addons / crm_helpdesk / crm_helpdesk.py
index c983acf..7717ae2 100644 (file)
@@ -23,23 +23,24 @@ from crm import crm
 from osv import fields, osv
 import time
 from crm import wizard
-import binascii
 import tools
+from tools.translate import _
 
-wizard.email_compose_message.email_model.append('crm.helpdesk')
 CRM_HELPDESK_STATES = (
     crm.AVAILABLE_STATES[2][0], # Cancelled
     crm.AVAILABLE_STATES[3][0], # Done
     crm.AVAILABLE_STATES[4][0], # Pending
 )
 
+wizard.mail_compose_message.SUPPORTED_MODELS.append('crm.helpdesk')
+
 class crm_helpdesk(crm.crm_case, osv.osv):
     """ Helpdesk Cases """
 
     _name = "crm.helpdesk"
     _description = "Helpdesk"
     _order = "id desc"
-    _inherit = ['email.thread']
+    _inherit = ['mail.thread']
     _columns = {
             'id': fields.integer('ID', readonly=True),
             'name': fields.char('Name', size=128, required=True),
@@ -57,37 +58,32 @@ class crm_helpdesk(crm.crm_case, osv.osv):
             'company_id': fields.many2one('res.company', 'Company'),
             'date_closed': fields.datetime('Closed', readonly=True),
             'partner_id': fields.many2one('res.partner', 'Partner'),
-            'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
-                                 domain="[('partner_id','=',partner_id)]"),
             'email_cc': fields.text('Watchers Emails', size=252 , help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
             'email_from': fields.char('Email', size=128, help="These people will receive email."),
             'date': fields.datetime('Date'),
             'ref' : fields.reference('Reference', selection=crm._links_get, size=128),
             'ref2' : fields.reference('Reference 2', selection=crm._links_get, size=128),
-            'canal_id': fields.many2one('res.partner.canal', 'Channel', \
-                            help="The channels represent the different communication \
- modes available with the customer."),
+            'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel."),
             'planned_revenue': fields.float('Planned Revenue'),
             'planned_cost': fields.float('Planned Costs'),
             'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
             'probability': fields.float('Probability (%)'),
             'categ_id': fields.many2one('crm.case.categ', 'Category', \
-                            domain="[('section_id','=',section_id),\
-                            ('object_id.model', '=', 'crm.helpdesk')]"),
-            'duration': fields.float('Duration', states={'done': [('readonly', True)]}),
-            'state': fields.selection(crm.AVAILABLE_STATES, 'State', size=16, readonly=True,
+                            domain="['|',('section_id','=',False),('section_id','=',section_id),\
+                            ('object_id.model', '=', 'crm.helpdesk')]"), 
+            'duration': fields.float('Duration', states={'done': [('readonly', True)]}), 
+            'state': fields.selection(crm.AVAILABLE_STATES, 'State', size=16, readonly=True, 
                                   help='The state is set to \'Draft\', when a case is created.\
                                   \nIf the case is in progress the state is set to \'Open\'.\
                                   \nWhen the case is over, the state is set to \'Done\'.\
                                   \nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
-            'message_ids': fields.one2many('email.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
+            'message_ids': fields.one2many('mail.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
     }
 
     _defaults = {
         'active': lambda *a: 1,
         'user_id': crm.crm_case._get_default_user,
         'partner_id': crm.crm_case._get_default_partner,
-        'partner_address_id': crm.crm_case._get_default_partner_address,
         'email_from': crm.crm_case. _get_default_email,
         'state': lambda *a: 'draft',
         'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
@@ -96,63 +92,29 @@ class crm_helpdesk(crm.crm_case, osv.osv):
         'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
     }
 
-    def message_new(self, cr, uid, msg, context=None):
-        """
-        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
-        @param msg: dictionary object to contain email message data
-        """
-        thread_pool = self.pool.get('email.thread')
-
-        subject = msg.get('subject')
-        body = msg.get('body')
-        msg_from = msg.get('from')
-        priority = msg.get('priority')
-
+    def message_new(self, cr, uid, msg_dict, custom_values=None, context=None):
+        """Automatically called when new email message arrives"""
+        res_id = super(crm_helpdesk,self).message_new(cr, uid, msg_dict, custom_values=custom_values, context=context)
+        subject = msg_dict.get('subject')  or _("No Subject")
+        body = msg_dict.get('body_text')
+        msg_from = msg_dict.get('from')
         vals = {
             'name': subject,
             'email_from': msg_from,
-            'email_cc': msg.get('cc'),
+            'email_cc': msg_dict.get('cc'),
             'description': body,
             'user_id': False,
         }
-        if msg.get('priority', False):
-            vals['priority'] = priority
-
-        res = thread_pool.get_partner(cr, uid, msg.get('from', False))
-        if res:
-            vals.update(res)
-
-        res_id = self.create(cr, uid, vals, context)
-
-        attachments = msg.get('attachments', {})
-        self.history(cr, uid, [res_id], _('receive'), history=True,
-                            subject = msg.get('subject'),
-                            email = msg.get('to'),
-                            details = msg.get('body'),
-                            email_from = msg.get('from'),
-                            email_cc = msg.get('cc'),
-                            message_id = msg.get('message-id'),
-                            references = msg.get('references', False) or msg.get('in-reply-to', False),
-                            attach = attachments,
-                            email_date = msg.get('date'),
-                            context = context)
-
+        vals.update(self.message_partner_by_email(cr, uid, msg_from))
+        self.write(cr, uid, [res_id], vals, context)
         return res_id
 
     def message_update(self, cr, uid, ids, msg, vals={}, default_act='pending', context=None):
-        """
-        @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
-        """
         if isinstance(ids, (str, int, long)):
             ids = [ids]
 
+        super(crm_helpdesk,self).message_update(cr, uid, ids, msg, context=context)
+
         if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES):
             vals['priority'] = msg.get('priority')
 
@@ -162,7 +124,7 @@ class crm_helpdesk(crm.crm_case, osv.osv):
             'probability':'probability'
         }
         vls = {}
-        for line in msg['body'].split('\n'):
+        for line in msg['body_text'].split('\n'):
             line = line.strip()
             res = tools.misc.command_re.match(line)
             if res and maps.get(res.group(1).lower()):
@@ -180,7 +142,5 @@ class crm_helpdesk(crm.crm_case, osv.osv):
             res = self.write(cr, uid, [case.id], values, context=context)
         return res
 
-crm_helpdesk()
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: