diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 2e95ffff8ec..47eb59dca3b 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -45,6 +45,322 @@ AVAILABLE_PRIORITIES = [ ('5', 'Lowest'), ] +class crm_case(object): + """A simple python class to be used for common functions """ + + def _get_default_partner_address(self, cr, uid, context): + """Gives id of default address for current user + @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 context: A standard dictionary for contextual values + """ + if not context.get('portal', False): + return False + return self.pool.get('res.users').browse(cr, uid, uid, context).address_id.id + + def _get_default_partner(self, cr, uid, context): + """Gives id of partner for current user + @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 context: A standard dictionary for contextual values + """ + if not context.get('portal', False): + return False + user = self.pool.get('res.users').browse(cr, uid, uid, context) + if not user.address_id: + return False + return user.address_id.partner_id.id + + def _get_default_email(self, cr, uid, context): + """Gives default email address for current user + @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 context: A standard dictionary for contextual values + """ + if not context.get('portal', False): + return False + user = self.pool.get('res.users').browse(cr, uid, uid, context) + if not user.address_id: + return False + return user.address_id.email + + def _get_default_user(self, cr, uid, context): + """Gives current user id + @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 context: A standard dictionary for contextual values + """ + if context.get('portal', False): + return False + return uid + + def _get_section(self, cr, uid, context): + """Gives section id for current User + @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 context: A standard dictionary for contextual values + """ + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + return user.context_section_id.id or False + + def stage_next(self, cr, uid, ids, context=None): + """This function computes next stage for case from its current stage + using available stage for that case type + @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 case IDs + @param context: A standard dictionary for contextual values""" + if not context: + context = {} + + s = self.get_stage_dict(cr, uid, ids, context=context) + for case in self.browse(cr, uid, ids, context): + section = (case.section_id.id or False) + if section in s: + st = case.stage_id.id or False + if st in s[section]: + self.write(cr, uid, [case.id], {'stage_id': s[section][st]}) + return True + + def get_stage_dict(self, cr, uid, ids, context=None): + """This function gives dictionary for stage according to stage levels + @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 case IDs + @param context: A standard dictionary for contextual values""" + if not context: + context = {} + + sid = self.pool.get('crm.case.stage').search(cr, uid, \ + [('object_id.model', '=', self._name)], context=context) + s = {} + previous = {} + for stage in self.pool.get('crm.case.stage').browse(cr, uid, sid, context=context): + section = stage.section_id.id or False + s.setdefault(section, {}) + s[section][previous.get(section, False)] = stage.id + previous[section] = stage.id + return s + + def stage_previous(self, cr, uid, ids, context=None): + """This function computes previous stage for case from its current stage + using available stage for that case type + @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 case IDs + @param context: A standard dictionary for contextual values""" + if not context: + context = {} + + s = self.get_stage_dict(cr, uid, ids, context=context) + for case in self.browse(cr, uid, ids, context): + section = (case.section_id.id or False) + + if section in s: + st = case.stage_id.id or False + s[section] = dict([(v, k) for (k, v) in s[section].iteritems()]) + if st in s[section]: + self.write(cr, uid, [case.id], {'stage_id': s[section][st]}) + return True + + def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, message_id=False, context={}): + """ + @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 cases: a browse record list + @param keyword: Case action keyword e.g.: If case is closed "Close" keyword is used + @param history: Value True/False, If True it makes entry in case History otherwise in Case Log + @param email: Email address if any + @param details: Details of case history if any + @param context: A standard dictionary for contextual values""" + if not context: + context = {} + + # The mailgate sends the ids of the cases and not the object list + if all(isinstance(case_id, (int, long)) for case_id in cases) and context.get('model'): + cases = self.pool.get(context['model']).browse(cr, uid, cases, context=context) + + model_obj = self.pool.get('ir.model') + + obj = self.pool.get('mailgate.message') + for case in cases: + model_ids = model_obj.search(cr, uid, [('model', '=', case._name)]) + data = { + 'name': keyword, + 'user_id': uid, + 'date': time.strftime('%Y-%m-%d %H:%M:%S'), + 'model_id' : model_ids and model_ids[0] or False, + 'res_id': case.id, + 'section_id': case.section_id.id, + 'message_id':message_id + } + + if history: + data['description'] = details or case.description + data['email_to'] = email or \ + (case.section_id and case.section_id.reply_to) or \ + (case.user_id and case.user_id.address_id and \ + case.user_id.address_id.email) or tools.config.get('email_from', False) + data['email_from'] = email_from or \ + (case.section_id and case.section_id.reply_to) or \ + (case.user_id and case.user_id.address_id and \ + case.user_id.address_id.email) or tools.config.get('email_from', False) + res = obj.create(cr, uid, data, context) + return True + + _history = __history + history = __history + + def onchange_partner_id(self, cr, uid, ids, part, email=False): + """This function returns value of partner address based on partner + @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 case IDs + @param part: Partner's id + @email: Partner's email ID + """ + if not part: + return {'value': {'partner_address_id': False, + 'email_from': False, + }} + addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact']) + data = {'partner_address_id': addr['contact']} + data.update(self.onchange_partner_address_id(cr, uid, ids, addr['contact'])['value']) + return {'value': data} + + def onchange_partner_address_id(self, cr, uid, ids, add, email=False): + """This function returns value of partner email based on Partner Address + @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 case IDs + @param add: Id of Partner's address + @email: Partner's email ID + """ + if not add: + return {'value': {'email_from': False}} + address = self.pool.get('res.partner.address').browse(cr, uid, add) + return {'value': {'email_from': address.email}} + + def case_open(self, cr, uid, ids, *args): + """Opens Case + @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 case Ids + @param *args: Tuple Value for additional Params + """ + cases = self.browse(cr, uid, ids) + self._history(cr, uid, cases, _('Open')) + for case in cases: + data = {'state': 'open', 'active': True} + if not case.user_id: + data['user_id'] = uid + self.write(cr, uid, case.id, data) + self._action(cr, uid, cases, 'open') + return True + + def case_close(self, cr, uid, ids, *args): + """Closes Case + @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 case Ids + @param *args: Tuple Value for additional Params + """ + cases = self.browse(cr, uid, ids) + cases[0].state # to fill the browse record cache + self._history(cr, uid, cases, _('Close')) + self.write(cr, uid, ids, {'state': 'done', + 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), + }) + # + # We use the cache of cases to keep the old case state + # + self._action(cr, uid, cases, 'done') + return True + + def case_escalate(self, cr, uid, ids, *args): + """Escalates case to top level + @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 case Ids + @param *args: Tuple Value for additional Params + """ + cases = self.browse(cr, uid, ids) + for case in cases: + data = {'active': True, 'user_id': False} + + if case.section_id.parent_id: + data['section_id'] = case.section_id.parent_id.id + if case.section_id.parent_id.user_id: + data['user_id'] = case.section_id.parent_id.user_id.id + else: + raise osv.except_osv(_('Error !'), _('You can not escalate this case.\nYou are already at the top level.')) + self.write(cr, uid, [case.id], data) + cases = self.browse(cr, uid, ids) + self._history(cr, uid, cases, _('Escalate')) + self._action(cr, uid, cases, 'escalate') + return True + + def case_cancel(self, cr, uid, ids, *args): + """Cancels Case + @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 case Ids + @param *args: Tuple Value for additional Params + """ + cases = self.browse(cr, uid, ids) + cases[0].state # to fill the browse record cache + self._history(cr, uid, cases, _('Cancel')) + self.write(cr, uid, ids, {'state': 'cancel', + 'active': True}) + self._action(cr, uid, cases, 'cancel') + return True + + def case_pending(self, cr, uid, ids, *args): + """Marks case as pending + @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 case Ids + @param *args: Tuple Value for additional Params + """ + cases = self.browse(cr, uid, ids) + cases[0].state # to fill the browse record cache + self._history(cr, uid, cases, _('Pending')) + self.write(cr, uid, ids, {'state': 'pending', 'active': True}) + self._action(cr, uid, cases, 'pending') + return True + + def case_reset(self, cr, uid, ids, *args): + """Resets case as draft + @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 case Ids + @param *args: Tuple Value for additional Params + """ + cases = self.browse(cr, uid, ids) + cases[0].state # to fill the browse record cache + self._history(cr, uid, cases, _('Draft')) + self.write(cr, uid, ids, {'state': 'draft', 'active': True}) + self._action(cr, uid, cases, 'draft') + return True + + class crm_case_section(osv.osv): """Sales Team""" @@ -67,7 +383,6 @@ class crm_case_section(osv.osv): 'resource_calendar_id': fields.many2one('resource.calendar', "Resource's Calendar"), 'server_id':fields.many2one('email.smtpclient', 'Server ID'), 'note': fields.text('Description'), - } _defaults = { diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index db01e94ccc6..8c8e8cca564 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -26,8 +26,9 @@ import math import time import mx.DateTime from tools.translate import _ +from crm import crm_case -class crm_lead(osv.osv): +class crm_lead(osv.osv, crm_case): """ CRM Lead Case """ _name = "crm.lead" @@ -35,19 +36,6 @@ class crm_lead(osv.osv): _order = "priority, id desc" _inherit = ['res.partner.address', 'mailgate.thread'] - def case_open(self, cr, uid, ids, *args): - """ - @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 case's Ids - @param *args: Give Tuple Value - """ - - res = super(crm_lead, self).case_open(cr, uid, ids, *args) - self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) - return res - def _compute_day(self, cr, uid, ids, fields, args, context={}): """ @param cr: the current row, from the database cursor, @@ -117,7 +105,7 @@ class crm_lead(osv.osv): " communication between partner and users by email"), 'description': fields.text('Description'), 'write_date': fields.datetime('Update Date' , readonly=True), - + # Lead fields 'categ_id': fields.many2one('crm.case.categ', 'Lead Source', \ domain="[('section_id','=',section_id),\ @@ -143,77 +131,48 @@ class crm_lead(osv.osv): method=True, multi='day_open', type="float", store=True), 'day_close': fields.function(_compute_day, string='Days to Close', \ method=True, multi='day_close', type="float", store=True), - 'function_name': fields.char('Function', size=64), + 'function_name': fields.char('Function', size=64), + '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\'.'), } _defaults = { + 'active': lambda *a: 1, + 'user_id': crm_case._get_default_user, + 'email_from': crm_case._get_default_email, + 'state': lambda *a: 'draft', + 'section_id': crm_case._get_section, '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], } - def stage_next(self, cr, uid, ids, context=None): - """This function computes next stage for case from its current stage - using available stage for that case type + def case_open(self, cr, uid, ids, *args): + """Overrides cancel for crm_case for setting Open Date @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 case IDs - @param context: A standard dictionary for contextual values""" - if not context: - context = {} - - s = self.get_stage_dict(cr, uid, ids, context=context) - for case in self.browse(cr, uid, ids, context): - section = (case.section_id.id or False) - if section in s: - st = case.stage_id.id or False - if st in s[section]: - self.write(cr, uid, [case.id], {'stage_id': s[section][st]}) - return True - - def get_stage_dict(self, cr, uid, ids, context=None): - """This function gives dictionary for stage according to stage levels - @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 case IDs - @param context: A standard dictionary for contextual values""" - if not context: - context = {} - - sid = self.pool.get('crm.case.stage').search(cr, uid, \ - [('object_id.model', '=', self._name)], context=context) - s = {} - previous = {} - for stage in self.pool.get('crm.case.stage').browse(cr, uid, sid, context=context): - section = stage.section_id.id or False - s.setdefault(section, {}) - s[section][previous.get(section, False)] = stage.id - previous[section] = stage.id - return s - - def stage_previous(self, cr, uid, ids, context=None): - """This function computes previous stage for case from its current stage - using available stage for that case type - @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 case IDs - @param context: A standard dictionary for contextual values""" - if not context: - context = {} - - s = self.get_stage_dict(cr, uid, ids, context=context) - for case in self.browse(cr, uid, ids, context): - section = (case.section_id.id or False) - - if section in s: - st = case.stage_id.id or False - s[section] = dict([(v, k) for (k, v) in s[section].iteritems()]) - if st in s[section]: - self.write(cr, uid, [case.id], {'stage_id': s[section][st]}) - return True + @param ids: List of case's Ids + @param *args: Give Tuple Value + """ + res = super(crm_lead, self).case_open(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res + def case_close(self, cr, uid, ids, *args): + """Overrides close for crm_case for setting close date + @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 case Ids + @param *args: Tuple Value for additional Params + """ + res = super(crm_opportunity, self).case_close(cr, uid, ids, args) + self.write(cr, uid, ids, {'date_close': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res + def convert_opportunity(self, cr, uid, ids, context=None): """ Precomputation for converting lead to opportunity @param cr: the current row, from the database cursor, @@ -267,118 +226,6 @@ class crm_lead(osv.osv): 'nodestroy': True } return value - - # From crm.case - - def case_close(self, cr, uid, ids, *args): - """Closes Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Close')) - self.write(cr, uid, ids, {'state': 'done', - 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), - }) - # - # We use the cache of cases to keep the old case state - # - self._action(cr, uid, cases, 'done') - return True - - def case_escalate(self, cr, uid, ids, *args): - """Escalates case to top level - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - for case in cases: - data = {'active': True, 'user_id': False} - - if case.section_id.parent_id: - data['section_id'] = case.section_id.parent_id.id - if case.section_id.parent_id.user_id: - data['user_id'] = case.section_id.parent_id.user_id.id - else: - raise osv.except_osv(_('Error !'), _('You can not escalate this case.\nYou are already at the top level.')) - self.write(cr, uid, [case.id], data) - cases = self.browse(cr, uid, ids) - self._history(cr, uid, cases, _('Escalate')) - self._action(cr, uid, cases, 'escalate') - return True - - def case_open(self, cr, uid, ids, *args): - """Opens Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - self._history(cr, uid, cases, _('Open')) - - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - self.write(cr, uid, case.id, data) - self._action(cr, uid, cases, 'open') - return True - - def case_cancel(self, cr, uid, ids, *args): - """Cancels Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Cancel')) - self.write(cr, uid, ids, {'state': 'cancel', - 'active': True}) - self._action(cr, uid, cases, 'cancel') - return True - - def case_pending(self, cr, uid, ids, *args): - """Marks case as pending - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Pending')) - self.write(cr, uid, ids, {'state': 'pending', 'active': True}) - self._action(cr, uid, cases, 'pending') - return True - - def case_reset(self, cr, uid, ids, *args): - """Resets case as draft - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Draft')) - self.write(cr, uid, ids, {'state': 'draft', 'active': True}) - self._action(cr, uid, cases, 'draft') - return True - crm_lead() diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py index 86ddeba4129..38cfba16a6b 100644 --- a/addons/crm/crm_meeting.py +++ b/addons/crm/crm_meeting.py @@ -20,23 +20,24 @@ ############################################################################## from base_calendar import base_calendar +from crm import crm_case from datetime import datetime, timedelta from osv import fields, osv from tools.translate import _ import time -class crm_lead(osv.osv): +class crm_lead(osv.osv, crm_case): """ CRM Leads """ _name = 'crm.lead' crm_lead() -class crm_phonecall(osv.osv): +class crm_phonecall(osv.osv, crm_case): """ CRM Phonecall """ _name = 'crm.phonecall' crm_phonecall() -class crm_meeting(osv.osv): +class crm_meeting(osv.osv, crm_case): """ CRM Meeting Cases """ _name = 'crm.meeting' @@ -117,78 +118,6 @@ class crm_meeting(osv.osv): return value - # From crm.case - - def case_close(self, cr, uid, ids, *args): - """Closes Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Close')) - self.write(cr, uid, ids, {'state': 'done', - 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), - }) - # - # We use the cache of cases to keep the old case state - # - self._action(cr, uid, cases, 'done') - return True - - def case_open(self, cr, uid, ids, *args): - """Opens Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - self._history(cr, uid, cases, _('Open')) - - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - self.write(cr, uid, case.id, data) - self._action(cr, uid, cases, 'open') - return True - - def case_cancel(self, cr, uid, ids, *args): - """Cancels Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Cancel')) - self.write(cr, uid, ids, {'state': 'cancel', - 'active': True}) - self._action(cr, uid, cases, 'cancel') - return True - - def case_reset(self, cr, uid, ids, *args): - """Resets case as draft - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Draft')) - self.write(cr, uid, ids, {'state': 'draft', 'active': True}) - self._action(cr, uid, cases, 'draft') - return True - crm_meeting() class calendar_attendee(osv.osv): diff --git a/addons/crm/crm_opportunity.py b/addons/crm/crm_opportunity.py index e527042b0e5..eb015359566 100644 --- a/addons/crm/crm_opportunity.py +++ b/addons/crm/crm_opportunity.py @@ -42,19 +42,6 @@ class crm_opportunity(osv.osv): _order = "priority,date_action,id desc" _inherit = 'crm.lead' - def case_open(self, cr, uid, ids, *args): - """ - @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 case's Ids - @param *args: Give Tuple Value - """ - - res = super(crm_opportunity, self).case_open(cr, uid, ids, *args) - self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) - return res - _columns = { # From crm.case 'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \ @@ -68,50 +55,43 @@ class crm_opportunity(osv.osv): 'phone': fields.char("Phone", size=64), 'date_deadline': fields.date('Expected Closing'), 'date_action': fields.date('Next Action'), - 'state': fields.selection(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\'.'), - } def case_close(self, cr, uid, ids, *args): - """Closes Case + """Overrides close for crm_case for setting probability and close date @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 case Ids @param *args: Tuple Value for additional Params """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Close')) - self.write(cr, uid, ids, {'state': 'done', - 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), - 'probability' : 100.0}) - # - # We use the cache of cases to keep the old case state - # - self._action(cr, uid, cases, 'done') - return True - + res = super(crm_opportunity, self).case_close(cr, uid, ids, args) + self.write(cr, uid, ids, {'probability' : 100.0, 'date_close': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res + def case_cancel(self, cr, uid, ids, *args): - """Cancels Case + """Overrides cancel for crm_case for setting probability @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 case Ids @param *args: Tuple Value for additional Params """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Cancel')) - self.write(cr, uid, ids, {'state': 'cancel', - 'active': True, - 'probability' : 0.0}) - self._action(cr, uid, cases, 'cancel') - return True + res = super(crm_opportunity, self).case_cancel(cr, uid, ids, args) + self.write(cr, uid, ids, {'probability' : 0.0}) + return res + + def case_open(self, cr, uid, ids, *args): + """Overrides cancel for crm_case for setting Open Date + @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 case's Ids + @param *args: Give Tuple Value + """ + res = super(crm_opportunity, self).case_open(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res def onchange_stage_id(self, cr, uid, ids, stage_id, context={}): @@ -132,7 +112,6 @@ class crm_opportunity(osv.osv): _defaults = { '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], - 'state' : 'draft', } def action_makeMeeting(self, cr, uid, ids, context=None): diff --git a/addons/crm/crm_phonecall.py b/addons/crm/crm_phonecall.py index ae0cbae0d88..3dc652da7fc 100644 --- a/addons/crm/crm_phonecall.py +++ b/addons/crm/crm_phonecall.py @@ -19,12 +19,13 @@ # ############################################################################## +from crm import crm_case from osv import fields, osv from tools.translate import _ import crm import time -class crm_phonecall(osv.osv): +class crm_phonecall(osv.osv, crm_case): """ Phonecall Cases """ _name = "crm.phonecall" @@ -79,89 +80,28 @@ class crm_phonecall(osv.osv): # From crm.case def case_close(self, cr, uid, ids, *args): - """Closes Case + """Overrides close for crm_case for setting close date @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 case Ids @param *args: Tuple Value for additional Params """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Close')) - self.write(cr, uid, ids, {'state': 'done', - 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), - }) - # - # We use the cache of cases to keep the old case state - # - self._action(cr, uid, cases, 'done') - return True + res = super(crm_phonecall, self).case_close(cr, uid, ids, args) + self.write(cr, uid, ids, {'date_close': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res def case_open(self, cr, uid, ids, *args): - """Opens Case + """Overrides cancel for crm_case for setting Open Date @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 case Ids - @param *args: Tuple Value for additional Params + @param ids: List of case's Ids + @param *args: Give Tuple Value """ - cases = self.browse(cr, uid, ids) - self._history(cr, uid, cases, _('Open')) - - for case in cases: - data = {'state': 'open', 'active': True} - if not case.user_id: - data['user_id'] = uid - self.write(cr, uid, case.id, data) - self._action(cr, uid, cases, 'open') - return True - - def case_pending(self, cr, uid, ids, *args): - """Marks case as pending - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Pending')) - self.write(cr, uid, ids, {'state': 'pending', 'active': True}) - self._action(cr, uid, cases, 'pending') - return True - - def case_cancel(self, cr, uid, ids, *args): - """Cancels Case - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Cancel')) - self.write(cr, uid, ids, {'state': 'cancel', - 'active': True}) - self._action(cr, uid, cases, 'cancel') - return True - - def case_reset(self, cr, uid, ids, *args): - """Resets case as draft - @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 case Ids - @param *args: Tuple Value for additional Params - """ - cases = self.browse(cr, uid, ids) - cases[0].state # to fill the browse record cache - self._history(cr, uid, cases, _('Draft')) - self.write(cr, uid, ids, {'state': 'draft', 'active': True}) - self._action(cr, uid, cases, 'draft') - return True + res = super(crm_phonecall, self).case_open(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res def action_make_meeting(self, cr, uid, ids, context=None): """ diff --git a/addons/mail_gateway/mail_gateway.py b/addons/mail_gateway/mail_gateway.py index 3d9b9971a47..764a1d00353 100644 --- a/addons/mail_gateway/mail_gateway.py +++ b/addons/mail_gateway/mail_gateway.py @@ -70,94 +70,12 @@ class mailgate_thread(osv.osv): _columns = { 'name':fields.char('Name', size=64), 'active': fields.boolean('Active'), -# 'message_ids':fields.one2many('mailgate.message', 'thread_id', 'Message'), 'message_ids': fields.function(_get_log_ids, method=True, type='one2many', \ multi="message_ids", relation="mailgate.message", string="Messages"), 'log_ids': fields.function(_get_log_ids, method=True, type='one2many', \ multi="log_ids", relation="mailgate.message", string="Logs"), } - def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, message_id=False, context={}): - """ - @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 cases: a browse record list - @param keyword: Case action keyword e.g.: If case is closed "Close" keyword is used - @param history: Value True/False, If True it makes entry in case History otherwise in Case Log - @param email: Email address if any - @param details: Details of case history if any - @param context: A standard dictionary for contextual values""" - if not context: - context = {} - - # The mailgate sends the ids of the cases and not the object list - if all(isinstance(case_id, (int, long)) for case_id in cases) and context.get('model'): - cases = self.pool.get(context['model']).browse(cr, uid, cases, context=context) - - model_obj = self.pool.get('ir.model') - - obj = self.pool.get('mailgate.message') - for case in cases: - model_ids = model_obj.search(cr, uid, [('model', '=', case._name)]) - data = { - 'name': keyword, - 'user_id': uid, - 'date': time.strftime('%Y-%m-%d %H:%M:%S'), - 'model_id' : model_ids and model_ids[0] or False, - 'res_id': case.id, - 'section_id': case.section_id.id, - 'message_id':message_id - } - - if history: - data['description'] = details or case.description - data['email_to'] = email or \ - (case.section_id and case.section_id.reply_to) or \ - (case.user_id and case.user_id.address_id and \ - case.user_id.address_id.email) or tools.config.get('email_from', False) - data['email_from'] = email_from or \ - (case.section_id and case.section_id.reply_to) or \ - (case.user_id and case.user_id.address_id and \ - case.user_id.address_id.email) or tools.config.get('email_from', False) - res = obj.create(cr, uid, data, context) - return True - - _history = __history - history = __history - - def onchange_partner_id(self, cr, uid, ids, part, email=False): - """This function returns value of partner address based on partner - @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 case IDs - @param part: Partner's id - @email: Partner's email ID - """ - if not part: - return {'value': {'partner_address_id': False, - 'email_from': False, - }} - addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact']) - data = {'partner_address_id': addr['contact']} - data.update(self.onchange_partner_address_id(cr, uid, ids, addr['contact'])['value']) - return {'value': data} - - def onchange_partner_address_id(self, cr, uid, ids, add, email=False): - """This function returns value of partner email based on Partner Address - @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 case IDs - @param add: Id of Partner's address - @email: Partner's email ID - """ - if not add: - return {'value': {'email_from': False}} - address = self.pool.get('res.partner.address').browse(cr, uid, add) - return {'value': {'email_from': address.email}} - mailgate_thread() class mailgate_message(osv.osv):