Stage 06.1 - journal management UI, export and system menu redesign
This commit is contained in:
@@ -8,6 +8,7 @@ from aiogram.types import CallbackQuery, InlineKeyboardMarkup, Message
|
||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||||
|
||||
from src.core.system_status import build_system_text, get_system_snapshot, has_system_alerts
|
||||
from src.trading.journal.service import JournalService
|
||||
|
||||
|
||||
router = Router(name="system")
|
||||
@@ -15,16 +16,20 @@ router = Router(name="system")
|
||||
|
||||
def _system_keyboard() -> InlineKeyboardMarkup:
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.button(text="🏠 К торговле", callback_data="trade:home")
|
||||
builder.adjust(1)
|
||||
builder.button(text="📒 Журнал", callback_data="journal:1")
|
||||
builder.button(text="🛠️ Настройки", callback_data="system:management")
|
||||
builder.button(text="ℹ️ Информация", callback_data="system:about")
|
||||
builder.adjust(2, 1)
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
def _system_alert_keyboard() -> InlineKeyboardMarkup:
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.button(text="🔁 Обновить", callback_data="system:retry")
|
||||
builder.button(text="🏠 К торговле", callback_data="trade:home")
|
||||
builder.adjust(1, 1)
|
||||
builder.button(text="📒 Журнал", callback_data="journal:1")
|
||||
builder.button(text="🛠️ Настройки", callback_data="system:management")
|
||||
builder.button(text="ℹ️ Информация", callback_data="system:about")
|
||||
builder.adjust(1, 2, 1)
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
@@ -32,10 +37,56 @@ async def _render_system_screen(
|
||||
target_message: Message,
|
||||
*,
|
||||
edit_mode: bool,
|
||||
user_id: int | None,
|
||||
chat_id: int | None,
|
||||
action: str,
|
||||
) -> None:
|
||||
journal = JournalService()
|
||||
|
||||
journal.log_ui_info(
|
||||
event_type="system_open_requested",
|
||||
message="Запрошено открытие экрана системы.",
|
||||
screen="system",
|
||||
action=action,
|
||||
user_id=user_id,
|
||||
chat_id=chat_id,
|
||||
)
|
||||
|
||||
snapshot = get_system_snapshot()
|
||||
is_alert = has_system_alerts(snapshot)
|
||||
|
||||
if is_alert:
|
||||
journal.log_ui_warning(
|
||||
event_type="system_open_alert",
|
||||
message="Система загружена с предупреждениями.",
|
||||
screen="system",
|
||||
action=action,
|
||||
user_id=user_id,
|
||||
chat_id=chat_id,
|
||||
payload={
|
||||
"has_alerts": True,
|
||||
"components": [
|
||||
{
|
||||
"name": component.name,
|
||||
"state": component.state,
|
||||
"details": component.details,
|
||||
}
|
||||
for component in snapshot.components
|
||||
if component.state != "🟢"
|
||||
],
|
||||
},
|
||||
)
|
||||
else:
|
||||
journal.log_ui_info(
|
||||
event_type="system_open_success",
|
||||
message="Экран системы загружен.",
|
||||
screen="system",
|
||||
action=action,
|
||||
user_id=user_id,
|
||||
chat_id=chat_id,
|
||||
payload={"has_alerts": False},
|
||||
)
|
||||
|
||||
text = build_system_text(include_updated_at=is_alert)
|
||||
reply_markup = _system_alert_keyboard() if is_alert else _system_keyboard()
|
||||
|
||||
@@ -45,12 +96,19 @@ async def _render_system_screen(
|
||||
await target_message.answer(text, reply_markup=reply_markup)
|
||||
|
||||
|
||||
@router.message(F.text.in_({"⚙️ Система", "⚙ Система"}))
|
||||
@router.message(F.text.in_({"🖥️ Система", "⚙️ Система", "⚙ Система"}))
|
||||
async def open_system(message: Message, state: FSMContext) -> None:
|
||||
await state.clear()
|
||||
|
||||
user_id = message.from_user.id if message.from_user else None
|
||||
chat_id = message.chat.id if message.chat else None
|
||||
|
||||
await _render_system_screen(
|
||||
message,
|
||||
edit_mode=False,
|
||||
user_id=user_id,
|
||||
chat_id=chat_id,
|
||||
action="open",
|
||||
)
|
||||
|
||||
|
||||
@@ -62,8 +120,100 @@ async def retry_system(callback: CallbackQuery, state: FSMContext) -> None:
|
||||
await callback.answer("Сообщение не найдено", show_alert=True)
|
||||
return
|
||||
|
||||
user_id = callback.from_user.id if callback.from_user else None
|
||||
chat_id = callback.message.chat.id if callback.message.chat else None
|
||||
|
||||
await _render_system_screen(
|
||||
callback.message,
|
||||
edit_mode=True,
|
||||
user_id=user_id,
|
||||
chat_id=chat_id,
|
||||
action="retry",
|
||||
)
|
||||
await callback.answer()
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router.callback_query(F.data == "system:management")
|
||||
async def open_system_management(callback: CallbackQuery) -> None:
|
||||
if callback.message is None:
|
||||
await callback.answer("Сообщение не найдено", show_alert=True)
|
||||
return
|
||||
|
||||
text = (
|
||||
"<b>🛠️ Настройки</b>\n\n"
|
||||
"<b>СИСТЕМА</b>\n\n"
|
||||
"Выберите раздел:"
|
||||
)
|
||||
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.button(text="🤖 Автоторговля", callback_data="settings:auto")
|
||||
builder.button(text="📊 Торговля", callback_data="settings:trade")
|
||||
builder.button(text="🌍 Общие", callback_data="settings:general")
|
||||
builder.button(text="📒 Журнал", callback_data="settings:journal")
|
||||
builder.button(text="⬅️ Назад", callback_data="system:back")
|
||||
|
||||
builder.adjust(2, 2, 1)
|
||||
|
||||
await callback.message.edit_text(
|
||||
text,
|
||||
reply_markup=builder.as_markup(),
|
||||
)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router.callback_query(F.data == "settings:journal")
|
||||
async def open_journal_settings(callback: CallbackQuery) -> None:
|
||||
if callback.message is None:
|
||||
await callback.answer("Сообщение не найдено", show_alert=True)
|
||||
return
|
||||
|
||||
service = JournalService()
|
||||
total = service.get_total_count()
|
||||
|
||||
text = (
|
||||
"<b>📒 Журнал</b>\n\n"
|
||||
"<b>СИСТЕМА</b> · Настройки\n\n"
|
||||
f"📄 Записей: {total}\n"
|
||||
"📦 Лимит: —\n"
|
||||
"⏳ Хранение: —\n"
|
||||
"🗄 Архив: —\n\n"
|
||||
)
|
||||
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.button(text="🗑 Очистка", callback_data="journal:clear_confirm")
|
||||
builder.button(text="🗄 Архив", callback_data="settings:journal_archive")
|
||||
builder.button(text="📦 Лимит", callback_data="settings:journal_limit")
|
||||
builder.button(text="⏳ Хранение", callback_data="settings:journal_retention")
|
||||
builder.button(text="⬅️ Назад", callback_data="system:control")
|
||||
builder.button(text="📒 Журнал", callback_data="journal:1")
|
||||
builder.adjust(2, 2, 2)
|
||||
|
||||
await callback.message.edit_text(
|
||||
text,
|
||||
reply_markup=builder.as_markup(),
|
||||
)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router.callback_query(F.data == "system:back")
|
||||
async def back_to_system(callback: CallbackQuery) -> None:
|
||||
if callback.message is None:
|
||||
await callback.answer("Сообщение не найдено", show_alert=True)
|
||||
return
|
||||
|
||||
user_id = callback.from_user.id if callback.from_user else None
|
||||
chat_id = callback.message.chat.id if callback.message.chat else None
|
||||
|
||||
await _render_system_screen(
|
||||
callback.message,
|
||||
edit_mode=True,
|
||||
user_id=user_id,
|
||||
chat_id=chat_id,
|
||||
action="back",
|
||||
)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router.callback_query(F.data == "system:about")
|
||||
async def open_system_about(callback: CallbackQuery) -> None:
|
||||
await callback.answer("О продукте скоро появится")
|
||||
Reference in New Issue
Block a user