|
|
@ -9,7 +9,7 @@ from django.db.models import Q |
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
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.dispatch import receiver |
|
|
from django.core.cache import cache |
|
|
from django.core.cache import cache |
|
|
from django.contrib.auth import get_user_model |
|
|
from django.contrib.auth import get_user_model |
|
|
@ -17,10 +17,39 @@ from django.contrib.auth import get_user_model |
|
|
UserModel = 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) |
|
|
@receiver(post_save, sender=Course) |
|
|
def handle_room_message_for_course(sender, instance, created, **kwargs): |
|
|
def handle_room_message_for_course(sender, instance, created, **kwargs): |
|
|
title_str = extract_text_from_json(instance.title) |
|
|
title_str = extract_text_from_json(instance.title) |
|
|
first_professor = instance.professors.first() |
|
|
first_professor = instance.professors.first() |
|
|
|
|
|
if created and not first_professor: |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
if created: # فقط برای موارد جدید اجرا شود |
|
|
if created: # فقط برای موارد جدید اجرا شود |
|
|
RoomMessage.objects.create( |
|
|
RoomMessage.objects.create( |
|
|
name=f"{title_str} - Group", |
|
|
name=f"{title_str} - Group", |
|
|
@ -43,6 +72,19 @@ def handle_room_message_for_course(sender, instance, created, **kwargs): |
|
|
).update(**update_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) |
|
|
@receiver(post_save, sender=Course) |
|
|
def ensure_professor_role(sender, instance, **kwargs): |
|
|
def ensure_professor_role(sender, instance, **kwargs): |
|
|
for professor in instance.professors.all(): |
|
|
for professor in instance.professors.all(): |
|
|
|