2009-12-30 10:20:44 +00:00
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
2010-01-12 09:18:39 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
2009-12-30 10:20:44 +00:00
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
2010-07-28 17:20:37 +00:00
from osv import fields , osv
from datetime import datetime
2010-01-13 13:34:09 +00:00
import crm
2010-04-05 09:50:29 +00:00
import time
2010-03-23 14:12:01 +00:00
from tools . translate import _
2010-05-05 11:55:13 +00:00
from crm import crm_case
2010-06-24 19:53:32 +00:00
import binascii
import tools
2010-01-11 12:57:42 +00:00
2010-07-08 14:03:52 +00:00
CRM_LEAD_PENDING_STATES = (
crm . AVAILABLE_STATES [ 2 ] [ 0 ] , # Cancelled
crm . AVAILABLE_STATES [ 3 ] [ 0 ] , # Done
crm . AVAILABLE_STATES [ 4 ] [ 0 ] , # Pending
)
2010-08-17 12:54:00 +00:00
class crm_lead ( crm_case , osv . osv ) :
2010-03-23 14:12:01 +00:00
""" CRM Lead Case """
2009-12-30 10:20:44 +00:00
_name = " crm.lead "
2010-12-20 11:38:20 +00:00
_description = " Lead/Opportunity "
2011-08-25 04:10:37 +00:00
_order = " priority,date_action,id desc "
2010-06-23 20:29:29 +00:00
_inherit = [ ' mailgate.thread ' , ' res.partner.address ' ]
2011-08-25 04:10:37 +00:00
2010-11-19 13:48:01 +00:00
def _compute_day ( self , cr , uid , ids , fields , args , context = None ) :
2010-03-22 10:40:26 +00:00
"""
@param cr : the current row , from the database cursor ,
@param uid : the current user ’ s ID for security checks ,
@param ids : List of Openday ’ s IDs
@return : difference between current date and log date
@param context : A standard dictionary for contextual values
2010-04-22 06:40:17 +00:00
"""
cal_obj = self . pool . get ( ' resource.calendar ' )
res_obj = self . pool . get ( ' resource.resource ' )
2010-04-05 06:12:50 +00:00
res = { }
2010-11-19 13:48:01 +00:00
for lead in self . browse ( cr , uid , ids , context = context ) :
2010-04-05 06:12:50 +00:00
for field in fields :
res [ lead . id ] = { }
duration = 0
2010-04-07 11:08:20 +00:00
ans = False
2010-04-05 06:12:50 +00:00
if field == ' day_open ' :
if lead . date_open :
date_create = datetime . strptime ( lead . create_date , " % Y- % m- %d % H: % M: % S " )
date_open = datetime . strptime ( lead . date_open , " % Y- % m- %d % H: % M: % S " )
ans = date_open - date_create
2010-04-07 11:08:20 +00:00
date_until = lead . date_open
2010-04-05 06:12:50 +00:00
elif field == ' day_close ' :
if lead . date_closed :
date_create = datetime . strptime ( lead . create_date , " % Y- % m- %d % H: % M: % S " )
date_close = datetime . strptime ( lead . date_closed , " % Y- % m- %d % H: % M: % S " )
2010-04-07 11:08:20 +00:00
date_until = lead . date_closed
2010-04-05 06:12:50 +00:00
ans = date_close - date_create
2010-04-07 11:08:20 +00:00
if ans :
resource_id = False
if lead . user_id :
resource_ids = res_obj . search ( cr , uid , [ ( ' user_id ' , ' = ' , lead . user_id . id ) ] )
2010-04-09 14:33:13 +00:00
if len ( resource_ids ) :
resource_id = resource_ids [ 0 ]
2010-04-07 11:08:20 +00:00
duration = float ( ans . days )
2010-04-20 05:57:54 +00:00
if lead . section_id and lead . section_id . resource_calendar_id :
2010-05-14 11:33:09 +00:00
duration = float ( ans . days ) * 24
2010-04-07 11:08:20 +00:00
new_dates = cal_obj . interval_get ( cr ,
uid ,
lead . section_id . resource_calendar_id and lead . section_id . resource_calendar_id . id or False ,
2010-09-29 08:05:01 +00:00
datetime . strptime ( lead . create_date , ' % Y- % m- %d % H: % M: % S ' ) ,
2010-04-07 11:08:20 +00:00
duration ,
resource = resource_id
)
no_days = [ ]
2010-09-29 08:05:01 +00:00
date_until = datetime . strptime ( date_until , ' % Y- % m- %d % H: % M: % S ' )
2010-04-07 11:08:20 +00:00
for in_time , out_time in new_dates :
if in_time . date not in no_days :
2010-04-22 06:40:17 +00:00
no_days . append ( in_time . date )
2010-04-07 11:08:20 +00:00
if out_time > date_until :
2010-04-22 06:40:17 +00:00
break
2010-04-07 11:08:20 +00:00
duration = len ( no_days )
2010-04-05 06:12:50 +00:00
res [ lead . id ] [ field ] = abs ( int ( duration ) )
return res
2010-03-10 06:25:59 +00:00
2011-03-24 14:34:28 +00:00
def _history_search ( self , cr , uid , obj , name , args , context = None ) :
res = [ ]
msg_obj = self . pool . get ( ' mailgate.message ' )
message_ids = msg_obj . search ( cr , uid , [ ( ' history ' , ' = ' , True ) , ( ' name ' , args [ 0 ] [ 1 ] , args [ 0 ] [ 2 ] ) ] , context = context )
lead_ids = self . search ( cr , uid , [ ( ' message_ids ' , ' in ' , message_ids ) ] , context = context )
if lead_ids :
return [ ( ' id ' , ' in ' , lead_ids ) ]
else :
return [ ( ' id ' , ' = ' , ' 0 ' ) ]
2011-03-23 16:22:06 +00:00
def _get_email_subject ( self , cr , uid , ids , fields , args , context = None ) :
res = { }
for obj in self . browse ( cr , uid , ids , context = context ) :
res [ obj . id ] = ' '
for msg in obj . message_ids :
if msg . history :
res [ obj . id ] = msg . name
2011-03-24 14:34:28 +00:00
break
2011-03-23 16:22:06 +00:00
return res
2010-03-10 06:25:59 +00:00
2010-01-11 12:57:42 +00:00
_columns = {
2010-07-08 14:03:52 +00:00
# Overridden from res.partner.address:
2011-02-24 15:03:09 +00:00
' partner_id ' : fields . many2one ( ' res.partner ' , ' Partner ' , ondelete = ' set null ' ,
2010-07-08 14:03:52 +00:00
select = True , help = " Optional linked partner, usually after conversion of the lead " ) ,
2010-10-08 14:40:49 +00:00
2010-08-06 13:26:50 +00:00
' id ' : fields . integer ( ' ID ' ) ,
2011-08-18 19:30:44 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , select = 1 ) ,
2010-06-25 17:41:41 +00:00
' active ' : fields . boolean ( ' Active ' , required = False ) ,
2010-05-19 13:42:43 +00:00
' date_action_last ' : fields . datetime ( ' Last Action ' , readonly = 1 ) ,
' date_action_next ' : fields . datetime ( ' Next Action ' , readonly = 1 ) ,
2011-08-18 19:30:44 +00:00
' email_from ' : fields . char ( ' Email ' , size = 128 , help = " E-mail address of the contact " , select = 1 ) ,
2010-05-03 12:30:48 +00:00
' section_id ' : fields . many2one ( ' crm.case.section ' , ' Sales Team ' , \
2011-08-25 00:19:47 +00:00
select = True , help = ' When sending mails, the default email address is taken from the sales team. ' ) ,
2010-05-03 12:30:48 +00:00
' create_date ' : fields . datetime ( ' Creation Date ' , readonly = True ) ,
2010-09-21 16:39:51 +00:00
' email_cc ' : fields . text ( ' Global CC ' , 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 " ) ,
2010-05-20 17:34:35 +00:00
' description ' : fields . text ( ' Notes ' ) ,
2010-06-25 17:41:41 +00:00
' write_date ' : fields . datetime ( ' Update Date ' , readonly = True ) ,
2010-05-05 11:55:13 +00:00
2010-09-09 16:04:47 +00:00
' categ_id ' : fields . many2one ( ' crm.case.categ ' , ' Category ' , \
2010-11-10 07:35:40 +00:00
domain = " [ ' | ' ,( ' section_id ' , ' = ' ,section_id),( ' section_id ' , ' = ' ,False), ( ' object_id.model ' , ' = ' , ' crm.lead ' )] " ) ,
2010-09-21 16:39:51 +00:00
' type_id ' : fields . many2one ( ' crm.case.resource.type ' , ' Campaign ' , \
2011-07-19 09:06:02 +00:00
domain = " [ ' | ' ,( ' section_id ' , ' = ' ,section_id),( ' section_id ' , ' = ' ,False)] " , help = " From which campaign (seminar, marketing campaign, mass mailing, ...) did this contact come from? " ) ,
' channel_id ' : fields . many2one ( ' res.partner.canal ' , ' Channel ' , help = " From which channel (mail, direct, phone, ...) did this contact reach you? " ) ,
2011-02-24 15:03:09 +00:00
' contact_name ' : fields . char ( ' Contact Name ' , size = 64 ) ,
2011-08-18 19:30:44 +00:00
' partner_name ' : fields . char ( " Customer Name " , size = 64 , help = ' The name of the future partner that will be created while converting the into opportunity ' , select = 1 ) ,
2010-09-29 11:47:07 +00:00
' optin ' : fields . boolean ( ' Opt-In ' , help = " If opt-in is checked, this contact has accepted to receive emails. " ) ,
' optout ' : fields . boolean ( ' Opt-Out ' , help = " If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign. " ) ,
2011-08-25 04:10:37 +00:00
' type ' : fields . selection ( [ ( ' lead ' , ' Lead ' ) , ( ' opportunity ' , ' Opportunity ' ) , ] , ' Type ' , help = " Type is used to separate Leads and Opportunities " ) ,
2010-04-05 06:12:50 +00:00
' priority ' : fields . selection ( crm . AVAILABLE_PRIORITIES , ' Priority ' ) ,
' date_closed ' : fields . datetime ( ' Closed ' , readonly = True ) ,
2011-08-16 13:33:53 +00:00
' stage_id ' : fields . many2one ( ' crm.case.stage ' , ' Stage ' , domain = " [(section_ids ' , ' = ' , section_id)] " ) ,
2011-01-21 07:27:24 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Salesman ' ) ,
2010-04-18 15:32:44 +00:00
' referred ' : fields . char ( ' Referred By ' , size = 64 ) ,
2010-04-05 08:40:54 +00:00
' date_open ' : fields . datetime ( ' Opened ' , readonly = True ) ,
2010-04-05 06:12:50 +00:00
' day_open ' : fields . function ( _compute_day , string = ' Days to Open ' , \
2011-07-05 12:28:57 +00:00
multi = ' day_open ' , type = " float " , store = True ) ,
2010-04-05 06:12:50 +00:00
' day_close ' : fields . function ( _compute_day , string = ' Days to Close ' , \
2011-07-05 12:28:57 +00:00
multi = ' day_close ' , type = " float " , store = True ) ,
2010-05-14 11:33:09 +00:00
' state ' : fields . selection ( crm . AVAILABLE_STATES , ' State ' , size = 16 , readonly = True ,
2010-05-05 11:55:13 +00:00
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 \' . \
2011-02-24 15:03:09 +00:00
\nIf the case needs to be reviewed then the state is set to \' Pending \' . ' ) ,
2010-09-09 16:04:47 +00:00
' message_ids ' : fields . one2many ( ' mailgate.message ' , ' res_id ' , ' Messages ' , domain = [ ( ' model ' , ' = ' , _name ) ] ) ,
2011-07-01 23:41:24 +00:00
' subjects ' : fields . function ( _get_email_subject , fnct_search = _history_search , string = ' Subject of Email ' , type = ' char ' , size = 64 ) ,
2011-02-24 15:03:09 +00:00
2010-02-28 10:57:24 +00:00
2011-08-25 04:10:37 +00:00
# Only used for type opportunity
' partner_address_id ' : fields . many2one ( ' res.partner.address ' , ' Partner Contact ' , domain = " [( ' partner_id ' , ' = ' ,partner_id)] " ) ,
' probability ' : fields . float ( ' Probability ( % ) ' , group_operator = " avg " ) ,
' planned_revenue ' : fields . float ( ' Expected Revenue ' ) ,
' ref ' : fields . reference ( ' Reference ' , selection = crm . _links_get , size = 128 ) ,
' ref2 ' : fields . reference ( ' Reference 2 ' , selection = crm . _links_get , size = 128 ) ,
' phone ' : fields . char ( " Phone " , size = 64 ) ,
' date_deadline ' : fields . date ( ' Expected Closing ' ) ,
' date_action ' : fields . date ( ' Next Action Date ' ) ,
' title_action ' : fields . char ( ' Next Action ' , size = 64 ) ,
' stage_id ' : fields . many2one ( ' crm.case.stage ' , ' Stage ' , domain = " [(section_ids ' , ' = ' , section_id)] " ) ,
}
2010-02-28 13:21:56 +00:00
_defaults = {
2010-05-14 11:33:09 +00:00
' active ' : lambda * a : 1 ,
' user_id ' : crm_case . _get_default_user ,
' email_from ' : crm_case . _get_default_email ,
' state ' : lambda * a : ' draft ' ,
2010-06-25 12:37:54 +00:00
' type ' : lambda * a : ' lead ' ,
2010-05-14 11:33:09 +00:00
' section_id ' : crm_case . _get_section ,
2010-04-05 06:12:50 +00:00
' 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 ] ,
2010-12-16 10:28:40 +00:00
#'stage_id': _get_stage_id,
2010-02-28 13:21:56 +00:00
}
2011-02-24 15:03:09 +00:00
2010-07-14 10:55:23 +00:00
def onchange_partner_address_id ( self , cr , uid , ids , add , email = False ) :
""" This function returns value of partner email based on Partner Address
"""
if not add :
return { ' value ' : { ' email_from ' : False , ' country_id ' : False } }
address = self . pool . get ( ' res.partner.address ' ) . browse ( cr , uid , add )
return { ' value ' : { ' email_from ' : address . email , ' phone ' : address . phone , ' country_id ' : address . country_id . id } }
2010-07-30 11:12:16 +00:00
2011-08-25 04:10:37 +00:00
def on_change_optin ( self , cr , uid , ids , optin ) :
return { ' value ' : { ' optin ' : optin , ' optout ' : False } }
def on_change_optout ( self , cr , uid , ids , optout ) :
return { ' value ' : { ' optout ' : optout , ' optin ' : False } }
def onchange_stage_id ( self , cr , uid , ids , stage_id , context = { } ) :
if not stage_id :
return { ' value ' : { } }
stage = self . pool . get ( ' crm.case.stage ' ) . browse ( cr , uid , stage_id , context )
if not stage . on_change :
return { ' value ' : { } }
return { ' value ' : { ' probability ' : stage . probability } }
def stage_find_percent ( self , cr , uid , percent , section_id ) :
""" Return the first stage with a probability == percent
2010-05-05 11:55:13 +00:00
"""
2011-08-25 04:10:37 +00:00
stage_pool = self . pool . get ( ' crm.case.stage ' )
if section_id :
ids = stage_pool . search ( cr , uid , [ ( " probability " , ' = ' , percent ) , ( " section_ids " , ' in ' , [ section_id ] ) ] )
else :
ids = stage_pool . search ( cr , uid , [ ( " probability " , ' = ' , percent ) ] )
2011-02-24 15:03:09 +00:00
2011-08-25 04:10:37 +00:00
if ids :
return ids [ 0 ]
return False
2011-02-24 15:03:09 +00:00
2011-08-25 04:10:37 +00:00
def stage_find_lost ( self , cr , uid , section_id ) :
return self . stage_find_percent ( cr , uid , 0.0 , section_id )
2011-02-24 15:03:09 +00:00
2011-08-25 04:10:37 +00:00
def stage_find_won ( self , cr , uid , section_id ) :
return self . stage_find_percent ( cr , uid , 100.0 , section_id )
2011-02-24 15:03:09 +00:00
2011-08-25 04:10:37 +00:00
def case_open ( self , cr , uid , ids , * args ) :
for l in self . browse ( cr , uid , ids ) :
# When coming from draft override date and stage otherwise just set state
if l . state == ' draft ' :
if l . type == ' lead ' :
message = _ ( " The lead ' %s ' has been opened. " ) % l . name
elif l . type == ' opportunity ' :
message = _ ( " The opportunity ' %s ' has been opened. " ) % l . name
else :
message = _ ( " The case ' %s ' has been opened. " ) % l . name
self . log ( cr , uid , l . id , message )
value = { ' date_open ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) }
self . write ( cr , uid , [ l . id ] , value )
if l . type == ' opportunity ' and not l . stage_id :
stage_id = self . stage_find ( cr , uid , l . section_id . id or False , [ ( ' sequence ' , ' > ' , 0 ) ] )
if stage_id :
self . stage_set ( cr , uid , [ l . id ] , stage_id )
2010-05-05 11:55:13 +00:00
res = super ( crm_lead , self ) . case_open ( cr , uid , ids , * args )
return res
2011-02-24 15:03:09 +00:00
2010-05-05 11:55:13 +00:00
def case_close ( self , cr , uid , ids , * args ) :
2010-12-16 10:28:40 +00:00
res = super ( crm_lead , self ) . case_close ( cr , uid , ids , * args )
2010-05-06 09:28:08 +00:00
self . write ( cr , uid , ids , { ' date_closed ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) } )
2010-10-16 14:02:41 +00:00
for case in self . browse ( cr , uid , ids ) :
2010-10-17 17:30:00 +00:00
if case . type == ' lead ' :
2010-10-17 18:28:33 +00:00
message = _ ( " The lead ' %s ' has been closed. " ) % case . name
2010-10-17 17:30:00 +00:00
else :
2010-10-17 18:28:33 +00:00
message = _ ( " The case ' %s ' has been closed. " ) % case . name
2010-10-16 15:46:28 +00:00
self . log ( cr , uid , case . id , message )
2010-05-05 11:55:13 +00:00
return res
2010-05-03 12:30:48 +00:00
2011-08-25 04:10:37 +00:00
def case_cancel ( self , cr , uid , ids , * args ) :
""" Overrides cancel for crm_case for setting probability
"""
res = super ( crm_lead , self ) . case_cancel ( cr , uid , ids , args )
self . write ( cr , uid , ids , { ' probability ' : 0.0 } )
return res
def case_reset ( self , cr , uid , ids , * args ) :
""" Overrides reset as draft in order to set the stage field as empty
"""
res = super ( crm_lead , self ) . case_reset ( cr , uid , ids , * args )
self . write ( cr , uid , ids , { ' stage_id ' : False , ' probability ' : 0.0 } )
return res
def case_mark_lost ( self , cr , uid , ids , * args ) :
""" Mark the case as lost: state = done and probability = 0 %
"""
res = super ( crm_lead , self ) . case_close ( cr , uid , ids , * args )
self . write ( cr , uid , ids , { ' probability ' : 0.0 } )
for l in self . browse ( cr , uid , ids ) :
stage_id = self . stage_find_lost ( cr , uid , l . section_id . id or False )
if stage_id :
self . stage_set ( cr , uid , [ l . id ] , stage_id )
message = _ ( " The opportunity ' %s ' has been marked as lost. " ) % l . name
self . log ( cr , uid , l . id , message )
return res
def case_mark_won ( self , cr , uid , ids , * args ) :
""" Mark the case as lost: state = done and probability = 0 %
"""
res = super ( crm_lead , self ) . case_close ( cr , uid , ids , * args )
self . write ( cr , uid , ids , { ' probability ' : 100.0 } )
for l in self . browse ( cr , uid , ids ) :
stage_id = self . stage_find_won ( cr , uid , l . section_id . id or False )
if stage_id :
self . stage_set ( cr , uid , [ l . id ] , stage_id )
message = _ ( " The opportunity ' %s ' has been been won. " ) % l . name
self . log ( cr , uid , l . id , message )
return res
2010-03-23 14:12:01 +00:00
def convert_opportunity ( self , cr , uid , ids , context = None ) :
""" Precomputation for converting lead to opportunity
"""
2010-11-23 07:05:05 +00:00
if context is None :
2010-03-23 14:12:01 +00:00
context = { }
context . update ( { ' active_ids ' : ids } )
data_obj = self . pool . get ( ' ir.model.data ' )
value = { }
2010-07-29 11:15:22 +00:00
2011-02-04 13:05:56 +00:00
for case in self . browse ( cr , uid , ids , context = context ) :
2010-03-23 14:12:01 +00:00
context . update ( { ' active_id ' : case . id } )
2011-02-04 13:05:56 +00:00
data_id = data_obj . _get_id ( cr , uid , ' crm ' , ' view_crm_lead2opportunity_partner ' )
view_id1 = False
if data_id :
view_id1 = data_obj . browse ( cr , uid , data_id , context = context ) . res_id
value = {
' name ' : _ ( ' Create Partner ' ) ,
' view_type ' : ' form ' ,
' view_mode ' : ' form,tree ' ,
' res_model ' : ' crm.lead2opportunity.partner ' ,
' view_id ' : False ,
' context ' : context ,
' views ' : [ ( view_id1 , ' form ' ) ] ,
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
' nodestroy ' : True
}
2010-03-23 14:12:01 +00:00
return value
2010-11-19 13:48:01 +00:00
def message_new ( self , cr , uid , msg , context = None ) :
2011-08-25 04:10:37 +00:00
""" Automatically calls when new email message arrives
2010-06-24 19:53:32 +00:00
"""
mailgate_pool = self . pool . get ( ' email.server.tools ' )
2011-07-05 05:46:19 +00:00
subject = msg . get ( ' subject ' ) or _ ( " No Subject " )
2010-06-24 19:53:32 +00:00
body = msg . get ( ' body ' )
msg_from = msg . get ( ' from ' )
priority = msg . get ( ' priority ' )
2010-06-25 12:05:00 +00:00
2010-06-24 19:53:32 +00:00
vals = {
' name ' : subject ,
' email_from ' : msg_from ,
' email_cc ' : msg . get ( ' cc ' ) ,
' description ' : body ,
' user_id ' : False ,
}
if msg . get ( ' priority ' , False ) :
vals [ ' priority ' ] = priority
2010-06-25 12:05:00 +00:00
res = mailgate_pool . get_partner ( cr , uid , msg . get ( ' from ' ) or msg . get_unixfrom ( ) )
2010-06-24 19:53:32 +00:00
if res :
vals . update ( res )
2010-06-25 12:05:00 +00:00
2010-06-25 17:41:41 +00:00
res = self . create ( cr , uid , vals , context )
2010-06-24 19:53:32 +00:00
attachents = msg . get ( ' attachments ' , [ ] )
for attactment in attachents or [ ] :
data_attach = {
' name ' : attactment ,
' datas ' : binascii . b2a_base64 ( str ( attachents . get ( attactment ) ) ) ,
' datas_fname ' : attactment ,
' description ' : ' Mail attachment ' ,
' res_model ' : self . _name ,
' res_id ' : res ,
}
self . pool . get ( ' ir.attachment ' ) . create ( cr , uid , data_attach )
return res
2010-11-19 13:48:01 +00:00
def message_update ( self , cr , uid , ids , vals = { } , msg = " " , default_act = ' pending ' , context = None ) :
2010-06-25 12:05:00 +00:00
"""
2011-02-24 15:03:09 +00:00
@param ids : List of update mail ’ s IDs
2010-06-24 19:53:32 +00:00
"""
if isinstance ( ids , ( str , int , long ) ) :
ids = [ ids ]
2010-06-25 12:05:00 +00:00
2010-08-26 15:31:21 +00:00
if msg . get ( ' priority ' ) in dict ( crm . AVAILABLE_PRIORITIES ) :
2010-06-24 19:53:32 +00:00
vals [ ' priority ' ] = msg . get ( ' priority ' )
maps = {
' cost ' : ' planned_cost ' ,
' revenue ' : ' planned_revenue ' ,
' probability ' : ' probability '
}
2010-06-25 12:05:00 +00:00
vls = { }
2010-06-24 19:53:32 +00:00
for line in msg [ ' body ' ] . split ( ' \n ' ) :
line = line . strip ( )
res = tools . misc . command_re . match ( line )
2010-06-25 12:05:00 +00:00
if res and maps . get ( res . group ( 1 ) . lower ( ) ) :
2010-06-24 19:53:32 +00:00
key = maps . get ( res . group ( 1 ) . lower ( ) )
vls [ key ] = res . group ( 2 ) . lower ( )
vals . update ( vls )
2010-06-25 17:41:41 +00:00
# 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 )
2010-07-08 14:03:52 +00:00
if case . state in CRM_LEAD_PENDING_STATES :
values . update ( state = crm . AVAILABLE_STATES [ 1 ] [ 0 ] ) #re-open
2010-06-25 17:41:41 +00:00
res = self . write ( cr , uid , [ case . id ] , values , context = context )
2010-06-24 19:53:32 +00:00
return res
def msg_send ( self , cr , uid , id , * args , * * argv ) :
""" Send The Message
2011-08-25 04:10:37 +00:00
@param ids : List of email ’ s IDs
2010-06-24 19:53:32 +00:00
"""
return True
2011-02-18 11:40:32 +00:00
2011-08-25 04:10:37 +00:00
def action_makeMeeting ( self , cr , uid , ids , context = None ) :
"""
This opens Meeting ' s calendar view to schedule meeting on current Opportunity
@return : Dictionary value for created Meeting view
"""
value = { }
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 = {
' default_opportunity_id ' : opp . id ,
' default_partner_id ' : opp . partner_id and opp . partner_id . id or False ,
' default_user_id ' : uid ,
' default_section_id ' : opp . section_id and opp . section_id . id or False ,
' default_email_from ' : opp . email_from ,
' default_state ' : ' open ' ,
' default_name ' : opp . name
}
value = {
' name ' : _ ( ' Meetings ' ) ,
' context ' : context ,
' view_type ' : ' form ' ,
' view_mode ' : ' calendar,form,tree ' ,
' res_model ' : ' crm.meeting ' ,
' view_id ' : False ,
' views ' : [ ( id1 , ' calendar ' ) , ( id2 , ' form ' ) , ( id3 , ' tree ' ) ] ,
' type ' : ' ir.actions.act_window ' ,
' search_view_id ' : res [ ' res_id ' ] ,
' nodestroy ' : True
}
return value
def write ( self , cr , uid , ids , vals , context = None ) :
if not context :
context = { }
if ' date_closed ' in vals :
return super ( crm_lead , self ) . write ( cr , uid , ids , vals , context = context )
if ' stage_id ' in vals and vals [ ' stage_id ' ] :
stage_obj = self . pool . get ( ' crm.case.stage ' ) . browse ( cr , uid , vals [ ' stage_id ' ] , context = context )
self . history ( cr , uid , ids , _ ( " Changed Stage to: %s " ) % stage_obj . name , details = _ ( " Changed Stage to: %s " ) % stage_obj . name )
message = ' '
for case in self . browse ( cr , uid , ids , context = context ) :
if case . type == ' lead ' or context . get ( ' stage_type ' , False ) == ' lead ' :
message = _ ( " The stage of lead ' %s ' has been changed to ' %s ' . " ) % ( case . name , stage_obj . name )
elif case . type == ' opportunity ' :
message = _ ( " The stage of opportunity ' %s ' has been changed to ' %s ' . " ) % ( case . name , stage_obj . name )
self . log ( cr , uid , case . id , message )
return super ( crm_lead , self ) . write ( cr , uid , ids , vals , context )
def unlink ( self , cr , uid , ids , context = None ) :
for lead in self . browse ( cr , uid , ids , context ) :
if ( not lead . section_id . allow_unlink ) and ( lead . state < > ' draft ' ) :
raise osv . except_osv ( _ ( ' Warning ! ' ) ,
_ ( ' You can not delete this lead. You should better cancel it. ' ) )
return super ( crm_lead , self ) . unlink ( cr , uid , ids , context )
2011-03-04 12:53:34 +00:00
2011-02-24 15:03:09 +00:00
2009-12-30 10:20:44 +00:00
crm_lead ( )
2010-03-22 10:40:26 +00:00
2010-03-23 14:12:01 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: