|
|
|
@ -5,7 +5,7 @@ from django.conf import settings |
|
|
|
from django.http import JsonResponse |
|
|
|
from django.shortcuts import render, get_object_or_404 |
|
|
|
from django.views.decorators.http import require_http_methods |
|
|
|
from django.db.models import Q |
|
|
|
from django.db.models import Q, Count |
|
|
|
from django.utils.translation import gettext_lazy as _ |
|
|
|
|
|
|
|
from apps.chat.models import RoomMessage, ChatMessage |
|
|
|
@ -39,7 +39,13 @@ def live_chat_dashboard_view(request): |
|
|
|
def api_get_rooms(request): |
|
|
|
"""گرفتن لیست رومها بر اساس دسترسی و حریم خصوصی مطلق""" |
|
|
|
user = request.user |
|
|
|
queryset = RoomMessage.objects.all().order_by('-updated_at') |
|
|
|
|
|
|
|
queryset = RoomMessage.objects.annotate( |
|
|
|
admin_unread_count=Count( |
|
|
|
'messages', |
|
|
|
filter=Q(messages__is_read=False) & ~Q(messages__sender=user) |
|
|
|
) |
|
|
|
).order_by('-updated_at') |
|
|
|
|
|
|
|
personal_q = Q(initiator=user) | Q(recipient=user) |
|
|
|
|
|
|
|
@ -61,11 +67,13 @@ def api_get_rooms(request): |
|
|
|
if r.room_type == 'group' and r.course: |
|
|
|
title = r.course.title |
|
|
|
|
|
|
|
unread_count = getattr(r, 'admin_unread_count', 0) |
|
|
|
|
|
|
|
data.append({ |
|
|
|
"id": r.id, |
|
|
|
"title": title, |
|
|
|
"type": r.room_type, |
|
|
|
"unread": r.unread_messages_count, |
|
|
|
"unread": unread_count, |
|
|
|
"time": r.updated_at.strftime("%H:%M") if r.updated_at else "" |
|
|
|
}) |
|
|
|
|
|
|
|
@ -82,6 +90,19 @@ def api_get_messages(request, room_id): |
|
|
|
is_deleted=False |
|
|
|
).order_by('id') |
|
|
|
|
|
|
|
# 🟢 مارک کردن پیامها به عنوان خوانده شده (سین کردن) برای تمام انواع چت |
|
|
|
if messages.exists(): |
|
|
|
# پیامهای طرف مقابل را سین کن |
|
|
|
unread_msgs = messages.filter(is_read=False).exclude(sender=request.user) |
|
|
|
if unread_msgs.exists(): |
|
|
|
unread_msgs.update(is_read=True) |
|
|
|
|
|
|
|
if room.room_type == RoomMessage.RoomTypeChoices.GROUP: |
|
|
|
# همگامسازی با فیلد استاتیک برای جلوگیری از مشکلات احتمالی در FastAPI |
|
|
|
if room.unread_messages_count > 0: |
|
|
|
room.unread_messages_count = 0 |
|
|
|
room.save(update_fields=['unread_messages_count']) |
|
|
|
|
|
|
|
data = [] |
|
|
|
for m in messages: |
|
|
|
avatar = m.sender.avatar.url if getattr(m.sender, 'avatar', None) else None |
|
|
|
|