clinical_laboratory/init_odoo.py
Luis Ernesto Portillo Zaldivar ddbc829103 feat: Reorganización de scripts y actualización automática de logo
- Movidos scripts Python a carpetas organizadas (test/ y utils/)
- Agregado logo del laboratorio (lab_logo.png)
- Implementado sistema de actualización automática de logo y nombre de empresa
- Creado script de validación para verificar estado del logo
- Actualizada documentación CLAUDE.md con nuevas rutas
- Eliminados intentos fallidos de cambio de tema CSS
- Ajustado docker-compose.yml para mapear carpetas de scripts

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-15 03:50:46 -06:00

200 lines
6.3 KiB
Python

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)