fix: исправление создания заявок - добавлено обязательное поле department

- Сделано поле 'items' необязательным в ProcurementRequestCreateSerializer
- Добавлено поле 'department' в форму создания заявки (dashboard и request_list)
- Обновлен JavaScript для передачи department в API
- Добавлен список departments в контекст dashboard view
- Теперь можно создать заявку без позиций (items), добавить их потом
- Все 72 теста проходят успешно
This commit is contained in:
admin i 2025-12-09 13:11:28 +03:00
parent c94de51c31
commit 41eda0e7ac
4 changed files with 26 additions and 3 deletions

View File

@ -231,7 +231,7 @@ class ProcurementRequestDetailSerializer(serializers.ModelSerializer):
class ProcurementRequestCreateSerializer(serializers.ModelSerializer):
"""Сериализатор для создания заявки с позициями."""
items = ProcurementItemCreateSerializer(many=True)
items = ProcurementItemCreateSerializer(many=True, required=False)
class Meta:
model = ProcurementRequest
@ -251,7 +251,7 @@ class ProcurementRequestCreateSerializer(serializers.ModelSerializer):
def create(self, validated_data):
"""Создать заявку с позициями."""
items_data = validated_data.pop('items')
items_data = validated_data.pop('items', [])
request = self.context['request']
# Создаем заявку
@ -260,7 +260,7 @@ class ProcurementRequestCreateSerializer(serializers.ModelSerializer):
**validated_data
)
# Создаем позиции
# Создаем позиции (если они переданы)
for item_data in items_data:
ProcurementItem.objects.create(
request=procurement_request,

View File

@ -67,6 +67,7 @@ def dashboard(request):
'budget': budget,
'recent_requests': recent_requests,
'can_approve': can_approve,
'departments': Department.objects.all().order_by('name'),
}
return render(request, 'procurement/dashboard.html', context)

View File

@ -242,6 +242,16 @@
placeholder="Опишите необходимость закупки..." maxlength="2000"></textarea>
</div>
<div class="col-12">
<label class="form-label">Отдел <span class="text-danger">*</span></label>
<select name="department" class="form-select" required>
<option value="">Выберите отдел...</option>
{% for dept in departments %}
<option value="{{ dept.id }}">{{ dept.name }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-6">
<label class="form-label">Срочность <span class="text-danger">*</span></label>
<select name="urgency" class="form-select" required>
@ -303,6 +313,7 @@
const data = {
title: formData.get('title'),
description: formData.get('description') || '',
department: formData.get('department'),
urgency: formData.get('urgency'),
estimated_cost: formData.get('estimated_cost') || null,
desired_date: formData.get('desired_date') || null,

View File

@ -173,6 +173,16 @@
placeholder="Опишите необходимость закупки..." maxlength="2000"></textarea>
</div>
<div class="col-12">
<label class="form-label">Отдел <span class="text-danger">*</span></label>
<select name="department" class="form-select" required>
<option value="">Выберите отдел...</option>
{% for dept in departments %}
<option value="{{ dept.id }}">{{ dept.name }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-6">
<label class="form-label">Срочность <span class="text-danger">*</span></label>
<select name="urgency" class="form-select" required>
@ -234,6 +244,7 @@
const data = {
title: formData.get('title'),
description: formData.get('description') || '',
department: formData.get('department'),
urgency: formData.get('urgency'),
estimated_cost: formData.get('estimated_cost') || null,
desired_date: formData.get('desired_date') || null,