diff --git a/apps/course/management/commands/assign_professors.py b/apps/course/management/commands/assign_professors.py new file mode 100644 index 0000000..8d435de --- /dev/null +++ b/apps/course/management/commands/assign_professors.py @@ -0,0 +1,25 @@ +from django.core.management.base import BaseCommand +from apps.course.models import Course +from apps.account.models import ProfessorUser +import random + +class Command(BaseCommand): + help = 'Assign at least one professor to every course (if missing)' + + def handle(self, *args, **options): + # Gather all active professors + professors = list(ProfessorUser.objects.filter(is_active=True)) + if not professors: + self.stdout.write(self.style.ERROR('No active professors found.')) + return + + updated = 0 + for course in Course.objects.all(): + if course.professors.exists(): + continue # already has a professor + professor = random.choice(professors) + course.professors.add(professor) + updated += 1 + self.stdout.write(f'Added professor {professor.id} to course {course.id}') + + self.stdout.write(self.style.SUCCESS(f'Finished. Updated {updated} course(s).')) diff --git a/apps/course/serializers/course.py b/apps/course/serializers/course.py index b8bffa0..9b46e5d 100644 --- a/apps/course/serializers/course.py +++ b/apps/course/serializers/course.py @@ -177,6 +177,7 @@ class CourseListSerializer(serializers.ModelSerializer): class CourseDetailSerializer(serializers.ModelSerializer): category = CourseCategorySerializer() professors = serializers.SerializerMethodField() + professor = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField() participant_count = serializers.SerializerMethodField() access = serializers.SerializerMethodField() @@ -210,6 +211,7 @@ class CourseDetailSerializer(serializers.ModelSerializer): 'access', 'participant_count', 'professors', + 'professor', 'is_professor', 'thumbnail', 'video_type', @@ -353,6 +355,13 @@ class CourseDetailSerializer(serializers.ModelSerializer): # چک کردن اینکه آیا کاربر در لیست اساتید این دوره هست یا نه return obj.professors.filter(id=user.id).exists() return False + + def get_professor(self, obj): + """Return the first professor's profile using UserProfileSerializer""" + first_prof = obj.professors.first() + if not first_prof: + return None + return UserProfileSerializer(first_prof, context=self.context).data def get_lessons_count(self, obj): if hasattr(obj, 'chapters') and obj.chapters.all(): diff --git a/apps/course/signals.py b/apps/course/signals.py index 4694f2f..401abac 100644 --- a/apps/course/signals.py +++ b/apps/course/signals.py @@ -22,21 +22,36 @@ def sync_course_group_room(instance): 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, - }, - ) + # Try to get an existing group room; if multiple exist, pick the first. + try: + room, created = RoomMessage.objects.get_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, + }, + ) + except RoomMessage.MultipleObjectsReturned: + # Fallback: get the earliest room and update it + room = RoomMessage.objects.filter( + course=instance, + room_type=RoomMessage.RoomTypeChoices.GROUP, + ).order_by("id").first() + created = False + if not created: + # Update the existing room with latest info + RoomMessage.objects.filter(id=room.id).update( + 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. + # No professor yet – just ensure the group room exists without initiator RoomMessage.objects.filter( course=instance, - room_type=RoomMessage.RoomTypeChoices.GROUP + room_type=RoomMessage.RoomTypeChoices.GROUP, ).update( name=f"{title_str} - Group", description=f"Group chat for course: {title_str}",