Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

有关记录规则设置的问题



  • 在OE中试着做了一个新增客户信息维护的开发项目,新建一个对象,该对象从res_partner继承而来,新对象中增加了一个部门编号字段department_id,该字段与hr_department是many2one关系,同时完成相关代码的开发与form的设计,还完成了报表的设计工作,设置了记录规则,菜单,从开发到完成一直使用admin用户登录,一切正常顺利,点击菜单,录入数据,打开报表很顺利.问题就从新建不同用户组和用户开始,用新建的用户登录后(该用于属于一个新建组中,该组的记录规则为[('department_id','child_of',[user.context_department_id.id])],该规则用于res.partner对象.打开报表时系统提示如下:

    访问错误

    访问规则禁止对已删除的文件执行以下操作,(操作:读取,单据类型:Partner).

    后把该用户附于和admin相同的组选项也不行.问题依就.后来考虑到提示窗口中有"访问规则"的提示,怀疑是不是记录规则和什么冲突了,进一步跟踪代码发现系统会从res_partner表中读取一条与res_company表中公司名称相同的"客户"记录,在读取这条记录时会把规则(('department_id','child_of',[user.context_department_id.id])]加在SQL语句后面并用and 连接,这时附加了这些条件的SQL语句是无法返回一个结集的,这时系统就会显示提示窗口,系统代码如下:
                query = 'SELECT %s FROM %s WHERE %s.id IN %%s' % (select_fields, ','.join(tables), self.table)
                if rule_clause:
                    query += " AND " + (' OR '.join(rule_clause))
                query += " ORDER BY " + order_by
                for sub_ids in cr.split_for_in_conditions(ids):
                    if rule_clause:
                        cr.execute(query, [tuple(sub_ids)] + rule_params)
                        if cr.rowcount != len(sub_ids):
                            raise except_orm(
    ('AccessError'),
                                            _('Operation prohibited by access rules, or performed on an already deleted document (Operation: read, Document type: %s).')
                                            % (self._description,))
                    else:
                        cr.execute(query, (tuple(sub_ids),))
                    res.extend(cr.dictfetchall())
    发现问题的原因所在了,解决问题就好办了,直接修改与该新建用户对应的记录规则为['|',('id','=','user.company_id.partner_id.id),('department_id','child_of',[user.context_department_id.id])],问题得以解决,爽!
    在OE中,新建一个数据库(也可以称为帐套)并初始化时,res_company表中会新建一个公司记录,同时在res_partner表中也会新增一条与公司名称相同的记录,就是说这个公司是它自己的商业伙伴关系,只不过这个partner即不是customer,也不是supplier,同时,如果新建一个用户时会默认关联到res_company中的公司记录上,而且res_company中这个公司记录与res_partner中的partner记录是通过many2one关联的.所以要在记录规则中增加('id','=','user.company_id.partner_id.id)这个条件,用于读取最顶层公司的记录,然后在视图文件中用domain过滤掉这条记录即可满足开发要求了.



  • 抱歉,'user.company_id.partner_id.id前面多了一个引号,正确的记录规则为['|',('id','=',user.company_id.partner_id.id),('department_id','child_of',[user.context_department_id.id])]



  • 学习.... 赞一个.... 建议给贴子加上标签 以便检索..


Log in to reply