@@ -189,7 +189,10 @@ def post_photo(request):
189189* report: The version_UUID of the report to which this photo is attached.
190190 """
191191 if request .method == 'POST' :
192- this_report = Report .objects .get (version_UUID = request .data ['report' ])
192+ try :
193+ this_report = Report .objects .get (version_UUID = request .data ['report' ])
194+ except Report .DoesNotExist :
195+ return Response ()
193196 instance = Photo (photo = request .FILES ['photo' ], report = this_report )
194197 instance .save ()
195198 return Response ('uploaded' )
@@ -316,24 +319,20 @@ def create(self, request, *args, **kwargs):
316319 # May raise a permission denied
317320 self .check_object_permissions (self .request , instance )
318321
319- result_headers = None
320- result_status = None
321- result_data = None
322+ # NOTE: Always return 201
323+ # See: https://github.com/Mosquito-Alert/Mosquito-Alert-Mobile-App/blob/6c5993a230a86f958c8dca8bcfef2994a6b93ebe/lib/api/api.dart#L381
324+ result_status = status . HTTP_201_CREATED
322325 if version_number >= 0 :
323326 serializer = self .get_serializer (instance , data = request .data )
324327 serializer .is_valid (raise_exception = True )
325328 serializer .save ()
326329
327- result_data = serializer .data
328-
329- if version_number == 0 :
330- result_status = status .HTTP_201_CREATED
331- result_headers = self .get_success_headers (serializer .data )
332-
333330 if version_number == - 1 :
334331 instance .soft_delete ()
332+ serializer = self .get_serializer (instance )
335333
336- result_status = status .HTTP_204_NO_CONTENT
334+ result_data = serializer .data
335+ result_headers = self .get_success_headers (serializer .data )
337336
338337 return Response (data = result_data , status = result_status , headers = result_headers )
339338
@@ -343,6 +342,25 @@ class PhotoViewSet(ReadWriteOnlyModelViewSet):
343342 queryset = Photo .objects .all ()
344343 serializer_class = PhotoSerializer
345344
345+ def create (self , request , * args , ** kwargs ):
346+ response = super ().create (request = request , * args , ** kwargs )
347+
348+ # Always return 200
349+ # See: https://github.com/Mosquito-Alert/Mosquito-Alert-Mobile-App/blob/6c5993a230a86f958c8dca8bcfef2994a6b93ebe/lib/api/api.dart#L508
350+ response .status = status .HTTP_200_OK
351+ return response
352+
353+ def perform_create (self , serializer ):
354+ # Restrict image saving to the initial report creation only.
355+ # Although the mobile app generates a new version_UUID for each
356+ # report update or deletion, the reports are versioned, and
357+ # only the original UUID is preserved. If the provided UUID is not
358+ # found, indicating an update/deletion, image saving is bypassed.
359+ if not Report .objects .filter (pk = serializer .report ).exists ():
360+ return
361+ else :
362+ super ().perform_create (serializer = serializer )
363+
346364
347365# For production version, substitute WriteOnlyModelViewSet
348366class FixViewSet (ReadWriteOnlyModelViewSet ):
0 commit comments