Improved CRM module:

* Better Wizard
	* Added some views: calendar
	* Changed Date_Deadline to datetime (for calendar purpose)

bzr revid: fp@tinyerp.com-76c641d9d2267a0609c07876e0471ed7297c8ae9
This commit is contained in:
Fabien Pinckaers 2007-12-17 20:16:01 +00:00
parent aa88c7316b
commit 909e58578d
3 changed files with 156 additions and 10 deletions

View File

@ -49,6 +49,12 @@ AVAILABLE_PRIORITIES = [
('1','Highest')
]
icon_lst = {
'form':'STOCK_NEW',
'tree':'STOCK_JUSTIFY_FILL',
'calendar':'STOCK_SELECT_COLOR'
}
class crm_case_section(osv.osv):
_name = "crm.case.section"
_description = "Case Section"
@ -81,6 +87,53 @@ class crm_case_section(osv.osv):
(_check_recursion, 'Error ! You can not create recursive sections.', ['parent_id'])
]
# Mainly used by the wizard
def menu_create_data(self, cr, uid, data, menu_lst, context):
menus = {}
menus[0] = data['menu_parent_id']
section = self.browse(cr, uid, data['section_id'], context)
for (index, mname, mdomain, latest, view_mode) in menu_lst:
if view_mode=='no':
menus[index] = data['menu_parent_id']
continue
view_mode = data['menu'+str(index)+'_option']
icon = icon_lst.get(view_mode.split(',')[0], 'STOCK_JUSTIFY_FILL')
menu_id=self.pool.get('ir.ui.menu').create(cr, uid, {
'name': data['menu'+str(index)],
'parent_id': menus[latest],
'icon': icon
})
menus[index] = menu_id
action_id = self.pool.get('ir.actions.act_window').create(cr,uid, {
'name': data['menu'+str(index)],
'res_model': 'crm.case',
'domain': mdomain.replace('SECTION_ID', str(data['section_id'])),
'view_type': 'form',
'view_mode': view_mode,
})
seq = 0
for mode in view_mode.split(','):
self.pool.get('ir.actions.act_window.view').create(cr, uid, {
'sequence': seq,
'view_id': data['view_'+mode],
'view_mode': mode,
'act_window_id': action_id,
'multi': True
})
seq+=1
self.pool.get('ir.values').create(cr, uid, {
'name': data['menu'+str(index)],
'key2': 'tree_but_open',
'model': 'ir.ui.menu',
'res_id': menu_id,
'value': 'ir.actions.act_window,%d'%action_id,
'object': True
})
return True
#
# Used when called from .XML file
#
def menu_create(self, cr, uid, ids, name, menu_parent_id=False, context={}):
menus = {}
menus[-1] = menu_parent_id
@ -273,7 +326,7 @@ class crm_case(osv.osv):
'som': fields.many2one('res.partner.som', 'State of Mind'),
'date': fields.datetime('Date'),
'create_date': fields.datetime('Created' ,readonly=True),
'date_deadline': fields.date('Deadline'),
'date_deadline': fields.datetime('Deadline'),
'date_closed': fields.datetime('Closed', readonly=True),
'canal_id': fields.many2one('res.partner.canal', 'Channel'),
'user_id': fields.many2one('res.users', 'User Responsible'),
@ -688,8 +741,15 @@ class crm_case_history(osv.osv):
_description = "Case history"
_order = "id desc"
_inherits = {'crm.case.log':"log_id"}
def _note_get(self, cursor, user, ids, name, arg, context=None):
res = {}
for hist in self.browse(cursor, user, ids, context or {}):
res[hist.id] = (hist.email or '/') + ' (' + str(hist.date) + ')\n'
res[hist.id] += (hist.description or '')
return res
_columns = {
'description': fields.text('Description'),
'note': fields.function(_note_get, method=True, string="Description", type="text"),
'email': fields.char('Email', size=84),
'log_id': fields.many2one('crm.case.log','Log'),
}

View File

@ -247,6 +247,20 @@
</field>
</record>
<record model="ir.ui.view" id="crm_case_calendar-view">
<field name="name">crm.case.calendar</field>
<field name="model">crm.case</field>
<field name="type">calendar</field>
<field name="arch" type="xml">
<calendar string="Cases" color="user_id" date_start="date" date_stop="date_deadline" day_length="12">
<field name="name"/>
<field name="partner_id"/>
<field name="state"/>
</calendar>
</field>
</record>
<record model="ir.ui.view" id="crm_case_tree-view">
<field name="name">crm.case.tree</field>
<field name="model">crm.case</field>
@ -302,14 +316,11 @@
<field name="description" colspan="4" nolabel="1" select="2"/>
</form>
<tree string="Communication history">
<field name="description"/>
<field name="email"/>
<field name="date"/>
<field name="note"/>
</tree>
</field>
<group col="2" colspan="2" expand="1">
<field name="canal_id"/>
<field name="som" select="2"/>
<button name="add_reply" string="Add Last Mail for Replying"
states="open" type="object" colspan="2"/>
<field name="description" colspan="2" select="2" nolabel="1"/>
@ -336,6 +347,7 @@
<field name="active" select="2"/>
<field name="email_cc" colspan="4"/>
<field name="categ_id" select="2" on_change="onchange_categ_id(categ_id)"/>
<field name="som" select="2"/>
<separator colspan="4" string="Dates"/>
<field name="create_date"/>
<field name="date_closed"/>

View File

@ -32,28 +32,102 @@ import osv
import pooler
section_form = '''<?xml version="1.0"?>
<form string="Create menus for cases">
<form string="Create Menus For Cases">
<separator string="Base Information" colspan="4"/>
<field name="menu_name"/>
<field name="menu_parent_id"/>
<field name="section_id"/>
<separator string="Select Views (empty for default)" colspan="4"/>
<field name="view_form"/>
<field name="view_tree"/>
<field name="view_calendar"/>
</form>'''
section_fields = {
'menu_name': {'string':'Menu base name', 'type':'char', 'required':True, 'size':64},
'menu_parent_id': {'string':'Parent menu', 'type':'many2one', 'relation':'ir.ui.menu'},
'menu_name': {'string':'Base Menu Name', 'type':'char', 'required':True, 'size':64},
'menu_parent_id': {'string':'Parent Menu', 'type':'many2one', 'relation':'ir.ui.menu', 'required':True},
'section_id': {'string':'Case Section', 'type':'many2one', 'relation':'crm.case.section', 'required':True},
'view_form': {'string':'Form View', 'type':'many2one', 'relation':'ir.ui.view', 'domain':[('type','=','form'),('model','=','crm.case')] },
'view_tree': {'string':'Tree View', 'type':'many2one', 'relation':'ir.ui.view', 'domain':[('type','=','tree'),('model','=','crm.case')] },
'view_calendar': {'string':'Calendar View', 'type':'many2one', 'relation':'ir.ui.view', 'domain':[('type','=','calendar'),('model','=','crm.case')] }
}
menu_lst = [
(1,'My ',"[('section_id','=',SECTION_ID),('user_id','=',uid)]", 0, 'form,tree'),
(2,'My Unclosed ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','<>','cancel'), ('state','<>','done')]", 1, 'tree,form'),
(5,'My Open ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','open')]", 2, 'tree,form'),
(6,'My Pending ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','pending')]", 2, 'tree,form'),
(7,'My Draft ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','draft')]", 2, 'tree,form'),
(3,'My Late ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('date_deadline','<=',time.strftime('%Y-%m-%d')), ('state','<>','cancel'), ('state','<>','done')]", 1, 'tree,form'),
(4,'My Canceled ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','cancel')]", 1, 'no'),
(8,'All ',"[('section_id','=',SECTION_ID),]", 0, 'tree,form'),
(9,'All Unassigned ',"[('section_id','=',SECTION_ID),('user_id','=',False)]", 8, 'no'),
(10,'All Late ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('date_deadline','<=',time.strftime('%Y-%m-%d')), ('state','<>','cancel'), ('state','<>','done')]", 8, 'no'),
(11,'All Canceled ',"[('section_id','=',SECTION_ID),('state','=','cancel')]", 8, 'no'),
(12,'All Unclosed ',"[('section_id','=',SECTION_ID),('state','<>','cancel'), ('state','<>','done')]", 8, 'tree,form'),
(13,'All Open ',"[('section_id','=',SECTION_ID),('state','=','open')]", 12, 'tree,form'),
(14,'All Pending ',"[('section_id','=',SECTION_ID),('state','=','pending')]", 12, 'tree,form'),
(15,'All Draft ',"[('section_id','=',SECTION_ID),('state','=','draft')]", 12, 'tree,form'),
(16,'All Unclosed and Unassigned ',"[('section_id','=',SECTION_ID),('user_id','=',False),('state','<>','cancel'),('state','<>','done')]", 12, 'no')
]
section_menu_form = '''<?xml version="1.0"?>
<form string="Created Menus" width="800">
<separator string="Update The Proposed Menus To Be Created" colspan="4"/>
''' + '\n'.join(map(lambda x: '\t<field name="menu%d" colspan="3"/> <field name="menu%d_option" nolabel="1"/>' % (x[0],x[0]), menu_lst)) + '''\n</form>'''
section_menu_fields = { }
for menu in menu_lst:
section_menu_fields['menu'+str(menu[0])] = {
'string': menu[1],
'type': 'char',
'size': 64,
'required': True
}
section_menu_fields['menu'+str(menu[0])+'_option'] = {
'string': menu[1],
'type': 'selection',
'selection': [
('no',"Don't Create"),
('form,tree','New Form'),
('form,tree,calendar','New With Calendar'),
('tree,form','List'),
('tree,form,calendar','List With Calendar'),
('calendar,tree,form','Calendar'),
],
'size': 64,
'required': True,
}
def case_menu_create(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
pool.get('crm.case.section').menu_create(cr, uid, [data['form']['section_id']], data['form']['menu_name'], data['form']['menu_parent_id'], context)
pool.get('crm.case.section').menu_create_data(cr, uid, data['form'], menu_lst, context)
return {}
def _menu_default(self, cr, uid, data, context):
result = {}
for menu in menu_lst:
result['menu'+str(menu[0])] = menu[1] + data['form']['menu_name']
result['menu'+str(menu[0])+'_option'] = menu[4]
return result
class wizard_section_menu_create(wizard.interface):
states = {
'init': {
'actions': [],
'result': {'type':'form', 'arch':section_form, 'fields':section_fields, 'state':[('end','Cancel'),('create','Create menu Entries')]}
'result': {'type':'form', 'arch':section_form, 'fields':section_fields, 'state':[('end','Cancel'),('design_menu','Create menu Entries')]}
},
'design_menu': {
'actions': [_menu_default],
'result': {
'type':'form',
'arch':section_menu_form,
'fields':section_menu_fields,
'state':[
('end','Cancel'),
('create','Create menu Entries')
]
}
},
'create': {
'actions': [case_menu_create],