164 lines
6.4 KiB
Python
164 lines
6.4 KiB
Python
from asgiref.sync import sync_to_async
|
||
from telegram import Update
|
||
from telegram.ext import ContextTypes
|
||
from telegram.ext import CallbackContext
|
||
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
|
||
from telegram import KeyboardButton, ReplyKeyboardMarkup
|
||
|
||
from hotels.models import Hotel, UserHotel
|
||
from users.models import User
|
||
|
||
|
||
async def edit_user(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""Изменение имени пользователя."""
|
||
query = update.callback_query
|
||
await query.answer()
|
||
|
||
user_id = int(query.data.split("_")[2])
|
||
context.user_data["edit_user_id"] = user_id
|
||
|
||
await query.edit_message_text("Введите новое имя пользователя:")
|
||
|
||
async def delete_user(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""Удаление пользователя."""
|
||
query = update.callback_query
|
||
await query.answer()
|
||
|
||
user_id = int(query.data.split("_")[2])
|
||
user = await sync_to_async(User.objects.get)(id=user_id)
|
||
await sync_to_async(user.delete)()
|
||
|
||
await query.edit_message_text("Пользователь успешно удален.")
|
||
|
||
async def get_users_for_hotel(hotel_id):
|
||
"""
|
||
Получение пользователей, зарегистрированных в отеле с правами управления через бота.
|
||
"""
|
||
users = await sync_to_async(list)(
|
||
User.objects.filter(user_hotels__hotel_id=hotel_id, user_hotels__role__in=["admin", "manager"]).distinct()
|
||
)
|
||
return users
|
||
|
||
|
||
async def show_users(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""Показать пользователей, зарегистрированных в отеле."""
|
||
query = update.callback_query
|
||
await query.answer()
|
||
|
||
# Если callback_data не содержит ID отеля, отображаем список отелей
|
||
if not query.data.startswith("manage_users_hotel_"):
|
||
user_id = query.from_user.id
|
||
hotels = await get_hotels_for_user(user_id)
|
||
|
||
if not hotels:
|
||
await query.edit_message_text("У вас нет доступных отелей.")
|
||
return
|
||
|
||
keyboard = [
|
||
[InlineKeyboardButton(hotel.name, callback_data=f"manage_users_hotel_{hotel.id}")]
|
||
for hotel in hotels
|
||
]
|
||
keyboard.append([InlineKeyboardButton("🏠 Главная", callback_data="main_menu")])
|
||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||
await query.edit_message_text("Выберите отель:", reply_markup=reply_markup)
|
||
return
|
||
|
||
# Обработка пользователей отеля
|
||
hotel_id = int(query.data.split("_")[-1])
|
||
users = await sync_to_async(list)(
|
||
User.objects.filter(user_hotel__hotel_id=hotel_id)
|
||
)
|
||
|
||
if not users:
|
||
await query.edit_message_text("В этом отеле нет пользователей.")
|
||
return
|
||
|
||
keyboard = [
|
||
[InlineKeyboardButton(f"{user.username}", callback_data=f"edit_user_{user.id}")]
|
||
for user in users
|
||
]
|
||
keyboard.append([
|
||
InlineKeyboardButton("🏠 Главная", callback_data="main_menu"),
|
||
InlineKeyboardButton("🔙 Назад", callback_data="manage_users"),
|
||
[InlineKeyboardButton("🏠 Главная", callback_data="main_menu")],
|
||
[InlineKeyboardButton("🔙 Назад", callback_data="back")],
|
||
])
|
||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||
await query.edit_message_text("Выберите пользователя:", reply_markup=reply_markup)
|
||
|
||
|
||
async def get_hotels_for_user(user):
|
||
"""Получение отелей, связанных с пользователем."""
|
||
return await sync_to_async(list)(
|
||
Hotel.objects.filter(hotel_users__user=user).distinct()
|
||
)
|
||
|
||
async def show_user_hotels(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""Показ списка отелей пользователя."""
|
||
query = update.callback_query
|
||
await query.answer()
|
||
|
||
user_id = query.from_user.id
|
||
user_hotels = await get_hotels_for_user(user_id)
|
||
|
||
if not user_hotels:
|
||
await query.edit_message_text("У вас нет связанных отелей.")
|
||
return
|
||
|
||
keyboard = [
|
||
[InlineKeyboardButton(hotel.name, callback_data=f"users_hotel_{hotel.id}")]
|
||
for hotel in user_hotels
|
||
]
|
||
keyboard.append([InlineKeyboardButton("🔙 Назад", callback_data="main_menu")])
|
||
|
||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||
await query.edit_message_text("Выберите отель:", reply_markup=reply_markup)
|
||
|
||
async def show_users_in_hotel(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""Показ пользователей в выбранном отеле."""
|
||
query = update.callback_query
|
||
await query.answer()
|
||
|
||
hotel_id = int(query.data.split("_")[2])
|
||
users = await get_users_for_hotel(hotel_id)
|
||
|
||
if not users:
|
||
await query.edit_message_text("В этом отеле нет пользователей.")
|
||
return
|
||
|
||
keyboard = [
|
||
[InlineKeyboardButton(f"{user.first_name} {user.last_name}", callback_data=f"user_action_{user.id}")]
|
||
for user in users
|
||
]
|
||
keyboard.append([
|
||
InlineKeyboardButton("🏠 Главная", callback_data="main_menu"),
|
||
InlineKeyboardButton("🔙 Назад", callback_data="manage_users"),
|
||
])
|
||
|
||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||
await query.edit_message_text("Пользователи отеля:", reply_markup=reply_markup)
|
||
|
||
async def user_action_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""Меню действий для пользователя."""
|
||
query = update.callback_query
|
||
await query.answer()
|
||
|
||
user_id = int(query.data.split("_")[2])
|
||
user = await sync_to_async(User.objects.get)(id=user_id)
|
||
|
||
keyboard = [
|
||
[InlineKeyboardButton("✏️ Изменить имя", callback_data=f"edit_user_{user_id}")],
|
||
[InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_user_{user_id}")],
|
||
[
|
||
InlineKeyboardButton("🏠 Главная", callback_data="main_menu"),
|
||
InlineKeyboardButton("🔙 Назад", callback_data="users_hotel"),
|
||
],
|
||
]
|
||
|
||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||
await query.edit_message_text(
|
||
f"Пользователь: {user.first_name} {user.last_name}\nВыберите действие:",
|
||
reply_markup=reply_markup,
|
||
)
|
||
|