[ADD]CRM:use proper sentence case
[odoo/odoo.git] / addons / crm / crm_lead.py
index 5f843f4..216a898 100644 (file)
@@ -42,6 +42,24 @@ class crm_lead(crm_case, osv.osv):
     _order = "priority,date_action,id desc"
     _inherit = ['mail.thread','res.partner.address']
 
+    def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None):
+        access_rights_uid = access_rights_uid or uid
+        stage_obj = self.pool.get('crm.case.stage')
+        order = stage_obj._order
+        if read_group_order == 'stage_id desc':
+            # lame hack to allow reverting search, should just work in the trivial case
+            order = "%s desc" % order
+        stage_ids = stage_obj._search(cr, uid, ['|', ('id','in',ids),('case_default','=',1)], order=order,
+                                      access_rights_uid=access_rights_uid, context=context)
+        result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context)
+        # restore order of the search
+        result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
+        return result
+
+    _group_by_full = {
+        'stage_id': _read_group_stage_ids
+    }
+
     # overridden because res.partner.address has an inconvenient name_get,
     # especially if base_contact is installed.
     def name_get(self, cr, user, ids, context=None):
@@ -188,6 +206,7 @@ class crm_lead(crm_case, osv.osv):
         'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('section_ids', '=', section_id)]"),
         'color': fields.integer('Color Index'),
         'partner_address_name': fields.related('partner_address_id', 'name', type='char', string='Partner Contact Name', readonly=True),
+        'partner_address_email': fields.related('partner_address_id', 'email', type='char', string='Partner Contact Email', readonly=True),
         'company_currency': fields.related('company_id', 'currency_id', 'symbol', type='char', string='Company Currency', readonly=True),
         'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True),
         'user_login': fields.related('user_id', 'login', type='char', string='User Login', readonly=True),
@@ -204,7 +223,6 @@ class crm_lead(crm_case, osv.osv):
         'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
         'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
         'color': 0,
-        #'stage_id': _get_stage_id,
     }
 
     def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
@@ -351,7 +369,7 @@ class crm_lead(crm_case, osv.osv):
             return res and res.id or False
     
         def _concat_all(attr):
-            return ', '.join([getattr(opportunity, attr) or '' for opportunity in opportunities if hasattr(opportunity, attr)])
+            return ', '.join(filter(lambda x: x, [getattr(opportunity, attr) or '' for opportunity in opportunities if hasattr(opportunity, attr)]))
 
         data = {}
         for field_name in fields:
@@ -404,7 +422,7 @@ class crm_lead(crm_case, osv.osv):
             else:
                 value = lead[field_name]
 
-            body.append("%s: %s\n" % (field.string, value or ''))
+            body.append("%s: %s" % (field.string, value or ''))
         return "\n".join(body + ['---'])
 
     def _merge_notification(self, cr, uid, opportunity_id, opportunities, context=None):
@@ -508,7 +526,9 @@ class crm_lead(crm_case, osv.osv):
 
     def _convert_opportunity_data(self, cr, uid, lead, customer, section_id=False, context=None):
         crm_stage = self.pool.get('crm.case.stage')
-        contact_id = self.pool.get('res.partner').address_get(cr, uid, [customer.id])['default']
+        contact_id = False
+        if customer:
+            contact_id = self.pool.get('res.partner').address_get(cr, uid, [customer.id])['default']
         if not section_id:
             section_id = lead.section_id and lead.section_id.id or False
         if section_id:
@@ -520,7 +540,7 @@ class crm_lead(crm_case, osv.osv):
                 'planned_revenue': lead.planned_revenue,
                 'probability': lead.probability,
                 'name': lead.name,
-                'partner_id': customer.id,
+                'partner_id': customer and customer.id or False,
                 'user_id': (lead.user_id and lead.user_id.id),
                 'type': 'opportunity',
                 'stage_id': stage_id or False,
@@ -537,9 +557,9 @@ class crm_lead(crm_case, osv.osv):
     def convert_opportunity(self, cr, uid, ids, partner_id, user_ids=False, section_id=False, context=None):
         partner = self.pool.get('res.partner')
         mail_message = self.pool.get('mail.message')
-        
-        customer = partner.browse(cr, uid, partner_id, context=context)
-        
+        customer = False
+        if partner_id:
+            customer = partner.browse(cr, uid, partner_id, context=context)
         for lead in self.browse(cr, uid, ids, context=context):
             if lead.state in ('done', 'cancel'):
                 continue
@@ -564,6 +584,7 @@ class crm_lead(crm_case, osv.osv):
                     'name': lead.partner_name or lead.contact_name or lead.name,
                     'user_id': lead.user_id.id,
                     'comment': lead.description,
+                    'section_id': lead.section_id.id or False,
                     'address': []
         })
         return partner_id
@@ -572,6 +593,7 @@ class crm_lead(crm_case, osv.osv):
         res = False
         res_partner = self.pool.get('res.partner')
         if partner_id:
+            res_partner.write(cr, uid, partner_id, {'section_id': lead.section_id.id or False})
             contact_id = res_partner.address_get(cr, uid, [partner_id])['default']
             res = lead.write({'partner_id' : partner_id, 'partner_address_id': contact_id}, context=context)
             
@@ -584,7 +606,7 @@ class crm_lead(crm_case, osv.osv):
                     'name': lead.contact_name,
                     'phone': lead.phone,
                     'mobile': lead.mobile,
-                    'email': to_email(lead.email_from)[0],
+                    'email': lead.email_from and to_email(lead.email_from)[0],
                     'fax': lead.fax,
                     'title': lead.title and lead.title.id or False,
                     'function': lead.function,
@@ -606,7 +628,6 @@ class crm_lead(crm_case, osv.osv):
             context = {}
         partner_ids = {}
         for lead in self.browse(cr, uid, ids, context=context):
-            partner_id = lead.partner_id and lead.partner_id.id or False
             if action == 'create': 
                 if not partner_id:
                     partner_id = self._lead_create_partner(cr, uid, lead, context=context)
@@ -646,7 +667,7 @@ class crm_lead(crm_case, osv.osv):
                 self.write(cr, uid, [lead_id], value, context=context)
         return True
 
-    def schedule_phonecall(self, cr, uid, ids, schedule_time, call_summary, user_id=False, section_id=False, categ_id=False, action='schedule', context=None):
+    def schedule_phonecall(self, cr, uid, ids, schedule_time, call_summary, desc, phone, contact_name, user_id=False, section_id=False, categ_id=False, action='schedule', context=None):
         """
         action :('schedule','Schedule a call'), ('log','Log a call')
         """
@@ -667,12 +688,12 @@ class crm_lead(crm_case, osv.osv):
                     'opportunity_id' : lead.id,
                     'user_id' : user_id or False,
                     'categ_id' : categ_id or False,
-                    'description' : lead.description or False,
+                    'description' : desc or '',
                     'date' : schedule_time,
                     'section_id' : section_id or False,
                     'partner_id': lead.partner_id and lead.partner_id.id or False,
                     'partner_address_id': lead.partner_address_id and lead.partner_address_id.id or False,
-                    'partner_phone' : lead.phone or (lead.partner_address_id and lead.partner_address_id.phone or False),
+                    'partner_phone' : phone or lead.phone or (lead.partner_address_id and lead.partner_address_id.phone or False),
                     'partner_mobile' : lead.partner_address_id and lead.partner_address_id.mobile or False,
                     'priority': lead.priority,
             }
@@ -689,17 +710,8 @@ class crm_lead(crm_case, osv.osv):
         models_data = self.pool.get('ir.model.data')
 
         # Get Opportunity views
-        opportunity_view_form = models_data._get_id(
-            cr, uid, 'crm', 'crm_case_form_view_oppor')
-        opportunity_view_tree = models_data._get_id(
-            cr, uid, 'crm', 'crm_case_tree_view_oppor')
-        if opportunity_view_form:
-            opportunity_view_form = models_data.browse(
-                cr, uid, opportunity_view_form, context=context).res_id
-        if opportunity_view_tree:
-            opportunity_view_tree = models_data.browse(
-                cr, uid, opportunity_view_tree, context=context).res_id
-
+        form_view = models_data.get_object_reference(cr, uid, 'crm', 'crm_case_form_view_oppor')
+        tree_view = models_data.get_object_reference(cr, uid, 'crm', 'crm_case_tree_view_oppor')
         return {
                 'name': _('Opportunity'),
                 'view_type': 'form',
@@ -708,8 +720,8 @@ class crm_lead(crm_case, osv.osv):
                 'domain': [('type', '=', 'opportunity')],
                 'res_id': int(opportunity_id),
                 'view_id': False,
-                'views': [(opportunity_view_form, 'form'),
-                          (opportunity_view_tree, 'tree'),
+                'views': [(form_view and form_view[1] or False, 'form'),
+                          (tree_view and tree_view[1] or False, 'tree'),
                           (False, 'calendar'), (False, 'graph')],
                 'type': 'ir.actions.act_window',
         }
@@ -736,10 +748,11 @@ class crm_lead(crm_case, osv.osv):
         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):
+    def message_update(self, cr, uid, ids, msg, vals=None, default_act='pending', context=None):
         if isinstance(ids, (str, int, long)):
             ids = [ids]
-
+        if vals == None:
+            vals = {}
         super(crm_lead, self).message_update(cr, uid, ids, msg, context=context)
 
         if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES):
@@ -773,24 +786,17 @@ class crm_lead(crm_case, osv.osv):
         This opens Meeting's calendar view to schedule meeting on current Opportunity
         @return : Dictionary value for created Meeting view
         """
+        if context is None:
+            context = {}
         value = {}
+        data_obj = self.pool.get('ir.model.data')
         for opp in self.browse(cr, uid, ids, context=context):
-            data_obj = self.pool.get('ir.model.data')
-
             # Get meeting views
-            result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
-            res = data_obj.read(cr, uid, result, ['res_id'])
-            id1 = data_obj._get_id(cr, uid, 'crm', 'crm_case_calendar_view_meet')
-            id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_meet')
-            id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_meet')
-            if id1:
-                id1 = data_obj.browse(cr, uid, id1, context=context).res_id
-            if id2:
-                id2 = data_obj.browse(cr, uid, id2, context=context).res_id
-            if id3:
-                id3 = data_obj.browse(cr, uid, id3, context=context).res_id
-
-            context = {
+            tree_view = data_obj.get_object_reference(cr, uid, 'crm', 'crm_case_tree_view_meet')
+            form_view = data_obj.get_object_reference(cr, uid, 'crm', 'crm_case_form_view_meet')
+            calander_view = data_obj.get_object_reference(cr, uid, 'crm', 'crm_case_calendar_view_meet')
+            search_view = data_obj.get_object_reference(cr, uid, 'crm', 'view_crm_case_meetings_filter')
+            context.update({
                 'default_opportunity_id': opp.id,
                 'default_partner_id': opp.partner_id and opp.partner_id.id or False,
                 'default_user_id': uid, 
@@ -798,7 +804,7 @@ class crm_lead(crm_case, osv.osv):
                 'default_email_from': opp.email_from,
                 'default_state': 'open',  
                 'default_name': opp.name
-            }
+            })
             value = {
                 'name': _('Meetings'),
                 'context': context,
@@ -806,9 +812,9 @@ class crm_lead(crm_case, osv.osv):
                 'view_mode': 'calendar,form,tree',
                 'res_model': 'crm.meeting',
                 'view_id': False,
-                'views': [(id1, 'calendar'), (id2, 'form'), (id3, 'tree')],
+                'views': [(calander_view and calander_view[1] or False, 'calendar'), (form_view and form_view[1] or False, 'form'), (tree_view and tree_view[1] or False, 'tree')],
                 'type': 'ir.actions.act_window',
-                'search_view_id': res['res_id'],
+                'search_view_id': search_view and search_view[1] or False,
                 'nodestroy': True
             }
         return value