HH/apps/social/ui_views.py
Marwan Alwali 4e367c780c update
2025-12-31 10:52:00 +03:00

103 lines
3.0 KiB
Python

"""
Social Media Monitoring 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 SocialMention
@login_required
def mention_list(request):
"""Social media mentions list view"""
queryset = SocialMention.objects.select_related(
'hospital', 'department', 'px_action', 'responded_by'
)
# Apply RBAC filters
user = request.user
if user.is_px_admin():
pass
elif user.hospital:
queryset = queryset.filter(hospital=user.hospital)
else:
queryset = queryset.none()
# Apply filters
platform_filter = request.GET.get('platform')
if platform_filter:
queryset = queryset.filter(platform=platform_filter)
sentiment_filter = request.GET.get('sentiment')
if sentiment_filter:
queryset = queryset.filter(sentiment=sentiment_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(content__icontains=search_query) |
Q(author_username__icontains=search_query)
)
# Date range
date_from = request.GET.get('date_from')
if date_from:
queryset = queryset.filter(posted_at__gte=date_from)
date_to = request.GET.get('date_to')
if date_to:
queryset = queryset.filter(posted_at__lte=date_to)
# Ordering
queryset = queryset.order_by('-posted_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 filter options
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(),
'positive': queryset.filter(sentiment='positive').count(),
'negative': queryset.filter(sentiment='negative').count(),
'neutral': queryset.filter(sentiment='neutral').count(),
}
context = {
'page_obj': page_obj,
'mentions': page_obj.object_list,
'stats': stats,
'hospitals': hospitals,
'filters': request.GET,
}
return render(request, 'social/mention_list.html', context)
@login_required
def mention_detail(request, pk):
"""Social media mention detail view"""
mention = get_object_or_404(SocialMention.objects.select_related('hospital', 'department', 'px_action', 'responded_by'),pk=pk)
context = {
'mention': mention,
}
return render(request, 'social/mention_detail.html', context)