class crm_case_stage(osv.osv):
""" Model for case stages. This models the main stages of a document
- management flow. Main CRM objects (leads, opportunities, project
+ management flow. Main CRM objects (leads, opportunities, project
issues, ...) will now use only stages, instead of state and stages.
Stages are for example used to display the kanban view of records.
"""
'requirements': fields.text('Requirements'),
'section_ids':fields.many2many('crm.case.section', 'section_stage_rel', 'stage_id', 'section_id', string='Sections',
help="Link between stages and sales teams. When set, this limitate the current stage to the selected sales teams."),
- 'state': fields.selection(AVAILABLE_STATES, 'State', required=True, help="The related state for the stage. The state of your document will automatically change regarding the selected stage. For example, if a stage is related to the state 'Close', when your document reaches this stage, it will be automatically have the 'closed' state."),
+ 'state': fields.selection(AVAILABLE_STATES, 'Related Status', required=True,
+ help="The status of your document will automatically change regarding the selected stage. " \
+ "For example, if a stage is related to the status 'Close', when your document reaches this stage, it is automatically closed."),
'case_default': fields.boolean('Common to All Teams',
help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
'fold': fields.boolean('Hide in Views when Empty',
_defaults = {
'sequence': lambda *args: 1,
'probability': lambda *args: 0.0,
- 'state': 'draft',
+ 'state': 'open',
'fold': False,
'type': 'both',
+ 'case_default': True,
}
class crm_case_section(osv.osv):
""" Model for sales teams. """
_name = "crm.case.section"
_inherits = {'mail.alias': 'alias_id'}
+ _inherit = "mail.thread"
_description = "Sales Teams"
_order = "complete_name"
'code': fields.char('Code', size=8),
'active': fields.boolean('Active', help="If the active field is set to "\
"true, it will allow you to hide the sales team without removing it."),
- 'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
- 'change_responsible': fields.boolean('Reassign Escalated', help="When escalating to this team override the saleman with the team leader."),
+ 'change_responsible': fields.boolean('Reassign Escalated', help="When escalating to this team override the salesman with the team leader."),
'user_id': fields.many2one('res.users', 'Team Leader'),
'member_ids':fields.many2many('res.users', 'sale_member_rel', 'section_id', 'member_id', 'Team Members'),
'reply_to': fields.char('Reply-To', size=64, help="The email address put in the 'Reply-To' of all emails sent by OpenERP about cases in this sales team"),
'note': fields.text('Description'),
'working_hours': fields.float('Working Hours', digits=(16,2 )),
'stage_ids': fields.many2many('crm.case.stage', 'section_stage_rel', 'section_id', 'stage_id', 'Stages'),
- 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="restrict", required=True,
- help="This Unique Mail Box Alias of the Sales Team allows to manage the Seamless email communication between Mail Box and OpenERP,"
- "This Alias MailBox also create and Manage the new Email Leads for this Sales Team and also manage the existing Lead email communication."),
+ 'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True,
+ help="The email address associated with this team. New emails received will automatically "
+ "create new leads assigned to the team."),
}
-
+
def _get_stage_common(self, cr, uid, context):
ids = self.pool.get('crm.case.stage').search(cr, uid, [('case_default','=',1)], context=context)
return ids
_defaults = {
- 'active': lambda *a: 1,
- 'allow_unlink': lambda *a: 1,
- 'stage_ids': _get_stage_common
+ 'active': 1,
+ 'stage_ids': _get_stage_common,
+ 'alias_domain': False, # always hide alias during creation
}
_sql_constraints = [
name = record['parent_id'][1] + ' / ' + name
res.append((record['id'], name))
return res
-
- def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
- res = super(crm_case_section,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
- if view_type == 'form':
- domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context)
- if not domain:
- doc = etree.XML(res['arch'])
- alias_node = doc.xpath("//div[@name='alias_box']")[0]
- parent = alias_node.getparent()
- parent.remove(alias_node)
- res['arch'] = etree.tostring(doc)
- return res
-
+
def create(self, cr, uid, vals, context=None):
- alias_pool = self.pool.get('mail.alias')
+ mail_alias = self.pool.get('mail.alias')
if not vals.get('alias_id'):
- alias_id = alias_pool.create_unique_alias(cr, uid, {'alias_name': "sales_team."+vals['name'], 'alias_model_id': self._name}, context=context)
- vals.update({'alias_id': alias_id})
+ vals.pop('alias_name', None) # prevent errors during copy()
+ alias_id = mail_alias.create_unique_alias(cr, uid,
+ {'alias_name': vals['name']},
+ model_name="crm.lead",
+ context=context)
+ vals['alias_id'] = alias_id
res = super(crm_case_section, self).create(cr, uid, vals, context)
- alias_pool.write(cr, uid, [vals['alias_id']],{'alias_defaults':{'section_id': res,'type':'lead'}},context)
+ mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'section_id': res, 'type':'lead'}}, context)
+ return res
+
+ def unlink(self, cr, uid, ids, context=None):
+ # Cascade-delete mail aliases as well, as they should not exist without the sales team.
+ mail_alias = self.pool.get('mail.alias')
+ alias_ids = [team.alias_id.id for team in self.browse(cr, uid, ids, context=context) if team.alias_id ]
+ res = super(crm_case_section, self).unlink(cr, uid, ids, context=context)
+ mail_alias.unlink(cr, uid, alias_ids, context=context)
return res
class crm_case_categ(osv.osv):
def _find_object_id(self, cr, uid, context=None):
"""Finds id for case object"""
- object_id = context and context.get('object_id', False) or False
- ids = self.pool.get('ir.model').search(cr, uid, [('id', '=', object_id)])
+ context = context or {}
+ object_id = context.get('object_id', False)
+ ids = self.pool.get('ir.model').search(cr, uid, ['|',('id', '=', object_id),('model', '=', context.get('object_name', False))])
return ids and ids[0] or False
_defaults = {
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
-
def _links_get(self, cr, uid, context=None):
"""Gets links value for reference field"""
obj = self.pool.get('res.request.link')
res = obj.read(cr, uid, ids, ['object', 'name'], context)
return [(r['object'], r['name']) for r in res]
+class crm_payment_mode(osv.osv):
+ """ Payment Mode for Fund """
+ _name = "crm.payment.mode"
+ _description = "CRM Payment Mode"
+ _columns = {
+ 'name': fields.char('Name', size=64, required=True),
+ 'section_id': fields.many2one('crm.case.section', 'Sales Team'),
+ }
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: