From cd8df58ba416852496493b67468a3dfa64f5884b Mon Sep 17 00:00:00 2001 From: ced <> Date: Fri, 19 Oct 2007 12:14:58 +0000 Subject: [PATCH] Improve ir.values - add view - allow to update the pickled value - add link from ir.ui.menu to action bzr revid: ced-4854bd92b7fb982545fc5e45102455f3a44ba1a5 --- bin/addons/base/ir/ir.xml | 51 +++++++++++++++++++++++++++++ bin/addons/base/ir/ir_ui_menu.py | 56 ++++++++++++++++++++++++++++++-- bin/addons/base/ir/ir_values.py | 31 ++++++++++++++++-- 3 files changed, 133 insertions(+), 5 deletions(-) diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index 51a0f313dd7..3410aa98163 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -1,6 +1,56 @@ + + + + + ir.values.form + ir.values + form + +
+ + + + + + + + + + + + +
+ + + ir.values.tree + ir.values + tree + + + + + + + + + + + + + + Values + ir.actions.act_window + ir.values + form + + + + + ========================================================== Sequences ========================================================== @@ -821,6 +871,7 @@ + diff --git a/bin/addons/base/ir/ir_ui_menu.py b/bin/addons/base/ir/ir_ui_menu.py index 319c3776216..bc9f59b5459 100644 --- a/bin/addons/base/ir/ir_ui_menu.py +++ b/bin/addons/base/ir/ir_ui_menu.py @@ -119,14 +119,64 @@ class ir_ui_menu(osv.osv): new_id = self.pool.get('ir.values').copy(cr, uid, iv.id, default={'res_id':res}, context=context) return res + def _action(self, cursor, user, ids, name, arg, context=None): + res = {} + values_obj = self.pool.get('ir.values') + value_ids = values_obj.search(cursor, user, [ + ('model', '=', self._name), ('key', '=', 'action'), + ('key2', '=', 'tree_but_open'), ('res_id', 'in', ids)], + context=context) + values_action = {} + for value in values_obj.browse(cursor, user, value_ids, + context=context): + values_action[value.res_id] = value.value + for menu_id in ids: + res[menu_id] = values_action.get(menu_id, False) + return res + + def _action_inv(self, cursor, user, menu_id, name, value, arg, context=None): + if context is None: + context = {} + ctx = context.copy() + if 'read_delta' in ctx: + del ctx['read_delta'] + values_obj = self.pool.get('ir.values') + values_ids = values_obj.search(cursor, user, [ + ('model', '=', self._name), ('key', '=', 'action'), + ('key2', '=', 'tree_but_open'), ('res_id', '=', menu_id)], + context=context) + if values_ids: + values_obj.write(cursor, user, values_ids[0], {'value': value}, + context=ctx) + else: + values_obj.create(cursor, user, { + 'name': 'Menuitem', + 'model': self._name, + 'value': value, + 'object': True, + 'key': 'action', + 'key2': 'tree_but_open', + 'res_id': menu_id, + }, context=ctx) + _columns = { 'name': fields.char('Menu', size=64, required=True, translate=True), 'sequence': fields.integer('Sequence'), 'child_id' : fields.one2many('ir.ui.menu', 'parent_id','Child ids'), 'parent_id': fields.many2one('ir.ui.menu', 'Parent Menu', select=True), - 'groups_id': many2many_unique('res.groups', 'ir_ui_menu_group_rel', 'menu_id', 'gid', 'Groups'), - 'complete_name': fields.function(_get_full_name, method=True, string='Complete Name', type='char', size=128), - 'icon': fields.selection(icons, 'Icon', size=64) + 'groups_id': many2many_unique('res.groups', 'ir_ui_menu_group_rel', + 'menu_id', 'gid', 'Groups'), + 'complete_name': fields.function(_get_full_name, method=True, + string='Complete Name', type='char', size=128), + 'icon': fields.selection(icons, 'Icon', size=64), + 'action': fields.function(_action, fnct_inv=_action_inv, + method=True, type='reference', string='Action', + selection=[ + ('ir.actions.report.custom', 'ir.actions.report.custom'), + ('ir.actions.report.xml', 'ir.actions.report.xml'), + ('ir.actions.act_window', 'ir.actions.act_window'), + ('ir.actions.wizard', 'ir.actions.wizard'), + ]), } _defaults = { 'icon' : lambda *a: 'STOCK_OPEN', diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index 8d68ca426a2..3a35f97254d 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -31,14 +31,41 @@ import pickle class ir_values(osv.osv): _name = 'ir.values' + + def _value_unpickle(self, cursor, user, ids, name, arg, context=None): + res = {} + for report in self.browse(cursor, user, ids, context=context): + value = report[name[:-9]] + if not report.object and value: + try: + value = str(pickle.loads(value)) + except: + pass + res[report.id] = value + return res + + def _value_pickle(self, cursor, user, id, name, value, arg, context=None): + if context is None: + context = {} + ctx = context.copy() + if 'read_delta' in ctx: + del ctx['read_delta'] + if not self.browse(cursor, user, id, context=context).object: + value = pickle.dumps(eval(value)) + self.write(cursor, user, id, {name[:-9]: value}, context=ctx) + _columns = { 'name': fields.char('Name', size=128), - 'model': fields.char('Name', size=128), + 'model': fields.char('Model', size=128), 'value': fields.text('Value'), + 'value_unpickle': fields.function(_value_unpickle, fnct_inv=_value_pickle, + method=True, type='text', string='Value'), 'object': fields.boolean('Is Object'), - 'key': fields.char('Name', size=128), + 'key': fields.char('Type', size=128), 'key2': fields.char('Value', size=256), 'meta': fields.text('Meta Datas'), + 'meta_unpickle': fields.function(_value_unpickle, fnct_inv=_value_pickle, + method=True, type='text', string='Meta Datas'), 'res_id': fields.integer('Resource ID'), 'user_id': fields.many2one('res.users', 'User', ondelete='cascade'), 'company_id': fields.many2one('res.company', 'Company')