File size: 6,962 Bytes
c0dc777
 
 
3583bfe
3d0782b
c0dc777
 
 
 
 
 
 
 
3d0782b
c0dc777
 
 
 
 
 
 
 
3583bfe
 
3d0782b
3583bfe
 
 
 
 
 
 
 
 
c0dc777
 
3583bfe
 
c0dc777
 
 
 
 
 
 
 
 
c5b4e8c
c0dc777
3583bfe
c5b4e8c
c0dc777
 
620ac76
c0dc777
 
 
 
 
 
 
 
620ac76
c0dc777
3d0782b
c0dc777
 
 
 
 
 
 
 
3583bfe
c0dc777
 
3583bfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5b4e8c
3583bfe
f55b52b
3583bfe
2d2332b
c0dc777
 
3d0782b
2d2332b
 
 
3583bfe
2d2332b
 
c0dc777
2d2332b
3583bfe
2d2332b
 
3583bfe
 
2d2332b
 
 
 
c0dc777
3583bfe
2d2332b
 
c0dc777
2d2332b
3583bfe
2d2332b
 
 
 
 
3583bfe
 
2d2332b
 
 
 
 
3583bfe
 
 
 
3d0782b
f55b52b
 
 
2d2332b
3583bfe
 
 
c5b4e8c
3583bfe
 
 
 
 
620ac76
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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)