TRL / app.py
Romanes's picture
Update app.py
f2059f6 verified
# -*- coding: utf-8 -*-
# App: Información general de la tecnología (versión inicial, sin descargas)
# Requisitos: pip install gradio pandas
import gradio as gr
import pandas as pd
from datetime import datetime
# --- Listas de opciones -------------------------------------------------------
FACULTADES = [
"Facultad de Ciencias Agropecuarias",
"Facultad de Ciencias",
"Facultad de Ciencias de la Educación",
"Facultad de Ciencias Económicas y Administrativas",
"Facultad de Ciencias de la Salud",
"Facultad de Derecho",
"Facultad de Ingeniería",
"Facultad de Estudios a Distancia",
"Facultad Chiquinquirá",
"Facultad Duitama",
"Facultad Sogamoso",
]
NIVELES_FORMACION = [
"Estudiante de pregrado",
"Profesional",
"Especialización",
"Maestria",
"Doctorado",
]
TIPOS_VINCULACION = [
"Estudiante de pregrado",
"Estudiante de posgrado",
"Joven investigador",
"Docente catedratico",
"Docente ocasional medio tiempo",
"Docente ocasional tiempo completo",
"Docente de planta",
"Contrato de Prestación de Servicios",
"Externo (aliado)",
]
TIPOS_DOCUMENTO = ["CC", "TI", "CE"]
# --- Defaults sugeridos por Facultad (de tu tabla) ----------------------------
DEFAULTS = {
"Facultad de Ciencias Agropecuarias": {
"nivel": "Estudiante de pregrado",
"vinc": "Estudiante de pregrado",
},
"Facultad de Ciencias": {
"nivel": "Profesional",
"vinc": "Estudiante de posgrado",
},
"Facultad de Ciencias de la Educación": {
"nivel": "Especialización",
"vinc": "Joven investigador",
},
"Facultad de Ciencias Económicas y Administrativas": {
"nivel": "Maestria",
"vinc": "Docente catedratico",
},
"Facultad de Ciencias de la Salud": {
"nivel": "Doctorado",
"vinc": "Docente ocasional medio tiempo",
},
"Facultad de Derecho": {
"nivel": None,
"vinc": "Docente ocasional tiempo completo",
},
"Facultad de Ingeniería": {
"nivel": None,
"vinc": "Docente de planta",
},
"Facultad de Estudios a Distancia": {
"nivel": None,
"vinc": "Contrato de Prestación de Servicios",
},
# Estas tres filas también fijan Tipo de documento:
"Facultad Chiquinquirá": {
"nivel": None, # en tu tabla aparece "TI" aquí, pero eso es tipo de documento; se fija abajo
"vinc": "Externo (aliado)",
"tdoc": "TI",
},
"Facultad Duitama": {
"nivel": None,
"vinc": None,
"tdoc": "CC",
},
"Facultad Sogamoso": {
"nivel": None,
"vinc": None,
"tdoc": "CE",
},
}
def aplicar_defaults_facultad(facultad):
"""Devuelve updates para nivel, vinculación y tipo de documento al cambiar la facultad."""
cfg = DEFAULTS.get(facultad, {})
upd_nivel = gr.update() # sin cambio por defecto
upd_vinc = gr.update()
upd_tdoc = gr.update()
if cfg.get("nivel") in NIVELES_FORMACION:
upd_nivel = gr.update(value=cfg["nivel"])
if cfg.get("vinc") in TIPOS_VINCULACION:
upd_vinc = gr.update(value=cfg["vinc"])
if cfg.get("tdoc") in TIPOS_DOCUMENTO:
upd_tdoc = gr.update(value=cfg["tdoc"])
return upd_nivel, upd_vinc, upd_tdoc
def generar_ficha(
codigo, fecha, facultad, grupo, nombre,
pn, sn, pa, sa,
tdoc, ndoc, profesion, nivel, vinculacion,
correo, direccion, telefono
):
"""Devuelve una vista previa tipo tabla (sin archivos)."""
fila = {
"Código": codigo,
"Fecha de ingreso": fecha,
"Facultad": facultad,
"Grupo de investigación": grupo,
"Nombre de la tecnología": nombre,
"Primer nombre": pn,
"Segundo nombre": sn,
"Primer apellido": pa,
"Segundo apellido": sa,
"Tipo de documento": tdoc,
"Número de documento": ndoc,
"Profesión": profesion,
"Nivel de formación": nivel,
"Tipo de vinculación": vinculacion,
"Correo electrónico": correo,
"Dirección": direccion,
"Número de teléfono": telefono,
"Generado": datetime.now().strftime("%Y-%m-%d %H:%M"),
}
df = pd.DataFrame([fila])
resumen = (
f"**{nombre or 'Tecnología'}** — {facultad or 'Sin facultad'}\n\n"
f"Inventor/a: {pn} {sn} {pa} {sa}\n"
f"Documento: {tdoc or ''} {ndoc or ''} | Nivel: {nivel or '-'} | Vinculación: {vinculacion or '-'}"
)
return df, resumen
with gr.Blocks(title="Información general de la tecnología") as demo:
gr.Markdown("# Información general de la tecnología (versión inicial)")
gr.Markdown(
"Capture la ficha base. Los campos **Facultad**, **Nivel de formación** y **Tipo de vinculación** "
"tienen listas de opciones; al cambiar *Facultad* se sugieren valores por defecto según su tabla."
)
with gr.Row():
codigo = gr.Textbox(label="Código", value="P2024/")
fecha = gr.Textbox(label="Fecha de ingreso", placeholder="YYYY-MM-DD")
with gr.Row():
facultad = gr.Dropdown(choices=FACULTADES, label="Facultad")
grupo = gr.Textbox(label="Grupo de investigación")
nombre = gr.Textbox(label="Nombre de la tecnología")
gr.Markdown("## Inventores (principal)")
with gr.Row():
pn = gr.Textbox(label="Primer nombre")
sn = gr.Textbox(label="Segundo nombre")
with gr.Row():
pa = gr.Textbox(label="Primer apellido")
sa = gr.Textbox(label="Segundo apellido")
gr.Markdown("## Datos de contacto")
with gr.Row():
tdoc = gr.Dropdown(choices=TIPOS_DOCUMENTO, label="Tipo de documento")
ndoc = gr.Textbox(label="Número de documento")
profesion = gr.Textbox(label="Profesión")
with gr.Row():
nivel = gr.Dropdown(choices=NIVELES_FORMACION, label="Nivel de formación")
vinculacion = gr.Dropdown(choices=TIPOS_VINCULACION, label="Tipo de vinculación")
with gr.Row():
correo = gr.Textbox(label="Correo electrónico")
direccion = gr.Textbox(label="Dirección")
telefono = gr.Textbox(label="Número de teléfono")
# Sugerir defaults al cambiar la Facultad
facultad.change(aplicar_defaults_facultad, inputs=[facultad], outputs=[nivel, vinculacion, tdoc])
with gr.Row():
btn_generar = gr.Button("Generar ficha (vista previa)")
btn_limpiar = gr.Button("Limpiar")
tabla = gr.Dataframe(label="Vista previa", wrap=True)
resumen_md = gr.Markdown()
btn_generar.click(
generar_ficha,
inputs=[codigo, fecha, facultad, grupo, nombre, pn, sn, pa, sa, tdoc, ndoc, profesion, nivel, vinculacion, correo, direccion, telefono],
outputs=[tabla, resumen_md],
)
def _limpiar():
return (
"P2024/", "", None, "", "", "", "", "", "", None, "", "",
None, None, "", "", ""
)
btn_limpiar.click(
_limpiar,
inputs=None,
outputs=[codigo, fecha, facultad, grupo, nombre, pn, sn, pa, sa, tdoc, ndoc, profesion, nivel, vinculacion, correo, direccion, telefono],
)
if __name__ == "__main__":
demo.launch()