Skip to content

Commit

Permalink
feat(AU-2283): Move payload validation to serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
Rodra committed Nov 19, 2024
1 parent f9356c7 commit 758b74d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 19 deletions.
23 changes: 23 additions & 0 deletions edxval/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,3 +257,26 @@ def get_preferred_languages(self, transcript_preference):
Returns python list for preferred_languages model field.
"""
return transcript_preference.preferred_languages


class TranscriptBulkDeleteSerializer(serializers.Serializer):
"""
Serializer for TranscriptBulkDelete
"""
def validate(self, data):
from edxval.api import get_available_transcript_languages # Local import to avoid circular import issues
missing_transcripts = []
for video_id, language_codes in self.initial_data.items():
if not isinstance(language_codes, list):
raise serializers.ValidationError(
f'Value for video "{video_id}" needs to be a list of language codes.'
)
available_transcript_languages = get_available_transcript_languages(video_id=video_id)
for language_code in language_codes:
if language_code not in available_transcript_languages:
missing_transcripts.append(f'Language "{language_code}" is not available for video "{video_id}".')

if missing_transcripts:
raise serializers.ValidationError('\n'.join(missing_transcripts))

return self.initial_data
25 changes: 6 additions & 19 deletions edxval/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
VideoImage,
VideoTranscript,
)
from edxval.serializers import VideoSerializer
from edxval.serializers import TranscriptBulkDeleteSerializer, VideoSerializer
from edxval.utils import TranscriptFormat, validate_generated_images

LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -424,7 +424,6 @@ class VideoTranscriptBulkDelete(APIView):
"""
authentication_classes = (JwtAuthentication, SessionAuthentication)

# noinspection PyMethodMayBeStatic
def post(self, request):
"""
View to delete a set of transcript files.
Expand All @@ -448,28 +447,16 @@ def post(self, request):
- A 400 if any of the validation fails
- A 200 if all transcripts delete jobs are triggered successfully
"""
data = request.data
missing_transcripts = []
for video_id, language_codes in data.items():
if not isinstance(language_codes, list):
return Response(
status=status.HTTP_400_BAD_REQUEST,
data={'message': f'Value for video "{video_id}" needs to be a list of language codes.'}
)
available_transcript_languages = get_available_transcript_languages(video_id=video_id)
for language_code in language_codes:
if language_code not in available_transcript_languages:
missing_transcripts.append(f'Language "{language_code}" is not available for video "{video_id}".')

if missing_transcripts:
serializer = TranscriptBulkDeleteSerializer(data=request.data)
if not serializer.is_valid():
return Response(
status=status.HTTP_400_BAD_REQUEST,
data={'message': '\n'.join(missing_transcripts)}
data={'message': serializer.errors['non_field_errors'][0]}
)

deleted = 0

for video_id, language_codes in data.items():
validated_data = serializer.validated_data
for video_id, language_codes in validated_data.items():
for language_code in language_codes:
delete_video_transcript(video_id=video_id, language_code=language_code)
deleted += 1
Expand Down

0 comments on commit 758b74d

Please sign in to comment.