186 lines
8.7 KiB
Python
186 lines
8.7 KiB
Python
"""
|
||
Страница управления задачами загрузки
|
||
"""
|
||
import streamlit as st
|
||
from datetime import datetime
|
||
import time
|
||
from async_upload_page import TASKS_STORAGE
|
||
|
||
|
||
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):
|
||
# Удаляем завершенные и неудачные задачи
|
||
tasks_to_remove = []
|
||
for task_id, task in TASKS_STORAGE.items():
|
||
if task.get('status') in ['completed', 'failed']:
|
||
tasks_to_remove.append(task_id)
|
||
|
||
for task_id in tasks_to_remove:
|
||
del TASKS_STORAGE[task_id]
|
||
|
||
st.success(f"✅ Удалено {len(tasks_to_remove)} завершенных задач")
|
||
st.rerun()
|
||
|
||
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("📊 Статистика задач")
|
||
|
||
# Получаем задачи из глобального хранилища
|
||
tasks = TASKS_STORAGE
|
||
|
||
# Подсчитываем статистику
|
||
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("📋 Список задач")
|
||
|
||
# Получаем задачи из глобального хранилища
|
||
tasks = TASKS_STORAGE
|
||
|
||
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('status') == 'running':
|
||
progress = task.get('progress', 0)
|
||
st.write(f"**Прогресс:** {progress}%")
|
||
st.progress(progress / 100)
|
||
|
||
# Показываем время выполнения
|
||
if task.get('started_at'):
|
||
started_time = datetime.fromtimestamp(task['started_at']).strftime("%Y-%m-%d %H:%M:%S")
|
||
st.write(f"**Начата:** {started_time}")
|
||
|
||
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('started_at'):
|
||
duration = task['completed_at'] - task['started_at']
|
||
st.write(f"**Длительность:** {duration:.1f} сек")
|
||
|
||
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):
|
||
# Удаляем задачу из глобального хранилища
|
||
if task_id in TASKS_STORAGE:
|
||
del TASKS_STORAGE[task_id]
|
||
st.rerun()
|
||
else:
|
||
# Пустое состояние
|
||
st.info("""
|
||
**Нет активных задач**
|
||
|
||
Загрузите файл на странице "Асинхронная загрузка", чтобы создать новую задачу.
|
||
Здесь вы сможете отслеживать прогресс обработки и управлять задачами.
|
||
""")
|
||
|
||
# Кнопка для создания тестовой задачи
|
||
if st.button("🧪 Создать тестовую задачу", key="create_test_task_btn"):
|
||
test_task_id = f"test_task_{int(time.time())}"
|
||
|
||
TASKS_STORAGE[test_task_id] = {
|
||
'status': 'completed',
|
||
'filename': 'test_file.zip',
|
||
'endpoint': '/test/upload',
|
||
'result': {'message': 'Тестовая задача выполнена', 'object_id': 'test-123'},
|
||
'started_at': time.time() - 5, # 5 секунд назад
|
||
'completed_at': time.time(),
|
||
'progress': 100
|
||
}
|
||
st.rerun()
|
||
|
||
st.markdown("---")
|
||
|
||
# Информация о статусах задач
|
||
with st.expander("ℹ️ Статусы задач"):
|
||
st.markdown("""
|
||
**Статусы задач:**
|
||
- 🟡 **Ожидает** - задача создана и ожидает выполнения
|
||
- 🔵 **Выполняется** - задача обрабатывается
|
||
- 🟢 **Завершена** - задача успешно выполнена
|
||
- 🔴 **Ошибка** - произошла ошибка при выполнении
|
||
- ⚫ **Отменена** - задача была отменена пользователем
|
||
|
||
**Действия:**
|
||
- ❌ **Отменить** - отменить выполнение задачи
|
||
- 🔄 **Обновить** - обновить статус задачи
|
||
- 📊 **Детали** - просмотреть подробную информацию
|
||
""") |