You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
5.0 KiB
100 lines
5.0 KiB
import logging
|
|
from django.db.models.signals import post_save
|
|
from django.dispatch import receiver
|
|
from apps.chat.models import ChatMessage, RoomMessage
|
|
from apps.account.models import User
|
|
from apps.account.notification_service import create_and_send_notification
|
|
from apps.course.models.course import get_localized_field
|
|
from apps.course.models.participant import Participant
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def get_message_preview(instance, lang='fa'):
|
|
if instance.content_type == 'text':
|
|
preview = instance.content or ''
|
|
if len(preview) > 50:
|
|
return preview[:50] + '...'
|
|
return preview
|
|
elif instance.content_type == 'image':
|
|
return 'تصویر' if lang == 'fa' else 'Image'
|
|
elif instance.content_type == 'audio':
|
|
return 'صدا' if lang == 'fa' else 'Audio'
|
|
else:
|
|
return 'فایل ضمیمه' if lang == 'fa' else 'Attachment'
|
|
|
|
@receiver(post_save, sender=ChatMessage)
|
|
def notify_on_new_chat_message(sender, instance, created, **kwargs):
|
|
if not created:
|
|
return
|
|
|
|
sender_user = instance.sender
|
|
room = instance.room
|
|
|
|
# 1. Check if the message is in a PRIVATE room
|
|
if room.room_type == RoomMessage.RoomTypeChoices.PRIVATE:
|
|
# Determine the recipient user (the other person in the private room)
|
|
recipient_user = None
|
|
if room.initiator == sender_user:
|
|
recipient_user = room.recipient
|
|
else:
|
|
recipient_user = room.initiator
|
|
|
|
if not recipient_user:
|
|
return
|
|
|
|
# Case A: Teacher Replied in a Private Chat
|
|
if sender_user.user_type == User.UserType.PROFESSOR:
|
|
if recipient_user.user_type in [User.UserType.STUDENT, User.UserType.CLIENT]:
|
|
preview_en = get_message_preview(instance, 'en')
|
|
preview_fa = get_message_preview(instance, 'fa')
|
|
|
|
create_and_send_notification(
|
|
user=recipient_user,
|
|
title_en="New Message from Teacher",
|
|
body_en=f"Teacher {sender_user.fullname or sender_user.username} replied: {preview_en}",
|
|
title_fa="پیام جدید از طرف استاد",
|
|
body_fa=f"استاد {sender_user.fullname or sender_user.username} پاسخ داد: {preview_fa}",
|
|
service='imam-javad',
|
|
data={'type': 'teacher_reply_private', 'message_id': instance.id, 'room_id': room.id}
|
|
)
|
|
|
|
# Case B: Support Replied
|
|
elif sender_user.user_type in [User.UserType.ADMIN, User.UserType.SUPER_ADMIN, User.UserType.CONSULTANT]:
|
|
if recipient_user.user_type in [User.UserType.STUDENT, User.UserType.CLIENT]:
|
|
preview_en = get_message_preview(instance, 'en')
|
|
preview_fa = get_message_preview(instance, 'fa')
|
|
|
|
create_and_send_notification(
|
|
user=recipient_user,
|
|
title_en="New Message from Support",
|
|
body_en=f"Support agent {sender_user.fullname or sender_user.username} replied to your message: {preview_en}",
|
|
title_fa="پاسخ پشتیبانی",
|
|
body_fa=f"پشتیبان {sender_user.fullname or sender_user.username} به پیام شما پاسخ داد: {preview_fa}",
|
|
service='imam-javad',
|
|
data={'type': 'support_reply', 'message_id': instance.id, 'room_id': room.id}
|
|
)
|
|
|
|
# 2. Check if the message is in a GROUP/COURSE room
|
|
elif room.room_type == RoomMessage.RoomTypeChoices.GROUP and room.course:
|
|
# Case A: Teacher Replied in a Course Chat
|
|
if sender_user.user_type == User.UserType.PROFESSOR:
|
|
course = room.course
|
|
course_title_en = get_localized_field('en', course.title)
|
|
course_title_fa = get_localized_field('fa', course.title)
|
|
|
|
preview_en = get_message_preview(instance, 'en')
|
|
preview_fa = get_message_preview(instance, 'fa')
|
|
|
|
# Notify all active enrolled students of the course
|
|
participants = Participant.objects.filter(course=course, is_active=True).select_related('student')
|
|
for p in participants:
|
|
if p.student != sender_user: # Exclude sender
|
|
create_and_send_notification(
|
|
user=p.student,
|
|
title_en="Teacher Post in Course Chat",
|
|
body_en=f"Teacher {sender_user.fullname or sender_user.username} posted in '{course_title_en}': {preview_en}",
|
|
title_fa="پیام استاد در گفتگوی دوره",
|
|
body_fa=f"استاد {sender_user.fullname or sender_user.username} در گفتگوی دوره «{course_title_fa}» پیام جدیدی فرستاد: {preview_fa}",
|
|
service='imam-javad',
|
|
data={'type': 'teacher_reply_course', 'message_id': instance.id, 'room_id': room.id}
|
|
)
|