HH/apps/core/context_processors.py
2026-03-09 16:10:24 +03:00

128 lines
4.0 KiB
Python

"""
Context processors for global template variables
"""
from django.db.models import Q
def sidebar_counts(request):
"""
Provide counts for sidebar badges.
Returns counts for:
- Active complaints
- Pending feedback
- Open PX actions
- Provisional users (PX Admin only)
"""
if not request.user.is_authenticated:
return {}
from apps.complaints.models import Complaint
from apps.feedback.models import Feedback
from apps.px_action_center.models import PXAction
user = request.user
# Source Users only see their own created complaints
if user.is_source_user():
complaint_count = Complaint.objects.filter(
created_by=user,
status__in=['open', 'in_progress']
).count()
return {
'complaint_count': complaint_count,
'feedback_count': 0,
'action_count': 0,
'current_hospital': None,
'is_px_admin': False,
'is_source_user': True,
}
# Filter based on user role and tenant_hospital
if user.is_px_admin():
# PX Admins use their selected hospital from session
hospital = getattr(request, 'tenant_hospital', None)
if hospital:
complaint_count = Complaint.objects.filter(
hospital=hospital,
status__in=['open', 'in_progress']
).count()
feedback_count = Feedback.objects.filter(
hospital=hospital,
status__in=['submitted', 'reviewed']
).count()
action_count = PXAction.objects.filter(
hospital=hospital,
status__in=['open', 'in_progress']
).count()
else:
complaint_count = 0
feedback_count = 0
action_count = 0
# Count provisional users for PX Admin
from apps.accounts.models import User
provisional_user_count = User.objects.filter(
is_provisional=True,
acknowledgement_completed=False
).count()
elif user.hospital:
complaint_count = Complaint.objects.filter(
hospital=user.hospital,
status__in=['open', 'in_progress']
).count()
feedback_count = Feedback.objects.filter(
hospital=user.hospital,
status__in=['submitted', 'reviewed']
).count()
action_count = PXAction.objects.filter(
hospital=user.hospital,
status__in=['open', 'in_progress']
).count()
# provisional_user_count = 0
else:
complaint_count = 0
feedback_count = 0
action_count = 0
return {
'complaint_count': complaint_count,
'feedback_count': feedback_count,
'action_count': action_count,
'current_hospital': getattr(request, 'tenant_hospital', None),
'is_px_admin': request.user.is_authenticated and request.user.is_px_admin(),
'is_source_user': False,
}
def hospital_context(request):
"""
Provide current hospital context to templates.
This ensures hospital information is available in the header for all pages.
"""
if not request.user.is_authenticated:
return {}
hospital = getattr(request, 'tenant_hospital', None)
# Get list of hospitals for PX Admin switcher
hospitals_list = []
if request.user.is_px_admin():
from apps.organizations.models import Hospital
hospitals_list = list(
Hospital.objects.filter(status='active').order_by('name').values('id', 'name', 'code')
)
# Source user context
is_source_user = request.user.is_source_user()
source_user_profile = getattr(request, 'source_user_profile', None)
return {
'current_hospital': hospital,
'is_px_admin': request.user.is_px_admin(),
'is_source_user': is_source_user,
'source_user_profile': source_user_profile,
'hospitals_list': hospitals_list,
# 'provisional_user_count': provisional_user_count,
}