kalenislims/lims_project/project.py

130 lines
3.9 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims_project 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 ModelView, ModelSQL, fields, Unique
from trytond.pool import PoolMeta, Pool
from trytond.pyson import Eval
from trytond.transaction import Transaction
__all__ = ['Project', 'Entry', 'Sample', 'CreateSampleStart', 'CreateSample']
class Project(ModelSQL, ModelView):
'Project'
__name__ = 'lims.project'
_rec_name = 'description'
code = fields.Char('Code', states={'required': True})
description = fields.Char('Description', required=True)
type = fields.Selection([], 'Type', sort=False)
start_date = fields.Date('Start date')
end_date = fields.Date('End date')
client = fields.Many2One('party.party', 'Client')
storage_time = fields.Integer('Storage time (in months)', required=True)
comments = fields.Text('Comments')
external_quality_control = fields.Boolean('External quality control')
@classmethod
def __setup__(cls):
super(Project, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'lims_project.msg_code_unique_id'),
]
@staticmethod
def default_storage_time():
return 3
@staticmethod
def default_external_quality_control():
return False
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
class Entry(metaclass=PoolMeta):
__name__ = 'lims.entry'
project = fields.Many2One('lims.project', 'Project',
domain=[('client', '=', Eval('party'))], depends=['party'])
project_type = fields.Function(fields.Selection([],
'Type', sort=False),
'on_change_with_project_type')
@classmethod
def __setup__(cls):
super(Entry, cls).__setup__()
cls.samples.context.update({
'project': Eval('project', None),
})
if 'project' not in cls.samples.depends:
cls.samples.depends.append('project')
@fields.depends('project', '_parent_project.type')
def on_change_with_project_type(self, name=None):
res = None
if self.project:
res = self.project.type
return res
class Sample(metaclass=PoolMeta):
__name__ = 'lims.sample'
project_type = fields.Function(fields.Selection([], 'Type'),
'on_change_with_project_type')
@staticmethod
def default_project_type():
Project = Pool().get('lims.project')
if Transaction().context.get('project'):
return Project(Transaction().context.get('project')).type
return ''
@fields.depends('entry', '_parent_entry.project')
def on_change_with_project_type(self, name=None):
res = ''
if self.entry and self.entry.project:
res = self.entry.project.type
return res
class CreateSampleStart(metaclass=PoolMeta):
__name__ = 'lims.create_sample.start'
project_type = fields.Char('Type')
class CreateSample(metaclass=PoolMeta):
__name__ = 'lims.create_sample'
def default_start(self, fields):
Entry = Pool().get('lims.entry')
defaults = super(CreateSample, self).default_start(fields)
defaults['project_type'] = ''
entry = Entry(Transaction().context['active_id'])
if entry.project:
defaults['project_type'] = entry.project.type
return defaults