55
66from django .db import transaction
77from core .utils import get_client_ip_address
8- from core .settings import MAX_FILES_PER_UPLOAD , MAX_FILE_SIZE_IN_MB
8+ from core .settings import MAX_FILES_PER_UPLOAD
99
10- from rest_framework import status
10+ from rest_framework import status , serializers
1111from rest_framework .generics import ListAPIView , ListCreateAPIView
1212from rest_framework .parsers import FormParser , MultiPartParser
1313from rest_framework .response import Response
2020from drf_spectacular .utils import extend_schema
2121
2222from apps .ifc_validation_models .models import set_user_context
23- from apps .ifc_validation_models .models import ValidationRequest , ValidationTask , ValidationOutcome , Model
23+ from apps .ifc_validation_models .models import ValidationRequest
24+ from apps .ifc_validation_models .models import ValidationTask
25+ from apps .ifc_validation_models .models import ValidationOutcome
26+ from apps .ifc_validation_models .models import Model
2427
2528from .serializers import ValidationRequestSerializer
2629from .serializers import ValidationTaskSerializer
2730from .serializers import ValidationOutcomeSerializer
2831from .serializers import ModelSerializer
29- from .tasks import ifc_file_validation_task
32+ from ... tasks import ifc_file_validation_task
3033
3134logger = logging .getLogger (__name__ )
3235
@@ -43,14 +46,14 @@ class ValidationRequestDetailAPIView(APIView):
4346 def get (self , request , id , * args , ** kwargs ):
4447
4548 """
46- Retrieves a single Validation Request by public_id .
49+ Retrieves a single Validation Request by (public) id .
4750 """
4851
49- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
52+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
5053
5154 instance = ValidationRequest .objects .filter (created_by__id = request .user .id , deleted = False , id = ValidationRequest .to_private_id (id )).first ()
5255 if instance :
53- serializer = ValidationRequestSerializer (instance )
56+ serializer = self . serializer_class (instance )
5457 return Response (serializer .data , status = status .HTTP_200_OK )
5558 else :
5659 data = {'message' : f"Validation Request with public_id={ id } does not exist for user with id={ request .user .id } ." }
@@ -63,7 +66,7 @@ def delete(self, request, id, *args, **kwargs):
6366 Deletes an IFC Validation Request instance by id.
6467 """
6568
66- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
69+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
6770
6871 if request .user .is_authenticated :
6972 logger .info (f"Authenticated, user = { request .user .id } " )
@@ -98,7 +101,7 @@ def get(self, request, *args, **kwargs):
98101 Returns a list of all Validation Requests.
99102 """
100103
101- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
104+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
102105 return super ().get (request , * args , ** kwargs )
103106
104107 def get_queryset (self ):
@@ -114,6 +117,10 @@ def get_queryset(self):
114117 # apply filter(s)
115118 pub_ids = [p .strip () for p in public_id .split (',' ) if p .strip ()]
116119 priv_ids = [ValidationRequest .to_private_id (p ) for p in pub_ids ]
120+
121+ logger .info (f"pub_ids = { pub_ids } " )
122+ logger .info (f"priv_ids = { priv_ids } " )
123+
117124 qs = qs .filter (id__in = priv_ids )
118125
119126 return qs
@@ -125,7 +132,7 @@ def post(self, request, *args, **kwargs):
125132 Creates a new Validation Request instance.
126133 """
127134
128- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
135+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
129136
130137 serializer = self .serializer_class (data = request .data )
131138 if serializer .is_valid ():
@@ -144,10 +151,9 @@ def post(self, request, *args, **kwargs):
144151 if file_i is not None : files += file_i
145152 logger .info (f"Received { len (files )} file(s) - files: { files } " )
146153
147- # only accept one file (for now)
148- if len (files ) != 1 :
149- data = {'message' : f"Only one file can be uploaded at a time." }
150- return Response (data , status = status .HTTP_400_BAD_REQUEST )
154+ # only accept one file (for now) - note: can't be done easily in serializer,
155+ # as we need access to request.FILES and our model only accepts one file
156+ serializer .validate_files (files )
151157
152158 # retrieve file size and save
153159 uploaded_file = serializer .validated_data
@@ -158,23 +164,13 @@ def post(self, request, *args, **kwargs):
158164 file_name = uploaded_file ['file_name' ]
159165 logger .info (f"file_length for uploaded file { file_name } = { file_length } ({ file_length / (1024 * 1024 )} MB)" )
160166
161- # check if file name ends with .ifc
162- if not file_name .lower ().endswith ('.ifc' ):
163- data = {'file_name' : "File name must end with '.ifc'." }
164- return Response (data , status = status .HTTP_400_BAD_REQUEST )
165-
166- # apply file size limit
167- if file_length > MAX_FILE_SIZE_IN_MB * 1024 * 1024 :
168- data = {'message' : f"File size exceeds allowed file size limit ({ MAX_FILE_SIZE_IN_MB } MB)." }
169- return Response (data , status = status .HTTP_413_REQUEST_ENTITY_TOO_LARGE )
170-
171167 # can't use this, file hasn't been saved yet
172168 #file = os.path.join(MEDIA_ROOT, uploaded_file['file_name'])
173169 #uploaded_file['size'] = os.path.getsize(file)
174170 uploaded_file ['size' ] = file_length
175171 instance = serializer .save ()
176172
177- # # submit task for background execution
173+ # submit task for background execution
178174 def submit_task (instance ):
179175 ifc_file_validation_task .delay (instance .id , instance .file_name )
180176 logger .info (f"Task 'ifc_file_validation_task' submitted for id:{ instance .id } file_name: { instance .file_name } )" )
@@ -183,6 +179,10 @@ def submit_task(instance):
183179
184180 return Response (serializer .data , status = status .HTTP_201_CREATED )
185181
182+ except serializers .ValidationError as e :
183+
184+ return Response (e .detail , status = status .HTTP_400_BAD_REQUEST )
185+
186186 except Exception as e :
187187
188188 traceback .print_exc (file = sys .stdout )
@@ -202,10 +202,10 @@ class ValidationTaskDetailAPIView(APIView):
202202 def get (self , request , id , * args , ** kwargs ):
203203
204204 """
205- Retrieves a single Validation Task by public_id .
205+ Retrieves a single Validation Task by (public) id .
206206 """
207207
208- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
208+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
209209
210210 instance = ValidationTask .objects .filter (request__created_by__id = request .user .id , request__deleted = False , id = ValidationTask .to_private_id (id )).first ()
211211 if instance :
@@ -229,7 +229,7 @@ def get(self, request, *args, **kwargs):
229229 Returns a list of all Validation Tasks, optionally filtered by request_public_id.
230230 """
231231
232- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % ( get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
232+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % ( self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
233233 return super ().get (request , * args , ** kwargs )
234234
235235 def get_queryset (self ):
@@ -261,10 +261,10 @@ class ValidationOutcomeDetailAPIView(APIView):
261261 def get (self , request , id , * args , ** kwargs ):
262262
263263 """
264- Retrieves a single Validation Outcome by public_id .
264+ Retrieves a single Validation Outcome by (public) id .
265265 """
266266
267- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
267+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
268268
269269 instance = ValidationOutcome .objects .filter (validation_task__request__created_by__id = request .user .id , validation_task__request__deleted = False , id = ValidationOutcome .to_private_id (id )).first ()
270270 if instance :
@@ -287,7 +287,7 @@ def get(self, request, *args, **kwargs):
287287 Returns a list of all Validation Outcomes, optionally filtered by request_public_id or validation_task_public_id.
288288 """
289289
290- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
290+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
291291 return super ().get (request , * args , ** kwargs )
292292
293293 def get_queryset (self ):
@@ -315,8 +315,6 @@ def priv_ids(param, prefix, to_priv):
315315 return qs
316316
317317
318-
319-
320318class ModelDetailAPIView (APIView ):
321319
322320 queryset = Model .objects .all ()
@@ -328,10 +326,10 @@ class ModelDetailAPIView(APIView):
328326 def get (self , request , id , * args , ** kwargs ):
329327
330328 """
331- Retrieves a single Model by public_id .
329+ Retrieves a single Model by (public) id .
332330 """
333331
334- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
332+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
335333
336334 instance = Model .objects .filter (request__created_by__id = request .user .id , request__deleted = False , id = Model .to_private_id (id )).first ()
337335 if instance :
@@ -354,7 +352,7 @@ def get(self, request, *args, **kwargs):
354352 Returns a list of all Models, optionally filtered by request_public_id.
355353 """
356354
357- logger .info ('API request - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
355+ logger .info ('API request v%s - User IP: %s Request Method: %s Request URL: %s Content-Length: %s' % (self . request . version , get_client_ip_address (request ), request .method , request .path , request .META .get ('CONTENT_LENGTH' )))
358356 return super ().get (request , * args , ** kwargs )
359357
360358 def get_queryset (self ):
0 commit comments