使用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中有类似的方法定义:

  1. def get_users_department(self, val):
  2. dep = val.get('department')
  3. fields = ['name']
  4. data = [dep]
  5. if not dep:
  6. return False
  7. return self.import_object(fields, data, 'hr.department', 'hr_department_user', dep)
  8. def get_user_mapping(self):
  9. return {
  10. 'model' : 'res.users',
  11. 'hook' : self.import_user,
  12. 'map' : {
  13. 'name': concat('first_name', 'last_name'),
  14. 'login': value('user_name', fallback='last_name'),
  15. 'context_lang' : 'context_lang',
  16. 'password' : 'password',
  17. '.id' : '.id',
  18. 'context_department_id/id': self.get_users_department,
  19. 'user_email' : 'email1',
  20. }
  21. }

其实也不是那么神秘,当你实现了下面的步骤:

1)  在context中写入自己的东西(测试)

1.1) 定义一个扩展类,是函数字段

  1. class extend_user(osv.osv):
  2. _name = "res.users"
  3. _inherit = ['res.users']
  4. # 返回我的id
  5. def _write_mine_id(self, cr, uid, ids, name, args, context=None):
  6. result =  dict.fromkeys(ids, 1024)
  7. return result
  8. _columns = {
  9. 'context_mine_id': fields.function( _write_mine_id,type="integer"),
  10. }
  11. extend_user()

1.2)  在Firefox的Debug下,看请求,奇迹发生了

说明:  不是当时的截图,应该是{"mine_id:": 1024}

1.3)  原理剖析

抽时间在做梳理了

2)  在context中写入当前登录人department_id

2.1)  修改上面的类文

  1. class extend_user(osv.osv):
  2. _name = "res.users"
  3. _inherit = ['res.users']
  4. # 获取用户关联的部门
  5. def _get_self_department_ids(self, cr, uid, ids, name, args, context=None):
  6. result = dict.fromkeys(ids, False)
  7. emp = self.pool.get('hr.employee')
  8. for id in ids:
  9. emp_ids = emp.search(cr, uid, [('user_id', '=', id)], context=context)
  10. emp = emp.browse(cr, uid, emp_ids[0], context=context)
  11. result[id] = emp.department_id
  12. return result
  13. _columns = {
  14. 'context_department_id': fields.function(_get_self_department_ids,type="hr.department"),
  15. }
  16. extend_user()

2.2)  结果看上面的截图,出来了

2.3)  注意函数字段的类型是  type="hr.department",你没看错就是这个

2.4) 获取部门id另一种方法,职员同名存在问题

  1. def get_current_user_department_id(self, cr, uid, ids, context=None):
  2. list_resource_id = self.pool.get('resource.resource').search(cr, uid, [('user_id','=',uid)], context=context)
  3. username = self.pool.get('resource.resource').browse(cr, uid, list_resource_id[0], context=context).name
  4. list_emp_id = self.pool.get('hr.employee').search(cr, uid, [('name_related','=',username)], context=context)
  5. depart_id = self.pool.get('hr.employee').browse(cr, uid, list_emp_id[0], context=context).department_id
  6. return depart_id

注意:这个return 的depart_id 可不是integer类型,raise Exception(type(depart_id))  :

Exception: <class 'openerp.osv.orm.browse_record'>

raise osv.except_osv(_("test"), _(depart_id))

OpenERP 在context中写自己的部门ID的更多相关文章

  1. 关于如何在其他包中写controller和简单介绍@SpringBootApplication

    本文参考博客:https://blog.csdn.net/u013473691/article/details/52353923 关于@Configuration和@Bean参考博客:https:// ...

  2. 在mybatis中写sql语句的一些体会

    本文会使用一个案例,就mybatis的一些基础语法进行讲解.案例中使用到的数据库表和对象如下: article表:这个表存放的是文章的基础信息 -- ------------------------- ...

  3. 一种获取context中keys和values的高效方法 | golang

    我们知道,在 golang 中的 context 是一个非常重要的包,保存了代码活动的上下文.我们经常使用 WithValue() 这个方法,来往 context 中 传递一些 key value 数 ...

  4. x01.os.12: 在 windows 中写 OS

    在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...

  5. oracle调用java方法的例子(下面所有代码都是在sql/plus中写)

    在Oracle中调用Java程序,注意:java方法必须是static类型的,如果想在JAVA中使用system.out/err输出log. 需要在oracle 中执行"call dbms_ ...

  6. 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能

    在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...

  7. python中写shell(转)

    python中写shell,亲测可用,转自stackoverflow To run a bash script, copy from stackoverflow def run_script(scri ...

  8. css笔记——关于css中写上charset “utf-8”

    当css文件中写上 charset "utf-8" 时需要将body和html的样式分开写 例如: html,body{margin:0;padding:0;font-family ...

  9. 用RelativeLayout布局可以在imageview中写上文字

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

随机推荐

  1. Java学习笔记_22_Set接口的实现类

    22.Set接口的实现类: Set接口存放的元素是无序的且不包括反复元素. 1>实现类HashSet: HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到.HashSet不 ...

  2. Bandwagon Host – 64M内存 1.5G硬盘 100G流量 年3.99美金

    BandwagonHost(习惯称作搬瓦工),属于IT7公司旗下的产品,搬瓦工虽然是新起的商家, 但是有实力雄厚的公司背景在一定程度上还是可以放心使用的. 很多用户在选择这款低价VPS的时候都担心是否 ...

  3. hdu1238 Substrings (暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=1238 Substrings Time Limit : 2000/1000ms (Java/Other)   Me ...

  4. 探究Linux下参数传递及查看和修改方法

    http://m.blog.csdn.net/blog/moonvs2010/11392959

  5. ios 重用UI部分代码的好方法(再也不用为局部变量的命名而烦恼啦!)

    重用控件类代码的一个非常好的解决方案:所有一样的控件其名字均用同样的一个名字.只是在最后赋值的时候,将创建好的控件赋给我们需要用到的那个控件. - (id)initWithFrame:(CGRect) ...

  6. 转 Objective-C中不同方式实现锁(一)

    为什么需要使用锁,当然熟悉多线程的你,自然不会对它觉得陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? 今天一起来探讨一下Objective-C中几种不同方式实现的锁,在这 ...

  7. 学习Android Studio里的Gradle

    一直听说Gradle很强大,只是偶尔用Android Studio创建Demo的时候看到他一次,今天抽个时间完整记录一下. 1.gradle位置 Android Studio项目创建好之后,默认有3个 ...

  8. Oracle WIHT AS 用法

    1.with table as 相当于建个临时表(用于一个语句中某些中间结果放在临时表空间的SQL语句),Oracle 9i 新增WITH语法,可以将查询中的子查询命名,放到SELECT语句的最前面. ...

  9. Android Protobuf应用及原理

    前言 之前一直忙于移动端日志SDK Trojan的开源工作,已十分稳定地运行在饿了么团队App中,集成了日志加密和解密功能.哎呀,允许我卖个狗皮膏药,不用不知道,用了就知道,从此爱不释手,Trojan ...

  10. C语言:通过指针对字符串进行拼接

    // //  main.c //  Pointer_stringcat // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. ...