Skip to content

Commit 3d7332c

Browse files
authored
Fix score form (#1244)
1 parent 7b3aa55 commit 3d7332c

File tree

3 files changed

+92
-38
lines changed

3 files changed

+92
-38
lines changed

django_project/minisass_frontend/src/components/ScoreForm/index.tsx

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
169169
'Content-Type': 'multipart/form-data'
170170
},
171171
validateStatus: function (status) {
172-
return status < 500; // Don't throw for status codes less than 500
172+
return status < 500 || status == 400; // Don't throw for status codes less than 500 or error 400
173173
}
174174
}
175175
);
@@ -192,12 +192,14 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
192192
else setErrorMessage(response.data.message)
193193
setIsErrorModalOpen(true);
194194
}
195+
setIsSavingData(false);
195196
}else {
196197
setProceedToSavingData(false);
198+
setIsSavingData(false);
197199
}
198200
}
199201
} catch (exception) {
200-
setIsSavingData(false)
202+
setIsSavingData(false);
201203
setErrorMessage(exception.message + (exception.response?.data?.message ? ": " + exception.response.data.message : ""));
202204
setIsErrorModalOpen(true);
203205
}
@@ -275,7 +277,7 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
275277
const [createSiteOrObservation, setCreateNewSiteOrObservation] = useState(true);
276278
const [refetchImages, setRefetchImages] = useState(false);
277279

278-
const uploadImages = async (pestImages) => {
280+
const uploadImages = async (pestImages, callback) => {
279281
setIsUploadingImage(true)
280282

281283
for (const key in pestImages) {
@@ -293,9 +295,6 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
293295
}
294296
}
295297

296-
const storedObservationId = localStorage.getItem('observationId') || 0;
297-
const storedSiteId = localStorage.getItem('siteId') || 0;
298-
299298
data.append('observationId', JSON.stringify(observationId));
300299

301300
if (typeof additionalData.selectedSite !== 'undefined' && additionalData.selectedSite !== null && additionalData.selectedSite !== "") {
@@ -324,23 +323,46 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
324323
{
325324
headers: {
326325
'Content-Type': 'multipart/form-data'
326+
},
327+
validateStatus: function (status) {
328+
return status < 500 || status == 400; // Don't throw for status codes less than 500 or error 400
327329
}
328330
}
329331
);
330332

331-
if(response.status == 200){
333+
if(response.status == 201){
332334
setIsUploadingImage(false)
333335
setObservationId(response.data.observation_id)
334336
setSiteId(response.data.site_id)
335-
setPestImages({})
336337
setCreateNewSiteOrObservation(false)
337338
localStorage.setItem('observationId', JSON.stringify(response.data.observation_id));
338339
localStorage.setItem('siteId', JSON.stringify(response.data.site_id));
339340
setRefetchImages(true)
341+
console.log('call callback')
342+
callback()
343+
} else {
344+
if (response.data.status.includes('error')) {
345+
if("Site name already exists" === response.data.message){
346+
setIsCloseSiteDialogOpen(true);
347+
}else {
348+
if(response.data.message === "")
349+
setErrorMessage("Something unexpectedly went wrong, please try again. If the issue should persist ,contact the system administrator via the contact us form describing the problem you're facing.");
350+
else setErrorMessage(response.data.message)
351+
setIsErrorModalOpen(true);
352+
}
353+
}else {
354+
setProceedToSavingData(false);
355+
}
356+
setIsSavingData(false);
357+
setIsUploadingImage(false);
340358
}
341359
}catch( exception ){
342-
console.log(exception.message);
360+
setIsSavingData(false);
361+
setIsUploadingImage(false);
362+
setErrorMessage(exception.message + (exception.response?.data?.message ? ": " + exception.response.data.message : ""));
363+
setIsErrorModalOpen(true);
343364
}
365+
setPestImages({});
344366
}
345367
}
346368
}
@@ -552,17 +574,19 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
552574
onSubmit={
553575
files => {
554576
pestImages[props.id] = files
555-
setPestImages({...pestImages})
556577
setOpenImagePestId(0)
557-
setIsAddMore(false)
558-
const updatedButtonStates = buttonStates.map(buttonState => {
559-
if (buttonState.id === props.id) {
560-
return { ...buttonState, showManageImages: !buttonState.showManageImages };
561-
}
562-
return buttonState;
563-
});
564-
setButtonStates(updatedButtonStates);
565-
uploadImages(pestImages)
578+
const callback = () => {
579+
const updatedButtonStates = buttonStates.map(buttonState => {
580+
if (buttonState.id === props.id) {
581+
return { ...buttonState, showManageImages: !buttonState.showManageImages };
582+
}
583+
return buttonState;
584+
});
585+
setButtonStates(updatedButtonStates);
586+
setPestImages({...pestImages})
587+
setIsAddMore(false)
588+
}
589+
uploadImages(pestImages, callback)
566590
}
567591
}/>
568592
</>
@@ -596,17 +620,19 @@ const ScoreForm: React.FC<ScoreFormProps> = ({ onCancel, additionalData, setSide
596620
onClose={closeUploadModal}
597621
onSubmit={files => {
598622
pestImages[props.id] = files;
599-
setPestImages({ ...pestImages });
600623
setOpenImagePestId(0);
601-
setIsAddMore(false);
602-
setManageImagesModalData({
603-
'groups': props.name,
604-
'sensetivityScore': props.sensitivity_score,
605-
'id': props.id,
606-
'images': pestImages[props.id],
607-
'saved_group_prediction': {}
608-
});
609-
uploadImages(pestImages);
624+
const callback = () => {
625+
setPestImages({ ...pestImages });
626+
setIsAddMore(false);
627+
setManageImagesModalData({
628+
'groups': props.name,
629+
'sensetivityScore': props.sensitivity_score,
630+
'id': props.id,
631+
'images': pestImages[props.id],
632+
'saved_group_prediction': {}
633+
});
634+
}
635+
uploadImages(pestImages, callback);
610636
}}
611637
/>
612638
</>

django_project/monitor/observation_views.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,16 @@ def upload_pest_image(request):
300300
'site_id': site.gid,
301301
'pest_image_id': pest_image.id,
302302
'classification_results': classification_results
303-
}
303+
},
304+
status=status.HTTP_201_CREATED
304305
)
305306
except ValidationError as ve:
306307
return JsonResponse({'status': 'error', 'message': 'Invalid input'}, status=status.HTTP_400_BAD_REQUEST)
308+
except ValueError as e:
309+
return JsonResponse(
310+
{'status': 'error', 'message': str(e)},
311+
status=status.HTTP_400_BAD_REQUEST
312+
)
307313
except Exception as e:
308314
# Handle other exceptions
309315
return JsonResponse({'status': 'error', 'message': 'An unexpected error occurred'}, status=status.HTTP_400_BAD_REQUEST)
@@ -510,13 +516,13 @@ def create(self, request, *args, **kwargs):
510516
try:
511517
latitude_input = datainput.get('latitude', None)
512518
longitude_input = datainput.get('longitude', None)
513-
latitude = float(str(latitude_input))
514-
longitude = float(str(longitude_input))
515-
if latitude is None or longitude is None:
519+
if latitude_input is None or longitude_input is None:
516520
return JsonResponse(
517521
{'status': 'error', 'message': 'Lattitude and/or Longitude cannot be None!'},
518522
status=status.HTTP_400_BAD_REQUEST
519523
)
524+
latitude = float(str(latitude_input))
525+
longitude = float(str(longitude_input))
520526
except ValueError:
521527
return JsonResponse(
522528
{'status': 'error', 'message': 'Invalid longitude or latitude format'},
@@ -636,8 +642,6 @@ def create(self, request, *args, **kwargs):
636642

637643
# Handle uploaded pest images
638644
for key, image in request.FILES.items():
639-
print(key, image)
640-
641645
if key.startswith("pest_"):
642646
# Do something with each file — like saving to a model
643647
group_name = key.split(':')[1]
@@ -670,7 +674,11 @@ def create(self, request, *args, **kwargs):
670674
{'status': 'error', 'message': 'cannot find site to save observation to'},
671675
status=status.HTTP_400_BAD_REQUEST
672676
)
673-
677+
except ValueError as e:
678+
return JsonResponse(
679+
{'status': 'error', 'message': str(e)},
680+
status=status.HTTP_400_BAD_REQUEST
681+
)
674682
except Exception as e:
675683
return JsonResponse(
676684
{'status': 'error', 'message': 'An unexpected error occurred'},

django_project/monitor/tests/test_observations.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ def test_upload_pest_image_success(self):
241241
)
242242

243243
# Check the response status and content
244-
self.assertEqual(response.status_code, 200)
244+
self.assertEqual(response.status_code, 201)
245245
self.assertIn('status', response.json())
246246
self.assertIn('observation_id', response.json())
247247

@@ -321,7 +321,27 @@ def test_upload_pest_image_failed(self):
321321

322322
# Check the response status and content
323323
self.assertEqual(response.status_code, 400)
324-
print(response.json())
324+
self.assertEquals(
325+
response.json(),
326+
{'status': 'error', 'message': 'Site Name and/or River Name cannot be empty!'}
327+
)
328+
329+
# Site is in the ocean
330+
response = self.client.post(
331+
url,
332+
{
333+
f'pest_image:{self.flatworms.id}': image_file,
334+
'observationId': 0,
335+
'siteId': 0,
336+
'create_site_or_observation': 'False',
337+
'latitude': -8.089023,
338+
'longitude': 109.879311,
339+
'siteName': 'Test Site'
340+
},
341+
)
342+
343+
# Check the response status and content
344+
self.assertEqual(response.status_code, 400)
325345
self.assertEquals(
326346
response.json(),
327347
{'status': 'error', 'message': 'Site Name and/or River Name cannot be empty!'}

0 commit comments

Comments
 (0)