ODOO 10 Uncaught TypeError: split не является функцией - PullRequest
0 голосов
/ 11 марта 2020

Я сталкиваюсь с этой проблемой, когда пытаюсь найти / найти имя партнера, используя поля Many2one в моих пользовательских моделях. Я пытаюсь сравнить с объявлением partner_id в модуле продажи / предложения, но я не нашел никакой разницы, кстати, когда я пытаюсь найти имя клиента в предложении, эта ошибка не отображается.

Поле декларации: *. Py

partner_id = fields.Many2one('res.partner', string="Client", required=True)

Поле декларации: *. xml

<group name="partner_info" string="Info client">
    <field name="partner_id" />

    <label for="street" string="Address"/>
    <div class="o_address_format">
        <field name="street" placeholder="Street..." class="o_address_street" />
        <field name="city" placeholder="City" class="o_address_city" />
        <field name="state_id" class="o_address_state" placeholder="State" options="{&quot;no_open&quot;: True}"/>
        <field name="zip" placeholder="ZIP" class="o_address_zip" />
    </div>
    <label for="street" string="Contact"/>
    <div name="contact">
        <field name="phone" widget="phone" placeholder="Tél ° "/>
        <field name="email" widget="email" placeholder="E-mail"/>
    </div>

</group>

Заранее спасибо enter image description here

1 Ответ

0 голосов
/ 11 марта 2020

После глубокого поиска я смог найти источник проблемы, когда мы поместили букву в поля партнера, она автоматически вызовет функцию name_search в базовом модуле, осуществляя поиск в таблице res_partner, используя SQL запрос:

select id 
from res_partner 
where 'entered value' [ '=' or 'like' or 'ilike' or '=like' or 
                        '=ilike'] [email, or name, ref ]...`;

Этот запрос возвращает список кортежей

[(id1, 'partner name1'), (id2, 'partner name2')]

, а функция возвращает второго вяза от каждой кортежи ведьмы - имя партнера, но если у вас есть некоторые Поле партнера с именем пусто, будет отображаться ошибка, и это объясняет, почему некоторые буквы не генерируют сообщение об ошибке. Некоторые буквы не генерируют сообщение об ошибке, потому что запрос SQL выполняет поиск по нескольким полям, таким как Email, ссылка, имя партнера.

И существование этой функции только у партнера, а не у каждой таблицы объясняет, что основная цель функции - позволить нам выполнять поиск по другим полям [электронная почта, ссылка ...]

Путь к функции: /addons/base/res/res_partner.py строка 640

@api.model
def name_search(self, name, args=None, operator='ilike', limit=100):
    if args is None:
        args = []
    if name and operator in ('=', 'ilike', '=ilike', 'like', '=like'):
        self.check_access_rights('read')
        where_query = self._where_calc(args)
        self._apply_ir_rules(where_query, 'read')
        from_clause, where_clause, where_clause_params = where_query.get_sql()
        where_str = where_clause and (" WHERE %s AND " % where_clause) or ' WHERE '

        # search on the name of the contacts and of its company
        search_name = name
        if operator in ('ilike', 'like'):
            search_name = '%%%s%%' % name
        if operator in ('=ilike', '=like'):
            operator = operator[1:]

        unaccent = get_unaccent_wrapper(self.env.cr)

        query = """SELECT id
                     FROM res_partner
                  {where} ({email} {operator} {percent}
                       OR {display_name} {operator} {percent}
                       OR {reference} {operator} {percent})
                       -- don't panic, trust postgres bitmap
                 ORDER BY {display_name} {operator} {percent} desc,
                          {display_name}
                """.format(where=where_str,
                           operator=operator,
                           email=unaccent('email'),
                           display_name=unaccent('display_name'),
                           reference=unaccent('ref'),
                           percent=unaccent('%s'))

        where_clause_params += [search_name]*4
        if limit:
            query += ' limit %s'
            where_clause_params.append(limit)
        self.env.cr.execute(query, where_clause_params)
        partner_ids = map(lambda x: x[0], self.env.cr.fetchall())

        if partner_ids:
            return self.browse(partner_ids).name_get()
        else:
            return []
    return super(Partner, self).name_search(name, args, operator=operator, limit=limit)

строка ошибки:

if partner_ids:
    return self.browse(partner_ids).name_get()
else:
    return []
...