50 lines
2.2 KiB
Python
50 lines
2.2 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import api, fields, models
|
||
|
|
||
|
|
||
|
class SaleOrderLine(models.Model):
|
||
|
_inherit = "sale.order.line"
|
||
|
_description = "Sales Order Line"
|
||
|
|
||
|
sale_order_option_ids = fields.One2many('sale.order.option', 'line_id', 'Optional Products Lines')
|
||
|
|
||
|
@api.depends('product_id')
|
||
|
def _compute_name(self):
|
||
|
# Take the description on the order template if the product is present in it
|
||
|
super()._compute_name()
|
||
|
for line in self:
|
||
|
if line.product_id and line.order_id.sale_order_template_id and line._use_template_name():
|
||
|
for template_line in line.order_id.sale_order_template_id.sale_order_template_line_ids:
|
||
|
if line.product_id == template_line.product_id:
|
||
|
lang = line.order_id.partner_id.lang
|
||
|
line.name = template_line.with_context(lang=lang).name + line.with_context(lang=lang)._get_sale_order_line_multiline_description_variants()
|
||
|
break
|
||
|
|
||
|
def _use_template_name(self):
|
||
|
""" Allows overriding to avoid using the template lines descriptions for the sale order lines descriptions.
|
||
|
This is typically useful for 'configured' products, such as event_ticket or event_booth, where we need to have
|
||
|
specific configuration information inside description instead of the default values.
|
||
|
"""
|
||
|
self.ensure_one()
|
||
|
return True
|
||
|
|
||
|
def _compute_price_unit(self):
|
||
|
# Avoid recomputing the price with pricelist rules, use the initial price
|
||
|
# used in the optional product line.
|
||
|
lines_without_price_recomputation = self._lines_without_price_recomputation()
|
||
|
super(SaleOrderLine, self - lines_without_price_recomputation)._compute_price_unit()
|
||
|
|
||
|
def _lines_without_price_recomputation(self):
|
||
|
""" Hook to allow filtering the lines to avoid the recomputation of the price. """
|
||
|
return self.filtered('sale_order_option_ids')
|
||
|
|
||
|
#=== TOOLING ===#
|
||
|
|
||
|
def _can_be_edited_on_portal(self):
|
||
|
return self.order_id._can_be_edited_on_portal() and (
|
||
|
self.sale_order_option_ids
|
||
|
or self.product_id in self.order_id.sale_order_option_ids.product_id
|
||
|
)
|