Bug: Widget selection vacío en resultados de tipo selection #67

Closed
opened 2025-07-17 00:51:59 +00:00 by luis_portillo · 9 comments

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.

## 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.
Author
Owner

Información adicional tras investigación

Se confirmó que el método get_selection_list() en lims.analysis.parameter funciona correctamente:

# 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
## 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
Author
Owner

Solución implementada

Se ha implementado una solución para el bug del widget selection vacío en la rama .

Cambios realizados:

  1. **Modelo **:

    • Agregado campo computed que muestra las opciones disponibles
    • Implementado método que obtiene las opciones usando
  2. **Vista **:

    • Removido widget selection que no funciona con campos Char dinámicos
    • Agregado campo de opciones disponibles que se muestra debajo del campo de entrada
    • Mejorado el placeholder para guiar al usuario

Resultado:

  • El usuario ahora ve las opciones válidas (ej: "Negativo < /dev/null | Positivo")
  • Puede escribir el valor correcto en el campo de texto
  • La experiencia de usuario es clara y funcional

Testing:

Se probó con el parámetro "Prueba de Embarazo":

  • Opciones mostradas correctamente: "Negativo | Positivo"
  • Valores se pueden ingresar y guardar correctamente

La solución está lista para revisión. La instancia sigue activa para pruebas.

## Solución implementada ✅ Se ha implementado una solución para el bug del widget selection vacío en la rama . ### Cambios realizados: 1. **Modelo **: - Agregado campo computed que muestra las opciones disponibles - Implementado método que obtiene las opciones usando 2. **Vista **: - Removido widget selection que no funciona con campos Char dinámicos - Agregado campo de opciones disponibles que se muestra debajo del campo de entrada - Mejorado el placeholder para guiar al usuario ### Resultado: - El usuario ahora ve las opciones válidas (ej: "Negativo < /dev/null | Positivo") - Puede escribir el valor correcto en el campo de texto - La experiencia de usuario es clara y funcional ### Testing: Se probó con el parámetro "Prueba de Embarazo": - Opciones mostradas correctamente: "Negativo | Positivo" - Valores se pueden ingresar y guardar correctamente La solución está lista para revisión. La instancia sigue activa para pruebas.
Author
Owner

Error adicional corregido: Se descubrió y corrigió un error de singleton en action_cancel de stock.lot mientras se probaba la solución del widget selection. Ambos errores han sido resueltos en los commits c03afb7 y dcff505.

Error adicional corregido: Se descubrió y corrigió un error de singleton en action_cancel de stock.lot mientras se probaba la solución del widget selection. Ambos errores han sido resueltos en los commits c03afb7 y dcff505.
Author
Owner

Se han implementado dos soluciones para el problema del widget selection:

Primera solución (descartada)

  • Cambiar el campo a Selection con opciones dinámicas
  • Se descartó porque Odoo no soporta bien las opciones dinámicas en campos Selection en vistas editable

Solución final implementada

  • Mantener el campo como Char pero con validación estricta
  • Agregar constraint que valida que el valor ingresado esté en la lista de opciones válidas
  • Mostrar las opciones disponibles debajo del campo para guiar al usuario
  • Si se intenta guardar un valor inválido, se muestra un error con las opciones válidas

Commits realizados

  • c03afb7: Implementar solución inicial mostrando opciones disponibles
  • dcff505: Corregir error singleton en action_cancel de stock.lot
  • c673230: Implementar widget selection dinámico (descartado)
  • 875a90a: Implementar validación de opciones de selección (solución final)

La solución ahora valida correctamente los valores y previene el ingreso de opciones inválidas.

Se han implementado dos soluciones para el problema del widget selection: ## Primera solución (descartada) - Cambiar el campo a Selection con opciones dinámicas - Se descartó porque Odoo no soporta bien las opciones dinámicas en campos Selection en vistas editable ## Solución final implementada - Mantener el campo como Char pero con validación estricta - Agregar constraint que valida que el valor ingresado esté en la lista de opciones válidas - Mostrar las opciones disponibles debajo del campo para guiar al usuario - Si se intenta guardar un valor inválido, se muestra un error con las opciones válidas ## Commits realizados - c03afb7: Implementar solución inicial mostrando opciones disponibles - dcff505: Corregir error singleton en action_cancel de stock.lot - c673230: Implementar widget selection dinámico (descartado) - 875a90a: Implementar validación de opciones de selección (solución final) La solución ahora valida correctamente los valores y previene el ingreso de opciones inválidas.
Author
Owner

Solución final implementada

Después de varias iteraciones, la solución implementada es:

  1. Campo value_selection como Char - Mantener el campo como texto para evitar problemas con opciones dinámicas en vistas editables
  2. Validación estricta - El constraint valida que solo se ingresen valores de la lista definida en el parámetro
  3. Mostrar opciones disponibles - Se muestra debajo del campo las opciones válidas (ej: 'Negativo < /dev/null | Positivo')
  4. Placeholder descriptivo - El campo muestra 'Seleccione una opción' como guía

Por qué no usar Selection field nativo

Los campos Selection en Odoo no soportan bien opciones dinámicas basadas en otros campos del mismo registro en vistas editables (editable='bottom'). Las opciones deben ser estáticas o calculadas a nivel de modelo, no de registro.

Comportamiento actual

  • El usuario escribe el valor en el campo (ej: 'Positivo')
  • Las opciones válidas se muestran debajo como referencia
  • Si intenta guardar un valor inválido, se muestra error con las opciones correctas

Commits finales

  • 875a90a: Implementar validación de opciones
  • c959878: Simplificar implementación y limpiar código

La solución es funcional y mantiene la integridad de los datos.

## Solución final implementada Después de varias iteraciones, la solución implementada es: 1. **Campo value_selection como Char** - Mantener el campo como texto para evitar problemas con opciones dinámicas en vistas editables 2. **Validación estricta** - El constraint valida que solo se ingresen valores de la lista definida en el parámetro 3. **Mostrar opciones disponibles** - Se muestra debajo del campo las opciones válidas (ej: 'Negativo < /dev/null | Positivo') 4. **Placeholder descriptivo** - El campo muestra 'Seleccione una opción' como guía ### Por qué no usar Selection field nativo Los campos Selection en Odoo no soportan bien opciones dinámicas basadas en otros campos del mismo registro en vistas editables (editable='bottom'). Las opciones deben ser estáticas o calculadas a nivel de modelo, no de registro. ### Comportamiento actual - El usuario escribe el valor en el campo (ej: 'Positivo') - Las opciones válidas se muestran debajo como referencia - Si intenta guardar un valor inválido, se muestra error con las opciones correctas ### Commits finales - 875a90a: Implementar validación de opciones - c959878: Simplificar implementación y limpiar código La solución es funcional y mantiene la integridad de los datos.
Author
Owner

Nueva implementación con autocompletado inteligente

Se ha implementado una solución mejorada que permite al técnico escribir valores parciales que se autocompletan:

Funcionalidades implementadas:

  1. Autocompletado en tiempo real (@onchange):

    • Al escribir, busca coincidencias y autocompleta si hay una sola opción
    • Búsqueda por inicio de palabra primero, luego por contenido
  2. Validación y autocompletado al guardar:

    • Override de create() y write() para validar y autocompletar
    • Si hay ambigüedad, prefiere la opción más corta
  3. Búsqueda flexible:

    • Acepta mayúsculas y minúsculas
    • Acepta iniciales: N→Negativo, P→Positivo
    • Acepta parciales: POS→Positivo, NEG→Negativo
    • Acepta símbolos directos: +, ++, +++
  4. Instrucciones automáticas:

    • Se generan automáticamente en el campo 'notes' del resultado
    • Muestran todas las opciones disponibles
    • Incluyen ejemplos de uso para las primeras 3 opciones

Ejemplo de instrucciones generadas:

La implementación está lista en la rama .

## Nueva implementación con autocompletado inteligente Se ha implementado una solución mejorada que permite al técnico escribir valores parciales que se autocompletan: ### Funcionalidades implementadas: 1. **Autocompletado en tiempo real** (@onchange): - Al escribir, busca coincidencias y autocompleta si hay una sola opción - Búsqueda por inicio de palabra primero, luego por contenido 2. **Validación y autocompletado al guardar**: - Override de create() y write() para validar y autocompletar - Si hay ambigüedad, prefiere la opción más corta 3. **Búsqueda flexible**: - Acepta mayúsculas y minúsculas - Acepta iniciales: N→Negativo, P→Positivo - Acepta parciales: POS→Positivo, NEG→Negativo - Acepta símbolos directos: +, ++, +++ 4. **Instrucciones automáticas**: - Se generan automáticamente en el campo 'notes' del resultado - Muestran todas las opciones disponibles - Incluyen ejemplos de uso para las primeras 3 opciones ### Ejemplo de instrucciones generadas: La implementación está lista en la rama .
Author
Owner

Implementación completada

Se ha implementado exitosamente el autocompletado inteligente para campos de selección.

Funcionalidades implementadas:

  • Autocompletado mientras escribes
  • Búsqueda flexible (mayúsculas/minúsculas, iniciales, parciales)
  • Instrucciones automáticas en campo notes
  • Validación corregida para reconocer valores de selección

Pull Request:

PR #72: #72

La funcionalidad ha sido probada y está funcionando correctamente.

## Implementación completada ✅ Se ha implementado exitosamente el autocompletado inteligente para campos de selección. ### Funcionalidades implementadas: - ✅ Autocompletado mientras escribes - ✅ Búsqueda flexible (mayúsculas/minúsculas, iniciales, parciales) - ✅ Instrucciones automáticas en campo notes - ✅ Validación corregida para reconocer valores de selección ### Pull Request: PR #72: https://gitea.grupoconsiti.com/Grupo-Consiti/clinical_laboratory/pulls/72 La funcionalidad ha sido probada y está funcionando correctamente.
Author
Owner

Error adicional corregido

Mientras se estaba probando la solución del widget selection, se descubrió otro error al intentar cancelar una orden:

\

Causa del error

El método \ en \ estaba accediendo a \ directamente, lo cual falla cuando se llama el método sobre múltiples registros.

Solución implementada

Se modificó el método para iterar sobre cada registro:

\

Commits realizados

  • : Implementar solución para widget selection vacío
  • : Corregir error 'Expected singleton' en action_cancel

La instancia ha sido reiniciada y ambos errores han sido corregidos.

## Error adicional corregido Mientras se estaba probando la solución del widget selection, se descubrió otro error al intentar cancelar una orden: \ ### Causa del error El método \ en \ estaba accediendo a \ directamente, lo cual falla cuando se llama el método sobre múltiples registros. ### Solución implementada Se modificó el método para iterar sobre cada registro: \ ### Commits realizados - \: Implementar solución para widget selection vacío - \: Corregir error 'Expected singleton' en action_cancel La instancia ha sido reiniciada y ambos errores han sido corregidos.
Author
Owner

Información adicional tras investigación

Se confirmó que el método en funciona correctamente:

El problema real:

  1. **En el modelo **:

    • es un campo simple
    • No hay implementación para obtener las opciones dinámicamente
    • En la línea 302-304 hay un comentario con que indica intención no implementada
  2. **En la vista **:

    • Usa en un campo Char
    • El widget espera opciones pero no las recibe

Confirmación del bug:

  • 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
## Información adicional tras investigación Se confirmó que el método en **funciona correctamente**: ### El problema real: 1. **En el modelo **: - es un campo simple - No hay implementación para obtener las opciones dinámicamente - En la línea 302-304 hay un comentario con que indica intención no implementada 2. **En la vista **: - Usa en un campo Char - El widget espera opciones pero no las recibe ### Confirmación del bug: - 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
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Grupo-Consiti/clinical_laboratory#67
No description provided.