115 lines
3.6 KiB
Python
115 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.model import ModelSQL, ModelView, fields, sequence_ordered, tree
|
|
from trytond.modules.product import (
|
|
copy_product_filtered, copy_template_filtered)
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.pyson import Bool, Eval, If
|
|
|
|
|
|
class Template(copy_template_filtered('tasks'), metaclass=PoolMeta):
|
|
__name__ = 'product.template'
|
|
|
|
taskable = fields.Boolean(
|
|
"Taskable",
|
|
states={
|
|
'invisible': (
|
|
~Eval('salable', False)
|
|
| (Eval('type') != 'service')),
|
|
},
|
|
help="Create tasks on sale.")
|
|
tasks = fields.One2Many(
|
|
'product.project_task', 'template', "Tasks",
|
|
states={
|
|
'invisible': (
|
|
~Eval('taskable', False)
|
|
| (Eval('type') != 'service')),
|
|
},
|
|
filter=[
|
|
('product', '=', None),
|
|
])
|
|
|
|
|
|
class Product(copy_product_filtered('tasks'), metaclass=PoolMeta):
|
|
__name__ = 'product.product'
|
|
|
|
tasks = fields.One2Many(
|
|
'product.project_task', 'product', "Tasks",
|
|
states={
|
|
'invisible': (
|
|
~Eval('taskable', False)
|
|
| (Eval('type') != 'service')),
|
|
})
|
|
|
|
@property
|
|
def tasks_used(self):
|
|
yield from self.tasks
|
|
yield from self.template.tasks
|
|
|
|
|
|
class ProjectTask(sequence_ordered(), tree(), ModelSQL, ModelView):
|
|
__name__ = 'product.project_task'
|
|
|
|
template = fields.Many2One(
|
|
'product.template', "Template", ondelete='CASCADE',
|
|
domain=[
|
|
('type', '=', 'service'),
|
|
If(Bool(Eval('product')),
|
|
('products', '=', Eval('product', -1)),
|
|
()),
|
|
If(Eval('parent'),
|
|
('id', '=', None),
|
|
()),
|
|
],
|
|
states={
|
|
'required': ~Eval('parent'),
|
|
'invisible': Bool(Eval('parent')),
|
|
})
|
|
product = fields.Many2One(
|
|
'product.product', "Product", ondelete='CASCADE',
|
|
domain=[
|
|
('type', '=', 'service'),
|
|
If(Bool(Eval('template')),
|
|
('template', '=', Eval('template', -1)),
|
|
()),
|
|
If(Eval('parent'),
|
|
('id', '=', None),
|
|
()),
|
|
],
|
|
states={
|
|
'invisible': Bool(Eval('parent')),
|
|
})
|
|
parent = fields.Many2One(
|
|
'product.project_task', "Parent", ondelete='CASCADE',
|
|
states={
|
|
'required': ~Eval('template'),
|
|
'invisible': Bool(Eval('template')),
|
|
})
|
|
name = fields.Char("Name", required=True)
|
|
timesheet_available = fields.Boolean("Available on timesheets")
|
|
children = fields.One2Many(
|
|
'product.project_task', 'parent', "Children")
|
|
|
|
@fields.depends(
|
|
'product', '_parent_product.template')
|
|
def on_change_product(self):
|
|
if self.product:
|
|
self.template = self.product.template
|
|
|
|
def get_sold_works(self, line):
|
|
"Yield sold works for the sale line"
|
|
pool = Pool()
|
|
Work = pool.get('project.work')
|
|
WorkStatus = pool.get('project.work.status')
|
|
status = WorkStatus.get_default_status('task')
|
|
yield Work(
|
|
type='task',
|
|
name=self.name,
|
|
company=line.sale.company,
|
|
origin=line,
|
|
timesheet_available=self.timesheet_available,
|
|
children=[
|
|
w for c in self.children for w in c.get_sold_works(line)],
|
|
status=status)
|