96 lines
2.6 KiB
Python
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)
|