from apps.course.models import Course from apps.chat.models import RoomMessage from django.db.models import Q from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from django.core.cache import cache from django.contrib.auth import get_user_model UserModel = get_user_model() @receiver(post_save, sender=Course) def handle_room_message_for_course(sender, instance, created, **kwargs): if created: # فقط برای موارد جدید اجرا شود RoomMessage.objects.create( name=f"{instance.title} - Group", description=f"Group chat for course: {instance.title}", initiator=instance.professor, # استاد به‌عنوان سازنده اتاق course=instance, room_type=RoomMessage.RoomTypeChoices.GROUP ) else: # این بخش در زمان آپدیت دوره اجرا می‌شود # Find the existing group room for this course and update its details RoomMessage.objects.filter( course=instance, room_type=RoomMessage.RoomTypeChoices.GROUP ).update( name=f"{instance.title} - Group", description=f"Group chat for course: {instance.title}", initiator=instance.professor ) @receiver(post_save, sender=Course) def ensure_professor_role(sender, instance, **kwargs): professor = getattr(instance, 'professor', None) if professor: professor.ensure_professor_profile() @receiver([post_save, post_delete], sender=Course) def invalidate_professor_course_cache(sender, instance, **kwargs): """ Clears the cached professor detail page AND their course list whenever a course assigned to them is created, updated, or deleted. """ if instance.professor: detail_cache_key = f"professor_detail_{instance.professor.slug}" cache.delete(detail_cache_key) # Optional: If you update a Professor's profile in the admin directly @receiver([post_save, post_delete], sender=UserModel) def invalidate_professor_profile_cache(sender, instance, **kwargs): if instance.user_type == UserModel.UserType.PROFESSOR: cache_key = f"professor_detail_{instance.slug}" cache.delete(cache_key) @receiver(post_save, sender=Course) def sync_course_chat_locks(sender, instance, **kwargs): """ Automatically locks/unlocks the related chat rooms when the admin toggles the chat locks on the Course page. """ # 1. Update the Group Chat RoomMessage.objects.filter( course=instance, room_type=RoomMessage.RoomTypeChoices.GROUP ).update(is_locked=instance.is_group_chat_locked) # 2. Update the Private Chats between the Professor and Students of this course # Get all student IDs enrolled in this course student_ids = instance.participants.values_list('student_id', flat=True) if student_ids: RoomMessage.objects.filter( room_type=RoomMessage.RoomTypeChoices.PRIVATE ).filter( # Find rooms where initiator is prof and recipient is student, OR vice versa Q(initiator_id=instance.professor_id, recipient_id__in=student_ids) | Q(initiator_id__in=student_ids, recipient_id=instance.professor_id) ).update(is_locked=instance.is_professor_chat_locked)