159 lines
7.2 KiB
Python
159 lines
7.2 KiB
Python
"""
|
||
Страница управления задачами загрузки
|
||
"""
|
||
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("""
|
||
**Статусы задач:**
|
||
- 🟡 **Ожидает** - задача создана и ожидает выполнения
|
||
- 🔵 **Выполняется** - задача обрабатывается
|
||
- 🟢 **Завершена** - задача успешно выполнена
|
||
- 🔴 **Ошибка** - произошла ошибка при выполнении
|
||
- ⚫ **Отменена** - задача была отменена пользователем
|
||
|
||
**Действия:**
|
||
- ❌ **Отменить** - отменить выполнение задачи
|
||
- 🔄 **Обновить** - обновить статус задачи
|
||
- 📊 **Детали** - просмотреть подробную информацию
|
||
""") |