Browse Source

new table for admins seen status

master
Mohsen Taba 2 months ago
parent
commit
7f3209b97d
  1. 19
      apps/chat/admin_views.py
  2. 30
      apps/chat/migrations/0004_adminroomseen.py
  3. 32
      apps/chat/models.py

19
apps/chat/admin_views.py

@ -8,7 +8,7 @@ from django.views.decorators.http import require_http_methods
from django.db.models import Q, Count from django.db.models import Q, Count
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from apps.chat.models import RoomMessage, ChatMessage
from apps.chat.models import RoomMessage, ChatMessage, AdminRoomSeen
from utils.admin import project_admin_site from utils.admin import project_admin_site
@ -43,7 +43,7 @@ def api_get_rooms(request):
queryset = RoomMessage.objects.annotate( queryset = RoomMessage.objects.annotate(
admin_unread_count=Count( admin_unread_count=Count(
'messages', 'messages',
filter=Q(messages__is_read=False) & ~Q(messages__sender=user)
filter=Q(messages__is_read=False) & ~Q(messages__sender=user) & Q(messages__is_deleted=False)
) )
).order_by('-updated_at') ).order_by('-updated_at')
@ -105,6 +105,21 @@ def api_get_messages(request, room_id):
room.unread_messages_count = 0 room.unread_messages_count = 0
room.save(update_fields=['unread_messages_count']) room.save(update_fields=['unread_messages_count'])
# ثبت وضعیت دیده شده برای ادمین در جدول AdminRoomSeen
is_admin = (
request.user.is_superuser or
getattr(request.user, 'user_type', '') in ['admin', 'super_admin'] or
(hasattr(request.user, 'has_role') and (request.user.has_role('admin') or request.user.has_role('super_admin')))
)
if is_admin:
latest_msg = messages.last() # پیام‌ها بر اساس id صعودی مرتب شده‌اند
if latest_msg:
AdminRoomSeen.objects.update_or_create(
admin=request.user,
room=room,
defaults={'last_seen_message': latest_msg}
)
data = [] data = []
for m in messages: for m in messages:
avatar = m.sender.avatar.url if getattr(m.sender, 'avatar', None) else None avatar = m.sender.avatar.url if getattr(m.sender, 'avatar', None) else None

30
apps/chat/migrations/0004_adminroomseen.py

@ -0,0 +1,30 @@
# Generated by Django 5.2.12 on 2026-06-06 02:02
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chat', '0003_alter_chatmessage_options_and_more'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='AdminRoomSeen',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('admin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='admin_room_seens', to=settings.AUTH_USER_MODEL, verbose_name='Admin User')),
('last_seen_message', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='admin_seens_last', to='chat.chatmessage', verbose_name='Last Seen Message')),
('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='admin_seens', to='chat.roommessage', verbose_name='Room')),
],
options={
'verbose_name': 'Admin Room Seen',
'verbose_name_plural': 'Admin Room Seens',
'unique_together': {('admin', 'room')},
},
),
]

32
apps/chat/models.py

@ -182,3 +182,35 @@ class MessageReadStatus(models.Model):
def __str__(self): def __str__(self):
return f"User {self.user.fullname} read Message {self.message.id}: {self.is_read}" return f"User {self.user.fullname} read Message {self.message.id}: {self.is_read}"
class AdminRoomSeen(models.Model):
admin = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name="admin_room_seens",
verbose_name=_("Admin User")
)
room = models.ForeignKey(
RoomMessage,
on_delete=models.CASCADE,
related_name="admin_seens",
verbose_name=_("Room")
)
last_seen_message = models.ForeignKey(
ChatMessage,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="admin_seens_last",
verbose_name=_("Last Seen Message")
)
class Meta:
unique_together = ("admin", "room")
verbose_name = _("Admin Room Seen")
verbose_name_plural = _("Admin Room Seens")
def __str__(self):
return f"Admin {self.admin.fullname} seen in Room {self.room.id}"
Loading…
Cancel
Save