Coverage for api/docs/audio_docs.py: 100%

18 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 06:14 +0000

1from rest_framework.exceptions import ( 

2 AuthenticationFailed, 

3 NotAuthenticated, 

4 NotFound, 

5 ValidationError, 

6) 

7 

8from drf_spectacular.utils import OpenApiResponse, extend_schema 

9 

10from api.constants.parameters import COLLECTION, TAG 

11from api.docs.base_docs import ( 

12 NON_FILTER_FIELDS, 

13 SEARCH_DESCRIPTION, 

14 custom_extend_schema, 

15 fields_to_md, 

16) 

17from api.examples import ( 

18 audio_complain_201_example, 

19 audio_complain_curl, 

20 audio_detail_200_example, 

21 audio_detail_404_example, 

22 audio_detail_curl, 

23 audio_related_200_example, 

24 audio_related_404_example, 

25 audio_related_curl, 

26 audio_search_200_example, 

27 audio_search_400_example, 

28 audio_search_list_curl, 

29 audio_stats_200_example, 

30 audio_stats_curl, 

31 audio_waveform_200_example, 

32 audio_waveform_404_example, 

33 audio_waveform_curl, 

34) 

35from api.serializers.audio_serializers import ( 

36 AudioReportRequestSerializer, 

37 AudioSearchRequestSerializer, 

38 AudioSerializer, 

39 AudioWaveformSerializer, 

40) 

41from api.serializers.media_serializers import MediaThumbnailRequestSerializer 

42from api.serializers.source_serializers import SourceSerializer 

43 

44 

45serializer = AudioSearchRequestSerializer(context={"media_type": "audio"}) 

46audio_filter_fields = fields_to_md( 

47 [f for f in serializer.field_names if f not in NON_FILTER_FIELDS] 

48) 

49 

50audio_search_description = SEARCH_DESCRIPTION.format( 

51 filter_fields=audio_filter_fields, 

52 media_type="audio files", 

53 collection_param=COLLECTION, 

54 tag_param=TAG, 

55) 

56 

57search = custom_extend_schema( 

58 desc=audio_search_description, 

59 params=serializer, 

60 res={ 

61 200: (AudioSerializer, audio_search_200_example["results"][0]), 

62 400: (ValidationError, audio_search_400_example), 

63 401: (NotAuthenticated, None), 

64 }, 

65 eg=[audio_search_list_curl], 

66 external_docs={ 

67 "description": "Openverse Syntax Guide", 

68 "url": "https://openverse.org/search-help", 

69 }, 

70) 

71 

72stats = custom_extend_schema( 

73 desc=f""" 

74 Get a list of all content sources and their respective number of 

75 audio files in the Openverse catalog. 

76 

77 By using this endpoint, you can obtain info about content sources such 

78 as {fields_to_md(SourceSerializer.Meta.fields)}.""", 

79 res={ 

80 200: (SourceSerializer(many=True), audio_stats_200_example[0]), 

81 401: (AuthenticationFailed, None), 

82 }, 

83 eg=[audio_stats_curl], 

84) 

85 

86detail = custom_extend_schema( 

87 desc=f""" 

88 Get the details of a specified audio track. 

89 

90 By using this endpoint, you can obtain info about audio files such as 

91 {fields_to_md(AudioSerializer.Meta.fields)}""", 

92 res={ 

93 200: (AudioSerializer, audio_detail_200_example), 

94 401: (AuthenticationFailed, None), 

95 404: (NotFound, audio_detail_404_example), 

96 }, 

97 eg=[audio_detail_curl], 

98) 

99 

100related = custom_extend_schema( 

101 desc=f""" 

102 Get related audio files for a specified audio track. 

103 

104 By using this endpoint, you can get the details of related audio such as 

105 {fields_to_md(AudioSerializer.Meta.fields)}.""", 

106 res={ 

107 200: (AudioSerializer(many=True), audio_related_200_example["results"][0]), 

108 401: (AuthenticationFailed, None), 

109 404: (NotFound, audio_related_404_example), 

110 }, 

111 eg=[audio_related_curl], 

112) 

113 

114report = custom_extend_schema( 

115 res={ 

116 201: (AudioReportRequestSerializer, audio_complain_201_example), 

117 400: (ValidationError, None), 

118 401: (AuthenticationFailed, None), 

119 404: (NotFound, None), 

120 }, 

121 eg=[audio_complain_curl], 

122) 

123 

124thumbnail = extend_schema( 

125 parameters=[MediaThumbnailRequestSerializer], 

126 responses={ 

127 200: OpenApiResponse(description="Thumbnail image"), 

128 401: AuthenticationFailed, 

129 }, 

130) 

131 

132waveform = custom_extend_schema( 

133 res={ 

134 200: (AudioWaveformSerializer, audio_waveform_200_example), 

135 401: (AuthenticationFailed, None), 

136 404: (NotFound, audio_waveform_404_example), 

137 }, 

138 eg=[audio_waveform_curl], 

139)