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() if os.path.exists("/app/test/create_test_demo_data.py"): with open("/app/test/create_test_demo_data.py", "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 ) print("--- Create Test Demo Data stdout ---") print(result.stdout) print("--- Create Test Demo Data stderr ---") print(result.stderr) sys.stdout.flush() 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})") # --- 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)