kalenislims/lims_project_implementation/project.py

157 lines
5.5 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims_project_implementation module for 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
from trytond.report import Report
from trytond.pool import PoolMeta, Pool
from trytond.pyson import Eval, Equal, Bool, Not
class Project(metaclass=PoolMeta):
__name__ = 'lims.project'
mpi_date = fields.Date('Request date',
states={'required': Bool(Equal(Eval('type'), 'implementation'))},
depends=['type'])
mpi_services = fields.Function(fields.Text('Requested analysis'),
'get_mpi_services')
mpi_product_types = fields.Function(fields.Text('Product types'),
'get_mpi_product_types')
mpi_matrixs = fields.Function(fields.Text('Matrixs'), 'get_mpi_matrixs')
mpi_methods = fields.Function(fields.Text('Methods'), 'get_mpi_methods')
mpi_laboratory_date = fields.Date(
'Date of delivery of report and procedure to the laboratory',)
mpi_professionals = fields.One2Many(
'lims.project.mpi_professional', 'project', 'Professionals')
@classmethod
def __setup__(cls):
super().__setup__()
project_type = ('implementation', 'Implementation')
if project_type not in cls.type.selection:
cls.type.selection.append(project_type)
cls.external_quality_control.states['invisible'] = Bool(
Equal(Eval('type'), 'implementation'))
cls.external_quality_control.depends = ['type']
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//group[@id="implementation"]', 'states', {
'invisible': Not(Bool(Equal(Eval('type'), 'implementation'))),
}),
]
def get_mpi_product_types(self, name):
pool = Pool()
Sample = pool.get('lims.sample')
samples = Sample.search([
('entry.project', '=', self.id),
], order=[('number', 'ASC')])
product_types = list(set(s.product_type.description for s in samples))
return '\n'.join(product_types)
def get_mpi_matrixs(self, name):
pool = Pool()
Sample = pool.get('lims.sample')
samples = Sample.search([
('entry.project', '=', self.id),
], order=[('number', 'ASC')])
matrixs = list(set(s.matrix.description for s in samples))
return '\n'.join(matrixs)
def get_mpi_services(self, name):
pool = Pool()
Service = pool.get('lims.service')
services = Service.search([
('fraction.sample.entry.project', '=', self.id),
], order=[('number', 'ASC')])
return '\n'.join(s.analysis.description for s in services)
def get_mpi_methods(self, name):
pool = Pool()
Service = pool.get('lims.service')
services = Service.search([
('fraction.sample.entry.project', '=', self.id),
], order=[('number', 'ASC')])
return '\n'.join(s.method.name for s in services if s.method)
class ProjectProfessional(ModelSQL, ModelView):
'Project Professional'
__name__ = 'lims.project.mpi_professional'
project = fields.Many2One('lims.project', 'Implementation project',
ondelete='CASCADE', select=True, required=True)
employee = fields.Many2One('company.employee', 'Employee', required=True)
position = fields.Many2One('lims.project.stp_professional.position',
'Position')
class ProjectSolventAndReagent(metaclass=PoolMeta):
__name__ = 'lims.project.solvent_reagent'
purchase_date = fields.Date('Purchase date')
@fields.depends('lot')
def on_change_lot(self, name=None):
pool = Pool()
Move = pool.get('stock.move')
if not self.lot:
return
purchases = Move.search([
('lot', '=', self.lot),
('from_location.type', '=', 'supplier'),
], order=[('effective_date', 'ASC')], limit=1)
if purchases:
self.purchase_date = purchases[0].effective_date
class Entry(metaclass=PoolMeta):
__name__ = 'lims.entry'
@classmethod
def __setup__(cls):
super().__setup__()
project_type = ('implementation', 'Implementation')
if project_type not in cls.project_type.selection:
cls.project_type.selection.append(project_type)
class Fraction(metaclass=PoolMeta):
__name__ = 'lims.fraction'
@fields.depends('type')
def on_change_with_special_type(self, name=None):
Config = Pool().get('lims.configuration')
config = Config(1)
if self.type and self.type == config.mpi_fraction_type:
return 'mpi'
return super().on_change_with_special_type(name)
@classmethod
def _get_special_type(cls, types):
Config = Pool().get('lims.configuration')
config = Config(1)
res_type = super()._get_special_type(types)
for type_ in types:
if type_ == 'mpi':
res_type.append(config.mpi_fraction_type)
return res_type
class ImplementationsReport(Report):
'Implementation Projects'
__name__ = 'lims.project.implementation_report'
@classmethod
def get_context(cls, records, header, data):
records = [r for r in records if r.type == 'implementation']
report_context = super().get_context(records, header, data)
report_context['company'] = report_context['user'].company
report_context['records'] = records
return report_context