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