""" Management команда для создания LiveKit комнат для существующих уроков. """ from django.core.management.base import BaseCommand from django.utils import timezone from datetime import timedelta from apps.schedule.models import Lesson from apps.video.livekit_service import LiveKitService from apps.video.models import VideoRoom class Command(BaseCommand): help = 'Создаёт LiveKit комнаты для всех уроков, у которых их ещё нет' def add_arguments(self, parser): parser.add_argument( '--all', action='store_true', help='Создать комнаты для всех уроков (включая прошедшие)', ) parser.add_argument( '--dry-run', action='store_true', help='Показать, что будет сделано, без фактического создания комнат', ) def handle(self, *args, **options): all_lessons = options['all'] dry_run = options['dry_run'] # Фильтруем уроки queryset = Lesson.objects.filter(livekit_room_name='') if not all_lessons: # Только будущие уроки и уроки, которые закончились менее 15 минут назад now = timezone.now() cutoff_time = now - timedelta(minutes=15) queryset = queryset.filter(end_time__gte=cutoff_time) queryset = queryset.exclude(status='cancelled') total = queryset.count() if total == 0: self.stdout.write(self.style.SUCCESS('Все уроки уже имеют LiveKit комнаты')) return self.stdout.write(f'Найдено {total} уроков без LiveKit комнат') if dry_run: self.stdout.write(self.style.WARNING('DRY RUN - комнаты не будут созданы')) for lesson in queryset[:10]: self.stdout.write(f' - Урок #{lesson.id}: {lesson.title} ({lesson.start_time})') if total > 10: self.stdout.write(f' ... и ещё {total - 10} уроков') return created_count = 0 error_count = 0 for lesson in queryset.iterator(): try: # Генерируем уникальное название комнаты room_name = LiveKitService.generate_room_name() # Создаем VideoRoom запись client_user = lesson.client.user if hasattr(lesson.client, 'user') else lesson.client video_room, created = VideoRoom.objects.get_or_create( lesson=lesson, defaults={ 'mentor': lesson.mentor, 'client': client_user, 'room_id': room_name, 'is_recording': True, 'max_participants': 10 if lesson.group else 2 } ) if not created: # VideoRoom уже существует, используем его room_id room_name = str(video_room.room_id) # Генерируем токен для ментора (действителен 24 часа) mentor_token = LiveKitService.generate_access_token( room_name=room_name, participant_name=lesson.mentor.get_full_name(), participant_identity=str(lesson.mentor.pk), is_admin=True, expires_in_minutes=1440 # 24 часа ) # Сохраняем данные в урок lesson.livekit_room_name = room_name lesson.livekit_access_token = mentor_token lesson.save(update_fields=['livekit_room_name', 'livekit_access_token']) created_count += 1 if created_count % 10 == 0: self.stdout.write(f'Создано комнат: {created_count}/{total}') except Exception as e: error_count += 1 self.stderr.write( self.style.ERROR(f'Ошибка создания комнаты для урока #{lesson.id}: {str(e)}') ) self.stdout.write( self.style.SUCCESS( f'Готово! Создано комнат: {created_count}, ошибок: {error_count}' ) )