From c03afb7f76fae96879fb75fd2fe33c966c30f8d4 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Wed, 16 Jul 2025 19:07:53 -0600 Subject: [PATCH] =?UTF-8?q?fix(#67):=20Solucionar=20widget=20selection=20v?= =?UTF-8?q?ac=C3=ADo=20en=20resultados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Agregar campo computed selection_options_display que muestra las opciones disponibles - Implementar método _compute_selection_options_display que obtiene opciones del parámetro - Actualizar vista para mostrar las opciones disponibles debajo del campo de entrada - Remover widget selection que no funciona con campos Char dinámicos - Agregar placeholder descriptivo para guiar al usuario El usuario ahora puede ver las opciones válidas (ej: "Negativo < /dev/null | Positivo") y escribir el valor correcto en el campo de texto. Scripts de prueba agregados para validar la solución. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- comment_issue_67.txt | 26 +++ issue_bug_selection.txt | 48 ++++++ .../__pycache__/sale_order.cpython-312.pyc | Bin 17447 -> 17447 bytes lims_management/models/lims_result.py | 22 ++- lims_management/views/lims_test_views.xml | 9 +- test/analyze_selection_bug.py | 151 ++++++++++++++++++ test/find_selection_result.py | 43 +++++ test/test_get_selection_list.py | 78 +++++++++ test/test_selection_fix.py | 116 ++++++++++++++ 9 files changed, 491 insertions(+), 2 deletions(-) create mode 100644 comment_issue_67.txt create mode 100644 issue_bug_selection.txt create mode 100644 test/analyze_selection_bug.py create mode 100644 test/find_selection_result.py create mode 100644 test/test_get_selection_list.py create mode 100644 test/test_selection_fix.py diff --git a/comment_issue_67.txt b/comment_issue_67.txt new file mode 100644 index 0000000..214810c --- /dev/null +++ b/comment_issue_67.txt @@ -0,0 +1,26 @@ +## Información adicional tras investigación + +Se confirmó que el método get_selection_list() en lims.analysis.parameter **funciona correctamente**: + +```python +# Ejemplo de uso: +param = env['lims.analysis.parameter'].browse(36) # Prueba de Embarazo +param.selection_values # 'Negativo,Positivo' +param.get_selection_list() # ['Negativo', 'Positivo'] +``` + +### El problema real: + +1. **En el modelo lims.result**: + - value_selection es un campo Char simple + - No hay implementación para obtener las opciones dinámicamente + - En la línea 302-304 hay un comentario con pass que indica intención no implementada + +2. **En la vista lims_test_views.xml**: + - Usa widget="selection" en un campo Char + - El widget espera opciones pero no las recibe + +### Confirmación del bug: +- get_selection_list() está disponible y funciona +- El problema es que no se está usando para proporcionar opciones al widget +- Se necesita implementar la conexión entre el método y la vista \ No newline at end of file diff --git a/issue_bug_selection.txt b/issue_bug_selection.txt new file mode 100644 index 0000000..5487c43 --- /dev/null +++ b/issue_bug_selection.txt @@ -0,0 +1,48 @@ +## Descripción del problema + +Se detectó un bug en la vista de resultados de pruebas donde el campo value_selection con widget selection aparece vacío y no muestra las opciones disponibles definidas en el parámetro. + +## Detalles técnicos + +### Síntomas: +- En lims_test_views.xml, línea 92-93, el campo value_selection usa widget="selection" +- El widget aparece vacío sin opciones disponibles +- Los valores de selección están definidos en lims.analysis.parameter.selection_values (ej: 'Negativo,Positivo') +- El campo no puede recibir valores porque no tiene opciones visibles + +### Caso de ejemplo: +- Test ID: 33 +- Resultado ID: 46 +- Parámetro: "Prueba de Embarazo" +- Opciones en parámetro: 'Negativo,Positivo' +- Valor actual en resultado: 'False' (incorrecto) + +### Análisis realizado: +Se identificaron 12 parámetros de tipo selection con opciones definidas: +- Anticuerpos Hepatitis C: 'No Reactivo,Reactivo,Indeterminado' +- Prueba de Embarazo: 'Negativo,Positivo' +- Aspecto: 'Transparente,Ligeramente turbio,Turbio,Muy turbio' +- Etc. + +## Causa raíz + +El widget selection en Odoo espera un campo de tipo Selection con opciones predefinidas, pero value_selection es un campo Char. Las opciones dinámicas del parámetro (selection_values) no se propagan automáticamente al widget. + +## Impacto + +- Los usuarios no pueden seleccionar valores para resultados de tipo selection +- Los datos se guardan incorrectamente (ej: 'False' en lugar de 'Negativo' o 'Positivo') +- Afecta la calidad de los datos y la usabilidad del sistema + +## Soluciones propuestas + +1. **Opción 1**: Cambiar el widget a text para permitir entrada manual +2. **Opción 2**: Implementar un campo Selection dinámico que obtenga opciones del parámetro +3. **Opción 3**: Crear un widget personalizado que lea selection_values del parámetro relacionado + +## Archivos afectados +- lims_management/views/lims_test_views.xml (línea 92-93) +- lims_management/models/lims_result.py (campo value_selection) + +## Prioridad +Media-Alta: Afecta la funcionalidad básica de ingreso de resultados para ciertos tipos de análisis. \ No newline at end of file diff --git a/lims_management/models/__pycache__/sale_order.cpython-312.pyc b/lims_management/models/__pycache__/sale_order.cpython-312.pyc index cb430ed31c536f04b3d94e0b4d5e9c424161ad6a..61dbebfcb053b878b2570f1f351871a699ce70e7 100644 GIT binary patch delta 21 bcmZ49!MMDGk?S-sFBbz4w0dvkl63(9La7Bt delta 21 bcmZ49!MMDGk?S-sFBbz49O2x^CF=qJLfHjF diff --git a/lims_management/models/lims_result.py b/lims_management/models/lims_result.py index 19d840d..94ec921 100644 --- a/lims_management/models/lims_result.py +++ b/lims_management/models/lims_result.py @@ -96,6 +96,13 @@ class LimsResult(models.Model): string='Valor de Selección' ) + # Campo para mostrar las opciones disponibles + selection_options_display = fields.Char( + string='Opciones disponibles', + compute='_compute_selection_options_display', + help='Opciones válidas para este parámetro' + ) + value_boolean = fields.Boolean( string='Valor Sí/No' ) @@ -301,4 +308,17 @@ class LimsResult(models.Model): # Si es selección, obtener las opciones if self.parameter_value_type == 'selection' and self.parameter_id.selection_values: # Esto se usará en las vistas para mostrar las opciones dinámicamente - pass \ No newline at end of file + pass + + @api.depends('parameter_id', 'parameter_id.selection_values') + def _compute_selection_options_display(self): + """Calcula las opciones disponibles para mostrar al usuario.""" + for record in self: + if record.parameter_id and record.parameter_value_type == 'selection': + options = record.parameter_id.get_selection_list() + if options: + record.selection_options_display = ' | '.join(options) + else: + record.selection_options_display = 'Sin opciones definidas' + else: + record.selection_options_display = False \ No newline at end of file diff --git a/lims_management/views/lims_test_views.xml b/lims_management/views/lims_test_views.xml index f038c09..455232b 100644 --- a/lims_management/views/lims_test_views.xml +++ b/lims_management/views/lims_test_views.xml @@ -90,8 +90,15 @@ class="oe_edit_only"/> +