""" Сериализаторы для видеоконференций. """ from rest_framework import serializers from .models import VideoRoom, VideoParticipant, VideoCallLog, ScreenRecording from apps.schedule.serializers import LessonSerializer from apps.users.serializers import UserSerializer class VideoParticipantSerializer(serializers.ModelSerializer): """Сериализатор участника видео.""" user = UserSerializer(read_only=True) duration = serializers.SerializerMethodField() class Meta: model = VideoParticipant fields = [ 'id', 'user', 'is_connected', 'is_audio_enabled', 'is_video_enabled', 'is_screen_sharing', 'joined_at', 'left_at', 'duration', 'reconnection_count' ] read_only_fields = [ 'joined_at', 'left_at', 'reconnection_count' ] def get_duration(self, obj): """Получить длительность в секундах.""" return obj.total_duration class VideoRoomSerializer(serializers.ModelSerializer): """Сериализатор видеокомнаты.""" lesson = LessonSerializer(read_only=True) mentor = UserSerializer(read_only=True) client = UserSerializer(read_only=True) participants = VideoParticipantSerializer(many=True, read_only=True) actual_duration = serializers.IntegerField(read_only=True) is_active = serializers.BooleanField(read_only=True) class Meta: model = VideoRoom fields = [ 'id', 'room_id', 'lesson', 'mentor', 'client', 'status', 'started_at', 'ended_at', 'duration', 'actual_duration', 'is_recording', 'recording_url', 'is_active', 'participants', 'quality_rating', 'quality_issues', 'created_at' ] read_only_fields = [ 'room_id', 'started_at', 'ended_at', 'duration', 'created_at' ] class VideoRoomCreateSerializer(serializers.ModelSerializer): """Сериализатор создания видеокомнаты.""" lesson_id = serializers.IntegerField(write_only=True) class Meta: model = VideoRoom fields = [ 'lesson_id', 'is_recording', 'max_participants' ] def validate_lesson_id(self, value): """Проверка занятия.""" from apps.schedule.models import Lesson try: lesson = Lesson.objects.get(id=value) except Lesson.DoesNotExist: raise serializers.ValidationError('Занятие не найдено') # Проверяем что комната еще не создана if hasattr(lesson, 'video_room'): raise serializers.ValidationError('Видеокомната для этого занятия уже существует') # Проверяем что занятие запланировано или в процессе (не отменено) if lesson.status == 'cancelled': raise serializers.ValidationError('Нельзя создать видеокомнату для отмененного занятия') return value def create(self, validated_data): """Создание видеокомнаты.""" from apps.schedule.models import Lesson lesson_id = validated_data.pop('lesson_id') lesson = Lesson.objects.get(id=lesson_id) video_room = VideoRoom.objects.create( lesson=lesson, mentor=lesson.mentor, client=lesson.client, **validated_data ) return video_room class VideoRoomStartSerializer(serializers.Serializer): """Сериализатор начала видеозвонка.""" def validate(self, attrs): """Валидация.""" room = self.instance if room.status != 'waiting': raise serializers.ValidationError('Комната уже начата или завершена') return attrs def save(self): """Начать звонок.""" self.instance.start() return self.instance class VideoRoomEndSerializer(serializers.Serializer): """Сериализатор завершения видеозвонка.""" quality_rating = serializers.IntegerField( min_value=1, max_value=5, required=False, help_text='Оценка качества связи от 1 до 5' ) quality_issues = serializers.CharField( required=False, allow_blank=True, help_text='Описание проблем с качеством' ) def validate(self, attrs): """Валидация.""" room = self.instance if room.status != 'active': raise serializers.ValidationError('Комната не активна') return attrs def save(self): """Завершить звонок.""" room = self.instance room.end() # Обновляем качество если указано if 'quality_rating' in self.validated_data: room.quality_rating = self.validated_data['quality_rating'] if 'quality_issues' in self.validated_data: room.quality_issues = self.validated_data['quality_issues'] room.save() return room class VideoCallLogSerializer(serializers.ModelSerializer): """Сериализатор лога видеозвонка.""" room = VideoRoomSerializer(read_only=True) class Meta: model = VideoCallLog fields = [ 'id', 'room', 'total_participants', 'total_duration', 'average_bitrate', 'packet_loss_rate', 'average_jitter', 'connection_issues', 'audio_issues', 'video_issues', 'metadata', 'created_at' ] read_only_fields = '__all__' class ScreenRecordingSerializer(serializers.ModelSerializer): """Сериализатор записи видео.""" room_id = serializers.UUIDField(source='room.room_id', read_only=True) lesson_title = serializers.CharField(source='room.lesson.title', read_only=True) is_expired = serializers.BooleanField(read_only=True) class Meta: model = ScreenRecording fields = [ 'id', 'room_id', 'lesson_title', 'file_path', 'file_size', 'duration', 'url', 'status', 'is_public', 'is_expired', 'expires_at', 'created_at', 'processed_at' ] read_only_fields = [ 'file_path', 'file_size', 'duration', 'status', 'created_at', 'processed_at' ] class ScreenRecordingCreateSerializer(serializers.Serializer): """Сериализатор создания записи.""" room_id = serializers.UUIDField() def validate_room_id(self, value): """Проверка комнаты.""" try: room = VideoRoom.objects.get(room_id=value) except VideoRoom.DoesNotExist: raise serializers.ValidationError('Комната не найдена') # Проверяем что комната активна if not room.is_active: raise serializers.ValidationError('Комната не активна') # Проверяем что запись включена if not room.is_recording: raise serializers.ValidationError('Запись не включена для этой комнаты') return value def create(self, validated_data): """Создание записи.""" room = VideoRoom.objects.get(room_id=validated_data['room_id']) recording = ScreenRecording.objects.create( room=room, status='processing' ) return recording