HH/apps/projects/ui_views.py
2025-12-24 12:42:31 +03:00

96 lines
2.6 KiB
Python

"""
QI Projects Console UI views
"""
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.db.models import Q
from django.shortcuts import get_object_or_404, render
from apps.organizations.models import Hospital
from .models import QIProject
@login_required
def project_list(request):
"""QI Projects list view"""
queryset = QIProject.objects.select_related(
'hospital', 'department', 'project_lead'
).prefetch_related('team_members', 'related_actions')
# Apply RBAC filters
user = request.user
if not user.is_px_admin() and user.hospital:
queryset = queryset.filter(hospital=user.hospital)
# Apply filters
status_filter = request.GET.get('status')
if status_filter:
queryset = queryset.filter(status=status_filter)
hospital_filter = request.GET.get('hospital')
if hospital_filter:
queryset = queryset.filter(hospital_id=hospital_filter)
# Search
search_query = request.GET.get('search')
if search_query:
queryset = queryset.filter(
Q(name__icontains=search_query) |
Q(description__icontains=search_query)
)
# Ordering
queryset = queryset.order_by('-created_at')
# Pagination
page_size = int(request.GET.get('page_size', 25))
paginator = Paginator(queryset, page_size)
page_number = request.GET.get('page', 1)
page_obj = paginator.get_page(page_number)
# Get hospitals for filter
hospitals = Hospital.objects.filter(status='active')
if not user.is_px_admin() and user.hospital:
hospitals = hospitals.filter(id=user.hospital.id)
# Statistics
stats = {
'total': queryset.count(),
'active': queryset.filter(status='active').count(),
'completed': queryset.filter(status='completed').count(),
}
context = {
'page_obj': page_obj,
'projects': page_obj.object_list,
'hospitals': hospitals,
'stats': stats,
'filters': request.GET,
}
return render(request, 'projects/project_list.html', context)
@login_required
def project_detail(request, pk):
"""QI Project detail view"""
project = get_object_or_404(
QIProject.objects.select_related(
'hospital', 'department', 'project_lead'
).prefetch_related(
'team_members', 'related_actions', 'tasks'
),
pk=pk
)
# Get tasks
tasks = project.tasks.all().order_by('order')
context = {
'project': project,
'tasks': tasks,
}
return render(request, 'projects/project_detail.html', context)