diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py
index beb35ee38b2..0b061083060 100644
--- a/openerp/addons/base/module/module.py
+++ b/openerp/addons/base/module/module.py
@@ -80,6 +80,7 @@ class module_category(osv.osv):
'description' : fields.text("Description", translate=True),
'sequence' : fields.integer('Sequence'),
'visible' : fields.boolean('Visible'),
+ 'xml_id': fields.function(osv.osv.get_external_id, type='char', size=128, string="External ID"),
}
_order = 'name'
diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py
index f148813ae05..92aa8b1a4a2 100644
--- a/openerp/addons/base/res/res_users.py
+++ b/openerp/addons/base/res/res_users.py
@@ -753,18 +753,20 @@ class groups_view(osv.osv):
xml1, xml2 = [], []
xml1.append('' % _('Applications'))
for app, kind, gs in self.get_groups_by_application(cr, uid, context):
+ # hide groups in category 'Hidden' (except to group_no_one)
+ attrs = 'groups="base.group_no_one"' if app and app.xml_id == 'base.module_category_hidden' else ''
if kind == 'selection':
# application name with a selection field
field_name = name_selection_groups(map(int, gs))
- xml1.append('' % field_name)
+ xml1.append('' % (field_name, attrs))
xml1.append('')
else:
# application separator with boolean fields
app_name = app and app.name or _('Other')
- xml2.append('' % app_name)
+ xml2.append('' % (app_name, attrs))
for g in gs:
field_name = name_boolean_group(g.id)
- xml2.append('' % field_name)
+ xml2.append('' % (field_name, attrs))
view.write({'arch': xml % ('\n'.join(xml1), '\n'.join(xml2))})
return True