lims_industry: task trigger refactoring
This commit is contained in:
parent
256eac5b01
commit
8441e9119f
|
@ -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')
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
|
@ -2,7 +2,9 @@
|
|||
version=5.2.0
|
||||
depends:
|
||||
lims
|
||||
lims_administrative_task
|
||||
xml:
|
||||
industry.xml
|
||||
sample.xml
|
||||
party.xml
|
||||
message.xml
|
||||
|
|
|
@ -24,4 +24,6 @@
|
|||
<field name="power"/>
|
||||
<label name="year_manufacturing"/>
|
||||
<field name="year_manufacturing"/>
|
||||
<label name="missing_data"/>
|
||||
<field name="missing_data"/>
|
||||
</form>
|
||||
|
|
|
@ -12,4 +12,5 @@
|
|||
<field name="capacity"/>
|
||||
<field name="power"/>
|
||||
<field name="year_manufacturing"/>
|
||||
<field name="missing_data"/>
|
||||
</tree>
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue