Для доступа к данным в 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/.