import gradio as gr import pandas as pd from datetime import datetime, timedelta import json import os # Simulación de base de datos users = { 'TAMA': {'password': 'DDOGI', 'role': 'admin'}, 'RODIELYS': {'password': 'CRISTOVIVE', 'role': 'editor'}, 'SHERLYN': {'password': 'CRISTOVIVE', 'role': 'publisher'} } # Inicialización de tareas tasks = pd.DataFrame({ 'id': range(1, 4), 'title': ['Desarrollar API', 'Diseñar UI', 'Escribir documentación'], 'assignee': ['RODIELYS', 'SHERLYN', 'RODIELYS'], 'status': ['Trabajando', 'Trabajando', 'Atrasado'], 'due_date': [(datetime.now() + timedelta(days=i)).strftime('%Y-%m-%d') for i in range(3, 6)] }) def load_data(): global tasks if os.path.exists('tasks.json'): with open('tasks.json', 'r') as f: tasks = pd.DataFrame(json.load(f)) def save_data(): with open('tasks.json', 'w') as f: json.dump(tasks.to_dict('records'), f) load_data() def login(username, password): if username in users and users[username]['password'] == password: return users[username]['role'], f"Bienvenido, {username}", gr.update(visible=True), gr.update(visible=False) return None, "Usuario o contraseña incorrectos", gr.update(visible=False), gr.update(visible=True) def get_tasks(username, role): if role == 'admin': return tasks.to_dict('records') return tasks[tasks['assignee'] == username].to_dict('records') def update_task_status(task_id, new_status, username, role): global tasks if role != 'admin' and tasks.loc[tasks['id'] == task_id, 'assignee'].iloc[0] != username: return "No tienes permiso para actualizar esta tarea", tasks.to_dict('records') tasks.loc[tasks['id'] == task_id, 'status'] = new_status save_data() return "Estado de la tarea actualizado", tasks.to_dict('records') def add_user(new_username, new_password, new_role, admin_username): if users[admin_username]['role'] != 'admin': return "Solo el administrador puede agregar usuarios" if new_username in users: return "El usuario ya existe" users[new_username] = {'password': new_password, 'role': new_role} return f"Usuario {new_username} agregado exitosamente" def add_task(title, assignee, due_date, admin_username): global tasks if users[admin_username]['role'] != 'admin': return "Solo el administrador puede agregar tareas" new_id = tasks['id'].max() + 1 if not tasks.empty else 1 new_task = pd.DataFrame({ 'id': [new_id], 'title': [title], 'assignee': [assignee], 'status': ['Trabajando'], 'due_date': [due_date] }) tasks = pd.concat([tasks, new_task], ignore_index=True) save_data() return f"Tarea '{title}' agregada exitosamente" def get_calendar_data(username, role): if role == 'admin': data = tasks else: data = tasks[tasks['assignee'] == username] calendar_data = [] for _, task in data.iterrows(): due_date = datetime.strptime(task['due_date'], '%Y-%m-%d') days_left = (due_date - datetime.now()).days color = 'green' if days_left > 3 else 'yellow' if days_left > 0 else 'red' calendar_data.append({ 'title': f"{task['title']} ({task['assignee']})", 'start': task['due_date'], 'color': color, 'extendedProps': {'status': task['status'], 'id': task['id']} }) return calendar_data with gr.Blocks() as demo: gr.Markdown("# Sistema de Gestión de Tareas") with gr.Row(visible=True) as login_row: username_input = gr.Textbox(label="Usuario", elem_id="username") password_input = gr.Textbox(label="Contraseña", type="password", elem_id="password") login_button = gr.Button("Iniciar Sesión", elem_id="login-button") login_output = gr.Textbox(label="Mensaje", elem_id="login-message") role_output = gr.Textbox(label="Rol", visible=False, elem_id="user-role") with gr.Tabs(visible=False) as main_tabs: with gr.Tab("Tareas"): refresh_button = gr.Button("Actualizar Tareas", elem_id="refresh-tasks") tasks_table = gr.DataFrame(label="Tareas", elem_id="tasks-table") with gr.Row(): task_id_input = gr.Number(label="ID de Tarea", elem_id="task-id") new_status_input = gr.Dropdown(["Trabajando", "Atrasado", "Cumplido"], label="Nuevo Estado", elem_id="new-status") update_status_button = gr.Button("Actualizar Estado", elem_id="update-status") update_status_output = gr.Textbox(label="Mensaje", elem_id="update-status-message") with gr.Tab("Cronograma"): calendar = gr.JSON(label="Datos del Calendario", elem_id="calendar-data") refresh_calendar_button = gr.Button("Actualizar Calendario", elem_id="refresh-calendar") with gr.Tab("Administración", visible=False) as admin_tab: gr.Markdown("## Agregar Usuario") new_username = gr.Textbox(label="Nuevo Usuario", elem_id="new-username") new_password = gr.Textbox(label="Nueva Contraseña", type="password", elem_id="new-password") new_role = gr.Dropdown(["editor", "publisher"], label="Rol", elem_id="new-role") add_user_button = gr.Button("Agregar Usuario", elem_id="add-user") add_user_output = gr.Textbox(label="Mensaje", elem_id="add-user-message") gr.Markdown("## Agregar Tarea") task_title = gr.Textbox(label="Título de la Tarea", elem_id="task-title") task_assignee = gr.Dropdown(list(users.keys()), label="Asignado a", elem_id="task-assignee") task_due_date = gr.Textbox(label="Fecha de Vencimiento (YYYY-MM-DD)", elem_id="task-due-date") add_task_button = gr.Button("Agregar Tarea", elem_id="add-task") add_task_output = gr.Textbox(label="Mensaje", elem_id="add-task-message") login_button.click( login, inputs=[username_input, password_input], outputs=[role_output, login_output, main_tabs, login_row] ).then( lambda role: gr.update(visible=role == 'admin'), inputs=[role_output], outputs=[admin_tab] ) refresh_button.click(get_tasks, inputs=[username_input, role_output], outputs=tasks_table) update_status_button.click(update_task_status, inputs=[task_id_input, new_status_input, username_input, role_output], outputs=[update_status_output, tasks_table]) add_user_button.click(add_user, inputs=[new_username, new_password, new_role, username_input], outputs=add_user_output) add_task_button.click(add_task, inputs=[task_title, task_assignee, task_due_date, username_input], outputs=add_task_output) refresh_calendar_button.click(get_calendar_data, inputs=[username_input, role_output], outputs=calendar) demo.launch(share=True)