kalenislims/lims/certification.py

234 lines
7.5 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims 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.wizard import Wizard, StateTransition, StateView, Button
from trytond.pyson import Eval
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.exceptions import UserError
from trytond.i18n import gettext
class CertificationType(ModelSQL, ModelView):
'Certification Type'
__name__ = 'lims.certification.type'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
report = fields.Boolean('Report')
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 TechnicalScope(ModelSQL, ModelView):
'Technical Scope'
__name__ = 'lims.technical.scope'
party = fields.Many2One('party.party', 'Party', required=True)
certification_type = fields.Many2One('lims.certification.type',
'Certification type')
versions = fields.One2Many('lims.technical.scope.version',
'technical_scope', 'Versions')
def get_rec_name(self, name):
if self.party:
return self.party.rec_name
@classmethod
def search_rec_name(cls, name, clause):
return [('party',) + tuple(clause[1:])]
class TechnicalScopeVersion(ModelSQL, ModelView):
'Technical Scope Version'
__name__ = 'lims.technical.scope.version'
_rec_name = 'number'
technical_scope = fields.Many2One('lims.technical.scope',
'Technical scope', required=True)
number = fields.Char('Number', required=True)
date = fields.Date('Date', required=True)
expiration_date = fields.Date('Expiration date')
version_lines = fields.Many2Many('lims.technical.scope.version.line',
'version', 'typification', 'Typifications')
valid = fields.Boolean('Active')
@classmethod
def __setup__(cls):
super().__setup__()
cls._buttons.update({
'open_typifications': {},
'add_typifications': {
'invisible': ~Eval('valid'),
},
'remove_typifications': {
'invisible': ~Eval('valid'),
},
})
@staticmethod
def default_valid():
return True
@classmethod
def validate(cls, versions):
super().validate(versions)
for version in versions:
version.check_active()
def check_active(self):
if self.valid:
versions = self.search([
('technical_scope', '=', self.technical_scope.id),
('valid', '=', True),
('id', '!=', self.id),
])
if versions:
raise UserError(gettext('lims.msg_active_version'))
@classmethod
@ModelView.button_action('lims.act_open_typifications')
def open_typifications(cls, versions):
pass
@classmethod
@ModelView.button_action('lims.act_add_typifications')
def add_typifications(cls, versions):
pass
@classmethod
@ModelView.button_action('lims.act_remove_typifications')
def remove_typifications(cls, versions):
pass
class TechnicalScopeVersionLine(ModelSQL):
'Technical Scope Version Line'
__name__ = 'lims.technical.scope.version.line'
version = fields.Many2One('lims.technical.scope.version',
'Technical scope version', ondelete='CASCADE', select=True,
required=True)
typification = fields.Many2One('lims.typification', 'Typification',
ondelete='CASCADE', select=True, required=True)
class AnalysisFamily(ModelSQL, ModelView):
'Analysis Family'
__name__ = 'lims.analysis.family'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
party = fields.Many2One('party.party', 'Certificant party')
certificants = fields.One2Many('lims.analysis.family.certificant',
'family', 'Product Type - Matrix')
@classmethod
def __setup__(cls):
super().__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'lims.msg_analysis_family_code_unique_id'),
]
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 AnalysisFamilyCertificant(ModelSQL, ModelView):
'Product Type - Matrix'
__name__ = 'lims.analysis.family.certificant'
family = fields.Many2One('lims.analysis.family', 'Family', required=True)
product_type = fields.Many2One('lims.product.type', 'Product type',
required=True)
matrix = fields.Many2One('lims.matrix', 'Matrix', required=True)
@classmethod
def __setup__(cls):
super().__setup__()
t = cls.__table__()
cls._sql_constraints += [
('product_matrix_uniq',
Unique(t, t.family, t.product_type, t.matrix),
'lims.msg_analysis_family_certificant_unique_id'),
]
class DuplicateAnalysisFamilyStart(ModelView):
'Duplicate Analysis Family'
__name__ = 'lims.analysis.family.duplicate.start'
family_origin = fields.Many2One('lims.analysis.family', 'Family Origin')
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
party = fields.Many2One('party.party', 'Certificant party')
class DuplicateAnalysisFamily(Wizard):
'Duplicate Analysis Family'
__name__ = 'lims.analysis.family.duplicate'
start = StateView('lims.analysis.family.duplicate.start',
'lims.lims_duplicate_analysis_family_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Duplicate', 'duplicate', 'tryton-ok', default=True),
])
duplicate = StateTransition()
def default_start(self, fields):
AnalysisFamily = Pool().get('lims.analysis.family')
family_origin = AnalysisFamily(Transaction().context['active_id'])
return {
'family_origin': family_origin.id,
'code': family_origin.code,
'description': family_origin.description,
}
def transition_duplicate(self):
AnalysisFamily = Pool().get('lims.analysis.family')
AnalysisFamily.copy([self.start.family_origin], default={
'code': self.start.code,
'description': self.start.description,
'party': self.start.party.id if self.start.party else None,
})
return 'end'
def end(self):
return 'reload'