fix: prevent QueryDict conversion breaking form data for non-admin users

Problem: Regular users couldn't create requests while admins could
Root cause: to_internal_value() used dict(QueryDict) which converts
all values to lists, breaking validation

Solution:
- For QueryDict: use _mutable flag to modify in-place
- For regular dict: use dict() conversion as before
- Avoids ['value'] instead of 'value' conversion

This fixes 400 errors for non-admin users when creating requests
with multipart/form-data.
This commit is contained in:
admin i 2025-12-08 12:41:56 +03:00
parent 895c019592
commit ba0aaccfd8

View File

@ -265,11 +265,22 @@ class RequestWriteSerializer(serializers.ModelSerializer):
dict[str, Any]: Преобразованные данные для дальнейшей валидации.
"""
if not self._is_power():
# data может быть QueryDict — сделаем копию как обычный dict
data = dict(data)
data.pop("employee", None)
data.pop("status", None)
data.pop("approver", None)
# ВАЖНО: data может быть QueryDict из DRF
# dict(QueryDict) превращает все значения в списки!
# Используем _mutable для безопасного удаления полей
if hasattr(data, '_mutable'):
# Это QueryDict, делаем его mutable
data._mutable = True
data.pop("employee", None)
data.pop("status", None)
data.pop("approver", None)
data._mutable = False
else:
# Обычный dict
data = dict(data)
data.pop("employee", None)
data.pop("status", None)
data.pop("approver", None)
return super().to_internal_value(data)