如何使用 current_user 字段进行过滤?
How to filter with the current_user fields?
我将此添加到 res.users
模型中:
class res_users(osv.osv):
_inherit = 'res.users'
_columns = {
'por_sucursal': fields.boolean('Por Sucursal', help="Es por Sucursal"),
'sucursal_u' : fields.many2one('sucursales', 'Sucursal', help="Selecciona la sucursal"),
}
_defaults = {
'por_sucursal': False,
}
res_users()
我也有型号ordenes.orden
:
class ordenes_orden(osv.Model):
_name = 'ordenes.orden'
_description = 'Ordenes de servicio'
_columns = {
'sucursal' : fields.many2one('sucursales', 'Sucursal', help="Selecciona la sucursal", required= True),
}
ordenes_orden()
模型sucursales
来自哪里:
class sucursales(osv.Model):
_name = 'sucursales'
_description = 'Sucursales de la empresa'
_columns = {
'name': fields.char('Sucursal', size=50, help="Sucursal"),
}
sucursales()
最后我也添加了这个 class:
class ordenes(osv.Model):
_name = 'ordenes.orden'
_inherit = 'ordenes.orden'
def dame_sucursal(self, cr, uid, ids, field, arg, context=None):
res = {}
for obj in self.browse(cr, uid, ids, context=context):
res[obj.id] = False
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
if user and user.sucursal_u and user.por_sucursal:
res[obj.id] = user.sucursal_u.id
return res
_columns = {
'name_suc': fields.function(dame_sucursal, type='many2one', store= True,
readonly = True, relation='sucursales')
}
ordenes()
所以我想从 sucursal 中过滤掉树视图中等于 current_user 的 sucursal 的所有订单。它工作正常,但只是第一次。如果我更改当前用户的 sucursal,函数字段不会更新。这是我的树视图:
<record id="open_view_ordenes_sucursales" model="ir.actions.act_window">
<field name="name">Ordenes</field>
<field name="res_model">ordenes.orden</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('sucursal','=','name_suc'),('state', 'not in', ('done','cancel'))]</field>
<field name="view_id" ref="x_sucursal_view_tree"/>
</record>
您的代码无法运行,因为您试图将当前用户的 succursal
存储在 ordenes.orden
记录中 - 这是不可能的,因为多个用户可能同时搜索订单。
您在树视图中使用的 domain
表达式也不起作用:('sucursal','=','name_suc')
将仅显示 sucursal 完全命名为 "name_suc" 的订单 - 它与name_suc
字段。每个领域术语的右侧是一个静态文字值。您可以在 Odoo 文档中阅读 more about domains。
但是有一个更简单的方法来做你想做的事,假设你的 succursales 应该类似于内置的 company Odoo 的概念;您应该使用类似的技术来过滤记录:每条记录的安全记录规则 (ir.rule
)。
尝试以下操作:
- 删除您订单中无用的
name_suc
列和相关域
为具有以下域值的 ordenes.orden
模型创建一个 record rule (ir.rule
):[('sucursal', '=', user.sucursal.id)]
。您可以在用户界面中进行测试,或者在模块的 XML 数据中创建它:
<record id="ordenes_sucursales_rule" model="ir.rule">
<field name="name">Per sucursal rule</field>
<field name="model_id" ref="model_ordenes_orden"/>
<field name="domain_force">[('sucursal', '=', user.sucursal_u.id)]
</field>
</record>
这将自动根据各地用户的sucursal过滤订单,除了管理员帐户(ID 1)不受记录规则限制。
如果你也想让用户看到没有sucursal的订单,你可以修改规则如下:
<record id="ordenes_sucursales_rule" model="ir.rule">
<field name="name">Per sucursal rule</field>
<field name="model_id" ref="model_ordenes_orden"/>
<field name="domain_force">['|', ('sucursal', '=', False),
('sucursal', '=', user.sucursal_u.id)]
</field>
</record>
假设您在 ordenes.orden
上有一个 sucursal
字段,即 many2one
到 sucursales
。
感谢 Odony
<record id="ordenes_sucursales_rule" model="ir.rule">
<field name="name">Per sucursal rule</field>
<field name="model_id" ref="model_ordenes_orden"/>
<field name="groups" eval="[(4,ref('group_sucursales'))]"></field>
<field name="domain_force">[('sucursal','=',user.sucursal_u.id)]</field>
<field eval="1" name="perm_write"/>
<field eval="1" name="perm_read"/>
<field eval="1" name="perm_create"/>
</record>
我将此添加到 res.users
模型中:
class res_users(osv.osv):
_inherit = 'res.users'
_columns = {
'por_sucursal': fields.boolean('Por Sucursal', help="Es por Sucursal"),
'sucursal_u' : fields.many2one('sucursales', 'Sucursal', help="Selecciona la sucursal"),
}
_defaults = {
'por_sucursal': False,
}
res_users()
我也有型号ordenes.orden
:
class ordenes_orden(osv.Model):
_name = 'ordenes.orden'
_description = 'Ordenes de servicio'
_columns = {
'sucursal' : fields.many2one('sucursales', 'Sucursal', help="Selecciona la sucursal", required= True),
}
ordenes_orden()
模型sucursales
来自哪里:
class sucursales(osv.Model):
_name = 'sucursales'
_description = 'Sucursales de la empresa'
_columns = {
'name': fields.char('Sucursal', size=50, help="Sucursal"),
}
sucursales()
最后我也添加了这个 class:
class ordenes(osv.Model):
_name = 'ordenes.orden'
_inherit = 'ordenes.orden'
def dame_sucursal(self, cr, uid, ids, field, arg, context=None):
res = {}
for obj in self.browse(cr, uid, ids, context=context):
res[obj.id] = False
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
if user and user.sucursal_u and user.por_sucursal:
res[obj.id] = user.sucursal_u.id
return res
_columns = {
'name_suc': fields.function(dame_sucursal, type='many2one', store= True,
readonly = True, relation='sucursales')
}
ordenes()
所以我想从 sucursal 中过滤掉树视图中等于 current_user 的 sucursal 的所有订单。它工作正常,但只是第一次。如果我更改当前用户的 sucursal,函数字段不会更新。这是我的树视图:
<record id="open_view_ordenes_sucursales" model="ir.actions.act_window">
<field name="name">Ordenes</field>
<field name="res_model">ordenes.orden</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('sucursal','=','name_suc'),('state', 'not in', ('done','cancel'))]</field>
<field name="view_id" ref="x_sucursal_view_tree"/>
</record>
您的代码无法运行,因为您试图将当前用户的 succursal
存储在 ordenes.orden
记录中 - 这是不可能的,因为多个用户可能同时搜索订单。
您在树视图中使用的 domain
表达式也不起作用:('sucursal','=','name_suc')
将仅显示 sucursal 完全命名为 "name_suc" 的订单 - 它与name_suc
字段。每个领域术语的右侧是一个静态文字值。您可以在 Odoo 文档中阅读 more about domains。
但是有一个更简单的方法来做你想做的事,假设你的 succursales 应该类似于内置的 company Odoo 的概念;您应该使用类似的技术来过滤记录:每条记录的安全记录规则 (ir.rule
)。
尝试以下操作:
- 删除您订单中无用的
name_suc
列和相关域 为具有以下域值的
ordenes.orden
模型创建一个 record rule (ir.rule
):[('sucursal', '=', user.sucursal.id)]
。您可以在用户界面中进行测试,或者在模块的 XML 数据中创建它:<record id="ordenes_sucursales_rule" model="ir.rule"> <field name="name">Per sucursal rule</field> <field name="model_id" ref="model_ordenes_orden"/> <field name="domain_force">[('sucursal', '=', user.sucursal_u.id)] </field> </record>
这将自动根据各地用户的sucursal过滤订单,除了管理员帐户(ID 1)不受记录规则限制。
如果你也想让用户看到没有sucursal的订单,你可以修改规则如下:
<record id="ordenes_sucursales_rule" model="ir.rule"> <field name="name">Per sucursal rule</field> <field name="model_id" ref="model_ordenes_orden"/> <field name="domain_force">['|', ('sucursal', '=', False), ('sucursal', '=', user.sucursal_u.id)] </field> </record>
假设您在
ordenes.orden
上有一个sucursal
字段,即many2one
到sucursales
。
感谢 Odony
<record id="ordenes_sucursales_rule" model="ir.rule">
<field name="name">Per sucursal rule</field>
<field name="model_id" ref="model_ordenes_orden"/>
<field name="groups" eval="[(4,ref('group_sucursales'))]"></field>
<field name="domain_force">[('sucursal','=',user.sucursal_u.id)]</field>
<field eval="1" name="perm_write"/>
<field eval="1" name="perm_read"/>
<field eval="1" name="perm_create"/>
</record>