Files
Solo_bot/handlers/admin/settings/keyboard.py
T

217 lines
6.3 KiB
Python

from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder
from ..panel.keyboard import AdminPanelCallback, build_admin_back_btn
from .settings_config import (
BUTTON_TITLES,
MODES_TITLES,
MONEY_FIELDS,
NOTIFICATION_TIME_FIELDS,
NOTIFICATION_TITLES,
PAYMENT_PROVIDER_TITLES,
)
def build_toggle_section_keyboard(
titles: dict[str, str],
state: dict[str, bool],
action: str,
columns: int,
back_action: str = "settings",
extra_rows: list[list[InlineKeyboardButton]] | None = None,
) -> InlineKeyboardMarkup:
builder = InlineKeyboardBuilder()
for index, key in enumerate(titles.keys(), start=1):
title = titles[key]
current_state = bool(state.get(key, False))
prefix = "" if current_state else ""
builder.button(
text=f"{prefix} {title}",
callback_data=AdminPanelCallback(
action=action,
page=index,
).pack(),
)
builder.adjust(columns)
if extra_rows:
for row in extra_rows:
builder.row(*row)
builder.row(
InlineKeyboardButton(
text="Назад",
callback_data=AdminPanelCallback(action=back_action).pack(),
)
)
return builder.as_markup()
def build_settings_kb() -> InlineKeyboardMarkup:
builder = InlineKeyboardBuilder()
builder.button(
text="Кассы",
callback_data=AdminPanelCallback(action="settings_cashboxes").pack(),
)
builder.button(
text="Деньги",
callback_data=AdminPanelCallback(action="settings_money").pack(),
)
builder.button(
text="Кнопки",
callback_data=AdminPanelCallback(action="settings_buttons").pack(),
)
builder.button(
text="Уведомления",
callback_data=AdminPanelCallback(action="settings_notifications").pack(),
)
builder.button(
text="Режимы",
callback_data=AdminPanelCallback(action="settings_modes").pack(),
)
builder.button(
text="Тарификация",
callback_data=AdminPanelCallback(action="settings_tariffs").pack(),
)
builder.adjust(2, 2, 2)
builder.row(build_admin_back_btn())
return builder.as_markup()
def build_settings_buttons_kb(buttons_state: dict[str, bool]) -> InlineKeyboardMarkup:
return build_toggle_section_keyboard(
titles=BUTTON_TITLES,
state=buttons_state,
action="settings_button_toggle",
columns=2,
back_action="settings",
)
def build_settings_cashboxes_kb(providers_state: dict[str, bool]) -> InlineKeyboardMarkup:
return build_toggle_section_keyboard(
titles=PAYMENT_PROVIDER_TITLES,
state=providers_state,
action="settings_cashbox_toggle",
columns=2,
back_action="settings",
)
def build_settings_notifications_kb(notifications_state: dict[str, object]) -> InlineKeyboardMarkup:
intervals_button = InlineKeyboardButton(
text="Интервалы",
callback_data=AdminPanelCallback(action="settings_notifications_intervals").pack(),
)
return build_toggle_section_keyboard(
titles=NOTIFICATION_TITLES,
state={k: bool(notifications_state.get(k, False)) for k in NOTIFICATION_TITLES},
action="settings_notification_toggle",
columns=1,
back_action="settings",
extra_rows=[[intervals_button]],
)
def build_settings_notifications_intervals_kb(notifications_state: dict[str, object]) -> InlineKeyboardMarkup:
builder = InlineKeyboardBuilder()
keys = list(NOTIFICATION_TIME_FIELDS.keys())
for index, key in enumerate(keys, start=1):
title = NOTIFICATION_TIME_FIELDS[key]
value = notifications_state.get(key)
value_text = "не задано" if value is None else str(value)
builder.button(
text=f"{title}: {value_text}",
callback_data=AdminPanelCallback(
action="settings_notification_interval_edit",
page=index,
).pack(),
)
builder.adjust(1)
builder.row(
InlineKeyboardButton(
text="Назад",
callback_data=AdminPanelCallback(action="settings_notifications").pack(),
)
)
return builder.as_markup()
def build_settings_modes_kb(modes_state: dict[str, bool]) -> InlineKeyboardMarkup:
return build_toggle_section_keyboard(
titles=MODES_TITLES,
state=modes_state,
action="settings_modes_toggle",
columns=2,
back_action="settings",
)
def build_settings_money_kb(money_state: dict[str, object]) -> InlineKeyboardMarkup:
builder = InlineKeyboardBuilder()
field_keys = list(MONEY_FIELDS.keys())
for index, key in enumerate(field_keys, start=1):
title = MONEY_FIELDS[key]
value = money_state.get(key)
if key == "RUB_TO_USD":
if value is False or value is None:
value_text = "по ЦБ РФ"
else:
value_text = str(value)
elif key == "CASHBACK":
try:
numeric_value = float(value) if value not in (None, False) else 0.0
except (TypeError, ValueError):
numeric_value = 0.0
if numeric_value <= 0:
value_text = "выкл"
else:
value_text = f"{numeric_value:g} %"
else:
value_text = "не задано" if value is None else str(value)
builder.button(
text=f"{title}: {value_text}",
callback_data=AdminPanelCallback(
action="settings_money_edit",
page=index,
).pack(),
)
mode = str(money_state.get("CURRENCY_MODE") or "RUB").upper()
if mode not in ("RUB", "USD", "RUB+USD"):
mode = "RUB"
builder.button(
text=f"Режим валют: {mode}",
callback_data=AdminPanelCallback(
action="settings_money_currency",
page=0,
).pack(),
)
builder.adjust(1)
builder.row(
InlineKeyboardButton(
text="Назад",
callback_data=AdminPanelCallback(action="settings").pack(),
)
)
return builder.as_markup()