CRONODEVCV / app.py
TAMA
Update app.py
c5b4e8c verified
Raw
History Blame Contribute Delete
6.96 kB
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)