74 lines
2.8 KiB
Python
74 lines
2.8 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.model import fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.tools import grouped_slice
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
class Lot(metaclass=PoolMeta):
|
|
__name__ = 'stock.lot'
|
|
|
|
subscription_services = fields.Many2Many(
|
|
'sale.subscription.service-stock.lot.asset',
|
|
'lot', 'service', "Services")
|
|
subscription_lines = fields.One2Many(
|
|
'sale.subscription.line', 'asset_lot', "Subscription Lines")
|
|
subscribed = fields.Function(
|
|
fields.Many2One('sale.subscription.line', "Subscribed"),
|
|
'get_subscribed', searcher='search_subscribed')
|
|
|
|
@classmethod
|
|
def get_subscribed(cls, lots, name):
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
SubscriptionLine = pool.get('sale.subscription.line')
|
|
|
|
subscribed_lines = {l.id: None for l in lots}
|
|
date = Transaction().context.get('date', Date.today())
|
|
for sub_lots in grouped_slice(lots):
|
|
lines = SubscriptionLine.search([
|
|
('asset_lot', 'in', [l.id for l in sub_lots]),
|
|
[
|
|
('start_date', '<=', date),
|
|
['OR',
|
|
('end_date', '=', None),
|
|
('end_date', '>', date),
|
|
],
|
|
]
|
|
])
|
|
subscribed_lines.update((s.asset_lot.id, s.id) for s in lines)
|
|
return subscribed_lines
|
|
|
|
@classmethod
|
|
def search_subscribed(cls, name, clause):
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
|
|
name, operator, value = clause[:3]
|
|
date = Transaction().context.get('date', Date.today())
|
|
domain = [
|
|
('asset_lot', '!=', None),
|
|
('start_date', '<=', date),
|
|
['OR',
|
|
('end_date', '=', None),
|
|
('end_date', '>', date),
|
|
],
|
|
]
|
|
if '.' in name:
|
|
_, target_name = name.split('.', 1)
|
|
domain.append((target_name,) + tuple(clause[1:]))
|
|
return [('subscription_lines', 'where', domain)]
|
|
else:
|
|
if (operator, value) == ('=', None):
|
|
return [('subscription_lines', 'not where', domain)]
|
|
elif (operator, value) == ('!=', None):
|
|
return [('subscription_lines', 'where', domain)]
|
|
else:
|
|
if isinstance(value, str):
|
|
target_name = 'rec_name'
|
|
else:
|
|
target_name = 'id'
|
|
domain.append((target_name,) + tuple(clause[1:]))
|
|
return [('subscription_lines', 'where', domain)]
|