HMI_Translate_Helper_wMaste.../x6_update_from_master.py

150 lines
5.5 KiB
Python
Raw Permalink Normal View History

import pandas as pd
import os
import PyLibrary.funciones_comunes as fc
from translation_config import TranslationConfig
from openpyxl import load_workbook
2024-10-15 10:00:51 -03:00
from openpyxl.styles import Font, PatternFill
from openpyxl.comments import Comment
# Definir el logger a nivel de módulo
logger = None
def update_from_master(config: TranslationConfig, archivo_to_update):
archivo_maestro = config.get_master_path()
if not os.path.exists(archivo_maestro):
print("El archivo maestro no existe.")
return
logger.info(" .... ")
logger.info(
f"Iniciando actualización en {archivo_to_update} desde el archivo maestro. Para {config.codigo_idioma_seleccionado}"
)
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
df_to_update = fc.read_dataframe_with_cleanup_retries(archivo_to_update)
col_clave = config.codigo_columna_maestra
celdas_con_errores = {}
2024-10-15 10:00:51 -03:00
celdas_vacias = {}
progress_bar = fc.ProgressBar(
len(df_to_update), prefix="Actualizando filas:", suffix="Completado"
)
for index, fila in df_to_update.iterrows():
valor_original = fila[col_clave]
clave = fc.compactar_celda_clave(config.codigo_tipo_PLC, valor_original)
2024-10-15 10:00:51 -03:00
if not pd.isna(clave) and clave in df_maestro[col_clave].values:
# logger.info(f"Fila {index} : Clave: {clave}")
indice_maestro = df_maestro.index[df_maestro[col_clave] == clave].tolist()[
0
]
valor_traducido_compacto = df_maestro.loc[
indice_maestro, config.codigo_idioma_seleccionado
]
2024-10-15 10:00:51 -03:00
if pd.isna(valor_traducido_compacto):
celdas_vacias[indice_maestro] = "Celda vacía en el archivo maestro"
logger.info(f"Fila {index}: Celda vacía en el archivo maestro")
else:
valor_traducido = fc.decompactar_celda_traducida(
config.codigo_tipo_PLC,
celda_original=valor_original,
celda_traducida=valor_traducido_compacto,
)
2024-10-15 10:00:51 -03:00
if (
not pd.isna(valor_traducido)
and fila[config.codigo_idioma_seleccionado] != valor_traducido
):
okToSave, Error = fc.verificar_celda_traducida(
config.codigo_tipo_PLC, clave, valor_traducido_compacto
)
2024-10-15 10:00:51 -03:00
if okToSave:
logger.info(f"Actualizado: Fila {index} : Clave: {clave}")
df_to_update.at[index, config.codigo_idioma_seleccionado] = (
valor_traducido
)
else:
df_to_update.at[index, config.codigo_idioma_seleccionado] = (
valor_original
)
logger.error(f"No actualizado porque: {Error}")
celdas_con_errores[indice_maestro] = Error
progress_bar.increment()
progress_bar.finish()
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)
marcar_celdas_con_errores(
2024-10-15 10:00:51 -03:00
archivo_maestro,
celdas_con_errores,
celdas_vacias,
config.codigo_idioma_seleccionado,
)
print(
2024-10-15 10:00:51 -03:00
f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro."
)
2024-10-15 10:00:51 -03:00
print(
f"Se han marcado {len(celdas_con_errores)} celdas con errores en el archivo maestro."
)
2024-10-15 10:00:51 -03:00
print(f"Se han marcado {len(celdas_vacias)} celdas vacías en el archivo maestro.")
logger.info(" .... ")
2024-10-15 10:00:51 -03:00
def marcar_celdas_con_errores(archivo_maestro, celdas_con_errores, celdas_vacias, target_lang_code):
workbook = load_workbook(archivo_maestro)
sheet = workbook.active
for col in range(1, sheet.max_column + 1):
if sheet.cell(row=1, column=col).value == target_lang_code:
target_col = col
break
else:
print(f"No se encontró la columna para el idioma {target_lang_code}")
return
2024-10-15 10:00:51 -03:00
error_fill = PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid")
empty_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
white_font = Font(color="FFFFFF") # Fuente blanca para celdas con fondo rojo
for indice_maestro, mensaje_error in celdas_con_errores.items():
row = indice_maestro + 2
cell = sheet.cell(row=row, column=target_col)
2024-10-15 10:00:51 -03:00
cell.fill = error_fill
cell.font = white_font # Aplicar fuente blanca
comment = Comment(mensaje_error, "Sistema de Traducción")
cell.comment = comment
2024-10-15 10:00:51 -03:00
for indice_maestro, mensaje in celdas_vacias.items():
row = indice_maestro + 2
cell = sheet.cell(row=row, column=target_col)
cell.fill = empty_fill
comment = Comment(mensaje, "Sistema de Traducción")
cell.comment = comment
workbook.save(archivo_maestro)
2024-10-15 10:00:51 -03:00
print(f"Se han marcado las celdas con errores y vacías en el archivo maestro {archivo_maestro}")
def run(config: TranslationConfig, archivo_to_update):
global logger
logger = fc.configurar_logger(config.work_dir)
2024-10-15 10:00:51 -03:00
script_name = os.path.basename(__file__)
print(f"\rIniciando: {script_name}\r")
update_from_master(config, archivo_to_update)
if __name__ == "__main__":
import menu_pasos_traduccion
menu_pasos_traduccion.main()