1
1
from collections import namedtuple
2
2
from math import floor
3
+ from typing import TypedDict
3
4
4
5
from django .conf import settings
5
6
from django .core .exceptions import ValidationError as DjangoValidationError
6
7
from django .core .validators import MaxValueValidator
7
8
from django .urls import reverse
8
9
from rest_framework import serializers
9
10
from rest_framework .exceptions import NotAuthenticated , ValidationError
11
+ from rest_framework .request import Request
10
12
11
13
from drf_spectacular .utils import extend_schema_serializer
12
14
from elasticsearch_dsl .response import Hit
20
22
from api .constants .sorting import DESCENDING , RELEVANCE , SORT_DIRECTIONS , SORT_FIELDS
21
23
from api .controllers import search_controller
22
24
from api .models .media import AbstractMedia
23
- from api .serializers .base import BaseModelSerializer , BaseRequestSerializer
25
+ from api .serializers .base import BaseModelSerializer
24
26
from api .serializers .docs import (
25
27
COLLECTION_HELP_TEXT ,
26
28
CREATOR_HELP_TEXT ,
39
41
#######################
40
42
41
43
42
- class PaginatedRequestSerializer (BaseRequestSerializer ):
44
+ class PaginatedRequestSerializer (serializers . Serializer ):
43
45
"""This serializer passes pagination parameters from the query string."""
44
46
45
47
_SUBJECT_TO_PAGINATION_LIMITS = (
@@ -68,7 +70,9 @@ class PaginatedRequestSerializer(BaseRequestSerializer):
68
70
)
69
71
70
72
def validate_page_size (self , value ):
71
- level , max_value = privilege .PAGE_SIZE .request_level (self .request )
73
+ level , max_value = privilege .PAGE_SIZE .request_level (
74
+ self .context .get ("request" )
75
+ )
72
76
73
77
validator = MaxValueValidator (
74
78
max_value ,
@@ -91,15 +95,19 @@ def validate_page_size(self, value):
91
95
return value
92
96
93
97
def clamp_result_count (self , real_result_count ):
94
- _ , max_depth = privilege .PAGINATION_DEPTH .request_level (self .request )
98
+ _ , max_depth = privilege .PAGINATION_DEPTH .request_level (
99
+ self .context .get ("request" )
100
+ )
95
101
96
102
if real_result_count > max_depth :
97
103
return max_depth
98
104
99
105
return real_result_count
100
106
101
107
def clamp_page_count (self , real_page_count ):
102
- _ , max_depth = privilege .PAGINATION_DEPTH .request_level (self .request )
108
+ _ , max_depth = privilege .PAGINATION_DEPTH .request_level (
109
+ self .context .get ("request" )
110
+ )
103
111
104
112
page_size = self .data ["page_size" ]
105
113
max_possible_page_count = max_depth / page_size
@@ -114,7 +122,9 @@ def validate(self, data):
114
122
115
123
# pagination depth is validated as a combination of page and page size,
116
124
# and so cannot be validated in the individual field validation methods
117
- level , max_depth = privilege .PAGINATION_DEPTH .request_level (self .request )
125
+ level , max_depth = privilege .PAGINATION_DEPTH .request_level (
126
+ self .context .get ("request" )
127
+ )
118
128
119
129
requested_pagination_depth = data ["page" ] * data ["page_size" ]
120
130
@@ -318,9 +328,10 @@ class MediaSearchRequestSerializer(PaginatedRequestSerializer):
318
328
required = False ,
319
329
)
320
330
321
- class Context (BaseRequestSerializer . Context , total = True ):
331
+ class Context (TypedDict , total = True ):
322
332
warnings : list [dict ]
323
333
media_type : MediaType
334
+ request : Request
324
335
325
336
context : Context
326
337
@@ -443,7 +454,7 @@ def validate_source(self, value):
443
454
f"Refer to the source list for valid options: { sources_list } ."
444
455
)
445
456
elif invalid_sources := (sources - valid_sources ):
446
- available_sources_uri = self .request .build_absolute_uri (
457
+ available_sources_uri = self .context . get ( " request" ) .build_absolute_uri (
447
458
reverse (f"{ self .media_type } -stats" )
448
459
)
449
460
self .context ["warnings" ].append (
0 commit comments