lims_industry: task trigger refactoring

This commit is contained in:
Adri?n Bernardi 2019-11-13 18:00:43 -03:00
parent 256eac5b01
commit 8441e9119f
12 changed files with 306 additions and 4 deletions

View File

@ -4,7 +4,9 @@
from trytond.pool import Pool
from . import industry
from . import sample
from . import party
from . import task
def register():
@ -17,6 +19,10 @@ def register():
industry.EquipmentTemplateComponentType,
industry.Equipment,
industry.Component,
sample.Entry,
sample.Sample,
party.Party,
party.Address,
task.AdministrativeTaskTemplate,
task.AdministrativeTask,
module='lims_industry', type_='model')

View File

@ -181,6 +181,30 @@ class Equipment(ModelSQL, ModelView):
'lims_industry.msg_equipment_name_unique'),
]
@classmethod
def create(cls, vlist):
TaskTemplate = Pool().get('lims.administrative.task.template')
equipments = super(Equipment, cls).create(vlist)
TaskTemplate.create_tasks('equipment_missing_data',
cls._for_task_missing_data(equipments))
return equipments
@classmethod
def _for_task_missing_data(cls, equipments):
AdministrativeTask = Pool().get('lims.administrative.task')
res = []
for equipment in equipments:
if not equipment.missing_data:
continue
if AdministrativeTask.search([
('type', '=', 'equipment_missing_data'),
('origin', '=', '%s,%s' % (cls.__name__, equipment.id)),
('state', 'not in', ('done', 'discarded')),
]):
continue
res.append(equipment)
return res
@fields.depends('plant')
def on_change_with_party(self, name=None):
return self.get_party([self], name)[self.id]
@ -265,6 +289,7 @@ class Component(ModelSQL, ModelView):
'get_plant', searcher='search_plant')
party = fields.Function(fields.Many2One('party.party', 'Party'),
'get_party', searcher='search_party')
missing_data = fields.Boolean('Missing data')
@classmethod
def __setup__(cls):
@ -277,6 +302,30 @@ class Component(ModelSQL, ModelView):
'lims_industry.msg_component_type_unique'),
]
@classmethod
def create(cls, vlist):
TaskTemplate = Pool().get('lims.administrative.task.template')
components = super(Component, cls).create(vlist)
TaskTemplate.create_tasks('component_missing_data',
cls._for_task_missing_data(components))
return components
@classmethod
def _for_task_missing_data(cls, components):
AdministrativeTask = Pool().get('lims.administrative.task')
res = []
for component in components:
if not component.missing_data:
continue
if AdministrativeTask.search([
('type', '=', 'component_missing_data'),
('origin', '=', '%s,%s' % (cls.__name__, component.id)),
('state', 'not in', ('done', 'discarded')),
]):
continue
res.append(component)
return res
def get_rec_name(self, name):
res = self.type.rec_name
if self.brand:

View File

@ -62,6 +62,10 @@ msgctxt "field:lims.component,internal_id:"
msgid "Internal ID Code"
msgstr "Código ID interno"
msgctxt "field:lims.component,missing_data:"
msgid "Missing data"
msgstr "Falta información"
msgctxt "field:lims.component,model:"
msgid "Model"
msgstr "Modelo"
@ -394,6 +398,10 @@ msgctxt "field:lims.plant,zip:"
msgid "Zip"
msgstr "Código postal"
msgctxt "field:lims.sample,missing_data:"
msgid "Missing data"
msgstr "Falta información"
msgctxt "field:party.address,administrative_contact:"
msgid "Administrative contact"
msgstr "Administrativo"
@ -422,6 +430,10 @@ msgctxt "field:party.address,technical_contact:"
msgid "Technical contact"
msgstr "Técnico"
msgctxt "field:party.party,complete_file:"
msgid "Complete File"
msgstr "Ficha completa"
msgctxt "field:party.party,fantasy_name:"
msgid "Fantasy Name"
msgstr "Nombre de fantasía"
@ -466,6 +478,22 @@ msgctxt "model:ir.action,name:act_plant"
msgid "Plants"
msgstr "Plantas"
msgctxt "model:ir.message,text:lbl_component_missing_data"
msgid "Missing data in Component"
msgstr "Faltan datos en Componente"
msgctxt "model:ir.message,text:lbl_equipment_missing_data"
msgid "Missing data in Equipment"
msgstr "Faltan datos en Equipo"
msgctxt "model:ir.message,text:lbl_party_incomplete_file"
msgid "Incomplete file in Party"
msgstr "Ficha incompleta en Tercero"
msgctxt "model:ir.message,text:lbl_sample_missing_data"
msgid "Missing data in Sample"
msgstr "Faltan datos en Muestra"
msgctxt "model:ir.message,text:msg_component_type_unique"
msgid "A component of the same type already exists for the equipment"
msgstr "Ya existe un componente del mismo tipo para el equipo"
@ -474,6 +502,18 @@ msgctxt "model:ir.message,text:msg_equipment_name_unique"
msgid "There is already an equipment with the same name for the plant"
msgstr "Ya existe un equipo con el mismo nombre para la planta"
msgctxt "model:ir.message,text:msg_party_no_email"
msgid "Party \"%(party)s\" has no Email"
msgstr "La entidad «%(party)s» no tiene correo electrónico"
msgctxt "model:ir.message,text:msg_party_no_phone"
msgid "Party \"%(party)s\" has no Phone"
msgstr "La entidad «%(party)s» no tiene teléfono"
msgctxt "model:ir.message,text:msg_party_no_tax_identifier"
msgid "Party \"%(party)s\" has no Tax Identifier"
msgstr "La entidad «%(party)s» no tiene identificador fiscal"
msgctxt "model:ir.message,text:msg_plant_name_unique"
msgid "There is already a plant with the same name for the party"
msgstr "Ya existe una planta con el mismo nombre para el tercero"

View File

@ -1,14 +1,35 @@
<?xml version="1.0"?>
<tryton>
<data group="1">
<record model="ir.message" id="msg_plant_name_unique">
<field name="text">There is already a plant with the same name for the party</field>
<record model="ir.message" id="lbl_component_missing_data">
<field name="text">Missing data in Component</field>
</record>
<record model="ir.message" id="msg_equipment_name_unique">
<field name="text">There is already an equipment with the same name for the plant</field>
<record model="ir.message" id="lbl_equipment_missing_data">
<field name="text">Missing data in Equipment</field>
</record>
<record model="ir.message" id="lbl_party_incomplete_file">
<field name="text">Incomplete file in Party</field>
</record>
<record model="ir.message" id="lbl_sample_missing_data">
<field name="text">Missing data in Sample</field>
</record>
<record model="ir.message" id="msg_component_type_unique">
<field name="text">A component of the same type already exists for the equipment</field>
</record>
<record model="ir.message" id="msg_equipment_name_unique">
<field name="text">There is already an equipment with the same name for the plant</field>
</record>
<record model="ir.message" id="msg_party_no_email">
<field name="text">Party "%(party)s" has no Email</field>
</record>
<record model="ir.message" id="msg_party_no_phone">
<field name="text">Party "%(party)s" has no Phone</field>
</record>
<record model="ir.message" id="msg_party_no_tax_identifier">
<field name="text">Party "%(party)s" has no Tax Identifier</field>
</record>
<record model="ir.message" id="msg_plant_name_unique">
<field name="text">There is already a plant with the same name for the party</field>
</record>
</data>
</tryton>

View File

@ -5,6 +5,8 @@
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.exceptions import UserError
from trytond.i18n import gettext
from trytond.transaction import Transaction
__all__ = ['Party', 'Address']
@ -20,15 +22,78 @@ class Party(metaclass=PoolMeta):
states=_states, depends=_depends)
plants = fields.One2Many('lims.plant', 'party', 'Plants',
states=_states, depends=_depends)
complete_file = fields.Boolean('Complete File',
states=_states, depends=_depends)
del _states, _depends
@classmethod
def create(cls, vlist):
TaskTemplate = Pool().get('lims.administrative.task.template')
parties = super(Party, cls).create(vlist)
TaskTemplate.create_tasks('party_incomplete_file',
cls._for_task_incomplete_file(parties))
return parties
@classmethod
def _for_task_incomplete_file(cls, parties):
AdministrativeTask = Pool().get('lims.administrative.task')
res = []
for party in parties:
if party.complete_file:
continue
if AdministrativeTask.search([
('type', '=', 'party_incomplete_file'),
('origin', '=', '%s,%s' % (cls.__name__, party.id)),
('state', 'not in', ('done', 'discarded')),
]):
continue
res.append(party)
return res
@classmethod
def search_rec_name(cls, name, clause):
res = super(Party, cls).search_rec_name(name, clause)
res.append(('fantasy_name',) + tuple(clause[1:]))
return res
@classmethod
def validate(cls, parties):
super(Party, cls).validate(parties)
cls.check_complete_file(parties)
@classmethod
def check_complete_file(cls, parties):
pool = Pool()
Address = pool.get('party.address')
for party in parties:
if not party.complete_file:
continue
has_email = Address.search_count([
('party', '=', party.id),
('email', 'not in', (None, '')),
])
if has_email < 1:
raise UserError(gettext(
'lims_industry.msg_party_no_email',
party=party.rec_name))
has_phone = Address.search_count([
('party', '=', party.id),
('phone', 'not in', (None, '')),
])
if has_phone < 1:
raise UserError(gettext(
'lims_industry.msg_party_no_phone',
party=party.rec_name))
if not party.tax_identifier:
raise UserError(gettext(
'lims_industry.msg_party_no_tax_identifier',
party=party.rec_name))
class Address(metaclass=PoolMeta):
__name__ = 'party.address'

51
lims_industry/sample.py Normal file
View File

@ -0,0 +1,51 @@
# This file is part of lims_industry 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.wizard import StateTransition, StateView, Button
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval, Bool
from trytond.exceptions import UserError
from trytond.i18n import gettext
__all__ = ['Entry', 'Sample']
class Entry(metaclass=PoolMeta):
__name__ = 'lims.entry'
@classmethod
def confirm(cls, entries):
Sample = Pool().get('lims.sample')
super(Entry, cls).confirm(entries)
samples = [s for e in entries for s in e.samples]
Sample._confirm_samples(samples)
class Sample(metaclass=PoolMeta):
__name__ = 'lims.sample'
missing_data = fields.Boolean('Missing data')
@classmethod
def _confirm_samples(cls, samples):
TaskTemplate = Pool().get('lims.administrative.task.template')
TaskTemplate.create_tasks('sample_missing_data',
cls._for_task_missing_data(samples))
@classmethod
def _for_task_missing_data(cls, samples):
AdministrativeTask = Pool().get('lims.administrative.task')
res = []
for sample in samples:
if not sample.missing_data:
continue
if AdministrativeTask.search([
('type', '=', 'sample_missing_data'),
('origin', '=', '%s,%s' % (cls.__name__, sample.id)),
('state', 'not in', ('done', 'discarded')),
]):
continue
res.append(sample)
return res

14
lims_industry/sample.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Sample -->
<record model="ir.ui.view" id="sample_view_form">
<field name="model">lims.sample</field>
<field name="inherit" ref="lims.lims_sample_view_form"/>
<field name="name">sample_form</field>
</record>
</data>
</tryton>

45
lims_industry/task.py Normal file
View File

@ -0,0 +1,45 @@
# This file is part of lims_industry module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.pool import PoolMeta
from trytond.i18n import gettext
__all__ = ['AdministrativeTaskTemplate', 'AdministrativeTask']
class AdministrativeTaskTemplate(metaclass=PoolMeta):
__name__ = 'lims.administrative.task.template'
@classmethod
def get_types(cls):
types = super(AdministrativeTaskTemplate, cls).get_types()
types.append(('equipment_missing_data',
gettext('lims_industry.lbl_equipment_missing_data')))
types.append(('component_missing_data',
gettext('lims_industry.lbl_component_missing_data')))
types.append(('party_incomplete_file',
gettext('lims_industry.lbl_party_incomplete_file')))
types.append(('sample_missing_data',
gettext('lims_industry.lbl_sample_missing_data')))
types.append(('sample_insufficient_volume',
gettext('lims_industry.lbl_sample_insufficient_volume')))
types.append(('aliquot_preparation',
gettext('lims_industry.lbl_aliquot_preparation')))
return types
class AdministrativeTask(metaclass=PoolMeta):
__name__ = 'lims.administrative.task'
@classmethod
def _get_origin(cls):
origins = super(AdministrativeTask, cls)._get_origin()
origins.extend([
'lims.equipment',
'lims.component',
'party.party',
'lims.sample',
'lims.aliquot',
])
return origins

View File

@ -2,7 +2,9 @@
version=5.2.0
depends:
lims
lims_administrative_task
xml:
industry.xml
sample.xml
party.xml
message.xml

View File

@ -24,4 +24,6 @@
<field name="power"/>
<label name="year_manufacturing"/>
<field name="year_manufacturing"/>
<label name="missing_data"/>
<field name="missing_data"/>
</form>

View File

@ -12,4 +12,5 @@
<field name="capacity"/>
<field name="power"/>
<field name="year_manufacturing"/>
<field name="missing_data"/>
</tree>

View File

@ -14,6 +14,12 @@
<label name="code"/>
<field name="code" xexpand="0"/>
</xpath>
<xpath
expr="/form/group[@id='checkboxes']"
position="inside">
<label name="complete_file"/>
<field name="complete_file" xexpand="0" width="25"/>
</xpath>
<xpath
expr="/form/notebook/page[@id='stock']"
position="after">