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, )