"""
HTML Views для модуля закупок (Frontend).
Все данные загружаются через API на клиенте.
Views только рендерят layout и передают минимальный контекст.
"""
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def dashboard(request):
"""Главная страница модуля закупок.
Данные загружаются через API:
- /api/procurement/stats/overview/ — статистика
- /api/procurement/budgets/my-department/ — бюджет отдела
- /api/procurement/requests/?ordering=-created_at&page_size=5 — последние заявки
"""
return render(request, 'procurement/dashboard.html', {})
@login_required
def request_list(request):
"""Список заявок на закупку.
Данные загружаются через API:
- /api/procurement/requests/ — с фильтрами
- /api/v1/departments/ — для фильтра по отделам
"""
scope = request.GET.get('scope', 'mine')
user = request.user
# Читаем фильтры из GET параметров
filters = {
'status': request.GET.get('status', ''),
'urgency': request.GET.get('urgency', ''),
'period': request.GET.get('period', ''),
}
# Определяем доступные представления
can_view_department = user.departments.exists()
can_view_all = (
user.is_staff or user.is_superuser or
user.has_perm('procurement.view_procurementrequest') or
user.has_perm('procurement.change_procurementrequest')
)
return render(request, 'procurement/request_list.html', {
'scope': scope,
'show_tabs': True,
'can_view_department': can_view_department,
'can_view_all': can_view_all,
'filters': filters,
})
@login_required
def my_requests(request):
"""Мои заявки — редирект на request_list."""
from django.shortcuts import redirect
return redirect('procurement_frontend:request_list')
@login_required
def pending_approvals(request):
"""Заявки на согласовании.
Данные загружаются через API:
- /api/procurement/requests/pending_approvals/
"""
user = request.user
# Определяем доступные представления
can_view_department = user.departments.exists()
can_view_all = (
user.is_staff or user.is_superuser or
user.has_perm('procurement.view_procurementrequest') or
user.has_perm('procurement.change_procurementrequest')
)
return render(request, 'procurement/request_list.html', {
'scope': 'pending',
'page_title': 'На согласовании',
'show_tabs': True,
'can_view_department': can_view_department,
'can_view_all': can_view_all,
})
@login_required
@login_required
def request_detail(request, pk):
"""Детальная страница заявки.
Загружает данные из БД и передаёт в шаблон.
Права на редактирование (can_edit):
- Админы/Staff → любая заявка в DRAFT
- Модельные права (change_procurementrequest) → любая заявка в DRAFT
- Автор заявки → своя заявка в DRAFT
- Начальник отдела → заявки своего отдела в DRAFT
Права на согласование (can_approve):
- Пользователи с активным approval для этой заявки
"""
from django.shortcuts import get_object_or_404
from procurement.models import ProcurementRequest
request_obj = get_object_or_404(
ProcurementRequest.objects.select_related(
'department', 'requestor', 'executor'
).prefetch_related('items', 'approvals__approver'),
pk=pk
)
user = request.user
# Проверяем права на редактирование (синхронизировано с API)
can_edit = False
if request_obj.is_editable: # Только DRAFT
# Админы могут редактировать
if user.is_superuser or user.is_staff:
can_edit = True
# Модельные права
elif user.has_perm('procurement.change_procurementrequest'):
can_edit = True
# Автор заявки
elif request_obj.requestor == user:
can_edit = True
# Начальник отдела
elif request_obj.department.head == user:
can_edit = True
# Проверяем права на согласование
can_approve = (
request_obj.approvals.filter(
approver=user,
status='pending'
).exists()
)
return render(request, 'procurement/request_detail.html', {
'request_id': pk,
'request_obj': request_obj,
'can_edit': can_edit,
'can_approve': can_approve,
})
@login_required
def request_create(request):
"""Страница создания заявки.
Данные загружаются через API:
- /api/v1/departments/ — список отделов
Создание через:
- POST /api/procurement/requests/
"""
return render(request, 'procurement/request_form.html', {
'page_title': 'Новая заявка',
'request_id': None,
})
@login_required
def request_edit(request, pk):
"""Страница редактирования заявки.
Данные загружаются через API:
- /api/v1/procurement/requests/{pk}/ — данные заявки
- /api/v1/departments/ — список отделов
Обновление через:
- PATCH /api/v1/procurement/requests/{pk}/
"""
return render(request, 'procurement/request_form.html', {
'page_title': 'Редактирование заявки',
'request_id': pk,
})
@login_required
def equipment_list(request):
"""Список оборудования.
Данные загружаются через API:
- /api/procurement/equipment/ — список с фильтрами
- /api/procurement/equipment-categories/ — категории для фильтра
- /api/v1/departments/ — отделы для фильтра
- /api/procurement/equipment/create-options/ — при создании
"""
return render(request, 'procurement/equipment_list.html', {})
@login_required
def equipment_detail(request, pk):
"""Детальная страница оборудования.
Загружает данные из БД и передаёт в шаблон.
Права на управление (can_manage):
- Админы/Staff → любое оборудование
- Начальник отдела → оборудование своего отдела
- Ответственный за оборудование → своё оборудование
"""
from django.shortcuts import get_object_or_404
from procurement.models import Equipment
equipment = get_object_or_404(
Equipment.objects.select_related(
'department',
'department__head',
'category',
'responsible_person',
'procurement_item',
'procurement_item__request'
).prefetch_related(
'maintenance_history',
'transfer_logs__from_department',
'transfer_logs__to_department',
'transfer_logs__from_person',
'transfer_logs__to_person'
),
pk=pk
)
user = request.user
# Проверяем права на управление
can_manage = False
if user.is_superuser or user.is_staff:
can_manage = True
elif equipment.department and equipment.department.head == user:
can_manage = True
elif equipment.responsible_person == user:
can_manage = True
return render(request, 'procurement/equipment_detail.html', {
'equipment': equipment,
'can_manage': can_manage,
})
# =============================================================================
# БЮДЖЕТЫ
# =============================================================================
@login_required
def budget_list(request):
"""Список бюджетов.
Данные загружаются через API:
- /api/procurement/budgets/ — список с фильтрами
- /api/v1/departments/ — отделы для фильтра
"""
return render(request, 'procurement/budget_list.html', {})
@login_required
def budget_create(request):
"""Создание бюджета.
Данные загружаются через API:
- /api/v1/departments/ — список отделов
Создание через:
- POST /api/procurement/budgets/
"""
return render(request, 'procurement/budget_form.html', {
'budget_id': None,
})
@login_required
def budget_edit(request, pk):
"""Редактирование бюджета.
Данные загружаются через API:
- /api/procurement/budgets/{pk}/ — текущие данные
- /api/v1/departments/ — список отделов
Обновление через:
- PATCH /api/procurement/budgets/{pk}/
"""
return render(request, 'procurement/budget_form.html', {
'budget_id': pk,
})