diff --git a/config/settings/base.py b/config/settings/base.py index eb28a0a..d49ef09 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -679,6 +679,7 @@ UNFOLD = { "icon": "forum", # آیکون چت "link": lambda request: admin_url_generator(request, "live_chat_dashboard"), "permission": is_main_panel, + "badge": "utils.admin.get_unread_chat_messages_badge", }, ] }, diff --git a/static/css/styles.css b/static/css/styles.css index f8f5849..17b0cad 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -1,5 +1,6 @@ -/* Bulletproof target for the Certificate badge using its URL */ -a[href*="/certificate/certificate/"] span:last-child { +/* Bulletproof target for the Certificate and Live Chat badges using their URLs */ +a[href*="/certificate/certificate/"] span:last-child, +a[href*="/live-chat/"] span:last-child { background-color: #1eb866 !important; /* Forces your custom green */ border-radius: 9999px !important; diff --git a/utils/admin.py b/utils/admin.py index 5083e78..b80ac0f 100644 --- a/utils/admin.py +++ b/utils/admin.py @@ -86,6 +86,37 @@ def get_pending_certificates_badge(request): print(f"Badge Error: {e}") return None +def get_unread_chat_messages_badge(request): + """Generates the integer for the Live Chat sidebar badge""" + try: + from apps.chat.models import RoomMessage, ChatMessage + from django.db.models import Q + + user = request.user + if not user.is_authenticated: + return None + + personal_q = Q(initiator=user) | Q(recipient=user) + + if user.is_superuser or getattr(user, 'has_role', lambda x: False)('admin') or getattr(user, 'has_role', lambda x: False)('super_admin') or getattr(user, 'has_role', lambda x: False)('consultant'): + room_filter = personal_q | Q(room_type=RoomMessage.RoomTypeChoices.GROUP) + else: + room_filter = personal_q | \ + Q(room_type=RoomMessage.RoomTypeChoices.GROUP, course__professor=user) | \ + Q(room_type=RoomMessage.RoomTypeChoices.GROUP, course__participants__student=user, course__participants__is_active=True) + + rooms = RoomMessage.objects.filter(room_filter) + + count = ChatMessage.objects.filter( + room__in=rooms, + is_read=False + ).exclude(sender=user).count() + + return count if count > 0 else None + except Exception as e: + print(f"Chat Badge Error: {e}") + return None + def variables(request): return {"plausible_domain": getattr(settings, 'PLAUSIBLE_DOMAIN', '')}