bot refactor
This commit is contained in:
107
bot/operations/hotels.py
Normal file
107
bot/operations/hotels.py
Normal file
@@ -0,0 +1,107 @@
|
||||
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
|
||||
from asgiref.sync import sync_to_async
|
||||
from hotels.models import Hotel, UserHotel
|
||||
from users.models import User
|
||||
|
||||
async def manage_hotels(update: Update, context):
|
||||
"""Отображение списка отелей, связанных с пользователем."""
|
||||
query = update.callback_query
|
||||
await query.answer()
|
||||
|
||||
user_id = query.from_user.id
|
||||
user = await sync_to_async(User.objects.filter(chat_id=user_id).first)()
|
||||
if not user:
|
||||
await query.edit_message_text("Вы не зарегистрированы в системе.")
|
||||
return
|
||||
|
||||
user_hotels = await sync_to_async(list)(
|
||||
UserHotel.objects.filter(user=user).select_related("hotel")
|
||||
)
|
||||
|
||||
if not user_hotels:
|
||||
await query.edit_message_text("У вас нет связанных отелей.")
|
||||
return
|
||||
|
||||
keyboard = [
|
||||
[InlineKeyboardButton(f"🏨 {hotel.hotel.name}", callback_data=f"hotel_{hotel.hotel.id}")]
|
||||
for hotel in user_hotels
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||||
await query.edit_message_text("Выберите отель:", reply_markup=reply_markup)
|
||||
|
||||
|
||||
async def hotel_actions(update: Update, context):
|
||||
"""Обработчик действий для выбранного отеля."""
|
||||
query = update.callback_query
|
||||
await query.answer()
|
||||
|
||||
hotel_id = int(query.data.split("_")[1])
|
||||
hotel = await sync_to_async(Hotel.objects.filter(id=hotel_id).first)()
|
||||
if not hotel:
|
||||
await query.edit_message_text("Отель не найден.")
|
||||
return
|
||||
|
||||
keyboard = [
|
||||
[InlineKeyboardButton("🗑️ Удалить отель", callback_data=f"delete_hotel_{hotel_id}")],
|
||||
[InlineKeyboardButton("🔗 Проверить интеграцию с PMS", callback_data=f"check_pms_{hotel_id}")],
|
||||
[InlineKeyboardButton("🛏️ Настроить номера", callback_data=f"setup_rooms_{hotel_id}")],
|
||||
[InlineKeyboardButton("🏠 Главная", callback_data="main_menu")],
|
||||
[InlineKeyboardButton("🔙 Назад", callback_data="back")],
|
||||
]
|
||||
reply_markup = InlineKeyboardMarkup(keyboard)
|
||||
await query.edit_message_text(f"Управление отелем: {hotel.name}", reply_markup=reply_markup)
|
||||
|
||||
|
||||
async def delete_hotel(update: Update, context):
|
||||
"""Удаление отеля."""
|
||||
query = update.callback_query
|
||||
await query.answer()
|
||||
|
||||
hotel_id = int(query.data.split("_")[2])
|
||||
hotel = await sync_to_async(Hotel.objects.filter(id=hotel_id).first)()
|
||||
if hotel:
|
||||
hotel_name = hotel.name
|
||||
await sync_to_async(hotel.delete)()
|
||||
await query.edit_message_text(f"Отель {hotel_name} успешно удалён.")
|
||||
else:
|
||||
await query.edit_message_text("Отель не найден.")
|
||||
|
||||
|
||||
async def check_pms(update: Update, context):
|
||||
"""Проверить интеграцию с PMS."""
|
||||
query = update.callback_query
|
||||
await query.answer()
|
||||
|
||||
hotel_id = int(query.data.split("_")[2])
|
||||
hotel = await sync_to_async(Hotel.objects.select_related('api', 'pms').get)(id=hotel_id)
|
||||
if not hotel:
|
||||
await query.edit_message_text("Отель не найден.")
|
||||
return
|
||||
|
||||
api_name = hotel.api.name if hotel.api else "Не настроен"
|
||||
pms_name = hotel.pms.name if hotel.pms else "Не указана"
|
||||
|
||||
status_message = f"Отель: {hotel.name}\nPMS система: {pms_name}\nAPI: {api_name}"
|
||||
await query.edit_message_text(status_message)
|
||||
|
||||
|
||||
async def setup_rooms(update: Update, context):
|
||||
"""Настроить номера отеля."""
|
||||
query = update.callback_query
|
||||
await query.answer()
|
||||
|
||||
hotel_id = int(query.data.split("_")[2])
|
||||
hotel = await sync_to_async(Hotel.objects.filter(id=hotel_id).first)()
|
||||
if not hotel:
|
||||
await query.edit_message_text("Отель не найден.")
|
||||
return
|
||||
|
||||
await query.edit_message_text(f"Настройка номеров для отеля: {hotel.name}")
|
||||
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user