Spaces:
Sleeping
Sleeping
| 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) |