From bf3d2cd284a2f2f7309bc14ff2945c03c237af40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 14 Mar 2012 15:26:05 +0100 Subject: [PATCH] [REF] Refactored base_needaction class. bzr revid: tde@openerp.com-20120314142605-hhii6p976zrdwmw3 --- openerp/addons/base/base_needaction.py | 108 ++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/base_needaction.py b/openerp/addons/base/base_needaction.py index eb953125cd4..20f32c947c2 100644 --- a/openerp/addons/base/base_needaction.py +++ b/openerp/addons/base/base_needaction.py @@ -22,6 +22,29 @@ from osv import osv, fields from tools.translate import _ +class base_needaction_users_rel(osv.osv): + ''' + base_needaction_users_rel holds the data related to the needaction + mechanism inside OpenERP. A needaction is characterized by: + - res_model: model of the followed objects + - res_id: ID of resource + - user_id: foreign key to the res.users table, to the user that + has to perform an action + ''' + + _name = 'base.needaction_users_rel' + _rec_name = 'id' + _order = 'res_model asc' + _columns = { + 'res_model': fields.char('Related Document Model', size=128, + select=1, required=True), + 'res_id': fields.integer('Related Document ID', + select=1, required=True), + 'user_id': fields.many2one('res.users', string='Related User ID', + ondelete='cascade', select=1, required=True), + } + + class base_needaction(osv.osv): '''Mixin class for object implementing the need action mechanism. @@ -44,20 +67,83 @@ class base_needaction(osv.osv): _name = 'base.needaction' _description = 'Need action mechanism' - def get_needaction_user_id(self, cr, uid, ids, name, arg, context=None): - result = dict.fromkeys[ids, False] - return result + #------------------------------------------------------ + # base_needaction_users_rel API + #------------------------------------------------------ + + def needaction_create(self, cr, uid, ids, user_ids, context=None): + if context is None: + context = {} + needact_rel_obj = self.pool.get('base.needaction_users_rel') + for id in ids: + for user_id in user_ids: + needact_rel_obj.create(cr, uid, {'res_model': self._name, 'res_id': id, 'user_id': user_id}, context=context) + return True + + def needaction_unlink_users(self, cr, uid, ids, context=None): + if context is None: + context = {} + needact_rel_obj = self.pool.get('base.needaction_users_rel') + to_del_ids = needact_rel_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)], context=context) + return needact_rel_obj.unlink(cr, uid, to_del_ids, context=context) + + def needaction_write_users(self, cr, uid, ids, user_ids, context=None): + if context is None: + context = {} + # unlink old records + self.needaction_unlink_users(cr, uid, ids, context=context) + # link new records + for res_id in ids: + self.needaction_create(cr, uid, ids, user_ids, context=context) + return True + + #------------------------------------------------------ + # Addon API + #------------------------------------------------------ - ''' Wrapper: in 6.1 the reference to a method is given to a function - field, not the function name. Inheritance is therefore not directly - possible.''' - def get_needaction_user_id_wrapper(self, cr, uid, ids, name, arg, context=None): - return self.get_needaction_user_id(cr, uid, ids, name, arg, context=context) + def get_needaction_user_ids(self, cr, uid, ids, context=None): + needact_rel_obj = self.pool.get('base.needaction_users_rel') + needact_rel_ids = needact_rel_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)], context=context) + needact_rel_objs = needact_rel_obj.read(cr, uid, needact_rel_ids, ['user_id'], context=context) + return [needact_rel_obj['user_id'][0] for needact_rel_obj in needact_rel_objs] + + def set_needaction_user_ids(self, cr, uid, ids, context=None): + result = dict.fromkeys(ids, []) + return result + + def write(self, cr, uid, ids, values, context=None): + if context is None: + context = {} + # get and update needaction_user_ids + needaction_user_ids = self.set_needaction_user_ids(cr, uid, ids, context=context) + for id in ids: + self.needaction_write_users(cr, uid, [id], needaction_user_ids[id], context=context) + # perform write + return super(base_needaction, self).write(cr, uid, ids, values, context=context) _columns = { - 'need_action_user_id': fields.function(get_needaction_user_id_wrapper, - type='many2one', relation='res.users', store=True, - select=1, string='User'), } + + + #------------------------------------------------------ + # General API + #------------------------------------------------------ + + def get_user_needaction_ids(self, cr, uid, user_id, offset=0, limit=None, order=None, count=False, context=None): + if context is None: + context = {} + needact_rel_obj = self.pool.get('base.needaction_users_rel') + search_res = needact_rel_obj.search(cr, uid, [('user_id', '=', user_id)], offset=offset, limit=limit, order=order, count=count, context=context) + return search_res + + def get_record_references(self, cr, uid, user_id, offset=0, limit=None, order=None, context=None): + if context is None: + context = {} + needact_rel_obj = self.pool.get('base.needaction_users_rel') + search_res = self.get_user_needaction_ids(cr, uid, user_id, offset=offset, limit=limit, order=order, context=context) + needact_objs = needact_rel_obj.browse(cr, uid, search_res, context=context) + record_references = [(needact_obj.res_model, needact_obj.res_id) for needact_obj in needact_objs] + return record_references + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: