#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para verificar y arreglar vistas que referencian label_custom
Ejecutar desde shell de Odoo:
exec(open('src/user/helpdesk_extras/scripts/check_and_fix_views.py').read())
check_and_fix_views(env)
"""
import logging
import re
_logger = logging.getLogger(__name__)
def check_and_fix_views(env):
"""Verifica y arregla vistas que referencian label_custom"""
try:
_logger.info("Buscando vistas que referencian label_custom...")
# Buscar todas las vistas del modelo helpdesk.template.field
views = env['ir.ui.view'].search([
('model', '=', 'helpdesk.template.field')
])
_logger.info(f"Encontradas {len(views)} vistas para helpdesk.template.field")
# Buscar vistas que contengan label_custom en el arch
problematic_views = []
for view in views:
if 'label_custom' in view.arch:
problematic_views.append(view)
_logger.warning(f"Vista {view.id} ({view.name}) contiene 'label_custom'")
# También buscar en vistas del modelo helpdesk.template que tengan field_ids
template_views = env['ir.ui.view'].search([
('model', '=', 'helpdesk.template')
])
for view in template_views:
if 'label_custom' in view.arch:
problematic_views.append(view)
_logger.warning(f"Vista template {view.id} ({view.name}) contiene 'label_custom'")
if problematic_views:
_logger.info(f"Encontradas {len(problematic_views)} vistas problemáticas")
_logger.info("Opciones:")
_logger.info("1. Eliminar el campo de las vistas (recomendado)")
_logger.info("2. Eliminar las vistas completamente")
# Opción 1: Remover label_custom de las vistas
for view in problematic_views:
try:
# Remover campo label_custom del arch
new_arch = view.arch
# Buscar y remover
pattern = r']*name=["\']label_custom["\'][^>]*/>'
new_arch = re.sub(pattern, '', new_arch, flags=re.IGNORECASE)
# Buscar y remover ...
pattern = r']*name=["\']label_custom["\'][^>]*>.*?'
new_arch = re.sub(pattern, '', new_arch, flags=re.IGNORECASE | re.DOTALL)
if new_arch != view.arch:
view.arch = new_arch
_logger.info(f"Removido label_custom de vista {view.id}")
except Exception as e:
_logger.error(f"Error procesando vista {view.id}: {str(e)}")
env.cr.commit()
_logger.info("Vistas actualizadas")
else:
_logger.info("No se encontraron vistas problemáticas")
# Verificar que el campo esté registrado
model = env['ir.model'].search([('model', '=', 'helpdesk.template.field')], limit=1)
if model:
field_model = env['ir.model.fields']
existing_field = field_model.search([
('model_id', '=', model.id),
('name', '=', 'label_custom')
], limit=1)
if not existing_field:
_logger.info("Registrando campo label_custom en ir.model.fields...")
field_model.create({
'model_id': model.id,
'name': 'label_custom',
'field_description': 'Custom Label',
'ttype': 'char',
'state': 'manual',
'required': False,
'readonly': False,
'store': True,
})
env.cr.commit()
_logger.info("Campo registrado")
else:
_logger.info("Campo ya está registrado")
# Limpiar caché
env.registry.clear_cache()
_logger.info("Caché limpiado")
return True
except Exception as e:
_logger.error(f"Error en check_and_fix_views: {str(e)}", exc_info=True)
return False