Files
tryton/modules/purchase_request/purchase.py
T

109 lines
3.7 KiB
Python
Raw Normal View History

2016-03-25 17:01:00 +01:00
# 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
2016-03-25 17:01:00 +01:00
2018-12-29 14:20:29 +01:00
from trytond.i18n import gettext
from trytond.pool import PoolMeta, Pool
from trytond.model import ModelView, Workflow, fields
2018-12-29 14:20:29 +01:00
from trytond.model.exceptions import AccessError
2016-12-27 17:50:05 +01:00
from trytond.transaction import Transaction
from trytond.pyson import Eval
2016-03-25 17:01:00 +01:00
2018-12-29 14:20:29 +01:00
from .exceptions import PurchaseWarehouseWarning
2016-03-25 17:01:00 +01:00
def process_request(func):
@wraps(func)
def wrapper(cls, purchases):
pool = Pool()
Request = pool.get('purchase.request')
func(cls, purchases)
requests = [r for p in purchases for l in p.lines for r in l.requests]
Request.update_state(requests)
return wrapper
2018-06-26 19:11:51 +02:00
class Purchase(metaclass=PoolMeta):
2016-03-25 17:01:00 +01:00
__name__ = 'purchase.purchase'
@classmethod
def delete(cls, purchases):
2016-12-27 17:50:05 +01:00
cls.check_delete_purchase_request(purchases)
2016-03-25 17:01:00 +01:00
super(Purchase, cls).delete(purchases)
2016-12-27 17:50:05 +01:00
@classmethod
2016-12-27 17:50:05 +01:00
def check_delete_purchase_request(cls, purchases):
with Transaction().set_context(_check_access=False):
purchases = cls.browse(purchases)
for purchase in purchases:
for line in purchase.lines:
if line.requests:
2018-12-29 14:20:29 +01:00
raise AccessError(
gettext('purchase_request.msg_purchase_delete_request',
purchase=purchase.rec_name))
@classmethod
@ModelView.button
@Workflow.transition('confirmed')
def confirm(cls, purchases):
for purchase in purchases:
purchase.check_request_warehouse()
super(Purchase, cls).confirm(purchases)
def check_request_warehouse(self):
2018-12-29 14:20:29 +01:00
pool = Pool()
Warning = pool.get('res.user.warning')
for line in self.lines:
for request in line.requests:
if request.warehouse != self.warehouse:
w_name = 'check_request_warehouse_%s_%s_%s' % (
self.id, self.warehouse.id, request.warehouse.id)
2018-12-29 14:20:29 +01:00
if Warning.check(w_name):
raise PurchaseWarehouseWarning(
w_name,
gettext('purchase_request'
'.msg_purchase_request_warehouse',
purchase=self.rec_name,
purchase_warehouse=self.warehouse.rec_name,
request=request.rec_name,
request_warehouse=request.warehouse.rec_name))
2016-12-27 17:50:05 +01:00
@classmethod
@ModelView.button
@Workflow.transition('cancelled')
@process_request
def cancel(cls, purchases):
super(Purchase, cls).cancel(purchases)
@classmethod
@Workflow.transition('done')
@process_request
def do(cls, purchases):
super(Purchase, cls).do(purchases)
2016-12-27 17:50:05 +01:00
2020-03-01 12:33:53 +01:00
class Line(metaclass=PoolMeta):
2016-12-27 17:50:05 +01:00
__name__ = 'purchase.line'
requests = fields.One2Many(
'purchase.request', 'purchase_line', "Requests", readonly=True,
states={
'invisible': ~Eval('requests'),
})
2023-01-04 13:59:46 +01:00
@classmethod
def copy(cls, lines, default=None):
default = default.copy() if default is not None else {}
default.setdefault('requests')
return super().copy(lines, default=default)
@classmethod
def delete(cls, lines):
pool = Pool()
Request = pool.get('purchase.request')
with Transaction().set_context(_check_access=False):
requests = [r for l in cls.browse(lines) for r in l.requests]
2020-03-01 12:33:53 +01:00
super().delete(lines)
with Transaction().set_context(_check_access=False):
Request.update_state(requests)