diff --git a/apps/course/signals.py b/apps/course/signals.py index 420ef3a..4694f2f 100644 --- a/apps/course/signals.py +++ b/apps/course/signals.py @@ -9,7 +9,7 @@ from django.db.models import Q logger = logging.getLogger(__name__) -from django.db.models.signals import post_save, post_delete, pre_save +from django.db.models.signals import post_save, post_delete, pre_save, m2m_changed from django.dispatch import receiver from django.core.cache import cache from django.contrib.auth import get_user_model @@ -17,10 +17,39 @@ from django.contrib.auth import get_user_model UserModel = get_user_model() +def sync_course_group_room(instance): + title_str = extract_text_from_json(instance.title) + first_professor = instance.professors.first() + + if first_professor: + RoomMessage.objects.update_or_create( + course=instance, + room_type=RoomMessage.RoomTypeChoices.GROUP, + defaults={ + "name": f"{title_str} - Group", + "description": f"Group chat for course: {title_str}", + "initiator": first_professor, + }, + ) + else: + # In create flows, professors may be assigned after the initial save. + # Keep metadata synced, but avoid creating an invalid room with null initiator. + RoomMessage.objects.filter( + course=instance, + room_type=RoomMessage.RoomTypeChoices.GROUP + ).update( + name=f"{title_str} - Group", + description=f"Group chat for course: {title_str}", + ) + + @receiver(post_save, sender=Course) def handle_room_message_for_course(sender, instance, created, **kwargs): title_str = extract_text_from_json(instance.title) first_professor = instance.professors.first() + if created and not first_professor: + return + if created: # فقط برای موارد جدید اجرا شود RoomMessage.objects.create( name=f"{title_str} - Group", @@ -43,6 +72,19 @@ def handle_room_message_for_course(sender, instance, created, **kwargs): ).update(**update_kwargs) +@receiver(m2m_changed, sender=Course.professors.through) +def handle_course_professors_changed(sender, instance, action, pk_set, **kwargs): + if action not in {"post_add", "post_remove", "post_clear"}: + return + + sync_course_group_room(instance) + + for professor in instance.professors.all(): + professor.ensure_professor_profile() + detail_cache_key = f"professor_detail_{professor.slug}" + cache.delete(detail_cache_key) + + @receiver(post_save, sender=Course) def ensure_professor_role(sender, instance, **kwargs): for professor in instance.professors.all():