From 4b8130a014ed47e1bb2cf5c4f59bae5a2cd3b8d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 1 Dec 2025 15:12:19 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20multipart/form-data=20=D0=B2=20employee=5Fedit?= =?UTF-8?q?=20=D0=B8=20employee=5Fedit=5Fme=20=D0=B4=D0=BB=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/employees/views_front.py | 76 +++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 10 deletions(-) diff --git a/backend/employees/views_front.py b/backend/employees/views_front.py index 465f8d5b..9aa9235c 100644 --- a/backend/employees/views_front.py +++ b/backend/employees/views_front.py @@ -434,13 +434,42 @@ def employee_profile(request, pk: str | int = "me"): def employee_edit(request, pk: int): """ Редактирование пользователя по id. + Поддерживает как JSON, так и multipart/form-data (для загрузки файлов). """ api = get_api_client(request) - try: - payload = json.loads(request.body or b"{}") - except Exception: + + # Проверяем Content-Type + content_type = request.content_type or '' + + if 'multipart/form-data' in content_type: + # Обрабатываем multipart/form-data (файлы) payload = {} - resp = api.patch(f"v1/employees/{pk}/", json=payload) + + # Собираем обычные поля из POST + for key, value in request.POST.items(): + if key == 'csrfmiddlewaretoken': + continue + # Если это массив (например skills_ids) + if key.endswith('_ids') or key == 'skills': + payload[key] = request.POST.getlist(key) + else: + payload[key] = value + + # Обрабатываем файлы (аватар) + if 'avatar' in request.FILES: + # Конвертируем в data URI для Base64ImageField + payload['avatar'] = _file_to_data_uri(request.FILES['avatar']) + + # Отправляем в DRF как JSON (с base64 аватаром) + resp = api.patch(f"v1/employees/{pk}/", json=payload) + else: + # Обрабатываем JSON (как раньше) + try: + payload = json.loads(request.body or b"{}") + except Exception: + payload = {} + resp = api.patch(f"v1/employees/{pk}/", json=payload) + try: data = resp.json except Exception: @@ -454,15 +483,42 @@ def employee_edit(request, pk: int): def employee_edit_me(request): """ Редактирование собственного профиля через /api/v1/employees/me/ + Поддерживает как JSON, так и multipart/form-data (для загрузки файлов). """ api = get_api_client(request) - # принимаем JSON из браузера - try: - payload = json.loads(request.body or b"{}") - except Exception: + + # Проверяем Content-Type + content_type = request.content_type or '' + + if 'multipart/form-data' in content_type: + # Обрабатываем multipart/form-data (файлы) payload = {} - # отправляем в DRF - resp = api.patch("v1/employees/me/", json=payload) + + # Собираем обычные поля из POST + for key, value in request.POST.items(): + if key == 'csrfmiddlewaretoken': + continue + # Если это массив (например skills_ids) + if key.endswith('_ids') or key == 'skills': + payload[key] = request.POST.getlist(key) + else: + payload[key] = value + + # Обрабатываем файлы (аватар) + if 'avatar' in request.FILES: + # Конвертируем в data URI для Base64ImageField + payload['avatar'] = _file_to_data_uri(request.FILES['avatar']) + + # Отправляем в DRF как JSON (с base64 аватаром) + resp = api.patch("v1/employees/me/", json=payload) + else: + # Обрабатываем JSON (как раньше) + try: + payload = json.loads(request.body or b"{}") + except Exception: + payload = {} + resp = api.patch("v1/employees/me/", json=payload) + try: data = resp.json except Exception: