78 lines
2.3 KiB
Python
78 lines
2.3 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 functools import wraps
|
|
|
|
from trytond.i18n import gettext
|
|
from trytond.model.exceptions import AccessError
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.transaction import without_check_access
|
|
|
|
|
|
def process_opportunity(func):
|
|
@wraps(func)
|
|
def wrapper(cls, sales):
|
|
pool = Pool()
|
|
Opportunity = pool.get('sale.opportunity')
|
|
with without_check_access():
|
|
opportunities = Opportunity.browse(
|
|
set(s.origin for s in cls.browse(sales)
|
|
if isinstance(s.origin, Opportunity)))
|
|
result = func(cls, sales)
|
|
with without_check_access():
|
|
Opportunity.process(opportunities)
|
|
return result
|
|
return wrapper
|
|
|
|
|
|
class Sale(metaclass=PoolMeta):
|
|
__name__ = 'sale.sale'
|
|
|
|
@classmethod
|
|
def _get_origin(cls):
|
|
return super()._get_origin() + ['sale.opportunity']
|
|
|
|
@classmethod
|
|
def check_modification(cls, mode, sales, values=None, external=False):
|
|
pool = Pool()
|
|
Opportunity = pool.get('sale.opportunity')
|
|
|
|
super().check_modification(
|
|
mode, sales, values=values, external=external)
|
|
|
|
if mode == 'write' and 'origin' in values:
|
|
origin = values['origin']
|
|
if origin and not isinstance(origin, str):
|
|
origin = '%s,%s' % tuple(origin)
|
|
for sale in sales:
|
|
if (isinstance(sale.origin, Opportunity)
|
|
and str(sale.origin) != origin):
|
|
raise AccessError(gettext(
|
|
'sale_opportunity'
|
|
'.msg_modify_origin_opportunity',
|
|
sale=sale.rec_name))
|
|
|
|
@classmethod
|
|
@process_opportunity
|
|
def cancel(cls, sales):
|
|
super().cancel(sales)
|
|
|
|
@classmethod
|
|
@process_opportunity
|
|
def quote(cls, sales):
|
|
super().quote(sales)
|
|
|
|
@classmethod
|
|
@process_opportunity
|
|
def confirm(cls, sales):
|
|
super().confirm(sales)
|
|
|
|
@classmethod
|
|
@process_opportunity
|
|
def proceed(cls, sales):
|
|
super().proceed(sales)
|
|
|
|
@classmethod
|
|
@process_opportunity
|
|
def do(cls, sales):
|
|
super().do(sales)
|