Files
tryton/modules/incoterm/sale.py
T
Cédric Krier ddf4f72c99 Extend grouping fields with a list
4e84027dbc2e updated the grouping fields method to receive the grouped
instance but it did not adapt to the returned type which is a list.

Closes #12718
(grafted from 099eaaf2255b752db61c8c91441e430bf148795a)

--HG--
branch : 7.0
2023-11-08 00:09:37 +01:00

111 lines
3.6 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.i18n import gettext
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from .common import IncotermAvailableMixin, IncotermMixin
class Sale(IncotermAvailableMixin, metaclass=PoolMeta):
__name__ = 'sale.sale'
@classmethod
def __setup__(cls):
super().__setup__()
cls.incoterm_location.search_context['incoterm_type'] = 'sale'
@property
@fields.depends('party')
def _party_incoterms(self):
return self.party.sale_incoterms if self.party else []
def _get_shipment_sale(self, Shipment, key):
pool = Pool()
ShipmentOut = pool.get('stock.shipment.out')
shipment = super()._get_shipment_sale(Shipment, key)
if isinstance(shipment, ShipmentOut):
shipment.incoterm = self.incoterm
shipment.incoterm_location = self.incoterm_location
return shipment
def _get_shipment_grouping_fields(self, shipment):
return super()._get_shipment_grouping_fields(shipment) + [
'incoterm', 'incoterm_location']
@property
@fields.depends('company', 'warehouse', 'shipment_address')
def _incoterm_required(self):
if self.company.incoterms:
if (self.warehouse and self.warehouse.address
and self.shipment_address):
return (
self.warehouse.address.country
!= self.shipment_address.country)
return False
def check_for_quotation(self):
from trytond.modules.sale.exceptions import SaleQuotationError
super().check_for_quotation()
if not self.incoterm and self._incoterm_required:
for line in self.lines:
if line.product and line.product.type in {'goods', 'assets'}:
raise SaleQuotationError(
gettext('incoterm'
'.msg_sale_incoterm_required_for_quotation',
sale=self.rec_name))
class Sale_Carrier(metaclass=PoolMeta):
__name__ = 'sale.sale'
@fields.depends('carrier', 'shipment_cost_method')
def _get_incoterm_pattern(self):
pattern = super()._get_incoterm_pattern()
if self.carrier:
pattern['mode'] = self.carrier.mode
pattern['carrier'] = (
'seller' if self.shipment_cost_method else 'buyer')
return pattern
@fields.depends(methods=['_set_default_incoterm'])
def on_change_carrier(self):
try:
super_on_change = super().on_change_carrier
except AttributeError:
pass
else:
super_on_change()
self._set_default_incoterm()
@fields.depends(methods=['_set_default_incoterm'])
def on_change_shipment_cost_method(self):
try:
super_on_change = super().on_change_shipment_cost_method
except AttributeError:
pass
else:
super_on_change()
self._set_default_incoterm()
class Opportunity(IncotermMixin, metaclass=PoolMeta):
__name__ = 'sale.opportunity'
@classmethod
def __setup__(cls):
super().__setup__()
cls.incoterm_location.search_context['incoterm_type'] = 'sale'
@classmethod
def _incoterm_readonly_state(cls):
return ~Eval('state').in_(['lead', 'opportunity'])
def _get_sale_opportunity(self):
sale = super()._get_sale_opportunity()
sale.incoterm = self.incoterm
sale.incoterm_location = self.incoterm_location
return sale