check_and_fix_views.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Script para verificar y arreglar vistas que referencian label_custom
  5. Ejecutar desde shell de Odoo:
  6. exec(open('src/user/helpdesk_extras/scripts/check_and_fix_views.py').read())
  7. check_and_fix_views(env)
  8. """
  9. import logging
  10. import re
  11. _logger = logging.getLogger(__name__)
  12. def check_and_fix_views(env):
  13. """Verifica y arregla vistas que referencian label_custom"""
  14. try:
  15. _logger.info("Buscando vistas que referencian label_custom...")
  16. # Buscar todas las vistas del modelo helpdesk.template.field
  17. views = env['ir.ui.view'].search([
  18. ('model', '=', 'helpdesk.template.field')
  19. ])
  20. _logger.info(f"Encontradas {len(views)} vistas para helpdesk.template.field")
  21. # Buscar vistas que contengan label_custom en el arch
  22. problematic_views = []
  23. for view in views:
  24. if 'label_custom' in view.arch:
  25. problematic_views.append(view)
  26. _logger.warning(f"Vista {view.id} ({view.name}) contiene 'label_custom'")
  27. # También buscar en vistas del modelo helpdesk.template que tengan field_ids
  28. template_views = env['ir.ui.view'].search([
  29. ('model', '=', 'helpdesk.template')
  30. ])
  31. for view in template_views:
  32. if 'label_custom' in view.arch:
  33. problematic_views.append(view)
  34. _logger.warning(f"Vista template {view.id} ({view.name}) contiene 'label_custom'")
  35. if problematic_views:
  36. _logger.info(f"Encontradas {len(problematic_views)} vistas problemáticas")
  37. _logger.info("Opciones:")
  38. _logger.info("1. Eliminar el campo de las vistas (recomendado)")
  39. _logger.info("2. Eliminar las vistas completamente")
  40. # Opción 1: Remover label_custom de las vistas
  41. for view in problematic_views:
  42. try:
  43. # Remover campo label_custom del arch
  44. new_arch = view.arch
  45. # Buscar y remover <field name="label_custom".../>
  46. pattern = r'<field[^>]*name=["\']label_custom["\'][^>]*/>'
  47. new_arch = re.sub(pattern, '', new_arch, flags=re.IGNORECASE)
  48. # Buscar y remover <field name="label_custom"...>...</field>
  49. pattern = r'<field[^>]*name=["\']label_custom["\'][^>]*>.*?</field>'
  50. new_arch = re.sub(pattern, '', new_arch, flags=re.IGNORECASE | re.DOTALL)
  51. if new_arch != view.arch:
  52. view.arch = new_arch
  53. _logger.info(f"Removido label_custom de vista {view.id}")
  54. except Exception as e:
  55. _logger.error(f"Error procesando vista {view.id}: {str(e)}")
  56. env.cr.commit()
  57. _logger.info("Vistas actualizadas")
  58. else:
  59. _logger.info("No se encontraron vistas problemáticas")
  60. # Verificar que el campo esté registrado
  61. model = env['ir.model'].search([('model', '=', 'helpdesk.template.field')], limit=1)
  62. if model:
  63. field_model = env['ir.model.fields']
  64. existing_field = field_model.search([
  65. ('model_id', '=', model.id),
  66. ('name', '=', 'label_custom')
  67. ], limit=1)
  68. if not existing_field:
  69. _logger.info("Registrando campo label_custom en ir.model.fields...")
  70. field_model.create({
  71. 'model_id': model.id,
  72. 'name': 'label_custom',
  73. 'field_description': 'Custom Label',
  74. 'ttype': 'char',
  75. 'state': 'manual',
  76. 'required': False,
  77. 'readonly': False,
  78. 'store': True,
  79. })
  80. env.cr.commit()
  81. _logger.info("Campo registrado")
  82. else:
  83. _logger.info("Campo ya está registrado")
  84. # Limpiar caché
  85. env.registry.clear_cache()
  86. _logger.info("Caché limpiado")
  87. return True
  88. except Exception as e:
  89. _logger.error(f"Error en check_and_fix_views: {str(e)}", exc_info=True)
  90. return False