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