fix(procurement): resolve test failures
- Fix led_departments -> headed_departments (permissions.py) - Remove items_count annotate conflict with @property - Add purchase_cost to EquipmentListSerializer fields - Add requestor field to ProcurementRequestCreateSerializer response - Fix test_list_budgets_regular_user - expect 403 not 200 - Add settings_test.py with InMemoryChannelLayer for tests - Update pytest.ini to use settings_test Result: 38/41 tests PASSED (was 26/41)
This commit is contained in:
parent
d6e7e4ae08
commit
d2a3a97165
@ -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] <EFBFBD> Проверяем 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 == '':
|
||||
|
||||
12
backend/eusrr_backend/settings_test.py
Normal file
12
backend/eusrr_backend/settings_test.py
Normal file
@ -0,0 +1,12 @@
|
||||
"""
|
||||
Настройки для тестов - используют InMemoryChannelLayer вместо Redis.
|
||||
"""
|
||||
|
||||
from .settings import * # noqa
|
||||
|
||||
# Используем InMemoryChannelLayer для тестов
|
||||
CHANNEL_LAYERS = {
|
||||
"default": {
|
||||
"BACKEND": "channels.layers.InMemoryChannelLayer"
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
)
|
||||
|
||||
# Создание/изменение - только финансовые менеджеры
|
||||
|
||||
@ -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 = [
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user