import gradio as gr import pandas as pd import re from datetime import datetime from hashlib import sha256 import os from huggingface_hub import HfApi, hf_hub_download from PIL import Image import requests from io import BytesIO from huggingface_hub import HfApi # Configuración CSV_FILE = "registros_incidencias.csv" PASSWORD_HASH = "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918" REPO_ID = "IvanRes25/IMSS" # Cambiar por tu usuario/repo de HF HF_TOKEN = os.getenv("IMSS") # Se autodetecta del Space PRESTACIONES = [ "1. PROFESIONALIZACIÓN", "2. ESTIMULOS DE PRODUCTIVIDAD", "3. UNIFORMES", "4. DESCUENTOS INJUSTIFICADOS", "5. SEGURO DE VIDA", "6. AHORRO SOLIDARIO", "7. OTROS" ] # Funciones para CSV def cargar_csv(): try: return pd.read_csv(hf_hub_download( repo_id=REPO_ID, filename=CSV_FILE, repo_type="space", token=os.getenv("IMSS") )) except: df = pd.DataFrame(columns=[ "Fecha_Registro", "Entidad", "Nombre", "CURP", "Prestacion", "Quincena" ]) guardar_csv(df) return df def guardar_csv(df): api = HfApi(token=HF_TOKEN) api.upload_file( path_or_fileobj="registros.csv", path_in_repo="registros.csv", repo_id=REPO_ID, repo_type="space" ) def guardar_registro(entidad, nombre, curp, prestacion, quincena): if not all([entidad, nombre, curp, prestacion, quincena]): return "⚠️ Todos los campos son obligatorios" if not re.match(r'^[A-Z]{4}[0-9]{6}[HM][A-Z]{5}[A-Z0-9]{2}$', curp.upper()): return "⚠️ CURP inválido" try: df = cargar_csv() nuevo_registro = { "Fecha_Registro": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "Entidad": entidad.strip().upper(), "Nombre": nombre.strip().title(), "CURP": curp.upper(), "Prestacion": prestacion, "Quincena": quincena } df = pd.concat([df, pd.DataFrame([nuevo_registro])], ignore_index=True) guardar_csv(df) return "✅ Registro guardado permanentemente" except Exception as e: return f"❌ Error: {str(e)}" def verificar_credenciales(username, password): return username == "admin" and sha256(password.encode()).hexdigest() == PASSWORD_HASH # Interfaz with gr.Blocks(title="Sistema de Captura") as app: logged_in = gr.State(False) with gr.Column(visible=True) as login_col: # Intenta cargar la imagen local try: # Carga la imagen y redimensiona img = Image.open("d5bb4c4a-f9e5-4c70-a53c-23b7dc3872a1.jpg") img.thumbnail((300, 300)) # Ajusta el tamaño según necesites # Muestra la imagen en la interfaz gr.Image( value=img, # Usamos la imagen directamente label="", show_label=False, interactive=False ) except Exception as e: print(f"Error cargando imagen: {e}") # Muestra un marcador de posición si falla gr.Markdown("![Imagen no encontrada](https://via.placeholder.com/300x150?text=Logo+no+encontrado)") # Resto de tu interfaz de login gr.Markdown("# Sistema de Captura de Incidencias") username = gr.Textbox(label="Usuario") # 8 espacios (4 del with + 4 del componente) password = gr.Textbox(label="Contraseña", type="password") login_btn = gr.Button("Ingresar") login_msg = gr.Textbox(label="Mensaje", interactive=False) # Captura (mismo nivel que el bloque de login) with gr.Column(visible=False) as captura_col: gr.Markdown("## Captura de Datos") entidad = gr.Textbox(label="Entidad Federativa") nombre = gr.Textbox(label="Nombre completo") curp = gr.Textbox(label="CURP") prestacion = gr.Dropdown(PRESTACIONES, label="Prestación afectada") quincena = gr.Textbox(label="Quincena (AAAA-MM-DD)") submit_btn = gr.Button("Guardar") resultado = gr.Textbox(label="Resultado") logout_btn = gr.Button("Cerrar sesión") # Eventos (también dentro de gr.Blocks) def autenticar(user, pwd): if verificar_credenciales(user, pwd): return { login_col: gr.update(visible=False), captura_col: gr.update(visible=True), login_msg: "" } return { login_msg: "⚠️ Credenciales incorrectas" } def cerrar_sesion(): return { login_col: gr.update(visible=True), captura_col: gr.update(visible=False), login_msg: "" } login_btn.click( autenticar, inputs=[username, password], outputs=[login_col, captura_col, login_msg] ) logout_btn.click( cerrar_sesion, outputs=[login_col, captura_col, login_msg] ) submit_btn.click( guardar_registro, inputs=[entidad, nombre, curp, prestacion, quincena], outputs=resultado ) app.launch()