From 0849ba9d6fc5df0f8eea002c6a4ac2c09a0a19ac Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Wed, 5 Jan 2011 15:07:08 +0100 Subject: [PATCH] [ADD] ir.model : list of modules in which the object is defined [ADD] ir.model.fields : list of modules in which the field is defined [IMP] ir.model : aligned field form view with ir.model.fields [ADD] ir.model : list of views [ADD] ir.model : report "Model Overview" bzr revid: jba@openerp.com-20110105140708-qrby7d6trhjw7vs5 --- bin/addons/base/__openerp__.py | 1 + bin/addons/base/ir/ir.xml | 20 ++++++++-------- bin/addons/base/ir/ir_model.py | 24 +++++++++++++++++++- bin/addons/base/ir/report/ir_report.xml | 16 +++++++++++++ bin/addons/base/ir/report/modeloverview.sxw | Bin 0 -> 17797 bytes 5 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 bin/addons/base/ir/report/ir_report.xml create mode 100644 bin/addons/base/ir/report/modeloverview.sxw diff --git a/bin/addons/base/__openerp__.py b/bin/addons/base/__openerp__.py index bb419fc90d3..e15dabc42e7 100644 --- a/bin/addons/base/__openerp__.py +++ b/bin/addons/base/__openerp__.py @@ -43,6 +43,7 @@ 'ir/wizard/wizard_menu_view.xml', 'ir/ir.xml', 'ir/workflow/workflow_view.xml', + 'ir/report/ir_report.xml', 'module/module_view.xml', 'module/module_data.xml', 'module/module_report.xml', diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index 29a836892b5..e944747cfd3 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -967,6 +967,7 @@ + @@ -981,29 +982,26 @@
- - - - + + + + - - - - + @@ -1032,6 +1030,9 @@ + + + @@ -1094,7 +1095,7 @@ - + @@ -1113,6 +1114,7 @@ + diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py index 4dfe39a7762..ed43ce824a3 100644 --- a/bin/addons/base/ir/ir_model.py +++ b/bin/addons/base/ir/ir_model.py @@ -63,6 +63,18 @@ class ir_model(osv.osv): is_osv_mem = self._is_osv_memory(cr, uid, all_model_ids, 'osv_memory', arg=None, context=context) return [('id', 'in', [id for id in is_osv_mem if bool(is_osv_mem[id]) == value])] + def _in_modules(self, cr, uid, ids, field_name, arg, context=None): + res = osv.osv.get_xml_ids(self, cr, uid, ids) + for k,v in res.iteritems(): + res[k]=', '.join(map(lambda x: x.split('.')[0],v)) + return res + + def _view_ids(self, cr, uid, ids, field_name, arg, context=None): + models=self.browse(cr,uid,ids) + res={} + for model in models: + res[model.id]=self.pool.get("ir.ui.view").search(cr, uid, [('model', '=', model.name)]) + return res _columns = { 'name': fields.char('Object Name', size=64, translate=True, required=True), @@ -73,7 +85,9 @@ class ir_model(osv.osv): 'access_ids': fields.one2many('ir.model.access', 'model_id', 'Access'), 'osv_memory': fields.function(_is_osv_memory, method=True, string='In-memory model', type='boolean', fnct_search=_search_osv_memory, - help="Indicates whether this object model lives in memory only, i.e. is not persisted (osv.osv_memory)") + help="Indicates whether this object model lives in memory only, i.e. is not persisted (osv.osv_memory)"), + 'modules': fields.function(_in_modules, method=True, type='char', size=128, string='In modules', help='List of modules in which the object is defined'), + 'view_ids': fields.function(_view_ids, method=True, type='one2many', obj='ir.ui.view', string='Views'), } _defaults = { @@ -150,6 +164,13 @@ ir_model() class ir_model_fields(osv.osv): _name = 'ir.model.fields' _description = "Fields" + + def _in_modules(self, cr, uid, ids, field_name, arg, context=None): + res = osv.osv.get_xml_ids(self, cr, uid, ids) + for k,v in res.iteritems(): + res[k]=', '.join(map(lambda x: x.split('.')[0],v)) + return res + _columns = { 'name': fields.char('Name', required=True, size=64, select=1), 'model': fields.char('Object Name', size=64, required=True, select=1), @@ -170,6 +191,7 @@ class ir_model_fields(osv.osv): 'groups': fields.many2many('res.groups', 'ir_model_fields_group_rel', 'field_id', 'group_id', 'Groups'), 'view_load': fields.boolean('View Auto-Load'), 'selectable': fields.boolean('Selectable'), + 'modules': fields.function(_in_modules, method=True, type='char', size=128, string='In modules', help='List of modules in which the field is defined'), } _rec_name='field_description' _defaults = { diff --git a/bin/addons/base/ir/report/ir_report.xml b/bin/addons/base/ir/report/ir_report.xml new file mode 100644 index 00000000000..3d077f453c8 --- /dev/null +++ b/bin/addons/base/ir/report/ir_report.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/bin/addons/base/ir/report/modeloverview.sxw b/bin/addons/base/ir/report/modeloverview.sxw new file mode 100644 index 0000000000000000000000000000000000000000..ea0f4ce0dfa577029b0aeb12915f2070e44bc23f GIT binary patch literal 17797 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 h{A+0aD^2qKmw{GZ>J9WSGvwEw