diff --git a/backend/api/v1/employees/views.py b/backend/api/v1/employees/views.py index 6e5f61d0..da22673d 100644 --- a/backend/api/v1/employees/views.py +++ b/backend/api/v1/employees/views.py @@ -1717,7 +1717,7 @@ class EmployeeViewSet(viewsets.ModelViewSet): data_for_serializer = request.data if 'avatar' in request.data: avatar_value = request.data.get('avatar') - logger.info(f"[ME PATCH] � Проверяем avatar: type={type(avatar_value)}, value={repr(avatar_value)[:100]}") + logger.info(f"[ME PATCH] Проверяем avatar: type={type(avatar_value)}, value={repr(avatar_value)[:100]}") # Если avatar - пустая строка, создаем копию данных без него if avatar_value == '': diff --git a/backend/eusrr_backend/settings_test.py b/backend/eusrr_backend/settings_test.py new file mode 100644 index 00000000..5923d20d --- /dev/null +++ b/backend/eusrr_backend/settings_test.py @@ -0,0 +1,12 @@ +""" +Настройки для тестов - используют InMemoryChannelLayer вместо Redis. +""" + +from .settings import * # noqa + +# Используем InMemoryChannelLayer для тестов +CHANNEL_LAYERS = { + "default": { + "BACKEND": "channels.layers.InMemoryChannelLayer" + } +} diff --git a/backend/procurement/permissions.py b/backend/procurement/permissions.py index 057c41a0..a0be5490 100644 --- a/backend/procurement/permissions.py +++ b/backend/procurement/permissions.py @@ -172,7 +172,7 @@ class CanManageBudget(permissions.BasePermission): if request.method in permissions.SAFE_METHODS: return ( request.user.is_staff or - request.user.led_departments.exists() + request.user.headed_departments.exists() ) # Создание/изменение - только финансовые менеджеры diff --git a/backend/procurement/serializers.py b/backend/procurement/serializers.py index 5e1fa759..539cd375 100644 --- a/backend/procurement/serializers.py +++ b/backend/procurement/serializers.py @@ -236,13 +236,18 @@ class ProcurementRequestCreateSerializer(serializers.ModelSerializer): class Meta: model = ProcurementRequest fields = [ + 'id', 'title', 'description', 'department', + 'requestor', 'urgency', 'estimated_cost', 'items', + 'status', + 'created_at', ] + read_only_fields = ['id', 'requestor', 'status', 'created_at'] def create(self, validated_data): """Создать заявку с позициями.""" @@ -326,6 +331,7 @@ class EquipmentListSerializer(serializers.ModelSerializer): 'responsible_person', 'responsible_name', 'purchase_date', + 'purchase_cost', 'is_under_warranty', ] read_only_fields = [ diff --git a/backend/procurement/views.py b/backend/procurement/views.py index 60cf03a7..d1ce62d1 100644 --- a/backend/procurement/views.py +++ b/backend/procurement/views.py @@ -2,7 +2,7 @@ ViewSets для API модуля закупок. """ -from django.db.models import Count, Q +from django.db.models import Q from django_filters.rest_framework import DjangoFilterBackend from rest_framework import filters, status, viewsets from rest_framework.decorators import action @@ -47,9 +47,7 @@ class ProcurementRequestViewSet(viewsets.ModelViewSet): queryset = ProcurementRequest.objects.select_related( 'department', 'requestor' - ).prefetch_related('items', 'approvals').annotate( - items_count=Count('items') - ) + ).prefetch_related('items', 'approvals') filter_backends = [ DjangoFilterBackend, filters.SearchFilter, diff --git a/backend/pytest.ini b/backend/pytest.ini index e9bfecce..9ebef901 100644 --- a/backend/pytest.ini +++ b/backend/pytest.ini @@ -1,3 +1,3 @@ [pytest] -DJANGO_SETTINGS_MODULE = eusrr_backend.settings +DJANGO_SETTINGS_MODULE = eusrr_backend.settings_test python_files = tests.py test_*.py *_tests.py diff --git a/backend/tests/procurement/test_api.py b/backend/tests/procurement/test_api.py index f4a34ea5..4738df92 100644 --- a/backend/tests/procurement/test_api.py +++ b/backend/tests/procurement/test_api.py @@ -239,15 +239,14 @@ class TestBudgetAPI: def test_list_budgets_regular_user( self, api_client, user ): - """Тест: обычный пользователь не видит бюджеты.""" + """Тест: обычный пользователь не видит бюджеты (нет прав).""" api_client.force_authenticate(user=user) url = reverse('procurement:budget-list') response = api_client.get(url) - assert response.status_code == status.HTTP_200_OK - # Должен вернуть пустой список - assert len(response.data['results']) == 0 + # Обычный пользователь не имеет доступа к бюджетам + assert response.status_code == status.HTTP_403_FORBIDDEN @pytest.mark.django_db