import socket import time import subprocess import sys import os # --- Configuración --- DB_HOST = os.environ.get("HOST", "db") DB_PORT = int(os.environ.get("PORT", 5432)) ODOO_CONF = "/etc/odoo/odoo.conf" DB_NAME = "lims_demo" MODULES_TO_INSTALL = "base,sale_management,stock,account,lims_management" # --- Lógica de espera de PostgreSQL --- print(f"Esperando a PostgreSQL en {DB_HOST}:{DB_PORT}...") sys.stdout.flush() while True: try: with socket.create_connection((DB_HOST, DB_PORT), timeout=2): print("PostgreSQL está listo.") sys.stdout.flush() break except (socket.timeout, ConnectionRefusedError, OSError) as e: print(f"PostgreSQL no está listo todavía ({e}), esperando...") sys.stdout.flush() time.sleep(2) # --- Lógica de inicialización de Odoo --- print(f"Creando base de datos '{DB_NAME}' e instalando módulos...") sys.stdout.flush() odoo_command = [ "odoo", "-c", ODOO_CONF, "-d", DB_NAME, "-i", MODULES_TO_INSTALL, "--load-language", "es_ES", "--stop-after-init" ] # Usamos subprocess.run para tener mejor control sobre la salida try: result = subprocess.run( odoo_command, capture_output=True, text=True, check=False ) print("--- Odoo stdout ---") print(result.stdout) print("--- Odoo stderr ---") print(result.stderr) sys.stdout.flush() if result.returncode != 0: print(f"Odoo falló con código de salida {result.returncode}") sys.exit(result.returncode) print("Inicialización de Odoo completada exitosamente.") # --- Lógica para crear datos de demostración personalizados --- print("Creando solicitudes de laboratorio de demostración...") sys.stdout.flush() with open("/app/create_lab_requests.py", "r") as f: script_content = f.read() # Reutilizamos el entorno de Odoo para ejecutar un script create_requests_command = f""" odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' {script_content} EOF """ try: result = subprocess.run( create_requests_command, shell=True, capture_output=True, text=True, check=False ) print("--- Create Lab Requests stdout ---") print(result.stdout) print("--- Create Lab Requests stderr ---") print(result.stderr) sys.stdout.flush() if result.returncode != 0: print(f"Fallo al crear las solicitudes de laboratorio con código de salida {result.returncode}") sys.exit(result.returncode) print("Solicitudes de laboratorio de demostración creadas exitosamente.") # --- Crear datos de demostración de pruebas --- print("\nCreando datos de demostración de pruebas de laboratorio...") sys.stdout.flush() # Usar el nuevo script consolidado de datos demo demo_script_path = "/app/test/create_demo_data.py" if os.path.exists(demo_script_path): with open(demo_script_path, "r") as f: demo_script_content = f.read() create_demo_command = f""" odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' {demo_script_content} EOF """ result = subprocess.run( create_demo_command, shell=True, capture_output=True, text=True, check=False ) print("--- Create Demo Data stdout ---") print(result.stdout) print("--- Create Demo Data stderr ---") print(result.stderr) sys.stdout.flush() if result.returncode == 0: print("Datos de demostración creados exitosamente.") else: print(f"Advertencia: Fallo al crear datos de demostración (código {result.returncode})") else: # Fallback al script anterior si existe old_script_path = "/app/test/create_test_demo_data.py" if os.path.exists(old_script_path): print("Usando script de demostración anterior...") with open(old_script_path, "r") as f: test_script_content = f.read() create_tests_command = f""" odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' {test_script_content} EOF """ result = subprocess.run( create_tests_command, shell=True, capture_output=True, text=True, check=False ) if result.returncode == 0: print("Datos de demostración de pruebas creados exitosamente.") else: print(f"Advertencia: Fallo al crear datos de demostración de pruebas (código {result.returncode})") # --- Actualizar logo de la empresa --- print("\nActualizando logo de la empresa...") sys.stdout.flush() if os.path.exists("/app/scripts/update_company_logo_odoo18.py"): with open("/app/scripts/update_company_logo_odoo18.py", "r") as f: logo_script_content = f.read() update_logo_command = f""" odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' {logo_script_content} EOF """ result = subprocess.run( update_logo_command, shell=True, capture_output=True, text=True, check=False ) print("--- Update Company Logo stdout ---") print(result.stdout) print("--- Update Company Logo stderr ---") print(result.stderr) sys.stdout.flush() if result.returncode == 0: print("Logo de empresa actualizado exitosamente.") else: print(f"Advertencia: Fallo al actualizar logo de empresa (código {result.returncode})") # --- Asignar admin al grupo de Administrador de Laboratorio --- print("\nAsignando usuario admin al grupo de Administrador de Laboratorio...") sys.stdout.flush() if os.path.exists("/app/scripts/assign_admin_to_lab_group.py"): with open("/app/scripts/assign_admin_to_lab_group.py", "r") as f: admin_group_script = f.read() assign_admin_command = f""" odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' {admin_group_script} EOF """ result = subprocess.run( assign_admin_command, shell=True, capture_output=True, text=True, check=False ) print("--- Assign Admin to Lab Group stdout ---") print(result.stdout) print("--- Assign Admin to Lab Group stderr ---") print(result.stderr) sys.stdout.flush() if result.returncode == 0: print("Usuario admin asignado exitosamente al grupo de Administrador de Laboratorio.") else: print(f"Advertencia: Fallo al asignar admin al grupo (código {result.returncode})") # --- Validación final del logo --- print("\nValidando estado final del logo y nombre...") sys.stdout.flush() if os.path.exists("/app/test/verify_company_logo.py"): with open("/app/test/verify_company_logo.py", "r") as f: verify_script_content = f.read() verify_command = f""" odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' {verify_script_content} EOF """ result = subprocess.run( verify_command, shell=True, capture_output=True, text=True, check=False ) print("--- Verify Company Logo stdout ---") print(result.stdout) sys.exit(0) except Exception as e: print(f"Ocurrió un error inesperado al crear las solicitudes de laboratorio: {e}") sys.exit(1) except FileNotFoundError: print("Error: El comando 'odoo' no se encontró. Asegúrate de que la imagen del contenedor es correcta y odoo está en el PATH.") sys.exit(1) except Exception as e: print(f"Ocurrió un error inesperado al ejecutar Odoo: {e}") sys.exit(1)