116 lines
4.3 KiB
Python
116 lines
4.3 KiB
Python
"""
|
||
Утилиты для отображения информации о победителях в зависимости от настроек розыгрыша
|
||
"""
|
||
from typing import Dict, Any, Optional
|
||
from models import User, Lottery
|
||
from account_utils import mask_account_number
|
||
|
||
|
||
def format_winner_display(user: User, lottery: Lottery, show_sensitive_data: bool = False) -> str:
|
||
"""
|
||
Форматирует отображение победителя в зависимости от настроек розыгрыша
|
||
|
||
Args:
|
||
user: Пользователь-победитель
|
||
lottery: Розыгрыш
|
||
show_sensitive_data: Показывать ли чувствительные данные (для админов)
|
||
|
||
Returns:
|
||
str: Отформатированная строка для отображения победителя
|
||
"""
|
||
display_type = getattr(lottery, 'winner_display_type', 'username')
|
||
|
||
if display_type == 'username':
|
||
# Отображаем username или имя
|
||
if user.username:
|
||
return f"@{user.username}"
|
||
else:
|
||
return user.first_name or f"Пользователь {user.id}"
|
||
|
||
elif display_type == 'chat_id':
|
||
# Отображаем Telegram ID
|
||
return f"ID: {user.telegram_id}"
|
||
|
||
elif display_type == 'account_number':
|
||
# Отображаем номер клиентского счета
|
||
if not user.account_number:
|
||
return "Счёт не указан"
|
||
|
||
if show_sensitive_data:
|
||
# Для админов показываем полный номер
|
||
return f"Счёт: {user.account_number}"
|
||
else:
|
||
# Для публичного показа маскируем номер
|
||
masked = mask_account_number(user.account_number, show_last_digits=4)
|
||
return f"Счёт: {masked}"
|
||
|
||
else:
|
||
# Fallback к username/имени
|
||
if user.username:
|
||
return f"@{user.username}"
|
||
else:
|
||
return user.first_name or f"Пользователь {user.id}"
|
||
|
||
|
||
def format_winner_info(winner_data: Dict[str, Any], show_sensitive_data: bool = False) -> str:
|
||
"""
|
||
Форматирует информацию о победителе из данных розыгрыша
|
||
|
||
Args:
|
||
winner_data: Словарь с данными о победителе
|
||
show_sensitive_data: Показывать ли чувствительные данные
|
||
|
||
Returns:
|
||
str: Отформатированная строка для отображения
|
||
"""
|
||
user = winner_data.get('user')
|
||
place = winner_data.get('place', 1)
|
||
prize = winner_data.get('prize', f'Приз {place} места')
|
||
|
||
if not user:
|
||
return f"{place}. Победитель не определен"
|
||
|
||
# Пробуем получить lottery из winner_data, если есть
|
||
lottery = winner_data.get('lottery')
|
||
|
||
if lottery:
|
||
winner_display = format_winner_display(user, lottery, show_sensitive_data)
|
||
else:
|
||
# Fallback если нет данных о розыгрыше
|
||
if user.username:
|
||
winner_display = f"@{user.username}"
|
||
else:
|
||
winner_display = user.first_name or f"Пользователь {user.id}"
|
||
|
||
return f"{place}. {winner_display}"
|
||
|
||
|
||
def get_display_type_name(display_type: str) -> str:
|
||
"""
|
||
Получить человекочитаемое название типа отображения
|
||
|
||
Args:
|
||
display_type: Тип отображения
|
||
|
||
Returns:
|
||
str: Название типа
|
||
"""
|
||
types = {
|
||
'username': 'Username/Имя',
|
||
'chat_id': 'Telegram ID',
|
||
'account_number': 'Номер счёта'
|
||
}
|
||
return types.get(display_type, 'Неизвестно')
|
||
|
||
|
||
def validate_display_type(display_type: str) -> bool:
|
||
"""
|
||
Проверяет корректность типа отображения
|
||
|
||
Args:
|
||
display_type: Тип отображения для проверки
|
||
|
||
Returns:
|
||
bool: True если тип корректен
|
||
"""
|
||
return display_type in ['username', 'chat_id', 'account_number'] |