Программирование

Реализация триггеров OnSave, OnChange и OnDelete в Odoo 19

Пошаговое руководство по реализации триггеров OnSave, OnChange и OnDelete в Odoo Community 19. Программные методы и интерфейс автоматизации.

4 ответа 1 просмотр

Как правильно реализовать триггеры 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 работает с псевдо-записью и автоматически отправляет изменения обратно в клиент, что критически важно для правильной реализации серверной автоматизации.


Диаграмма настройки триггера с условием Before Update Domain в Odoo Community версии 19

Содержание


Введение в триггеры 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” для предотвращения многократного выполнения триггера при каждом сохранении.

Пример выполнения Python-кода в действии Execute Code для вычисления поля в Odoo

Через программные методы

Для более сложных сценариев OnSave реализуется через переопределение методов в классе модели:

python
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:

python
@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”. Этот подход работает только при ручном изменении полей в интерфейсе пользователя.

Настройте следующие параметры:

  1. Выберите триггер “On UI change”
  2. Укажите поля, изменения которых должны активировать триггер
  3. В качестве действия выберите “Execute Code”
  4. Напишите Python-код для обработки изменения

Через декоратор @api.onchange

Для программной реализации OnChange используйте декоратор @api.onchange. Этот метод работает с псевдо-записью и автоматически отправляет изменения обратно в клиент:

python
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 метода программно используйте:

python
# Псевдо-запись для тестирования
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” в разделе автоматизации. Этот триггер активируется при удалении записи из базы данных.

Настройте следующие параметры:

  1. Выберите триггер “On deletion”
  2. Укажите модель, записи которой будут удаляться
  3. Настройте действие (например, “Execute Code” для выполнения Python-кода)

Через декоратор @api.ondelete

Для программной реализации OnDelete используйте декоратор @api.ondelete:

python
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:

python
@api.ondelete(at_uninstall=False)
def _ondelete_cascade(self):
 """Каскадное удаление связанных записей"""
 for record in self:
 # Удаление связанных записей
 record.related_records.unlink()

Важно тщательно тестировать каскадное удаление, так как оно может привести к потере данных, если не реализовано правильно.


Лучшие практики и оптимизация

При реализации триггеров в Odoo Community 19 следуйте этим рекомендациям:

Для OnSave триггеров

  1. Избегайте бесконечных циклов - проверяйте, не вызывает ли ваш триггер повторное сохранение:
python
@api.model
def create(self, vals):
 if vals.get('trigger_field') == self._context.get('trigger_source'):
 return super().create(vals)
 # Ваша логика
 return super().create(vals)
  1. Оптимизируйте производительность - используйте записи пачками вместо циклов:
python
# Плохо
for record in records:
 record.some_field = some_value

# Хорошо
records.write({'some_field': some_value})

Для OnChange триггеров

  1. Возвращайте только измененные поля - это улучшает производительность:
python
@api.onchange('field1', 'field2')
def _onchange_fields(self):
 result = {}
 if self.field1:
 result['field3'] = f"Processed: {self.field1}"
 return {'value': result}
  1. Используйте кэширование для сложных вычислений:
python
def _compute_field(self):
 for record in self:
 if record.id not in self._cache:
 # Вычисление значения
 record.field = complex_calculation(record)

Для OnDelete триггеров

  1. Проверяйте права доступа перед удалением:
python
@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("У вас нет прав на удаление этой записи")
  1. Используйте транзакции для сложных операций удаления:
python
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)
 # Логика в транзакции

Общие рекомендации

  1. Тестируйте триггеры в различных сценариях использования
  2. Документируйте логику триггеров для будущих разработчиков
  3. Используйте логирование для отладки сложных триггеров:
python
import logging
_logger = logging.getLogger(__name__)

@api.onchange('field')
def _onchange_field(self):
 _logger.info(f"Изменено поле: {self.field}")
  1. Учитывайте контекст при реализации триггеров:
python
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 и сообществу разработчиков, где вы найдете примеры и решения для сложных сценариев автоматизации.


Источники

  1. Odoo Documentation - Automated Actions - Официальная документация по реализации триггеров в Odoo Community 19: https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html
  2. Odoo Documentation - ORM Reference - Справочник по методам API для реализации триггеров: https://www.odoo.com/documentation/19.0/developer/reference/backend/orm.html
  3. 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.

Starfish / Разработчик

При реализации триггеров в Odoo важно понимать, что self.onchange вызывает как @api.depends, так и @api.onchange декорированные функции. Словарь values в self.onchange служит двум целям: предоставляет значения полей для использования в onchange функциях и указывает поля, для которых нужно вернуть значения. Возвращаемый словарь value не включает неизмененные поля. Это важно учитывать при программировании триггеров OnChange в серверной части Odoo.

Авторы
Starfish / Разработчик
Разработчик
Источники
Платформа ERP
Проверено модерацией
НейроОтветы
Модерация