From 7f3209b97da9ca3c84a934aafa373d1d190866a8 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 6 Jun 2026 02:43:58 +0330 Subject: [PATCH] new table for admins seen status --- apps/chat/admin_views.py | 19 +++++++++++-- apps/chat/migrations/0004_adminroomseen.py | 30 ++++++++++++++++++++ apps/chat/models.py | 32 ++++++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 apps/chat/migrations/0004_adminroomseen.py diff --git a/apps/chat/admin_views.py b/apps/chat/admin_views.py index 9ac2622..460cde4 100644 --- a/apps/chat/admin_views.py +++ b/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.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 @@ -43,7 +43,7 @@ def api_get_rooms(request): queryset = RoomMessage.objects.annotate( admin_unread_count=Count( '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') @@ -104,6 +104,21 @@ def api_get_messages(request, room_id): if room.unread_messages_count > 0: room.unread_messages_count = 0 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 = [] for m in messages: diff --git a/apps/chat/migrations/0004_adminroomseen.py b/apps/chat/migrations/0004_adminroomseen.py new file mode 100644 index 0000000..2638eee --- /dev/null +++ b/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')}, + }, + ), + ] diff --git a/apps/chat/models.py b/apps/chat/models.py index aeeef61..f8c68e5 100644 --- a/apps/chat/models.py +++ b/apps/chat/models.py @@ -181,4 +181,36 @@ class MessageReadStatus(models.Model): def __str__(self): 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}" + \ No newline at end of file