跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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. 有关记录规则设置的问题

有关记录规则设置的问题

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

    在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过滤掉这条记录即可满足开发要求了.

    1 条回复 最后回复
    0
    • Z 离线
      Z 离线
      zopewind
      写于 最后由 编辑
      #2

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

      1 条回复 最后回复
      0
      • mrshellyM 离线
        mrshellyM 离线
        mrshelly
        写于 最后由 编辑
        #3

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

        1 条回复 最后回复
        0

        • 登录

        • 没有帐号? 注册

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