61 lines
2.5 KiB
Python
61 lines
2.5 KiB
Python
from aiogram.types import InlineKeyboardMarkup
|
|
|
|
from database.models import Tariff
|
|
|
|
from .keyboard import build_single_tariff_kb
|
|
|
|
|
|
MAX_TARIFF_NAME_LENGTH = 40
|
|
MAX_SUBGROUP_TITLE_LENGTH = 40
|
|
|
|
|
|
def validate_tariff_name(name: str) -> tuple[bool, str]:
|
|
if len(name) > MAX_TARIFF_NAME_LENGTH:
|
|
return False, f"Название тарифа слишком длинное. Максимум {MAX_TARIFF_NAME_LENGTH} символов."
|
|
return True, ""
|
|
|
|
|
|
def validate_subgroup_title(title: str) -> tuple[bool, str]:
|
|
if len(title) > MAX_SUBGROUP_TITLE_LENGTH:
|
|
return False, f"Название подгруппы слишком длинное. Максимум {MAX_SUBGROUP_TITLE_LENGTH} символов."
|
|
return True, ""
|
|
|
|
|
|
def tariff_to_dict(tariff) -> dict:
|
|
if isinstance(tariff, dict):
|
|
return tariff
|
|
return {
|
|
"id": tariff.id,
|
|
"name": tariff.name,
|
|
"price_rub": tariff.price_rub,
|
|
"group_code": tariff.group_code,
|
|
"subgroup_title": tariff.subgroup_title,
|
|
"sort_order": tariff.sort_order,
|
|
}
|
|
|
|
|
|
def render_tariff_card(tariff: Tariff) -> tuple[str, InlineKeyboardMarkup]:
|
|
traffic_text = f"{tariff.traffic_limit} ГБ" if tariff.traffic_limit else "Безлимит"
|
|
device_text = f"{tariff.device_limit}" if tariff.device_limit is not None else "Безлимит"
|
|
sort_order = getattr(tariff, "sort_order", 1)
|
|
vless_text = "Да" if getattr(tariff, "vless", False) else "Нет"
|
|
configurable = bool(getattr(tariff, "configurable", False))
|
|
configurable_text = "Включен" if configurable else "Выключен"
|
|
external_squad_text = getattr(tariff, "external_squad", None) or "Не задан"
|
|
|
|
text = (
|
|
f"<b>📄 Тариф: {tariff.name}</b>\n\n"
|
|
f"📁 Группа: <code>{tariff.group_code}</code>\n"
|
|
f"📅 Длительность: <b>{tariff.duration_days} дней</b>\n"
|
|
f"💰 Стоимость: <b>{tariff.price_rub}₽</b>\n"
|
|
f"📦 Трафик: <b>{traffic_text}</b>\n"
|
|
f"📱 Устройств: <b>{device_text}</b>\n"
|
|
f"🔗 VLESS: <b>{vless_text}</b>\n"
|
|
f"⚙️ Конфигуратор: <b>{configurable_text}</b>\n"
|
|
f"Внешний сквад: <b>{external_squad_text}</b>\n"
|
|
f"🔢 Позиция: <b>{sort_order}</b>\n"
|
|
f"{'✅ Активен' if tariff.is_active else '⛔ Отключен'}"
|
|
)
|
|
|
|
return text, build_single_tariff_kb(tariff.id, tariff.group_code, configurable=configurable)
|