[IMP] add functional boolean field to create/remove menu action

bzr revid: rco@openerp.com-20110420134531-s2jp5yfmoa3cwok1
This commit is contained in:
Raphael Collet 2011-04-20 15:45:31 +02:00
parent c3c735400f
commit 1a29e6c9d6
2 changed files with 73 additions and 36 deletions

View File

@ -46,7 +46,7 @@ class portal(osv.osv):
help=_('Widgets assigned to portal users')),
}
def copy(self, cr, uid, id, values={}, context=None):
def copy(self, cr, uid, id, values, context=None):
""" override copy(): menu_action_id must be different """
values['menu_action_id'] = None
return super(portal, self).copy(cr, uid, id, values, context)
@ -56,17 +56,15 @@ class portal(osv.osv):
if context is None:
context = {}
# first create the 'menu_action_id'
assert not values.get('menu_action_id')
values['menu_action_id'] = self._create_menu_action(cr, uid, values, context)
# create portal (admin should not be included)
context['noadmin'] = True
portal_id = super(portal, self).create(cr, uid, values, context)
# assign menu action and widgets to users
self._assign_menu_to_users(cr, uid, [portal_id], context)
self._assign_widgets_to_users(cr, uid, [portal_id], context)
if values.get('users') or values.get('menu_action_id'):
self._assign_menu_to_users(cr, uid, [portal_id], context)
if values.get('users') or values.get('widget_ids'):
self._assign_widgets_to_users(cr, uid, [portal_id], context)
return portal_id
@ -76,33 +74,40 @@ class portal(osv.osv):
super(portal, self).write(cr, uid, ids, values, context)
# assign menu action and widgets to users
self._assign_menu_to_users(cr, uid, ids, context)
self._assign_widgets_to_users(cr, uid, ids, context)
if values.get('users') or values.get('menu_action_id'):
self._assign_menu_to_users(cr, uid, ids, context)
if values.get('users') or values.get('widget_ids'):
self._assign_widgets_to_users(cr, uid, ids, context)
# if parent_menu_id has changed, apply the change on menu_action_id
if 'parent_menu_id' in values:
act_window_obj = self.pool.get('ir.actions.act_window')
portals = self.browse(cr, uid, ids, context)
action_ids = [p.menu_action_id.id for p in portals]
action_values = {'domain': [('parent_id', '=', values['parent_menu_id'])]}
act_window_obj.write(cr, uid, action_ids, action_values, context)
action_ids = [p.menu_action_id.id for p in portals if p.menu_action_id]
if action_ids:
action_values = {'domain': [('parent_id', '=', values['parent_menu_id'])]}
act_window_obj.write(cr, uid, action_ids, action_values, context)
return True
def _create_menu_action(self, cr, uid, values, context=None):
# create a menu action that opens the menu items below parent_menu_id
groups_obj = self.pool.get('res.groups')
actions_obj = self.pool.get('ir.actions.act_window')
action_values = {
'name': values['name'] + ' Menu',
'type': 'ir.actions.act_window',
'usage': 'menu',
'res_model': 'ir.ui.menu',
'view_type': 'tree',
'view_id': self._res_xml_id(cr, uid, 'base', 'view_menu'),
'domain': [('parent_id', '=', values.get('parent_menu_id', False))],
}
return actions_obj.create(cr, uid, action_values, context)
def create_menu_action(self, cr, uid, id, context=None):
""" create, if necessary, a menu action that opens the menu items below
parent_menu_id """
p = self.browse(cr, uid, id, context)
if not p.menu_action_id:
actions_obj = self.pool.get('ir.actions.act_window')
parent_id = p.parent_menu_id.id if p.parent_menu_id else False
action_values = {
'name': p.name + ' Menu',
'type': 'ir.actions.act_window',
'usage': 'menu',
'res_model': 'ir.ui.menu',
'view_type': 'tree',
'view_id': self._res_xml_id(cr, uid, 'base', 'view_menu'),
'domain': [('parent_id', '=', parent_id)],
}
action_id = actions_obj.create(cr, uid, action_values, context)
self.write(cr, uid, [id], {'menu_action_id': action_id}, context)
def do_create_menu(self, cr, uid, ids, context=None):
""" create a parent menu for the given portals """
@ -112,7 +117,7 @@ class portal(osv.osv):
for p in self.browse(cr, uid, ids, context):
# create a menuitem under 'portal.portal_menu'
menu_values = {
'name': p.group_id.name + ' Menu',
'name': p.name + ' Menu',
'parent_id': menu_root,
'groups_id': [(6, 0, [p.group_id.id])],
}
@ -126,8 +131,9 @@ class portal(osv.osv):
""" assign portal menu action to users for the given portal ids """
user_obj = self.pool.get('res.users')
for p in self.browse(cr, uid, ids, context):
user_values = {'menu_id': p.menu_action_id.id}
user_obj.write(cr, uid, [u.id for u in p.users], user_values, context)
if p.menu_action_id:
user_values = {'menu_id': p.menu_action_id.id}
user_obj.write(cr, uid, [u.id for u in p.users], user_values, context)
def _assign_widgets_to_users(self, cr, uid, ids, context=None):
""" assign portal widgets to users for the given portal ids """
@ -150,6 +156,38 @@ portal()
class portal_override_menu(osv.osv):
"""
extend res.portal with a boolean field 'Override Users Menu', that
triggers the creation or removal of menu_action_id
"""
_name = 'res.portal'
_inherit = 'res.portal'
def _get_override_menu(self, cr, uid, ids, field_name, arg, context=None):
assert field_name == 'override_menu'
result = {}
for p in self.browse(cr, uid, ids, context):
result[p.id] = bool(p.menu_action_id)
return result
def _set_override_menu(self, cr, uid, id, field_name, field_value, arg, context=None):
assert field_name == 'override_menu'
if field_value:
self.create_menu_action(cr, uid, id, context)
else:
self.write(cr, uid, [id], {'menu_action_id': False}, context)
_columns = {
'override_menu': fields.function(
_get_override_menu, fnct_inv=_set_override_menu,
type='boolean', method=True, string='Override Users Menu Action'),
}
portal_override_menu()
class portal_widget(osv.osv):
"""
Similar to res.widget.user (res_widget.py), but with a portal instead.

View File

@ -42,13 +42,12 @@ the portal's users.
<field name="arch" type="xml">
<page string="Users" position="before">
<page string="Portal">
<group colspan="2" col="2">
<separator string="Portal Menu" colspan="2"/>
<group colspan="2" col="2">
<field name="menu_action_id"/>
<field name="parent_menu_id"
context="{'ir.ui.menu.full_list': True}"/>
</group>
<group colspan="2" col="4">
<separator string="Portal Menu" colspan="4"/>
<field name="menu_action_id"/>
<field name="override_menu"/>
<field name="parent_menu_id"
context="{'ir.ui.menu.full_list': True}"/>
<button name="do_create_menu" type="object"
string="Create Parent Menu"/>
</group>