Browse Source

compatible course professor add to serializers

master
Mohsen Taba 1 month ago
parent
commit
c0afa137de
  1. 25
      apps/course/management/commands/assign_professors.py
  2. 9
      apps/course/serializers/course.py
  3. 39
      apps/course/signals.py

25
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).'))

9
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',
@ -354,6 +356,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():
lessons_count = 0

39
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}",

Loading…
Cancel
Save