有关记录规则设置的问题
-
在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过滤掉这条记录即可满足开发要求了.