trytond-carrier_load_ul/unit_load.py

180 lines
6.4 KiB
Python

# The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import fields, ModelView, Model
from trytond.pool import PoolMeta, Pool
from trytond.pyson import Eval, Bool
from trytond.exceptions import UserError
from trytond.i18n import gettext
class UnitLoad(metaclass=PoolMeta):
__name__ = 'stock.unit_load'
load_line = fields.Many2One('carrier.load.order.line', 'Load line',
select=True, readonly=True,
ondelete='RESTRICT')
load_order = fields.Function(
fields.Many2One('carrier.load.order', 'Load order'),
'get_load_order', searcher='search_load_order')
load_order_state = fields.Function(fields.Selection(
'get_load_order_states', 'Load order State'), 'get_load_order_state')
load_lines = fields.Many2Many('carrier.load.order.line-stock.unit_load',
'unit_load', 'load_line', 'Load lines')
@classmethod
def __setup__(cls):
super(UnitLoad, cls).__setup__()
cls._buttons.update({
'unload': {
'invisible': (Eval('load_order_state') == 'done'),
'readonly': (Eval('load_order_state') == 'done'),
'depends': ['load_order_state']
}
})
cls._buttons['move_try']['invisible'] |= Bool(Eval('load_order'))
cls._buttons['move_try'].setdefault('depends', [])
cls._buttons['move_try']['depends'].append('load_order')
def get_load_order_state(self, name=None):
if self.load_order:
return self.load_order.state
@classmethod
def get_load_order_states(cls):
pool = Pool()
Load = pool.get('carrier.load.order')
return Load.state.selection
@classmethod
def copy(cls, records, default=None):
if default is None:
default = {}
default = default.copy()
default['load_line'] = None
default['load_lines'] = None
return super(UnitLoad, cls).copy(records, default=default)
@classmethod
def delete(cls, records):
if any(r.load_line for r in records):
raise UserError(gettext(
'carrier_load_ul.msg_stock_unit_load_delete_load'))
super(UnitLoad, cls).delete(records)
@classmethod
def get_load_order(cls, records, name=None):
values = {}
for record in records:
load_line = record.load_line or (
record.load_lines and record.load_lines[-1])
values[record.id] = load_line.order.id if load_line else None
return values
@classmethod
def search_load_order(cls, name, clause):
join_operator = 'OR'
cond1, cond2 = [], []
def get_field(_field):
return '%s.%s' % (
_field,
clause[0].replace(name, 'order', 1))
if '.' not in clause[0]:
if clause[2] is None:
if clause[1] == '=':
join_operator = 'AND'
cond1.append(('load_line', ) + tuple(clause[1:]))
cond2.append(('load_lines', ) + tuple(clause[1:]))
else:
cond1.append((get_field('load_line'), ) + tuple(clause[1:]))
cond2.extend([
('load_lines', '!=', None),
(get_field('load_lines'), ) + tuple(clause[1:])
])
else:
cond1.append((get_field('load_line'), ) + tuple(clause[1:]))
cond2.append((get_field('load_lines'), ) + tuple(clause[1:]))
return [join_operator,
cond1,
cond2
]
@classmethod
@ModelView.button
def unload(cls, records, load_order=None):
if cls.unload_try(records, load_order):
for record in records:
if record.load_line:
record.load_line = None
elif record.load_lines:
record.load_lines = list(record.load_lines)[:-1]
cls.save(records)
@classmethod
def unload_try(cls, records, load_order=None):
for record in records:
load_line = record.load_line
if load_line and load_order and load_line.order != load_order:
raise UserError(gettext(
'carrier_load_ul.msg_stock_unit_load_wrong_load_order',
unit_load=record.rec_name,
order=load_order.rec_name))
if not load_line and record.load_lines:
load_line = record.load_lines[-1]
if load_order and load_line.order != load_order:
raise UserError(gettext(
'carrier_load_ul.msg_stock_unit_load_wrong_load_order',
unit_load=record.rec_name,
order=load_order.rec_name))
if load_line and load_line.order.state == 'done' and \
load_line.order.sale.state not in ('draft', 'quotation'):
raise UserError(gettext(
'carrier_load_ul.msg_stock_unit_load_unload'))
return True
@classmethod
def get_available(cls, records, name=None):
res = super(UnitLoad, cls).get_available(records, name)
sub_records = [r for r in records
if r.load_line and r.load_line.order.type == 'out']
res.update({r.id: False for r in sub_records})
return res
@classmethod
def search_available(cls, name, clause):
res = super(UnitLoad, cls).search_available(name, clause)
reverse = {
'=': '!=',
'!=': '='
}
operation = 'AND'
if (clause[2] and clause[1] == '=') or (
not clause[2] and clause[1] == '!='):
operation = 'OR'
_load_domain = [operation,
('load_line', clause[1] if clause[2]
else reverse[clause[1]], None),
('load_line.order.type', clause[1] if not clause[2]
else reverse[clause[1]], 'out')
]
res.append(_load_domain)
return res
class UnitLoadLabel(metaclass=PoolMeta):
__name__ = 'stock.unit_load.label'
@classmethod
def counter(cls, unit_load):
res = super(UnitLoadLabel, cls).counter(unit_load)
if not res and unit_load.load_line:
_items = [ul.id for ul in unit_load.load_line.order.unit_loads]
return '%s' % (_items.index(unit_load.id) + 1)
return res