如何在 Odoo 中调用 ir.rule 域中的方法?
How do I call a method in ir.rule domain in Odoo?
我想为我的应用创建一个记录规则。
这是我的 XML:
<record model="ir.rule" id="ir_rule_something">
<field name="name">something</field>
<field name="model_id" ref="model_something"/>
<field name="domain_force">[('agent','in',function_that_return_list_of_ids)]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_unlink" eval="False"/>
<field name="perm_create" eval="False"/>
</record>
我想要 function_that_return_list_of_ids
到 return id
的列表。我应该把方法放在哪里以及如何调用它?
最简单的方法是在 ir.rule
本身中覆盖 _eval_context
或 _eval_context_for_combinations
。
class MyIrRule(models.Model):
_inherit ="ir.rule"
@api.model
def _eval_context(self):
context = super(MyIrRule,self)._eval_context()
context.update(function_of_ids=function_of_ids)
在这个例子中,function_of_ids
不是一个方法,而是一个简单的函数。
我从 ir.rule 中找到了另一种调用函数的方法。
在这里。
<record id="manager_asterisk_cdr_rule" model="ir.rule">
<field name="name">Manager Asterisk CDR rule</field>
<field name="perm_write" eval="1"/>
<field name="perm_read" eval="1"/>
<field name="perm_create" eval="1"/>
<field name="perm_unlink" eval="1"/>
<field name="groups" eval="[(6,0, [ref('group_barrier_manager')])]"/>
<field name="model_id" ref="asterisk_base.model_asterisk_cdr"/>
<field name="domain_force">user.manager.get_cdr_domain()</field>
</record>
主要部分是:
<field name="domain_force">user.manager.get_cdr_domain()</field>
函数如下:
@api.multi
def get_cdr_domain(self):
# Used from facility_manager/security.xml to filter CDR records
facility_ids = [f.id for f in self.facilities]
barriers = self.env['barrier.barrier'].search(
[('facility', 'in', facility_ids)])
numbers = []
for b in barriers:
# Add barrier access phones
numbers.extend([a.number for a in b.access_phones])
# Add panels GSM number
numbers.extend(
[p.gsm_number for p in b.call_panels if p.gsm_number])
# Add panels SIP number
numbers.extend(
[p.sip_number for p in b.call_panels if p.sip_number])
# Add keys of type=phone
key_numbers = [k.number for k in self.env[
'barrier.resident_key'].search([
('facility', 'in', facility_ids),
('key_type', '=', 'phone')])]
numbers.extend(key_numbers)
domain = ['|', ('src', 'in', numbers), ('dst', 'in', numbers)]
return domain
此外,当您向函数请求的模型添加新记录时,您需要清除缓存:
self.env['ir.rule'].clear_cache()
我想为我的应用创建一个记录规则。
这是我的 XML:
<record model="ir.rule" id="ir_rule_something">
<field name="name">something</field>
<field name="model_id" ref="model_something"/>
<field name="domain_force">[('agent','in',function_that_return_list_of_ids)]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_unlink" eval="False"/>
<field name="perm_create" eval="False"/>
</record>
我想要 function_that_return_list_of_ids
到 return id
的列表。我应该把方法放在哪里以及如何调用它?
最简单的方法是在 ir.rule
本身中覆盖 _eval_context
或 _eval_context_for_combinations
。
class MyIrRule(models.Model):
_inherit ="ir.rule"
@api.model
def _eval_context(self):
context = super(MyIrRule,self)._eval_context()
context.update(function_of_ids=function_of_ids)
在这个例子中,function_of_ids
不是一个方法,而是一个简单的函数。
我从 ir.rule 中找到了另一种调用函数的方法。 在这里。
<record id="manager_asterisk_cdr_rule" model="ir.rule">
<field name="name">Manager Asterisk CDR rule</field>
<field name="perm_write" eval="1"/>
<field name="perm_read" eval="1"/>
<field name="perm_create" eval="1"/>
<field name="perm_unlink" eval="1"/>
<field name="groups" eval="[(6,0, [ref('group_barrier_manager')])]"/>
<field name="model_id" ref="asterisk_base.model_asterisk_cdr"/>
<field name="domain_force">user.manager.get_cdr_domain()</field>
</record>
主要部分是:
<field name="domain_force">user.manager.get_cdr_domain()</field>
函数如下:
@api.multi
def get_cdr_domain(self):
# Used from facility_manager/security.xml to filter CDR records
facility_ids = [f.id for f in self.facilities]
barriers = self.env['barrier.barrier'].search(
[('facility', 'in', facility_ids)])
numbers = []
for b in barriers:
# Add barrier access phones
numbers.extend([a.number for a in b.access_phones])
# Add panels GSM number
numbers.extend(
[p.gsm_number for p in b.call_panels if p.gsm_number])
# Add panels SIP number
numbers.extend(
[p.sip_number for p in b.call_panels if p.sip_number])
# Add keys of type=phone
key_numbers = [k.number for k in self.env[
'barrier.resident_key'].search([
('facility', 'in', facility_ids),
('key_type', '=', 'phone')])]
numbers.extend(key_numbers)
domain = ['|', ('src', 'in', numbers), ('dst', 'in', numbers)]
return domain
此外,当您向函数请求的模型添加新记录时,您需要清除缓存:
self.env['ir.rule'].clear_cache()