feat(#51): Task 6 completada - Actualizar generación automática de resultados
- Implementado método _generate_test_results() en lims.test - Genera automáticamente líneas de lims.result basadas en product.template.parameter - Se ejecuta al crear una nueva prueba - Respeta el orden (sequence) y las instrucciones de cada parámetro - Agregado action_regenerate_results() para regenerar manualmente - Botón en la vista con confirmación para regenerar resultados - Logging de información sobre resultados generados 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
5bee8e79df
commit
79373a01a1
|
@ -146,7 +146,46 @@ class LimsTest(models.Model):
|
||||||
for vals in vals_list:
|
for vals in vals_list:
|
||||||
if vals.get('name', 'Nuevo') == 'Nuevo':
|
if vals.get('name', 'Nuevo') == 'Nuevo':
|
||||||
vals['name'] = self.env['ir.sequence'].next_by_code('lims.test') or 'Nuevo'
|
vals['name'] = self.env['ir.sequence'].next_by_code('lims.test') or 'Nuevo'
|
||||||
return super().create(vals_list)
|
|
||||||
|
tests = super().create(vals_list)
|
||||||
|
# Generar resultados automáticamente
|
||||||
|
tests._generate_test_results()
|
||||||
|
return tests
|
||||||
|
|
||||||
|
def _generate_test_results(self):
|
||||||
|
"""Genera automáticamente las líneas de resultado basadas en los parámetros configurados del análisis."""
|
||||||
|
for test in self:
|
||||||
|
if test.result_ids:
|
||||||
|
# Si ya tiene resultados, no generar nuevos
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Obtener el product.template del análisis
|
||||||
|
product_tmpl = test.product_id.product_tmpl_id
|
||||||
|
|
||||||
|
# Buscar los parámetros configurados para este análisis
|
||||||
|
template_parameters = self.env['product.template.parameter'].search([
|
||||||
|
('product_tmpl_id', '=', product_tmpl.id)
|
||||||
|
], order='sequence, id')
|
||||||
|
|
||||||
|
# Crear una línea de resultado por cada parámetro
|
||||||
|
for param_config in template_parameters:
|
||||||
|
result_vals = {
|
||||||
|
'test_id': test.id,
|
||||||
|
'parameter_id': param_config.parameter_id.id,
|
||||||
|
'sequence': param_config.sequence,
|
||||||
|
'notes': param_config.instructions or ''
|
||||||
|
}
|
||||||
|
|
||||||
|
# Inicializar valores según el tipo
|
||||||
|
if param_config.parameter_value_type == 'boolean':
|
||||||
|
result_vals['value_boolean'] = False
|
||||||
|
|
||||||
|
self.env['lims.result'].create(result_vals)
|
||||||
|
|
||||||
|
if template_parameters:
|
||||||
|
_logger.info(f"Generados {len(template_parameters)} resultados para la prueba {test.name}")
|
||||||
|
else:
|
||||||
|
_logger.warning(f"No se encontraron parámetros configurados para el análisis {product_tmpl.name}")
|
||||||
|
|
||||||
def action_start_process(self):
|
def action_start_process(self):
|
||||||
"""Inicia el proceso de análisis."""
|
"""Inicia el proceso de análisis."""
|
||||||
|
@ -236,6 +275,28 @@ class LimsTest(models.Model):
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def action_regenerate_results(self):
|
||||||
|
"""Regenera los resultados basados en la configuración actual del análisis."""
|
||||||
|
self.ensure_one()
|
||||||
|
if self.state not in ['draft', 'in_process']:
|
||||||
|
raise UserError(_('Solo se pueden regenerar resultados en pruebas en borrador o en proceso.'))
|
||||||
|
|
||||||
|
# Confirmar con el usuario
|
||||||
|
if self.result_ids:
|
||||||
|
# En producción, aquí se mostraría un wizard de confirmación
|
||||||
|
# Por ahora, eliminamos los resultados existentes
|
||||||
|
self.result_ids.unlink()
|
||||||
|
|
||||||
|
# Regenerar
|
||||||
|
self._generate_test_results()
|
||||||
|
|
||||||
|
self.message_post(
|
||||||
|
body=_('Resultados regenerados por %s') % self.env.user.name,
|
||||||
|
subject=_('Resultados Regenerados')
|
||||||
|
)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def action_draft(self):
|
def action_draft(self):
|
||||||
"""Regresa a borrador."""
|
"""Regresa a borrador."""
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
|
|
|
@ -24,6 +24,10 @@
|
||||||
<button name="action_draft" string="Volver a Borrador"
|
<button name="action_draft" string="Volver a Borrador"
|
||||||
type="object"
|
type="object"
|
||||||
invisible="state != 'cancelled'"/>
|
invisible="state != 'cancelled'"/>
|
||||||
|
<button name="action_regenerate_results" string="Regenerar Resultados"
|
||||||
|
type="object"
|
||||||
|
invisible="state not in ['draft', 'in_process']"
|
||||||
|
confirm="¿Está seguro de regenerar los resultados? Esto eliminará los resultados actuales."/>
|
||||||
<field name="state" widget="statusbar"
|
<field name="state" widget="statusbar"
|
||||||
statusbar_visible="draft,in_process,result_entered,validated"/>
|
statusbar_visible="draft,in_process,result_entered,validated"/>
|
||||||
</header>
|
</header>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user