[FIX] Thread widget: cleaned function calls (using this.proxy) to avoid asynchronous...
[odoo/odoo.git] / addons / crm_helpdesk / crm_helpdesk.py
index 2894a42..7717ae2 100644 (file)
 from crm import crm
 from osv import fields, osv
 import time
+from crm import wizard
+import tools
+from tools.translate import _
 
-class crm_helpdesk(osv.osv, crm.crm_case):
+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 Cases"
+    _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), 
-            'active': fields.boolean('Active', required=False), 
-            'date_action_last': fields.datetime('Last Action', readonly=1), 
-            'date_action_next': fields.datetime('Next Action', readonly=1), 
-            'description': fields.text('Description'), 
-            'create_date': fields.datetime('Creation Date' , readonly=True), 
-            'write_date': fields.datetime('Update Date' , readonly=True), 
-            'date_deadline': fields.date('Deadline'), 
-            'user_id': fields.many2one('res.users', 'Responsible'), 
+            'id': fields.integer('ID', readonly=True),
+            'name': fields.char('Name', size=128, required=True),
+            'active': fields.boolean('Active', required=False),
+            'date_action_last': fields.datetime('Last Action', readonly=1),
+            'date_action_next': fields.datetime('Next Action', readonly=1),
+            'description': fields.text('Description'),
+            'create_date': fields.datetime('Creation Date' , readonly=True),
+            'write_date': fields.datetime('Update Date' , readonly=True),
+            'date_deadline': fields.date('Deadline'),
+            'user_id': fields.many2one('res.users', 'Responsible'),
             'section_id': fields.many2one('crm.case.section', 'Sales Team', \
                             select=True, help='Sales team to which Case belongs to.\
-                                 Define Responsible user and Email account for mail gateway.'), 
-            '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."), 
-            'planned_revenue': fields.float('Planned Revenue'), 
-            'planned_cost': fields.float('Planned Costs'), 
-            'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), 
-            'probability': fields.float('Probability (%)'), 
-            'som': fields.many2one('res.partner.som', 'State of Mind', \
-                            help="The minds states allow to define a value scale which represents" \
-                                "the partner mentality in relation to our services.The scale has" \
-                                "to be created with a factor for each level from 0" \
-                                "(Very dissatisfied) to 10 (Extremely satisfied)."), 
+                                 Define Responsible user and Email account for mail gateway.'),
+            'company_id': fields.many2one('res.company', 'Company'),
+            'date_closed': fields.datetime('Closed', readonly=True),
+            'partner_id': fields.many2one('res.partner', 'Partner'),
+            '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),
+            '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),\
+                            domain="['|',('section_id','=',False),('section_id','=',section_id),\
                             ('object_id.model', '=', 'crm.helpdesk')]"), 
-            'duration': fields.float('Duration'), 
+            '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('mailgate.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', 
+        'active': lambda *a: 1,
+        'user_id': crm.crm_case._get_default_user,
+        'partner_id': crm.crm_case._get_default_partner,
+        'email_from': crm.crm_case. _get_default_email,
+        'state': lambda *a: 'draft',
         'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
-        'section_id': crm.crm_case. _get_section, 
-        'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c), 
-        'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0], 
+        'section_id': crm.crm_case. _get_section,
+        'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
+        '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: