跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. self.env.user 为什么总是指向超级用户?

self.env.user 为什么总是指向超级用户?

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
13 帖子 3 发布者 2.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 皓 离线
    皓 离线
    皓羽如风
    写于 最后由 编辑
    #3

    谢谢你,前边没有地方用sudo(),uid值也是超级用户的

    1 条回复 最后回复
    0
    • digitalsatoriD 离线
      digitalsatoriD 离线
      digitalsatori 管理员
      写于 最后由 编辑
      #4

      把你的代码show一下吧

      【上海先安科技】(tony AT openerp.cn)

      皓 1 条回复 最后回复
      0
      • 皓 离线
        皓 离线
        皓羽如风
        在 回复了 digitalsatori 最后由 编辑
        #5

        @digitalsatori 0_1532586491915_uid问题.png

        1 条回复 最后回复
        0
        • digitalsatoriD 离线
          digitalsatoriD 离线
          digitalsatori 管理员
          写于 最后由 编辑
          #6

          代码能贴全点吗?哪里调用了这个方法,这个方法对应的类定义?另外你用的Odoo的版本号?调试的打印结果是什么?

          【上海先安科技】(tony AT openerp.cn)

          1 条回复 最后回复
          0
          • 皓 离线
            皓 离线
            皓羽如风
            写于 最后由 皓羽如风 编辑
            #7

            背景是我添加了一个布尔类型的can_write计算字段,用于判断当前用户是否有权限填写某项目。这个方法在model中只有字段里compute处有调用,即:
            can_write = fields.Boolean(compute='_can_write', store=False, readonly=True)
            我用的odoo版本是11版的。
            没有报错信息,只是不能输入(即没有写如权限),即这个方法中,state in ['apply', 'partner']时,can_write判断为false,我print输出了self.env.user.employee_ids[0].id 和self.parent_id.id, 发现确实不一致,前者始终指向admin, 包括self.env.uid也是如此。

            1 条回复 最后回复
            0
            • digitalsatoriD 离线
              digitalsatoriD 离线
              digitalsatori 管理员
              写于 最后由 digitalsatori 编辑
              #8

              可以推断你这个计算字段是定义在hr.employee对象上的。

              你在elif的判断条件里有一个错误:
              self.env.user.employee_ids[0].id == self.parent_id
              应该是:
              self.env.user.employee_ids[0].id == self.parent_id.id

              self.env.user.employee_ids[0].id 和self.parent_id.id, 发现确实不一致,前者始终指向admin, 包括self.env.uid也是如此。

              好象得不出当前user总是root user的结论啊。前者是指self.env.user.employee_ids[0].id 吧?这个是employee的id

              另外,这样的判断在碰到没有关联Employee的用户时,系统直接就报错了。

              【上海先安科技】(tony AT openerp.cn)

              1 条回复 最后回复
              0
              • 皓 离线
                皓 离线
                皓羽如风
                写于 最后由 编辑
                #9

                你说的elif里的错误已经改了,问题不出现在那,理论上self.env.user.employee_ids[0].id 确实应该指向当前登录用户的id,包括self.env.uid都应当指向当前登录用户的employee_id,但是print输出的全部为1,我的数据库里指向了admin;
                你说的情况确实可能存在,但当时测得时候,出问题的用户在hr_employee表中是有数据的,同一models表中其他位置获取到的居然是没有问题的。

                1 条回复 最后回复
                0
                • digitalsatoriD 离线
                  digitalsatoriD 离线
                  digitalsatori 管理员
                  写于 最后由 编辑
                  #10

                  @皓羽如风
                  这么说吧,你几乎不必怀疑Odoo会把self.env.user会固定为root user,否则你就发现了一个天大的安全漏洞了。问题一定是在定制的部分。

                  你没有完整贴你的定制代码,我们很难猜测。

                  就是你贴出的那部分代码里还有问题(虽然跟你的超级用户的结论不一定相关):

                  你的_can_write函数似乎只处理单例的情况。更合理的应该是放在一个循环里:

                  for employee in self:
                  
                  

                  【上海先安科技】(tony AT openerp.cn)

                  皓 1 条回复 最后回复
                  0
                  • S 离线
                    S 离线
                    Siyuan
                    写于 最后由 编辑
                    #11

                    看下 self._context 里 uid 的值,

                    以及 self._uid 的值,

                    不是 self.env 里面的uid

                    1 条回复 最后回复
                    0
                    • digitalsatoriD 离线
                      digitalsatoriD 离线
                      digitalsatori 管理员
                      写于 最后由 digitalsatori 编辑
                      #12

                      self._uid和self.env.uid是一回事, 参见models.py

                          _cr = property(lambda self: self.env.cr)
                          _uid = property(lambda self: self.env.uid)
                          _context = property(lambda self: self.env.context)
                      

                      他们默认的情况下跟session context中的uid都是当前登录用户, 但是我们是可以通过with_env方法来改变环境用户的, 比如:

                      print(self.env.uid) --> 1
                      self.with_env(self.env(user=5))
                      print(self.env.uid) --> 5
                      

                      【上海先安科技】(tony AT openerp.cn)

                      1 条回复 最后回复
                      0
                      • 皓 离线
                        皓 离线
                        皓羽如风
                        在 回复了 digitalsatori 最后由 编辑
                        #13

                        @digitalsatori 这个我是了解的,我有在其他地方print输出测试过,所以了解。_can_write函数本身就是针对单例情况的,嗯,我考虑一下,看看怎么改合适。

                        1 条回复 最后回复
                        0

                        • 登录

                        • 没有帐号? 注册

                        • 登录或注册以进行搜索。
                        • 第一个帖子
                          最后一个帖子
                        0
                        • 版块
                        • 标签
                        • 热门
                        • 用户
                        • 群组