Переопределить метод api.onchange

1

Я пытаюсь переопределить метод _onchange_product_id_check_availability из класса sale.order.line, чтобы изменить исчисление доступности.

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

это оригинальный метод:

@api.onchange('product_uom_qty', 'product_uom', 'route_id')
    def _onchange_product_id_check_availability(self):
        if not self.product_id or not self.product_uom_qty or not self.product_uom:
            self.product_packaging = False
            return {}
        if self.product_id.type == 'product':
            precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
            product = self.product_id.with_context(warehouse=self.order_id.warehouse_id.id)
            product_qty = self.product_uom._compute_quantity(self.product_uom_qty, self.product_id.uom_id)
            if float_compare(product.virtual_available, product_qty, precision_digits=precision) == -1:
                is_available = self._check_routing()
                if not is_available:
                    message =  _('You plan to sell %s %s but you only have %s %s available in %s warehouse.') % \
                            (self.product_uom_qty, self.product_uom.name, product.virtual_available, product.uom_id.name, self.order_id.warehouse_id.name)
                    # We check if some products are available in other warehouses.
                    if float_compare(product.virtual_available, self.product_id.virtual_available, precision_digits=precision) == -1:
                        message += _('\nThere are %s %s available accross all warehouses.') % \
                                (self.product_id.virtual_available, product.uom_id.name)

                    warning_mess = {
                        'title': _('Not enough inventory!'),
                        'message' : message
                    }
                    return {'warning': warning_mess}
        return {}

и это то, что я пытаюсь реализовать:

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


    @api.onchange('product_uom_qty', 'product_uom', 'route_id')
    def _onchange_product_id_check_availability(self):
        if not self.product_id or not self.product_uom_qty or not self.product_uom:
            self.product_packaging = False
            return {}
        if self.product_id.type == 'product':
            precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
            product = self.product_id.with_context(warehouse=self.order_id.warehouse_id.id)
            product_qty = self._calculate_availabilty()
            if float_compare(product.virtual_available, product_qty, precision_digits=precision) == -1:
                is_available = self._check_routing()
                if not is_available:
                    message =  _('You plan to sell %s %s but you only have %s %s available in %s warehouse.') % \
                            (product_qty, self.product_uom.name, product.virtual_available, product.uom_id.name, self.order_id.warehouse_id.name)
                    # We check if some products are available in other warehouses.
                    if float_compare(product.virtual_available, self.product_id.virtual_available, precision_digits=precision) == -1:
                        message += _('\nThere are %s %s available accross all warehouses.') % \
                                (self.product_id.virtual_available, product.uom_id.name)

                    warning_mess = {
                        'title': _('Not enough inventory!'),
                        'message' : message
                    }
                    return {'warning': warning_mess}
        return {}


    def _calculate_availabilty(self):
        pdb.set_trace()
        if self.product_uom.name == "Piece(s)":
            return self.product_uom_qty
        if self.product_uom.name == "Kilogram":
            if(self.product_id.theoric_weight == 0 or self.product_uom_qty==0):
                return self.product_uom_qty
            return self.product_uom_qty/self.product_id.theoric_weight
        pass
  • 1
    Вы добавили в свой __manifest__.py модуль sale_stock в массив depends перезапустили сервис Odoo и после этого обновили свой модуль?
  • 1
    @forvas Forvas Боже мой, спасибо! это сработало! :) большое Вам спасибо!! , У меня были продажи и запасы в качестве зависимостей, но я не думал, что мне придется добавить это тоже.
Показать ещё 1 комментарий
Теги:
odoo
odoo-11

1 ответ

1
Лучший ответ

Метод _onchange_product_id_check_availability определен в модуле sale_stock.

Если вы хотите заменить его поведение, не забудьте добавить модуль sale_stock в массив depends вашего __manifest__.py. В противном случае ваш метод не будет вызываться, и исходный код будет выполнен, как всегда.

'depends': [
    'sale_stock',
    ...
],

Ещё вопросы

Сообщество Overcoder
Наверх
Меню