Контекстні змінні Python-скриптів
Під час використання Python-скриптів для трансформації даних у вашому розпорядженні є такі змінні й бібліотеки.
Основні об'єкти Odoo
env
Середовище Odoo для доступу до бази даних і моделей.
# Доступ до будь-якої моделі Odoo
partners = env['res.partner'].search([('customer_rank', '>', 0)])
products = env['product.product'].browse([1, 2, 3])
model
Модель Odoo, для якої виконується синхронізація.
# Назва моделі
model_name = model._name # наприклад, 'res.partner'
# Список полів моделі
field_names = model._fields.keys()
records
Поточний набір записів, що обробляється скриптом.
for record in records:
print(record.name)
print(record.email)
# Швидкий збір значень полів
emails = records.mapped('email')
total = sum(records.mapped('amount_total'))
Дані запиту
request_data
JSON-повідомлення ззовні (вхідний потік) або дані, що відправляються (вихідний).
# Вхідні дані
customer_name = request_data.get('name', '')
email = request_data.get('email_address', '')
# Вихідні дані
request_data['timestamp'] = datetime.now().isoformat()
request_data['source'] = 'odoo'
Службові бібліотеки
Дата та час
import time
from datetime import datetime, timedelta
import dateutil
from dateutil import timezone
date_str = request_data.get('date')
parsed_date = datetime.strptime(date_str, '%Y-%m-%d')
utc_time = datetime.now(timezone.utc)
Base64
from base64 import b64encode, b64decode
encoded = b64encode(binary_data).decode('utf-8')
decoded = b64decode(encoded_string)
Обробка помилок
from odoo.exceptions import UserError
if not request_data.get('required_field'):
raise UserError('Обов\'язкове поле відсутнє!')
Команди роботи із записами
from odoo.fields import Command
Command.create({'name': 'Новий запис'})
Command.update(record_id, {'name': 'Оновлено'})
Command.delete(record_id)
Command.link(record_id)
Command.unlink(record_id)
Режими виконання скриптів
Evaluate Mode (Оцінка)
Повертає обчислене значення, яке буде записане в поле:
request_data.get('customer', {}).get('name', '').upper()
# Результат функції стане значенням поля
Execute Mode (Виконання)
Виконує складні операції без повернення значення:
for item in request_data.get('items', []):
env['product.product'].create({
'name': item['name'],
'list_price': item['price']
})
# Нічого повертати не потрібно
Приклади скриптів
1. Валідація даних
# Очищення номера телефону (Evaluate)
import re
re.sub(r'[^0-9+]', '', request_data.get('phone', ''))
# Перевірка формату email (Execute)
email = request_data.get('email', '')
if email and not re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', email):
raise UserError(f'Невірний формат email: {email}')
2. Конвертація формату
# Перетворення дати з MM/DD/YYYY у YYYY-MM-DD (Evaluate)
from datetime import datetime
datetime.strptime(
request_data.get('order_date'),
'%m/%d/%Y'
).strftime('%Y-%m-%d')
3. Зовнішні запити
# Отримання даних з зовнішнього каталогу (Execute)
import requests
product_sku = request_data.get('sku')
if product_sku:
response = requests.get(f'https://catalog.example.com/api/products/{product_sku}')
if response.status_code == 200:
product_data = response.json()
result = {
'name': product_data['title'],
'list_price': product_data['price'],
'description': product_data['description'],
}
else:
raise UserError(f'Product {product_sku} not found in catalog')
Найкращі практики
- Перевіряйте вхідні дані перед обробкою.
- Використовуйте
try/except
для передбачуваних помилок. - Логуйте ключові операції, щоб спростити налагодження.
- Пишіть короткі, зрозумілі скрипти під конкретне завдання.
- Тестуйте скрипти на різних наборах даних.
- Коментуйте складну бізнес-логіку.
- Не хардкодуйте значення — зберігайте їх у конфігураціях.
Поради з налагодження
import logging
_logger = logging.getLogger(__name__)
_logger.info(f'Processing record: {records.id}')
_logger.debug(f'Request data: {request_data}')
_logger.error(f'Error processing: {str(e)}')
print(f'DEBUG: Current value = {value}')