HMI_Translate_Helper_wMaste.../x6_update_from_master.py

88 lines
3.4 KiB
Python

import pandas as pd
import os
import re
import logging
import PyLibrary.funciones_comunes as fc
from openpyxl.utils.escape import unescape
def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_to_update, target_lang_code):
if not os.path.exists(archivo_maestro):
print("El archivo maestro no existe.")
return
# Configurar el logger
logger = fc.configurar_logger()
logger.info(" .... ")
logger.info(
f"Iniciando actualizacion en {archivo_to_update} desde el archivo maestro. Para {target_lang_code} "
)
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
df_to_update = fc.read_dataframe_with_cleanup_retries(archivo_to_update)
col_clave = codigo_columna_maestra
# Iterar sobre las filas del archivo de actualización para actualizarlas
for index, fila in df_to_update.iterrows():
valor_original = fila[col_clave]
clave = fc.compactar_celda_clave(tipo_PLC, valor_original)
logger.info(
f'Fila {index} : Clave: {clave}'
)
if not pd.isnull(clave) and clave in df_maestro[col_clave].values:
# Obtenemos los valores
valor_traducido_compacto = df_maestro.loc[
df_maestro[col_clave] == clave, target_lang_code
].values[0]
# Descompactamos
valor_traducido = fc.decompactar_celda_traducida(tipo_PLC,
celda_original=valor_original, celda_traducida=valor_traducido_compacto
)
if (
not pd.isnull(valor_traducido)
and fila[target_lang_code] != valor_traducido
):
# Salvamos en el file to Update
okToSave, Error = fc.verificar_celda_traducida(tipo_PLC,
clave, valor_traducido_compacto
)
if okToSave:
logger.info("Actualizado.")
df_to_update.at[index, target_lang_code] = valor_traducido
else:
df_to_update.at[index, target_lang_code] = valor_original
logger.error(
f'No actualizado porque: {Error}'
)
# Guardar el archivo actualizado
nombre, extension = os.path.splitext(archivo_to_update)
nuevo_nombre = f"{nombre}_import{extension}"
fc.save_dataframe_with_retries(df_to_update, output_path=nuevo_nombre)
print(
f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. "
)
logger.info(
f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. "
)
logger.info(" .... ")
def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma) :
archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx"
archivo_to_update = fc.select_file("xlsx")
if archivo_to_update:
if seleccion_idioma not in fc.IDIOMAS:
print("Selección inválida.")
else:
_, target_lang_code = fc.IDIOMAS[seleccion_idioma]
update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_to_update, target_lang_code)
if __name__ == "__main__":
tipo_PLC = "siemens"
codigo_columna_maestra = "it-IT"
fc.mostrar_idiomas()
seleccion_idioma = int(input("Introduce el número del idioma de destino: "))
run(tipo_PLC, codigo_columna_maestra)