Odoo - 如何从后端设置域过滤器
Odoo - How to set domain filter from backend
我正在使用 odoo 10e。我想做的是在 fields_view_get
方法
中设置域标准
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
res = super(Customer, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
doc = etree.XML(res['arch'])
if view_type == 'tree':
if self.env.user.partner_id.parent_id.id is False:
id = self.env.user.id
else:
id = self.env.user.partner_id.parent_id.id
doc.attrib['domain'] = "[('custodians','='," + str(id) + ")]"
for node_form in doc.xpath("//tree"):
node_form.attrib['duplicate'] = '0'
res['arch'] = etree.tostring(doc)
for node_form in doc.xpath("//form"):
node_form.attrib['duplicate'] = '0'
res['arch'] = etree.tostring(doc)
return res
这就是我尝试过的。但它不起作用。你可以看到为什么我想从后端设置域,因为我必须根据条件设置 user_id。
如果我做错了或有更好的方法,请告诉我。
编辑
我已将保管人字段定义如下
custodians = fields.Many2one('res.users', string="Custodian", domain=[('groups_id', 'in', [12])],
readonly=[('readonly_custodian', '=', True)])
实际上,每当登录用户创建 Customer
记录时,我们都会将他设置为该 Customer
的保管人,我想做的就是当该用户再次登录时,他应该能够看到他和他的 parent 保管记录
看来您应该能够通过修改加载树视图的 action 上的 domain
来实现此行为。
Window Actions 有两种定义方式,但无论哪种方式,重要的部分是 domain
值。
旧答案:
第一种方式:
<act_window id="..."
name="..."
...
domain="[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]"/>
第二种方式:
<record id="..." model="ir.actions.act_window">
<field name="domain">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field>
</record>
编辑:
由于 user
在 domain
中似乎无法访问,我认为这可能有效:
<record id="view_ir_rule_restrict_custodians" model="ir.rule">
<field name="name">Restrict Users to see only their Custodians</field>
<field name="model_id" ref="model_res_partner"/>
<!-- Should this be `... or user.partner_id.id`? -->
<field name="domain_force">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field>
</record>
注意:这是一个全局规则,因此您可能希望为某些组(如经理)强制删除它
<record id="view_ir_rule_unrestrict_custodians_managers" model="ir.rule">
<field name="name">Un-Restrict Managers to see any Custodians</field>
<field name="model_id" ref="model_res_partner"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_sale_manager'))]"/>
</record>
编辑 2:
正如我们在聊天中发现的那样,您问题的特定域是这样的:
[('custodians','in',user.partner_id.parent_id and [(user.partner_id.parent_id.id),user.partner_id.id] or [user.partner_id.id])]
我正在使用 odoo 10e。我想做的是在 fields_view_get
方法
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
res = super(Customer, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
doc = etree.XML(res['arch'])
if view_type == 'tree':
if self.env.user.partner_id.parent_id.id is False:
id = self.env.user.id
else:
id = self.env.user.partner_id.parent_id.id
doc.attrib['domain'] = "[('custodians','='," + str(id) + ")]"
for node_form in doc.xpath("//tree"):
node_form.attrib['duplicate'] = '0'
res['arch'] = etree.tostring(doc)
for node_form in doc.xpath("//form"):
node_form.attrib['duplicate'] = '0'
res['arch'] = etree.tostring(doc)
return res
这就是我尝试过的。但它不起作用。你可以看到为什么我想从后端设置域,因为我必须根据条件设置 user_id。
如果我做错了或有更好的方法,请告诉我。
编辑
我已将保管人字段定义如下
custodians = fields.Many2one('res.users', string="Custodian", domain=[('groups_id', 'in', [12])],
readonly=[('readonly_custodian', '=', True)])
实际上,每当登录用户创建 Customer
记录时,我们都会将他设置为该 Customer
的保管人,我想做的就是当该用户再次登录时,他应该能够看到他和他的 parent 保管记录
看来您应该能够通过修改加载树视图的 action 上的 domain
来实现此行为。
Window Actions 有两种定义方式,但无论哪种方式,重要的部分是 domain
值。
旧答案:
第一种方式:
<act_window id="..."
name="..."
...
domain="[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]"/>
第二种方式:
<record id="..." model="ir.actions.act_window">
<field name="domain">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field>
</record>
编辑:
由于 user
在 domain
中似乎无法访问,我认为这可能有效:
<record id="view_ir_rule_restrict_custodians" model="ir.rule">
<field name="name">Restrict Users to see only their Custodians</field>
<field name="model_id" ref="model_res_partner"/>
<!-- Should this be `... or user.partner_id.id`? -->
<field name="domain_force">[('custodians','=',user.partner_id.parent_id and user.partner_id.parent_id.id or user.id)]</field>
</record>
注意:这是一个全局规则,因此您可能希望为某些组(如经理)强制删除它
<record id="view_ir_rule_unrestrict_custodians_managers" model="ir.rule">
<field name="name">Un-Restrict Managers to see any Custodians</field>
<field name="model_id" ref="model_res_partner"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_sale_manager'))]"/>
</record>
编辑 2:
正如我们在聊天中发现的那样,您问题的特定域是这样的:
[('custodians','in',user.partner_id.parent_id and [(user.partner_id.parent_id.id),user.partner_id.id] or [user.partner_id.id])]