|
|
@ -13,7 +13,7 @@ from django.contrib import messages |
|
|
from apps.chat.models import RoomMessage, ChatMessage, MessageReadStatus |
|
|
from apps.chat.models import RoomMessage, ChatMessage, MessageReadStatus |
|
|
from utils.admin import project_admin_site, admin_url_generator |
|
|
from utils.admin import project_admin_site, admin_url_generator |
|
|
from django.contrib.auth import get_user_model |
|
|
from django.contrib.auth import get_user_model |
|
|
|
|
|
|
|
|
|
|
|
from django.db.models import Count, Q |
|
|
User = get_user_model() |
|
|
User = get_user_model() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -47,6 +47,30 @@ def get_allowed_users_for_room(room): |
|
|
return User.objects.filter(is_active=True, id__in=allowed_ids) |
|
|
return User.objects.filter(is_active=True, id__in=allowed_ids) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_rooms_queryset_for_user(user, queryset): |
|
|
|
|
|
""" |
|
|
|
|
|
Absolute Privacy Rule: |
|
|
|
|
|
- NO ONE sees a PRIVATE chat unless they are the initiator or recipient. |
|
|
|
|
|
- Admins/Consultants see ALL GROUP chats. |
|
|
|
|
|
- Others see only their enrolled GROUP chats. |
|
|
|
|
|
""" |
|
|
|
|
|
# شرط پایه: چتهایی که خود شخص در آنها حضور مستقیم دارد (خصوصی یا گروهی فرقی ندارد) |
|
|
|
|
|
personal_q = Q(initiator=user) | Q(recipient=user) |
|
|
|
|
|
|
|
|
|
|
|
if user.is_superuser or user.has_role('admin') or user.has_role('super_admin') or user.has_role('consultant'): |
|
|
|
|
|
# ادمینها و مشاورین: چتهای خودشان + تمام چتهای گروهی |
|
|
|
|
|
return queryset.filter( |
|
|
|
|
|
personal_q | |
|
|
|
|
|
Q(room_type=RoomMessage.RoomTypeChoices.GROUP) |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
|
|
|
# اساتید و دانشجویان: چتهای خودشان + چتهای گروهی که در آن عضو هستند |
|
|
|
|
|
return queryset.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) |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
# --- WIDTH ENFORCEMENT FOR SELECT2 DROPDOWNS IN INLINES --- |
|
|
# --- WIDTH ENFORCEMENT FOR SELECT2 DROPDOWNS IN INLINES --- |
|
|
class MinWidthInlineForm(forms.ModelForm): |
|
|
class MinWidthInlineForm(forms.ModelForm): |
|
|
def __init__(self, *args, **kwargs): |
|
|
def __init__(self, *args, **kwargs): |
|
|
@ -178,7 +202,7 @@ class RoomMessageAdmin(ModelAdmin): |
|
|
queryset = queryset.annotate( |
|
|
queryset = queryset.annotate( |
|
|
total_messages=Count('messages') |
|
|
total_messages=Count('messages') |
|
|
) |
|
|
) |
|
|
return queryset |
|
|
|
|
|
|
|
|
return get_rooms_queryset_for_user(request.user, queryset) |
|
|
|
|
|
|
|
|
@action( |
|
|
@action( |
|
|
description=_("Manage All Messages"), |
|
|
description=_("Manage All Messages"), |
|
|
@ -265,6 +289,26 @@ class ChatMessageAdmin(ModelAdmin): |
|
|
) |
|
|
) |
|
|
actions_list = ["back_to_chat_rooms"] |
|
|
actions_list = ["back_to_chat_rooms"] |
|
|
|
|
|
|
|
|
|
|
|
def get_queryset(self, request): |
|
|
|
|
|
queryset = super().get_queryset(request) |
|
|
|
|
|
user = request.user |
|
|
|
|
|
|
|
|
|
|
|
personal_q = Q(room__initiator=user) | Q(room__recipient=user) |
|
|
|
|
|
|
|
|
|
|
|
if user.is_superuser or user.has_role('admin') or user.has_role('super_admin') or user.has_role('consultant'): |
|
|
|
|
|
# ادمینها و مشاورین: پیامهای خودشان + تمام پیامهای چتهای گروهی |
|
|
|
|
|
return queryset.filter( |
|
|
|
|
|
personal_q | |
|
|
|
|
|
Q(room__room_type=RoomMessage.RoomTypeChoices.GROUP) |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
|
|
|
# اساتید و دانشجویان |
|
|
|
|
|
return queryset.filter( |
|
|
|
|
|
personal_q | |
|
|
|
|
|
Q(room__room_type=RoomMessage.RoomTypeChoices.GROUP, room__course__professor=user) | |
|
|
|
|
|
Q(room__room_type=RoomMessage.RoomTypeChoices.GROUP, room__course__participants__student=user, room__course__participants__is_active=True) |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
# 🔔 FILTER THE SENDER DROPDOWN IN THE CHAT MESSAGE FORM |
|
|
# 🔔 FILTER THE SENDER DROPDOWN IN THE CHAT MESSAGE FORM |
|
|
def formfield_for_foreignkey(self, db_field, request, **kwargs): |
|
|
def formfield_for_foreignkey(self, db_field, request, **kwargs): |
|
|
if db_field.name == "sender": |
|
|
if db_field.name == "sender": |
|
|
|