[FIX] Thread widget: cleaned function calls (using this.proxy) to avoid asynchronous...
[odoo/odoo.git] / addons / crm_helpdesk / crm_helpdesk.py
index 6a51303..7717ae2 100644 (file)
 from crm import crm
 from osv import fields, osv
 import time
+from crm import wizard
+import tools
+from tools.translate import _
+
+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 """
@@ -29,7 +40,7 @@ class crm_helpdesk(crm.crm_case, osv.osv):
     _name = "crm.helpdesk"
     _description = "Helpdesk"
     _order = "id desc"
-    _inherit = ['mailgate.thread']
+    _inherit = ['mail.thread']
     _columns = {
             'id': fields.integer('ID', readonly=True),
             'name': fields.char('Name', size=128, required=True),
@@ -47,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'),
@@ -86,7 +92,55 @@ class crm_helpdesk(crm.crm_case, osv.osv):
         'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
     }
 
-crm_helpdesk()
+    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_dict.get('cc'),
+            'description': body,
+            'user_id': False,
+        }
+        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):
+        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')
+
+        maps = {
+            'cost':'planned_cost',
+            'revenue': 'planned_revenue',
+            'probability':'probability'
+        }
+        vls = {}
+        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()):
+                key = maps.get(res.group(1).lower())
+                vls[key] = res.group(2).lower()
+        vals.update(vls)
+
+        # Unfortunately the API is based on lists
+        # but we want to update the state based on the
+        # previous state, so we have to loop:
+        for case in self.browse(cr, uid, ids, context=context):
+            values = dict(vals)
+            if case.state in CRM_HELPDESK_STATES:
+                values.update(state=crm.AVAILABLE_STATES[1][0]) #re-open
+            res = self.write(cr, uid, [case.id], values, context=context)
+        return res
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: