From 566bdacad0229d47e1a7f15d0b4ea401706d5321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CMikkelando=E2=80=9D?= <ms.m.kl@mail.ru> Date: Mon, 27 Jan 2025 01:04:40 +0300 Subject: [PATCH] final --- movere_local/mainapp/urls.py | 2 +- movere_local/mainapp/views.py | 22 +++++++++- test/api_test.py | 30 +++++++++++++ test/tg_bot.py | 79 ++++++++++++++++++++++++++--------- 4 files changed, 112 insertions(+), 21 deletions(-) diff --git a/movere_local/mainapp/urls.py b/movere_local/mainapp/urls.py index a66cc634..9f262b82 100644 --- a/movere_local/mainapp/urls.py +++ b/movere_local/mainapp/urls.py @@ -30,7 +30,7 @@ urlpatterns = [ path('story-and-files', views.view_story_and_files, name='view_story_and_files'), path('redactor/', views.redactor, name='redactor'), path('api/orders/by-username/<str:username>/', views.order_list_by_username_api, name='order_list_by_username_api'), - + path('api/users/<str:username>/', views.check_user_exists, name='check_user_exists'), # path('serve-file/<str:file_name>/', views.serve_file, name='serve_file'), # re_path(r'^download-file/(?P<path>.*)$', views.download_file, name='download_file'), diff --git a/movere_local/mainapp/views.py b/movere_local/mainapp/views.py index 3cbca1ee..d69d1471 100644 --- a/movere_local/mainapp/views.py +++ b/movere_local/mainapp/views.py @@ -635,4 +635,24 @@ def view_editrequests(request): print('from views: ', nn_status) - return render(request, 'mainapp/view_editrequests.html', {'orders_status_list': orders_status_list, 'nn_status': nn_status}) \ No newline at end of file + return render(request, 'mainapp/view_editrequests.html', {'orders_status_list': orders_status_list, 'nn_status': nn_status}) + + + + +@csrf_exempt +def check_user_exists(request, username): + # Проверка ключа API + api_key = request.headers.get('Authorization') + if api_key != f"Api-Key {settings.API_KEY}": + return JsonResponse({'error': 'Unauthorized'}, status=403) + + if request.method == 'GET': + # Проверка существует ли пользователь СЃ таким именем + try: + user = User.objects.get(username=username) + return JsonResponse({'exists': True}) + except User.DoesNotExist: + return JsonResponse({'exists': False}) + + return JsonResponse({'error': 'Method not allowed'}, status=405) diff --git a/test/api_test.py b/test/api_test.py index bd627dce..31f5256b 100644 --- a/test/api_test.py +++ b/test/api_test.py @@ -139,7 +139,37 @@ def mark_order_as_processed(order_id): return set_order_status(order_id=order_id, status=STATUS_FINISHED) +def is_login_exists_in_db(username): + """ + Проверяет существование пользователя РІ базе данных РїРѕ имени пользователя. + + Аргументы: + username (str): РРјСЏ пользователя, наличие которого необходимо проверить РІ базе данных. + + Возвращает: + bool: Возвращает True, если пользователь существует РІ базе данных, иначе False. + + Рсключения: + Обрабатывает любое исключение requests, связанное СЃ HTTP-запросом, такое как проблемы соединения + или некорректный HTTP-ответ. Р’ случае ошибки возвращает False Рё выводит сообщение РѕР± ошибке РІ консоль. + """ + try: + response = requests.get(f"{BASE_URL}{USERNAME_CHECK_ENDPOINT}{username}/", headers=HEADERS) + response.raise_for_status() + user_data = response.json() + return user_data.get('exists', False) + except requests.exceptions.RequestException as e: + print(f"Ошибка РїСЂРё проверке логина РІ базе данных: {e}") + return False + + + + + if __name__ == "__main__": data = get_order_statuses_with_ids('red') print(data) + + print('LOGIN: ', is_login_exists_in_db('lksdjf')) + print('LOGIN: ', is_login_exists_in_db('red')) diff --git a/test/tg_bot.py b/test/tg_bot.py index 8475f68b..b75d4057 100644 --- a/test/tg_bot.py +++ b/test/tg_bot.py @@ -7,8 +7,16 @@ from aiogram.types import CallbackQuery from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.fsm.state import State, StatesGroup -from test.api_test import get_order_statuses_with_ids # РРјРїРѕСЂС‚ функции для получения заказов +# from test.api_test import get_order_statuses_with_ids # РРјРїРѕСЂС‚ функции для получения заказов +# from test.api_test import is_login_exists_in_db + +# from test.config import token + +from api_test import get_order_statuses_with_ids # РРјРїРѕСЂС‚ функции для получения заказов +from api_test import is_login_exists_in_db + from config import token + # Устанавливаем уровень логирования logging.basicConfig(level=logging.INFO) @@ -43,11 +51,11 @@ async def send_welcome(message: types.Message, state: FSMContext): # Создаем инлайн-РєРЅРѕРїРєРё "Старт", "Р’С…РѕРґ" Рё "Регистрация" builder = InlineKeyboardBuilder() - builder.add(types.InlineKeyboardButton(text="Старт", callback_data="start")) - builder.add(types.InlineKeyboardButton(text="Р’С…РѕРґ", callback_data="login")) - builder.add(types.InlineKeyboardButton(text="Регистрация", url="https://lms.hse.ru/")) + builder.add(types.InlineKeyboardButton(text="Стартвђ", callback_data="start")) + builder.add(types.InlineKeyboardButton(text="Р’С…РѕРґрџ”ђ", callback_data="login")) + builder.add(types.InlineKeyboardButton(text="Регистрация✍", url="https://moverelab.ru/")) - await message.answer("Привет! Выберите действие:", reply_markup=builder.as_markup()) + await message.answer("Привет👋", reply_markup=builder.as_markup()) # Удаление всех сообщений РґРѕ /start async def delete_messages_up_to_start(chat_id: int, current_message_id: int): @@ -66,7 +74,7 @@ async def delete_messages_up_to_start(chat_id: int, current_message_id: int): async def send_about(call: CallbackQuery): await delete_messages_up_to_start(call.message.chat.id, call.message.message_id) builder = InlineKeyboardBuilder() - builder.add(types.InlineKeyboardButton(text="Назад", callback_data="main_menu")) + builder.add(types.InlineKeyboardButton(text="Назад🔙", callback_data="main_menu")) await call.message.answer("Ртот Р±РѕС‚ был создан студентами для лаборатории РњРРРњ.", reply_markup=builder.as_markup()) # Обработчик нажатия РЅР° "Р’С…РѕРґ" @@ -75,29 +83,45 @@ async def ask_for_login(call: CallbackQuery, state: FSMContext): await delete_messages_up_to_start(call.message.chat.id, call.message.message_id) builder = InlineKeyboardBuilder() - builder.add(types.InlineKeyboardButton(text="Назад", callback_data="main_menu")) + builder.add(types.InlineKeyboardButton(text="Назад🔙", callback_data="main_menu")) await call.message.answer("Введите ваш логин:", reply_markup=builder.as_markup()) await state.set_state(AuthStates.waiting_for_login) + # Обработка РІРІРѕРґР° логина @router.message(AuthStates.waiting_for_login) async def get_login(message: types.Message, state: FSMContext): await delete_messages_up_to_start(message.chat.id, message.message_id) - # Сохраняем логин РІ словарь авторизованных пользователей chat_id = message.chat.id login = message.text - auth_users[chat_id] = login + + # Проверяем, существует ли логин РІ базе данных + if is_login_exists_in_db(login): + # Сохраняем логин РІ словарь авторизованных пользователей + auth_users[chat_id] = login + + await message.answer(f"Р’С‹ успешно вошли РІ систему как {login}.") + await show_profile_menu(chat_id) + await state.clear() + else: + # Если логин РЅРµ найден + builder = InlineKeyboardBuilder() + builder.add(types.InlineKeyboardButton(text="Назад🔙", callback_data="main_menu")) + builder.add(types.InlineKeyboardButton(text="Попробовать СЃРЅРѕРІР°", callback_data="login")) # РљРЅРѕРїРєР° для повторного РІРІРѕРґР° + await message.answer( + "Логин РЅРµ найден. Пожалуйста, введите корректный логин или вернитесь РІ главное меню.", + reply_markup=builder.as_markup() + ) await state.clear() - await message.answer(f"Р’С‹ успешно вошли РІ систему как {login}.") - await show_profile_menu(chat_id) + # Отображение меню профиля async def show_profile_menu(chat_id): builder = InlineKeyboardBuilder() - builder.add(types.InlineKeyboardButton(text="Профиль", callback_data="profile")) - builder.add(types.InlineKeyboardButton(text="РњРѕРё заказы", callback_data="show_orders")) # Новая РєРЅРѕРїРєР° для заказа + builder.add(types.InlineKeyboardButton(text="Профиль👤", callback_data="profile")) + builder.add(types.InlineKeyboardButton(text="РњРѕРё заказы✅", callback_data="show_orders")) # Новая РєРЅРѕРїРєР° для заказа await bot.send_message(chat_id, "Выберите действие:", reply_markup=builder.as_markup()) # Обработчик нажатия РЅР° "Профиль" @@ -110,10 +134,10 @@ async def show_profile(call: CallbackQuery): await delete_messages_up_to_start(call.message.chat.id, call.message.message_id) builder = InlineKeyboardBuilder() - builder.add(types.InlineKeyboardButton(text="Выйти", callback_data="logout")) - builder.add(types.InlineKeyboardButton(text="Назад", callback_data="profile_menu")) + builder.add(types.InlineKeyboardButton(text="Выйти🔚", callback_data="logout")) + builder.add(types.InlineKeyboardButton(text="Назад🔙", callback_data="profile_menu")) - await call.message.answer(f"Ваш профиль:\nЛогин: {login}\nВыберите действие:", reply_markup=builder.as_markup()) + await call.message.answer(f"Р’С‹ авторизованы как {login}\n", reply_markup=builder.as_markup()) # Обработчик нажатия РЅР° "Назад" РёР· профиля @router.callback_query(lambda call: call.data == 'profile_menu') @@ -160,15 +184,32 @@ async def show_orders(call: CallbackQuery): if login: user_orders = get_order_statuses_with_ids(login) + + # Перевод статусов + status_translation = { + 'wait_confirmation': 'Ожидает подтверждения⏳', + 'in_work': 'Р’ работе🛠️', + 'ready': 'Готов✔️', + 'done': 'Получен🚩', + 'canceled': 'Отменен❌' + } + + # Проверка Рё вывод заказов if user_orders: - order_details = [f"Order ID: {order_id}, Status: {status}" for order_id, status in user_orders] - orders_text = "Ваши заказы:\n" + "\n".join(order_details) + print(user_orders) + order_details = [ + f"Номер заказа: {order_id}\nСтатус: {status_translation.get(status, 'Неизвестный статус')}" + for order_id, status in user_orders + ] + orders_text = "Ваши заказы:\n" + "\n\n".join(order_details) else: orders_text = "Заказы отсутствуют." + + # Строим меню СЃ РєРЅРѕРїРєРѕР№ возврата builder = InlineKeyboardBuilder() - builder.add(types.InlineKeyboardButton(text="Назад", callback_data="profile_menu")) + builder.add(types.InlineKeyboardButton(text="Назад🔙", callback_data="profile_menu")) await call.message.answer(orders_text, reply_markup=builder.as_markup()) else: -- GitLab