如何使用函数过滤域视图?在odoo 9

时间:2017-05-02 08:54:44

标签: filter openerp odoo-9

我想用函数而不是变量过滤域,以便在视图中只显示一些寄存器。 我这样做了:

class SaleOrderExt(models.Model):
    _inherit = ['sale.order']

    @api.multi
    def custom_funct_date(self):
        my_date = ... (some stuff)
        return my_date

然后,在视图中,我已经过滤了域名:

<?xml version="1.0"?>
<openerp>
  <data>
    <record id='action_menu_custom_date' model='ir.actions.act_window'>
      <field name="name">This is a test</field>
      <field name="res_model">sale.order</field>
      <field name="view_type">form</field>
      <field name="view_mode">tree,form</field>
      <field name="domain">[('date_order','>=',custom_funct_date)]</field>
    </record>
  </data>
</openerp>

但是这给了我一个错误:

ValueError: "name 'custom_funct_date' is not defined" while evaluating
u"[('date_order','>=',custom_funct_date)]" 

3 个答案:

答案 0 :(得分:3)

而不是使用ir.actions.act_window使用服务器操作使用ir.actions.server 你可以调用你的函数并返回一个动作来打开你的模型 域。

    <record id="action_menu_custom_dat" model="ir.actions.server">
        <field name="name">Your Action</field>
        <field name="model_id" ref="sale.model_sale_order"/>
        <field name="state">code</field>
        <field name="code">action = self.custom_funct_date(cr, uid, context=context)</field>
        <field eval="True" name="condition"/>
    </record>

并在您的模型中将方法更改为:

     def custom_funct_date(self, cr, uid, context=None):
            # print "make sure that this action is called from th server action "
            # compute you date
            my_date = ... (some stuff)
            tree_id = self.env.ref("modul_name.view_tree_id")
            form_id = self.env.ref("modul_name.view_form_id")
            return {
                'type': 'ir.actions.act_window',
                'name': 'This is a test',
                'view_type': 'form',
                'view_mode': 'tree,form',
                'res_model': 'sale.order',
                'domain': [('date_order','>=',my_date)],
                # if you don't want to specify form for example
                # (False, 'form') just pass False 
                'views': [(tree_id.id, 'tree'), (form_id.id, 'form')],
                'target': 'current',
                'context': context,
            }

答案 1 :(得分:2)

在域中,您需要传递一个字段而不是函数名称。

为此,您可以创建计算字段。将方法分配给计算字段。

为您的计算字段指定搜索属性后。

Odoo示例:

upper_name = field.Char(compute='_compute_upper', search='_search_upper')

def _search_upper(self, operator, value):
    if operator == 'like':
        operator = 'ilike'
    return [('name', operator, value)]

对于你的情况:

class SaleOrderExt(models.Model):
    _inherit = ['sale.order']

    your_date = fields.Datetime(string="Computed date", compute="compute_your_date", search="_search_date")

    @api.depends('date')
    def compute_your_date(self):
        my_date = ... (some stuff)
        return my_date


    def _search_date(self, operator, value):
        return [('date', operator, value)]

编辑:

您的xml代码必须像这样

<?xml version="1.0"?>
<openerp>
  <data>
    <record id='action_menu_custom_date' model='ir.actions.act_window'>
      <field name="name">This is a test</field>
      <field name="res_model">sale.order</field>
      <field name="view_type">form</field>
      <field name="view_mode">tree,form</field>
      <field name="domain">[('date_order','>=',your_date)]</field>
    </record>
  </data>
</openerp>

答案 2 :(得分:0)

自上次回答以来已经过了很多次,但它对其他人有用。

我对 res.partner 继承视图有类似的问题,这就是我解决的方法。在这种情况下,我需要用户成为访问其数据的合作伙伴或管理员以在笔记本部分显示合作伙伴的数据。

型号:

class Partner(models.Model):
    _inherit = 'res.partner'

 @api.multi
    def _get_domain(self):
    # Remember that self returns a recordset, so we need to iterate over that
    # dominio (domain in english) -boolean- store if the user is the partner or the admin
        for rec in self:
            rec.dominio =  True if self.id == self.env.user.partner_id.id or self.env.user.has_group('cnae.group_cnae_manager') else False

    dominio = fields.Boolean(string='Dominio', compute=_get_domain)

XML:

... ir.ui.view header record stuff ...

<!--  Hide notebook to other users -->
<xpath expr="//notebook" position="attributes">
    <attribute name="attrs">{'invisible':[('dominio','=',False)]}</attribute>
</xpath>