Реализация триггеров OnSave, OnChange и OnDelete в Odoo 19
Пошаговое руководство по реализации триггеров OnSave, OnChange и OnDelete в Odoo Community 19. Программные методы и интерфейс автоматизации.
Как правильно реализовать триггеры OnSave, OnChange и OnDelete в серверной автоматизации Odoo Community версии 19?
В Odoo Community 19 триггеры реализуются через раздел “Custom” в автоматизации правил с использованием различных подходов для каждого типа действия. Для OnSave используйте триггеры “On create” и “On create and edit”, для OnDelete - триггер “On deletion”, а для OnChange - триггер “On UI change” с действием “Execute Code”. При программировании важно понимать, что @api.onchange работает с псевдо-записью и автоматически отправляет изменения обратно в клиент, что критически важно для правильной реализации серверной автоматизации.
Содержание
- Введение в триггеры Odoo Community 19
- Реализация триггера OnSave в Odoo
- Реализация триггера OnChange в Odoo
- Реализация триггера OnDelete в Odoo
- Лучшие практики и оптимизация
- Заключение и дополнительные ресурсы
Введение в триггеры Odoo Community 19
Odoo Community 19 предоставляет мощные инструменты для автоматизации бизнес-процессов через триггеры, которые активируются при различных событиях в системе. Триггеры OnSave, OnChange и OnDelete являются основными механизмами для реализации серверной автоматизации в odoo.
В отличие от предыдущих версий, в Odoo Community 19 триггеры реализуются преимущественно через раздел “Custom” в автоматизации правил, что упрощает процесс настройки без необходимости написания сложного кода. Однако для более сложных сценариев по-прежнему доступны программные методы через декораторы и методы API.
Основные триггеры включают:
- OnSave - активируется при сохранении записей
- OnChange - активируется при изменении значений полей
- OnDelete - активируется при удалении записей
Эти триггеры позволяют автоматизировать широкий спектр бизнес-процессов, от автоматического расчета полей до сложных каскадных операций с данными.
Реализация триггера OnSave в Odoo
Для реализации триггера OnSave в Odoo Community 19 доступны два основных подхода через интерфейс автоматизации:
Через раздел “Custom” в автоматизации правил
В интерфейсе автоматизации Odoo используйте следующие триггеры:
- “On create” - активируется только при первом сохранении новой записи
- “On create and edit” - активируется как при первом сохранении новой записи, так и при последующих изменениях существующих записей
При использовании “On create and edit” обязательно укажите поля в разделе “When updating field” для предотвращения многократного выполнения триггера при каждом сохранении.
Через программные методы
Для более сложных сценариев OnSave реализуется через переопределение методов в классе модели:
from odoo import api, models
class YourModel(models.Model):
_name = 'your.model'
@api.model
def create(self, vals):
# Код, выполняемый при создании записи
result = super().create(vals)
# Дополнительная логика для OnSave
if 'some_field' in vals:
# Ваша логика обработки
pass
return result
def write(self, vals):
# Код, выполняемый при изменении существующей записи
result = super().write(vals)
# Дополнительная логика для OnSave
if 'some_field' in vals:
# Ваша логика обработки
pass
return result
Важно отметить, что для обработки создания нескольких записей одновременно следует использовать декоратор @api.model_create_multi:
@api.model
def create(self, vals_list):
# Код для создания нескольких записей
records = super().create(vals_list)
# Логика для OnSave при массовом создании
for record in records:
if record.some_field:
# Ваша логика обработки
pass
return records
Реализация триггера OnChange в Odoo
Триггер OnChange в Odoo Community 19 реализуется двумя основными способами:
Через интерфейс автоматизации
Используйте триггер “On UI change” с действием “Execute Code”. Этот подход работает только при ручном изменении полей в интерфейсе пользователя.
Настройте следующие параметры:
- Выберите триггер “On UI change”
- Укажите поля, изменения которых должны активировать триггер
- В качестве действия выберите “Execute Code”
- Напишите Python-код для обработки изменения
Через декоратор @api.onchange
Для программной реализации OnChange используйте декоратор @api.onchange. Этот метод работает с псевдо-записью и автоматически отправляет изменения обратно в клиент:
from odoo import api, fields, models
class YourModel(models.Model):
_name = 'your.model'
name = fields.Char()
related_field = fields.Char(compute='_compute_related_field')
@api.onchange('name')
def _onchange_name(self):
"""Триггер OnChange для поля name"""
for record in self:
if record.name:
# Логика обработки изменения
record.related_field = f"Processed: {record.name}"
else:
record.related_field = False
Важно понимать, что self.onchange вызывает как функции с декоратором @api.depends, так и функции с декоратором @api.onchange. Словарь values в self.onchange служит двум целям:
- Предоставляет значения полей для использования в onchange функциях
- Указывает поля, для которых нужно вернуть значения
Возвращаемый словарь value не включает неизмененные поля, что необходимо учитывать при программировании триггеров OnChange в серверной части odoo.
Использование метода onchange
Для вызова onchange метода программно используйте:
# Псевдо-запись для тестирования
test_record = self.new({'name': 'Test Value'})
# Вызов onchange метода
result = test_record._onchange_name()
# Результат содержит изменения, которые нужно применить
if result and 'value' in result:
# Применение изменений к реальной записи
test_record.update(result['value'])
Реализация триггера OnDelete в Odoo
Через интерфейс автоматизации
В Odoo Community 19 триггер OnDelete реализуется через триггер “On deletion” в разделе автоматизации. Этот триггер активируется при удалении записи из базы данных.
Настройте следующие параметры:
- Выберите триггер “On deletion”
- Укажите модель, записи которой будут удаляться
- Настройте действие (например, “Execute Code” для выполнения Python-кода)
Через декоратор @api.ondelete
Для программной реализации OnDelete используйте декоратор @api.ondelete:
from odoo import api, models
class YourModel(models.Model):
_name = 'your.model'
_description = 'Your Model'
related_records = fields.One2many('related.model', 'parent_id')
@api.ondelete(at_uninstall=False)
def _ondelete_related_records(self):
"""Триггер OnDelete при удалении записей"""
for record in self:
# Логика, выполняемая при удалении
if record.related_records:
# Например, запрет удаления при наличии связанных записей
raise models.ValidationError(
f"Нельзя удалить запись {record.name}, "
"пока существуют связанные записи"
)
Декоратор @api.ondelete позволяет определить логику, которая будет выполнена перед удалением записей. Аргумент at_uninstall=False указывает, что метод не должен вызываться при удалении модуля.
Каскадное удаление
Для реализации каскадного удаления в odoo:
@api.ondelete(at_uninstall=False)
def _ondelete_cascade(self):
"""Каскадное удаление связанных записей"""
for record in self:
# Удаление связанных записей
record.related_records.unlink()
Важно тщательно тестировать каскадное удаление, так как оно может привести к потере данных, если не реализовано правильно.
Лучшие практики и оптимизация
При реализации триггеров в Odoo Community 19 следуйте этим рекомендациям:
Для OnSave триггеров
- Избегайте бесконечных циклов - проверяйте, не вызывает ли ваш триггер повторное сохранение:
@api.model
def create(self, vals):
if vals.get('trigger_field') == self._context.get('trigger_source'):
return super().create(vals)
# Ваша логика
return super().create(vals)
- Оптимизируйте производительность - используйте записи пачками вместо циклов:
# Плохо
for record in records:
record.some_field = some_value
# Хорошо
records.write({'some_field': some_value})
Для OnChange триггеров
- Возвращайте только измененные поля - это улучшает производительность:
@api.onchange('field1', 'field2')
def _onchange_fields(self):
result = {}
if self.field1:
result['field3'] = f"Processed: {self.field1}"
return {'value': result}
- Используйте кэширование для сложных вычислений:
def _compute_field(self):
for record in self:
if record.id not in self._cache:
# Вычисление значения
record.field = complex_calculation(record)
Для OnDelete триггеров
- Проверяйте права доступа перед удалением:
@api.ondelete(at_uninstall=False)
def _ondelete_check_permissions(self):
for record in self:
if not record.user_has_groups('base.group_system'):
raise models.ValidationError("У вас нет прав на удаление этой записи")
- Используйте транзакции для сложных операций удаления:
from odoo import api, SUPERUSER_ID
@api.ondelete(at_uninstall=False)
def _ondelete_with_transaction(self):
env = api.Environment(self._cr, SUPERUSER_ID, self._context)
# Логика в транзакции
Общие рекомендации
- Тестируйте триггеры в различных сценариях использования
- Документируйте логику триггеров для будущих разработчиков
- Используйте логирование для отладки сложных триггеров:
import logging
_logger = logging.getLogger(__name__)
@api.onchange('field')
def _onchange_field(self):
_logger.info(f"Изменено поле: {self.field}")
- Учитывайте контекст при реализации триггеров:
if self._context.get('skip_trigger'):
return super().create(vals)
Заключение и дополнительные ресурсы
Реализация триггеров OnSave, OnChange и OnDelete в Odoo Community 19 требует понимания архитектуры системы и правильного подхода к автоматизации. Триггеры через интерфейс автоматизации подходят для простых сценариев, в то время как программные методы через декораторы предоставляют больше гибкости для сложной логики.
Ключевые моменты, которые необходимо запомнить:
- Для OnSave используйте триггеры “On create” и “On create and edit” или переопределяйте методы create() и write()
- Для OnChange используйте триггер “On UI change” с действием “Execute Code” или декоратор @api.onchange
- Для OnDelete используйте триггер “On deletion” или декоратор @api.ondelete
Правильная реализация триггеров позволяет автоматизировать бизнес-процессы в odoo, улучшая эффективность и снижая количество ручных операций. Важно тщательно тестировать триггеры и следовать лучшим практикам для обеспечения стабильности работы системы.
Для более глубокого изучения обратитесь к официальной документации Odoo и сообществу разработчиков, где вы найдете примеры и решения для сложных сценариев автоматизации.
Источники
- Odoo Documentation - Automated Actions - Официальная документация по реализации триггеров в Odoo Community 19: https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html
- Odoo Documentation - ORM Reference - Справочник по методам API для реализации триггеров: https://www.odoo.com/documentation/19.0/developer/reference/backend/orm.html
- Stack Overflow - Server-side onchange implementation - Обсуждение реализации OnChange в серверной части Odoo: https://stackoverflow.com/questions/63376700/how-can-i-use-odoos-server-side-onchange-method-inside-a-create-function
В Odoo Community 19 триггеры реализуются через раздел “Custom” в автоматизации правил. Для OnSave используйте триггеры “On create” (при первом сохранении записи) и “On create and edit” (при первом и последующих сохранениях). Для OnDelete применяйте триггер “On deletion”, который активируется при удалении записи из базы данных. Триггер “On UI change” соответствует OnChange и работает только с действием “Execute Code” при ручном изменении полей в интерфейсе. При использовании “On create and edit” обязательно указывайте поля в разделе “When updating field” для предотвращения многократного выполнения.
Для реализации триггеров в Odoo Community 19 используйте следующие методы: OnChange через декоратор @api.onchange для полей, которые должны запускать обработку при изменении. OnDelete через декоратор @api.ondelete для методов, которые должны выполняться при удалении записей. OnSave реализуется через переопределение методов create() для новых записей и write() для существующих. Декоратор @api.onchange работает с псевдо-записью и автоматически отправляет изменения обратно в клиент. Для обработки создания нескольких записей используйте декоратор @api.model_create_multi.
При реализации триггеров в Odoo важно понимать, что self.onchange вызывает как @api.depends, так и @api.onchange декорированные функции. Словарь values в self.onchange служит двум целям: предоставляет значения полей для использования в onchange функциях и указывает поля, для которых нужно вернуть значения. Возвращаемый словарь value не включает неизмененные поля. Это важно учитывать при программировании триггеров OnChange в серверной части Odoo.