Рубрики
Software

Новый статус заказа в Odoo

На одном из проектов появилась необходимость добавить еще один статус к заказам (модель — sale.order). В Odoo это делается максимально быстро и удобно. Тут будет небольшой пример.

Первым делом, добавляем к атрибуту state в модели sale.order нужное нам значение. Делается это через расширение модели и метод selection_add.

from odoo import models, fields, api

class CustomSaleOrder(models.Model):
    _inherit = 'sale.order'

    state = fields.Selection(selection_add=[('fully_canceled', 'Отменен без учета')])

В существующий список статусов заказа мы добавили новый — Отменен без учета.

Также, определим действие, которое будет устанавливать заказу новый статус:

    def action_fully_canceled(self):
        self.state = 'fully_canceled'

Делаем это в том же файле, котором определили новый статус.

Теперь редактируем внешний вид заказа в Odoo. Для этого унаследуем sale.view_order_form и внесем отдельные корективы:

  • Переопределяем статусы заказа, которые отображаются вверху справа
  • Добавляем отображение кнопки, для того чтобы установить новый статус
  • Переопределяем существующую кнопку Cancel, чтобы отображалась в новом статусе
<?xml version="1.0" encoding="UTF-8"?>
 <odoo>
<record model="ir.ui.view" id="sale_order_form_view">
            <field name="name">sale_order.custom_status</field>
            <field name="model">sale.order</field>
            <field name="inherit_id" ref="sale.view_order_form"/>
            <field name="arch" type="xml">
                <!-- Переопределяем статусы заказа, которые отображаются вверху справа -->
                <xpath expr="//field[@name='state']" position="replace">
                    <field 
                        name="state" 
                        widget="statusbar" 
                        statusbar_visible="draft,sale,sent,done,cancel,fully_canceled" 
                    />
                </xpath>

                <!-- Добавляем отображение кнопки, для того чтобы установить новый статус -->
                <xpath expr="/form/header/button[@name='print_quotation']" position="after">
                    <button 
                    name="action_fully_canceled" 
                    states="draft,sale,done,canceled" string="Отменен для учета" 
                    class="oe_highlight" type="object"
                    />
                </xpath>

                <!-- Переопределяем существующую кнопку Cancel, чтобы отображалась в новом статусе -->
                <xpath expr="//form//header//button[@name='action_cancel']" position="replace">
                   <button name="action_cancel" states="draft,sent,sale,fully_canceled" type="object" string="Cancel"/>
                </xpath>
            </field>
</record>
</odoo>

Не забываем обновить модуль, в котором проделаны все изменения. Новый статус полностью функционирует, его можно использовать.