Рубрики
Software

External API в Odoo / Flectra (XML-RPC)

Для доступа к данным в Odoo и Flectra можно использовать External API. Он построен на базе XML-RPC. Для работы не нужно использовать дополнительные плагины (REST API for FLECTRA или RESTFUL API для Odoo). Документация и все возможности XML-RPC — https://www.odoo.com/documentation/12.0/webservices/odoo.html. Покажу основные моменты и действия, которые можно выполнять скриптами.

Все примеры ниже будут на Python3. Базовая настройка:

import xmlrpc.client

# Данные для авторизации
host = '0.0.0.0'
port = 8069 #7073 или другой. Зависит от настроек
db = 'v1_01'
user = 'v1'
password = 'v1'

root = f"http://{host}:{port}/xmlrpc/"
models = xmlrpc.client.ServerProxy(root + '2/object')

# Авторизация пользователя. Этот шаг можно не использовать, главное явно указать идентификатор пользователя (например, uid = 2). Для некоторых случаев будет необходим uid.
uid = xmlrpc.client.ServerProxy(root + 'common').login(db, user, password)
print("Залогинены как %s (uid: %d)" % (user, uid))

Мы обращаемся к определенным моделям и их полям в Flectra. Примеры:

  • Товар — product.product
  • Заказ — sale.order
  • Контрагенты — res.partner

Пройдемся по основным действиям:

read — получение данных по определенному id

Обращаемся к res.partner, операция — чтение (read).

result = models.execute_kw(
    db, uid, password, 'res.partner', 'read',
    [7], {'fields': ['id', 'name',]})

print(result[0])

Результат выполнения скрипта:

{‘id’: 7, ‘name’: ‘Поставщик 7’}

Коректировать список полей можно расширив {‘fields’: [‘id’, ‘name’,]}. Если нужно получить всю информацию — не используем словарь fields.

search — получение айди по критериям

В этом случае мы получем идентификаторы всех контрагентов, которые являются обновременно нашими покупателями и внесены в систему как компания.

result = models.execute_kw(db, uid, password,
    'res.partner', 'search',
    [[['customer', '=', True], ['company_type', '=', 'company']]],
    {'offset': 2, 'limit': 5})

Результат выполнения скрипта — список идентификаторов контрагентов: [16, 19, 24, 25, 32]. Также, были использованы дополительные параметры: offset и limit, которые позволяют достать только определенную часть списка. По умолчанию метод отдает все результаты.

search_count — получаем общее количество результатов

Чтобы получить количество результатов, которые соответствуют параметру фильтра можно использовать search_count. Синтаксис аналогичен примеру выше, но в результате мы получим количество — 5.

search_read — получение данных по фильтру

По сути, это смесь read() и search(). Используется довольно часто, так как за 1 запрос можно сразу получить нужные данные у всех объектов, которые соответствуют параметрам фильтра.

result = models.execute_kw(db, uid, password,
    'res.partner', 'search_read',
    [[['customer', '=', True], ['company_type', '=', 'company']]],
    {'fields': ['name', 'city', 'phone'], 'limit': 2})

В результате, получили 2 компании с номерами телефонов и городами, в которых они находятся:

[{‘city’: False, ‘id’: 9, ‘name’: ‘1 Клиент’, ‘phone’: False}, {‘city’: ‘Kyiv’, ‘id’: 11, ‘name’: ‘Pepsi Co’, ‘phone’: ‘+380980000000’}]

Другие методы:

  • create — создание записей.
  • write — изменение записей. Обязательно указываем идентификатор или список идентификаторов, которые хотим обновить.
  • unlink — удаление объекта.
  • fields_get — инспектирование модели.

Как будет больше времени, обязательно расширю и дополню этот материал.

Изображение с сайта https://blog.papercut.com/write-xml-rpc-clients/.