diff --git a/backend/api/v1/employees/views.py b/backend/api/v1/employees/views.py index 367193f8..480e60df 100644 --- a/backend/api/v1/employees/views.py +++ b/backend/api/v1/employees/views.py @@ -300,12 +300,20 @@ class RegisterAPIView(APIView): @transaction.atomic def post(self, request): + import logging + logger = logging.getLogger(__name__) + + # Логируем входящие данные для диагностики + logger.warning(f"[REGISTER] Received data: {request.data}") + logger.warning(f"[REGISTER] Content-Type: {request.content_type}") + # 0) хотя бы один контакт if not ( request.data.get("telegram") or request.data.get("whatsapp") or request.data.get("wechat") ): + logger.warning("[REGISTER] No contact provided") return Response( { "detail": "Заполните хотя бы одно из полей: WhatsApp, WeChat или Telegram" @@ -314,6 +322,8 @@ class RegisterAPIView(APIView): ) ser = RegisterSerializer(data=request.data) + if not ser.is_valid(): + logger.warning(f"[REGISTER] Validation errors: {ser.errors}") ser.is_valid(raise_exception=True) v = ser.validated_data diff --git a/backend/employees/views_auth.py b/backend/employees/views_auth.py index 1b2eeea8..987b06c7 100644 --- a/backend/employees/views_auth.py +++ b/backend/employees/views_auth.py @@ -65,6 +65,9 @@ def register_view(request): Страница регистрации: показываем Django-форму и шлём валидные данные в /api/v1/auth/register/ (аватар пока локально, в API не отправляем — загрузим после верификации). """ + import logging + logger = logging.getLogger(__name__) + api = get_api_client(request) if request.method == "GET": @@ -73,11 +76,24 @@ def register_view(request): # ВАЖНО: учитывать файлы (чтобы form.avatar был BoundField) form = RegistrationForm(request.POST, request.FILES) + + # Логируем полученные данные + logger.warning(f"[REGISTER_VIEW] POST data: {request.POST.dict()}") + logger.warning(f"[REGISTER_VIEW] FILES: {list(request.FILES.keys())}") + if not form.is_valid(): + logger.warning(f"[REGISTER_VIEW] Form errors: {form.errors}") return render(request, "auth/register.html", {"form": form}, status=400) payload = form.to_api_payload() # формирует json для API, включая password + logger.warning(f"[REGISTER_VIEW] API payload keys: {list(payload.keys())}") + payload_debug = {k: v for k, v in payload.items() if k != 'avatar'} + logger.warning(f"[REGISTER_VIEW] API payload (без avatar): {payload_debug}") + resp = api.post("v1/auth/register/", json=payload) + logger.warning(f"[REGISTER_VIEW] API response status: {resp.status}") + resp_data = resp.json if resp.json else resp.content + logger.warning(f"[REGISTER_VIEW] API response: {resp_data}") if resp.status == 201: messages.success( diff --git a/backend/test_register_api.py b/backend/test_register_api.py new file mode 100644 index 00000000..6e2aa17c --- /dev/null +++ b/backend/test_register_api.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python +""" +Тестовый скрипт для проверки API регистрации. +Отправляет запросы на /api/v1/auth/register/ и показывает ответы. +""" +import json +import sys +import os +import django + +# Настройка Django +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "eusrr_backend.settings") +django.setup() + +from django.test import Client +from django.urls import reverse + + +def test_register(): + """Тестируем регистрацию с валидными данными.""" + client = Client() + url = reverse("api:v1:register") + + # Тестовые данные + payload = { + "first_name": "Тест", + "last_name": "Тестов", + "phone_number": "+79991234567", + "email": "test@example.com", + "birth_date": "1990-01-01", + "password": "password123", + "telegram": "@test_user", + "whatsapp": "", + "wechat": "", + } + + print(f"Отправка запроса на: {url}") + print(f"Данные: {json.dumps(payload, indent=2, ensure_ascii=False)}") + print("-" * 60) + + response = client.post( + url, + data=json.dumps(payload), + content_type="application/json" + ) + + print(f"Статус: {response.status_code}") + print(f"Content-Type: {response.get('Content-Type')}") + + try: + data = response.json() + print(f"Ответ: {json.dumps(data, indent=2, ensure_ascii=False)}") + except Exception as e: + print(f"Не удалось распарсить JSON: {e}") + print(f"Тело ответа: {response.content.decode('utf-8')}") + + return response + + +def test_register_missing_contact(): + """Тестируем регистрацию без контактов.""" + client = Client() + url = reverse("api:v1:register") + + payload = { + "first_name": "Тест", + "last_name": "Тестов", + "phone_number": "+79991234567", + "email": "test2@example.com", + "birth_date": "1990-01-01", + "password": "password123", + "telegram": "", + "whatsapp": "", + "wechat": "", + } + + print("\n" + "=" * 60) + print("Тест без контактов:") + print(f"Данные: {json.dumps(payload, indent=2, ensure_ascii=False)}") + print("-" * 60) + + response = client.post( + url, + data=json.dumps(payload), + content_type="application/json" + ) + + print(f"Статус: {response.status_code}") + try: + data = response.json() + print(f"Ответ: {json.dumps(data, indent=2, ensure_ascii=False)}") + except Exception as e: + print(f"Не удалось распарсить JSON: {e}") + + return response + + +def test_register_invalid_phone(): + """Тестируем регистрацию с неправильным телефоном.""" + client = Client() + url = reverse("api:v1:register") + + payload = { + "first_name": "Тест", + "last_name": "Тестов", + "phone_number": "123", # неправильный формат + "email": "test3@example.com", + "birth_date": "1990-01-01", + "password": "password123", + "telegram": "@test_user", + "whatsapp": "", + "wechat": "", + } + + print("\n" + "=" * 60) + print("Тест с неправильным телефоном:") + print(f"Данные: {json.dumps(payload, indent=2, ensure_ascii=False)}") + print("-" * 60) + + response = client.post( + url, + data=json.dumps(payload), + content_type="application/json" + ) + + print(f"Статус: {response.status_code}") + try: + data = response.json() + print(f"Ответ: {json.dumps(data, indent=2, ensure_ascii=False)}") + except Exception as e: + print(f"Не удалось распарсить JSON: {e}") + + return response + + +if __name__ == "__main__": + print("=" * 60) + print("ТЕСТ API РЕГИСТРАЦИИ") + print("=" * 60) + + test_register() + test_register_missing_contact() + test_register_invalid_phone() + + print("\n" + "=" * 60) + print("Тесты завершены") + print("=" * 60)