Как получить текущее имя пользователя в качестве связанного поля odoo

#python #odoo-13

#python #odoo-13

Вопрос:

 <record id="product.product_normal_action_sell" model="ir.actions.act_window">
            <field name="name">Product Variants</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">product.product</field>
            <field name="view_mode">kanban,tree,form,activity</field>
            <field name="context">{"search_default_filter_to_sell":1}</field>
            <field name="domain">[('user', '=', "Ignored value")]</field>
            <field name="view_id" ref="product.product_product_tree_view"/>
            <field name="search_view_id" ref="product.product_search_form_view"/>
            <field name="help" type="html">
              <p class="o_view_nocontent_smiling_face">
                Create a new product variant
              </p><p>
                You must define a product for everything you sell, whether it's a physical product,
                a consumable or a service you offer to customers.
                The product form contains information to simplify the sale process:
                price, notes in the quotation, accounting data, procurement methods, etc.
              </p>
            </field>
        </record>  

Я хочу всегда менять поле пользователя при входе в систему.
Я знаю, что могу использовать значение по умолчанию, но функция по умолчанию не повлияет на выходящий продукт.Для этого я хочу использовать поле, связанное с пользователем.Пожалуйста, предложите мне.

 _inherit = 'product.template'
_description = "Product filter"
category_branch = fields.Many2one('multi.branch', string="Branch Name",related="categ_id.branch_id",rea
  

 class ResUsers(models.Model):
    """Res Users Model."""

    _inherit = 'res.users'

    @api.model
    def _get_branch(self):
        return self.env.user.branch_id
    branch_id = fields.Many2one('multi.branch', string='Branch',
                                default=_get_branch,
                                help='The branch this user is currently 
                                working for.')  

donly= True)

Ответ №1:

Связанные поля являются частным случаем вычисляемых полей, которые являются связанными (прокси) полями, которые предоставляют значение подполя в текущей записи.

Значение связанного поля задается путем следования последовательности реляционных полей и чтения поля в достигнутой модели. Полная последовательность полей для обхода задается related атрибутом.

self.env.user это не последовательность реляционных полей, вы не можете использовать ее в related параметре.

Вам нужно определить его как вычисляемое поле, чтобы получить значение текущего пользователя и вернуть его по запросу.

 def _get_current_user(self):
    for r in self:
        r.user_id = self.env.user

def _search_branch(self, operator, value):
        return [('categ_id.branch_id', operator, self.env.user.branch_id.id)]

user = fields.Many2one('res.users', compute='_get_current_user', search='_search_branch')
  

Редактировать:
поиск по вычисляемому полю можно включить, установив параметр поиска. Значение представляет собой имя метода, возвращающее поисковые домены.

Метод поиска вызывается при обработке доменов перед выполнением фактического поиска в модели. Он должен возвращать домен, эквивалентный условию: field operator value .

Вам нужно заменить value параметр, возвращаемый доменом поиска на self.env.user.branch_id.id затем попробуйте использовать следующий домен в действии шаблона продукта:

 [('user', '=', "Ignored value")]
  

Пример:

 class ResUsers(models.Model):
    _inherit = 'res.users'

    branch_id = fields.Many2one('multi.branch')


class ProductCategory(models.Model):
    _inherit = 'product.category'

    branch_id = fields.Many2one('multi.branch')


class ProductTemplate(models.Model):
    _inherit = 'product.template'

    user = fields.Many2one("res.users", compute='_get_current_user', search='_search_branch')

    def _get_current_user(self):
        for r in self:
            r.user_branch = self.env.user.id

    def _search_branch(self, operator, value):
        return [('categ_id.branch_id', operator, self.env.user.branch_id.id)]
  

Комментарии:

1. Спасибо за ваш ответ. Но вычислить поле не может пользователь для фильтра домена, я хочу использовать это поле в качестве фильтра домена. Когда я добавляю store = True , выходящий продукт пуст для этого поля. Можете ли вы помочь мне, как я могу это сделать? Моя проблема в том, что каждый пользователь, входящий в систему, изменяет это поле пользователя в продукте и хочет фильтровать для текущего пользователя входа.

2. Непонятно, пожалуйста, объясните, чего вам нужно достичь и как вам нужно это фильтровать.

3. На самом деле я хочу добавить одно поле типа user для каждого продукта, и когда вход текущего пользователя совпадает с пользователем в продукте, я хочу отображать продукт только того же пользователя в представлении продукта о продаже. Не отображать продукт, который не совпадает с текущим пользователем.

4. Когда я фильтрую пользователя в представлении продукта о продаже, отображается только тот продукт, поле пользователя которого совпадает с текущим пользователем входа.

5. Вам нужно назначить продукт конкретному пользователю?