Odoo 10 - функция с CRON - PullRequest
1 голос
/ 17 мая 2019

Вот моя функция:

# Méthode CRON pour fermetures contrats
@api.model
def run_close_old_contracts(self):
    _logger.info('CRON Called for to verify closed dates contracts')
    domain = ['|', ('half_pension_unsubscribe_date', '<=', fields.Date.today()),
              ('nursery_morning_unsubscribe_date', '<=', fields.Date.today()),
              ('nursery_evening_unsubscribe_date', '<=', fields.Date.today())]
    for contract in self.search(domain):
        if contract.half_pension_unsubscribe_date <= fields.Date.today():
            if contract.half_pension_status == "3":
                contract.half_pension_status = "3"
        if contract.nursery_morning_unsubscribe_date <= fields.Date.today():
            if contract.nursery_status_morning == "3":
                contract.nursery_status_morning = "3"
        if contract.nursery_evening_unsubscribe_date <= fields.Date.today():
            if contract.nursery_status_evening == "3":
                contract.nursery_status_evening = "3"

Поэтому я использую CRON (автоматическое действие) для вызова этой функции.

Проблема в том, что эта функция вызывает метод write () для каждого заполненного условия и всего этого для каждой найденной записи.

Я бы хотел вызывать метод write () один раз, а не каждый раз, когда вводил условие.

Я думал о словаре, но не вижу, как он здесь используется.

У вас есть идея?

Спасибо!

1 Ответ

1 голос
/ 17 мая 2019

Просто заполните словарь и write в конце:

@api.model
def run_close_old_contracts(self):
    _logger.info('CRON Called for to verify closed dates contracts')
    domain = ['|', ('half_pension_unsubscribe_date', '<=', fields.Date.today()),
            ('nursery_morning_unsubscribe_date', '<=', fields.Date.today()),
            ('nursery_evening_unsubscribe_date', '<=', fields.Date.today())]
    for contract in self.search(domain):
        to_write = {}
        if contract.half_pension_unsubscribe_date <= fields.Date.today():
            if contract.half_pension_status != "3":
                to_write['half_pension_status'] = "3"
        if contract.nursery_morning_unsubscribe_date <= fields.Date.today():
            if contract.nursery_status_morning != "3":
                to_write['nursery_status_morning'] = "3"
        if contract.nursery_evening_unsubscribe_date <= fields.Date.today():
            if contract.nursery_status_evening != "3":
                to_write['nursery_status_evening'] = "3"
        contract.write(to_write)

Вы сравнили каждый статус с «равно 3» и в конце написали «3». Это не имеет смысла, поэтому я изменил «равно» на «не равно» в коде выше.

Редактировать: подсказка от Документация Odoo

ОПАСНО каждое присвоение полю запускает обновление базы данных, когда установка нескольких полей одновременно или установка полей на нескольких записи (с тем же значением), используйте write ().

...