使用OpenERP自定义模块开发的时候,你会发现,有一个uid(当前登录用户id)特别好用,不管是在xml的domain
条件表达式中,还是在类中,都能很方便的使用uid.有一段时间就一直在琢磨,这个uid 是什么时候赋值的。感觉是在
session中,一直没有找到。后来需要获取当前登录人的部门id,把department_id做成类似uid这么的变量,就爽了,就
太方便了。
注:Search 资料显示 ['&',('department', '=', user.context_department_id.id),('state', '=', 'pr_draft')]
提示context_department_id不存在,其实这是OE7.0之前的用法,6.0中有类似的方法定义:
def get_users_department(self, val):
dep = val.get('department')
fields = ['name']
data = [dep]
if not dep:
return False
return self.import_object(fields, data, 'hr.department', 'hr_department_user', dep)
def get_user_mapping(self):
return {
'model' : 'res.users',
'hook' : self.import_user,
'map' : {
'name': concat('first_name', 'last_name'),
'login': value('user_name', fallback='last_name'),
'context_lang' : 'context_lang',
'password' : 'password',
'.id' : '.id',
'context_department_id/id': self.get_users_department,
'user_email' : 'email1',
}
}
其实也不是那么神秘,当你实现了下面的步骤:
1) 在context中写入自己的东西(测试)
1.1) 定义一个扩展类,是函数字段
class extend_user(osv.osv):
_name = "res.users"
_inherit = ['res.users']
# 返回我的id
def _write_mine_id(self, cr, uid, ids, name, args, context=None):
result = dict.fromkeys(ids, 1024)
return result
_columns = {
'context_mine_id': fields.function( _write_mine_id,type="integer"),
}
extend_user()
1.2) 在Firefox的Debug下,看请求,奇迹发生了
说明: 不是当时的截图,应该是{"mine_id:": 1024}
1.3) 原理剖析
抽时间在做梳理了
2) 在context中写入当前登录人department_id
2.1) 修改上面的类文
class extend_user(osv.osv):
_name = "res.users"
_inherit = ['res.users']
# 获取用户关联的部门
def _get_self_department_ids(self, cr, uid, ids, name, args, context=None):
result = dict.fromkeys(ids, False)
emp = self.pool.get('hr.employee')
for id in ids:
emp_ids = emp.search(cr, uid, [('user_id', '=', id)], context=context)
emp = emp.browse(cr, uid, emp_ids[0], context=context)
result[id] = emp.department_id
return result
_columns = {
'context_department_id': fields.function(_get_self_department_ids,type="hr.department"),
}
extend_user()
2.2) 结果看上面的截图,出来了
2.3) 注意函数字段的类型是 type="hr.department",你没看错就是这个
2.4) 获取部门id另一种方法,职员同名存在问题
def get_current_user_department_id(self, cr, uid, ids, context=None):
list_resource_id = self.pool.get('resource.resource').search(cr, uid, [('user_id','=',uid)], context=context)
username = self.pool.get('resource.resource').browse(cr, uid, list_resource_id[0], context=context).name
list_emp_id = self.pool.get('hr.employee').search(cr, uid, [('name_related','=',username)], context=context)
depart_id = self.pool.get('hr.employee').browse(cr, uid, list_emp_id[0], context=context).department_id
return depart_id
注意:这个return 的depart_id 可不是integer类型,raise Exception(type(depart_id)) :
Exception: <class 'openerp.osv.orm.browse_record'>