【问题标题】:How to filter with the current_user fields?如何使用 current_user 字段进行过滤?
【发布时间】:2015-09-17 18:07:21
【问题描述】:

我将此添加到 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 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()

所以我想从树形视图中过滤所有等于 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>

【问题讨论】:

    标签: openerp openerp-7 openerp-8


    【解决方案1】:

    您的代码无法工作,因为您试图将当前用户的 succursal 存储在 ordenes.orden 记录中 - 这是不可能的,因为多个用户可能同时搜索订单。

    您在树视图上使用的domain 表达式也不起作用:('sucursal','=','name_suc') 将仅显示成功命名为“name_suc”的订单 - 它与name_suc 字段无关。每个域术语的右侧是一个静态文字值。您可以阅读 Odoo 文档中的more about domains

    但是有一个更简单的方法来做你想做的事,假设你的 succursales 应该类似于 Odoo 的内置 company 概念;您应该使用类似的技术来过滤记录:每条记录的安全记录规则 (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>
      

      这将根据各地用户的顺序自动过滤订单,除了不受记录规则限制的管理员帐户(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 字段,即many2onesucursales

    【讨论】:

    • 谢谢 Odony,我不知道为什么 iknew 会这样使用规则让我试试,我会告诉你
    【解决方案2】:

    感谢 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>
    

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2020-01-07
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多