from rest_framework import serializers from utils import FileFieldSerializer class OnlineClassTokenCreateSerializer(serializers.Serializer): redirect_path = serializers.CharField(required=False) def validate_redirect_path(self, value: str) -> str: value = value.strip() if value and value.startswith("http"): raise serializers.ValidationError("Redirect path must be relative to the frontend domain.") return value class OnlineClassTokenVerifySerializer(serializers.Serializer): token = serializers.CharField(max_length=128) def validate_token(self, value: str) -> str: value = value.strip() if not value: raise serializers.ValidationError("Token is required.") return value class LiveSessionRoomCreateSerializer(serializers.Serializer): room_id = serializers.CharField(required=False, max_length=255, allow_blank=True) subject = serializers.CharField(required=False, max_length=255, allow_blank=True) def validate_room_id(self, value: str) -> str: return value.strip() def validate_subject(self, value: str) -> str: return value.strip() class LiveSessionTokenSerializer(serializers.Serializer): course_slug = serializers.CharField(max_length=255) def validate_course_slug(self, value: str) -> str: value = value.strip() if not value: raise serializers.ValidationError("course_slug is required.") return value class LiveSessionRecordedFileSerializer(serializers.Serializer): recorded_file = serializers.FileField(required=True) def validate_recorded_file(self, value): if not value: raise serializers.ValidationError("recorded_file is required.") return value class LiveSessionRecordingSerializer(serializers.Serializer): file = FileFieldSerializer(required=True) title = serializers.CharField(required=False, max_length=255, allow_blank=True) recording_type = serializers.ChoiceField(choices=['voice', 'video'], required=False, default='video') file_time = serializers.DurationField(required=False, allow_null=True) def validate_file(self, value): if not value: raise serializers.ValidationError("file is required.") return value def validate_title(self, value): return value.strip() if value else None