Как фильтровать с полями current_user?

Я добавил это к модели 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()

Итак, я хочу отфильтровать все заказы из sucursal, где они равны sucursal current_user в древовидном представлении. Работает нормально, но только первое время. Поле функции не обновляется, если я меняю 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>

person Leonardo    schedule 17.09.2015    source источник


Ответы (2)


Ваш код не может работать, потому что вы пытаетесь сохранить succursal текущего пользователя в ordenes.orden записях - это невозможно, потому что несколько пользователей могут одновременно искать заказы.

Выражение domain, которое вы использовали в древовидном представлении, также не может работать: ('sucursal','=','name_suc') будет отображать только ордера, в которых succursal точно назван "name_suc" - оно не имеет ничего общего с полем name_suc. Правая часть каждого доменного термина представляет собой статическое буквальное значение. Вы можете прочитать дополнительную информацию о доменах в Odoo документация.

Но есть гораздо более простой способ сделать то, что вы хотите, предполагая, что ваши дополнительные продажи должны быть похожи на встроенную компанию концепцию Odoo; вы должны использовать аналогичный метод для фильтрации записей: правила безопасности для каждой записи (ir.rule). Попробуйте следующее:

  • удалите бесполезный столбец name_suc в вашем заказе и соответствующий домен
  • создайте правило записи (ir.rule) для модели ordenes.orden со следующим значением домена: [('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>
    

    Это предполагает, что у вас есть поле sucursal на ordenes.orden, которое является от many2one до sucursales.

person odony    schedule 17.09.2015
comment
Спасибо, Одони, я не знаю, почему iknew был таким, используя правила, дай мне попробовать, и я скажу тебе - person Leonardo; 18.09.2015

отлично работает благодаря 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>
person Leonardo    schedule 18.09.2015