Odoo中文网|Odoo实施培训

 找回密码
 立即注册
搜索
热搜: Odoo OpenERP 实施
查看: 6699|回复: 0
打印 上一主题 下一主题

odoo|openerp中查不到未激活的用户的解决办法(转)

[复制链接]

15

主题

35

帖子

140

积分

版主

Rank: 7Rank: 7Rank: 7

积分
140
跳转到指定楼层
楼主
发表于 2015-8-23 21:18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经常遇到客户问下面的问题:administrator将一位休长假的员工设置成了未激活状态。现在这名员工上班了,需要恢复成激活状态,但是在用户列表中找不到了。 最后直接在数据库中,更改记录的active字段解决了问题。而这种直接修改底层数据的操作可能是内控程序所不允许的。
看orm中实现的search方法了
def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
             return self._search(cr, user, args, offset=offset, limit=limit
                                 order=order, context=context, count=count)
  它直接调用了_search
  def _search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False, access_rights_uid=None):
               .....
               query = self._where_calc(cr, user, args, context=context)
               self._apply_ir_rules(cr, user, query, 'read', context=context)
               order_by = self._generate_order_by(order, query)
               from_clause, where_clause, where_clause_params = query.get_sql()
               ....
               cr.execute('SELECT "%s".id FROM ' %
                    self._table + from_clause + where_str + order_by + limit_str + offset_str,
                    where_clause_params)

我们看到,是_where_calc 生成了查询条件query
def _where_calc(self, cr, user, domain, active_test=True, context=None):
            ....
            if 'active' in self._all_columns and (active_test and context.get('active_test', True)):
                    if domain:
                        if not any(item[0] == 'active' for item in domain):
                            domain.insert(0, ('active', '=', 1))
                    else:
                        domain = [('active', '=', 1)]
           ....
在这个长长的if语句中, 有连串的and条件
--- 本模型中有active字段, res.users符合这个条件,
--- active_test:_search 调用_where_calc时未设置这个参数, 默认值是True, 这个条件也符合
--- 取上下文'active_test', 因为在用户列表的活动窗口中没有给出这个上下文, context.get指定了True
因此这个长长的if语句的条件是满足的, 结果就是在domain中增加了active=1, (这还有一个限制,domain中没有指定active, 即 if not any(item[0] == 'active' for item in domain)

到此为止, 我们找到了原因, 也就能找到了解决问题的方法
-- 修改act-window, 在上下文中指定 "active_test":False 或
-- 在搜索条件中指定active=False  (它只能显示未激活的用户, 并且active可能会被翻译成别的名字)

最后要说的是, 除了res.users, 所有带有active字段的, 都有同样的现象。                                

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|技术支持|开发手册|Odoo中文网-远鼎旗下odoo培训网站 ( 苏ICP备15039516号 )

GMT+8, 2024-5-3 01:34 , Processed in 0.014082 second(s), 9 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表