#!/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