Работает все, кроме отображения задач
This commit is contained in:
159
streamlit_app/tasks_page.py
Normal file
159
streamlit_app/tasks_page.py
Normal file
@@ -0,0 +1,159 @@
|
||||
"""
|
||||
Страница управления задачами загрузки
|
||||
"""
|
||||
import streamlit as st
|
||||
from datetime import datetime
|
||||
import time
|
||||
|
||||
|
||||
def render_tasks_page():
|
||||
"""Рендер страницы управления задачами"""
|
||||
st.title("📋 Управление задачами загрузки")
|
||||
st.markdown("---")
|
||||
|
||||
# Кнопки управления
|
||||
col1, col2, col3, col4 = st.columns([1, 1, 1, 2])
|
||||
|
||||
with col1:
|
||||
if st.button("🔄 Обновить", key="refresh_tasks_btn", use_container_width=True):
|
||||
st.rerun()
|
||||
|
||||
with col2:
|
||||
if st.button("🗑️ Очистить завершенные", key="clear_completed_btn", use_container_width=True):
|
||||
st.info("Функция очистки будет добавлена в следующих версиях")
|
||||
|
||||
with col3:
|
||||
auto_refresh = st.checkbox("🔄 Автообновление", key="auto_refresh_checkbox")
|
||||
if auto_refresh:
|
||||
time.sleep(2)
|
||||
st.rerun()
|
||||
|
||||
with col4:
|
||||
st.caption("Последнее обновление: " + datetime.now().strftime("%H:%M:%S"))
|
||||
|
||||
st.markdown("---")
|
||||
|
||||
# Статистика задач
|
||||
st.subheader("📊 Статистика задач")
|
||||
|
||||
# Получаем задачи из session_state
|
||||
tasks = st.session_state.get('upload_tasks', {})
|
||||
|
||||
# Подсчитываем статистику
|
||||
total_tasks = len(tasks)
|
||||
pending_tasks = len([t for t in tasks.values() if t.get('status') == 'pending'])
|
||||
running_tasks = len([t for t in tasks.values() if t.get('status') == 'running'])
|
||||
completed_tasks = len([t for t in tasks.values() if t.get('status') == 'completed'])
|
||||
failed_tasks = len([t for t in tasks.values() if t.get('status') == 'failed'])
|
||||
|
||||
col1, col2, col3, col4, col5 = st.columns(5)
|
||||
|
||||
with col1:
|
||||
st.metric("Всего", total_tasks, f"+{total_tasks}")
|
||||
|
||||
with col2:
|
||||
st.metric("Ожидают", pending_tasks, f"+{pending_tasks}")
|
||||
|
||||
with col3:
|
||||
st.metric("Выполняются", running_tasks, f"+{running_tasks}")
|
||||
|
||||
with col4:
|
||||
st.metric("Завершены", completed_tasks, f"+{completed_tasks}")
|
||||
|
||||
with col5:
|
||||
st.metric("Ошибки", failed_tasks, f"+{failed_tasks}")
|
||||
|
||||
st.markdown("---")
|
||||
|
||||
# Список задач
|
||||
st.subheader("📋 Список задач")
|
||||
|
||||
# Получаем задачи из session_state
|
||||
tasks = st.session_state.get('upload_tasks', {})
|
||||
|
||||
if tasks:
|
||||
# Показываем задачи
|
||||
for task_id, task in tasks.items():
|
||||
status_emoji = {
|
||||
'pending': '🟡',
|
||||
'running': '🔵',
|
||||
'completed': '🟢',
|
||||
'failed': '🔴'
|
||||
}.get(task.get('status', 'pending'), '⚪')
|
||||
|
||||
with st.expander(f"{status_emoji} {task.get('filename', 'Unknown')} - {task.get('status', 'unknown').upper()}", expanded=True):
|
||||
col1, col2 = st.columns([3, 1])
|
||||
|
||||
with col1:
|
||||
st.write(f"**ID:** `{task_id}`")
|
||||
st.write(f"**Статус:** {status_emoji} {task.get('status', 'unknown').upper()}")
|
||||
st.write(f"**Файл:** {task.get('filename', 'Unknown')}")
|
||||
st.write(f"**Эндпоинт:** {task.get('endpoint', 'Unknown')}")
|
||||
|
||||
if task.get('completed_at'):
|
||||
completed_time = datetime.fromtimestamp(task['completed_at']).strftime("%Y-%m-%d %H:%M:%S")
|
||||
st.write(f"**Завершена:** {completed_time}")
|
||||
|
||||
if task.get('result'):
|
||||
result = task['result']
|
||||
if task.get('status') == 'completed':
|
||||
st.success(f"✅ {result.get('message', 'Задача выполнена')}")
|
||||
if result.get('object_id'):
|
||||
st.info(f"ID объекта: {result['object_id']}")
|
||||
else:
|
||||
st.error(f"❌ {result.get('message', 'Ошибка выполнения')}")
|
||||
|
||||
if task.get('error'):
|
||||
st.error(f"❌ Ошибка: {task['error']}")
|
||||
|
||||
with col2:
|
||||
if task.get('status') in ['pending', 'running']:
|
||||
if st.button("❌ Отменить", key=f"cancel_{task_id}_btn", use_container_width=True):
|
||||
st.info("Функция отмены будет реализована в следующих версиях")
|
||||
else:
|
||||
if st.button("🗑️ Удалить", key=f"delete_{task_id}_btn", use_container_width=True):
|
||||
# Удаляем задачу из session_state
|
||||
if 'upload_tasks' in st.session_state:
|
||||
del st.session_state.upload_tasks[task_id]
|
||||
st.rerun()
|
||||
else:
|
||||
# Пустое состояние
|
||||
st.info("""
|
||||
**Нет активных задач**
|
||||
|
||||
Загрузите файл на странице "Асинхронная загрузка", чтобы создать новую задачу.
|
||||
Здесь вы сможете отслеживать прогресс обработки и управлять задачами.
|
||||
""")
|
||||
|
||||
# Кнопка для создания тестовой задачи
|
||||
if st.button("🧪 Создать тестовую задачу", key="create_test_task_btn"):
|
||||
test_task_id = f"test_task_{int(time.time())}"
|
||||
if 'upload_tasks' not in st.session_state:
|
||||
st.session_state.upload_tasks = {}
|
||||
|
||||
st.session_state.upload_tasks[test_task_id] = {
|
||||
'status': 'completed',
|
||||
'filename': 'test_file.zip',
|
||||
'endpoint': '/test/upload',
|
||||
'result': {'message': 'Тестовая задача выполнена', 'object_id': 'test-123'},
|
||||
'completed_at': time.time()
|
||||
}
|
||||
st.rerun()
|
||||
|
||||
st.markdown("---")
|
||||
|
||||
# Информация о статусах задач
|
||||
with st.expander("ℹ️ Статусы задач"):
|
||||
st.markdown("""
|
||||
**Статусы задач:**
|
||||
- 🟡 **Ожидает** - задача создана и ожидает выполнения
|
||||
- 🔵 **Выполняется** - задача обрабатывается
|
||||
- 🟢 **Завершена** - задача успешно выполнена
|
||||
- 🔴 **Ошибка** - произошла ошибка при выполнении
|
||||
- ⚫ **Отменена** - задача была отменена пользователем
|
||||
|
||||
**Действия:**
|
||||
- ❌ **Отменить** - отменить выполнение задачи
|
||||
- 🔄 **Обновить** - обновить статус задачи
|
||||
- 📊 **Детали** - просмотреть подробную информацию
|
||||
""")
|
||||
Reference in New Issue
Block a user