This commit is contained in:
TannedCung 2024-06-06 14:31:05 +07:00
commit e4fa15f196
5 changed files with 86 additions and 46 deletions

View File

@ -4,6 +4,7 @@ import urllib
import random
import numpy as np
from pathlib import Path
import urllib.parse
import uuid
from copy import deepcopy
import sys, os
@ -33,10 +34,18 @@ def sbt_predict(image_url, engine, metadata={}) -> None:
img = cv2.imdecode(arr, -1)
save_dir = "./tmp_results"
try:
parsed_url = urllib.parse.urlparse(image_url)
query_params = urllib.parse.parse_qs(parsed_url.query)
file_name = query_params['file_name'][0]
except Exception as e:
print(f"[ERROR]: Error extracting file name from url: {image_url}")
file_name = f"{uuid.uuid4()}.jpg"
os.makedirs(save_dir, exist_ok=True)
# image_path = os.path.join(save_dir, f"{image_url}.jpg")
os.makedirs(save_dir, exist_ok = True)
tmp_image_path = os.path.join(save_dir, f"{uuid.uuid4()}.jpg")
tmp_image_path = os.path.join(save_dir, file_name)
cv2.imwrite(tmp_image_path, img)
extra_params = {'sub': metadata.get("subsidiary", None)} # example of 'AU'
outputs = process_img(img=tmp_image_path,

View File

@ -847,7 +847,6 @@ def calculate_a_request(report, request):
rv_avg_acc = avg_dict(att["acc"]["reviewed"])
image.is_required = fb_avg_acc < settings.BAD_THRESHOLD
image.is_reviewed = rv_avg_acc > 0
if image.processing_time < 0:
continue

View File

@ -8,10 +8,9 @@ import { Button, Tag } from 'antd';
const FileCard = ({ file, isSelected, onClick }) => {
const fileName = file['File Name'];
const extensionType = fileName.split('.').pop();
let status = true;
if (file['Is Required'] && !file['Is Reviewed']) {
status = false;
}
const isRequired = file['Is Required'];
const isReviewd = file['Is Reviewed'];
return (
<div
style={{
@ -52,20 +51,29 @@ const FileCard = ({ file, isSelected, onClick }) => {
>
{fileName
? fileName.substring(0, 25).replace('temp_', '')
: fileName}
{' '}({extensionType})
: fileName}{' '}
({extensionType})
</span>
</div>
<Tag
color={status ? 'success' : 'warning'}
icon={
status ? <CheckCircleOutlined /> : <ExclamationCircleOutlined />
}
style={{ display: 'inline-block', fontWeight: 'bold' }}
// bordered={false}
>
{status ? 'Good' : 'Warning'}{' '}
</Tag>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems:'center'}}>
<Tag
color={isRequired ? 'warning' : ''}
style={{ display: 'inline-block', fontWeight: 'bold' , textTransform: 'capitalize' }}
// bordered={false}
>
Required: {isRequired.toString()}
</Tag>
<Tag
color={isReviewd ? 'success' : 'warning'}
style={{ display: 'inline-block', fontWeight: 'bold', textTransform: 'capitalize' }}
// bordered={false}
>
Reviewed: {isReviewd.toString()}
</Tag>
</div>
</div>
<Button
style={{

View File

@ -56,7 +56,7 @@ export const updateRevisedData = async (requestID: any) => {
console.log(error);
throw error;
});
if (result.status != 200) {
if (!result.ok) {
throw new Error('Could not update revised data');
}
};

View File

@ -53,6 +53,8 @@ import {
} from './const';
import FileCard from './FileCard';
import RecentRequest from './RecentRequest';
import './style.css';
const ReviewPage = () => {
const [loading, setLoading] = useState(false);
const [fullscreen, setFullscreen] = useState(false);
@ -124,11 +126,11 @@ const ReviewPage = () => {
}
}, []);
useEffect(() => {
if (reason) {
setSolution(counter_measure_map[reason]);
}
}, [reason]);
// useEffect(() => {
// if (reason) {
// setSolution(counter_measure_map[reason]);
// }
// }, [reason]);
const updateSelectedFileDataSource = (fileContent) => {
let tempData = {};
@ -137,13 +139,20 @@ const ReviewPage = () => {
SOURCE_OBJECT_NAMES.forEach((name) => {
tempData[k][name] = fileContent[name][k];
});
if (
(isEmpty(tempData[k][REVIEWED_RESULT]) ||
(tempData[k][REVIEWED_RESULT].length == 1 &&
isEmpty(tempData[k][REVIEWED_RESULT][0]))) &&
!isEmpty(tempData[k][PREDICTED_RESULT])
) {
tempData[k][REVIEWED_RESULT] = tempData[k][PREDICTED_RESULT];
if (!isEmpty(tempData[k][PREDICTED_RESULT])) {
let isEmptyResult = false;
if (isEmpty(tempData[k][REVIEWED_RESULT])) {
isEmptyResult = true;
}
if (Array.isArray(tempData[k][REVIEWED_RESULT]) && tempData[k][REVIEWED_RESULT].length > 0) {
isEmptyResult = tempData[k][REVIEWED_RESULT].every((r: any) =>
isEmpty(r),
);
}
if (isEmptyResult) {
tempData[k][REVIEWED_RESULT] = tempData[k][PREDICTED_RESULT];
}
}
});
@ -166,16 +175,20 @@ const ReviewPage = () => {
if (!reason) {
setReason(null);
setOtherReason(null);
} else if (REASON_BAD_QUALITY.some((r) => r.value === reason)) {
setReason(reason);
setOtherReason(null);
} else {
setReason('other');
setOtherReason(reason);
}
if (!solution) {
setSolution(null);
setOtherSolution(null);
} else if (SOLUTION_BAD_QUALITY.some((r) => r.value === solution)) {
setSolution(solution);
setOtherSolution(null);
} else {
setSolution('other');
setOtherSolution(solution);
@ -190,7 +203,6 @@ const ReviewPage = () => {
setImageLoading(false);
}
};
const loadCurrentRequest = (requestIndex) => {
setLoading(true);
setImageLoading(true);
@ -277,8 +289,8 @@ const ReviewPage = () => {
);
if (isConfirmed) {
try {
addRecentRequest(currentRequest?.RequestID);
await updateRevisedData(currentRequest?.RequestID);
addRecentRequest(currentRequest?.RequestID);
setCurrentRequest({
...currentRequest,
['Is Reviewed']: true,
@ -298,11 +310,18 @@ const ReviewPage = () => {
let request_file_result = {};
SOURCE_KEYS.forEach((k) => {
request_file_result[k] = selectedFileDataSource[k][REVIEWED_RESULT];
if(Array.isArray(selectedFileDataSource[k][REVIEWED_RESULT])){
request_file_result[k] = selectedFileDataSource[k][REVIEWED_RESULT].toString();
}else{
request_file_result[k] = selectedFileDataSource[k][REVIEWED_RESULT];
}
});
let data = {
request_file_result,
reason: reason ? reason : otherReason,
solution: solution ? solution : otherSolution,
reason: reason !== 'other' ? reason : otherReason,
solution: solution !== 'other' ? solution : otherSolution,
};
try {
await updateRevisedDataByFile(currentRequest?.RequestID, fileId, data);
@ -327,6 +346,8 @@ const ReviewPage = () => {
// use left/right keys to navigate
useHotkeys('left', gotoPreviousRequest);
useHotkeys('right', gotoNextRequest);
useHotkeys('u', submitRevisedData);
useHotkeys('c', handleConfirmReview);
const fileExtension = selectedFileName
? selectedFileName.split('.').pop()
@ -334,10 +355,10 @@ const ReviewPage = () => {
const [lightBox, setLightBox] = useState(false);
const updateRevised = (fieldName) => {
const updateRevisedByFeedback = (fieldName) => {
setSelectedFileDataSource((prevData) => {
prevData[fieldName][REVIEWED_RESULT] =
prevData[fieldName][FEEDBACK_RESULT];
prevData[fieldName][FEEDBACK_RESULT];
return {
...prevData,
};
@ -527,13 +548,12 @@ const ReviewPage = () => {
overflowX: 'visible',
}}
>
<Spin spinning={imageLoading}>
<Spin spinning={imageLoading} wrapperClassName='image-spin'>
<img
style={{
maxHeight: '100%',
maxWidth: '100%',
height: 'auto',
width: 'auto',
height: '100%',
width: '100%',
objectFit: 'contain',
cursor: 'zoom-in',
}}
src={selectedFileData}
@ -666,7 +686,7 @@ const ReviewPage = () => {
style={{ minWidth: '120px' }}
onClick={handleConfirmReview}
>
Confirm request
Confirm request
</Button>
</div>
</div>
@ -721,7 +741,7 @@ const ReviewPage = () => {
}
} catch (error) {}
return (
<div style={{ margin: '0 0 8px' }}>
<div style={{ margin: '0 0 8px' }} className='file-input-group'>
<div
style={{
display: 'flex',
@ -737,7 +757,7 @@ const ReviewPage = () => {
ghost
icon={<CopyOutlined />}
size='small'
onClick={() => updateRevised(data)}
onClick={() => updateRevisedByFeedback(data)}
/>
</div>
<Input
@ -776,7 +796,11 @@ const ReviewPage = () => {
placeholder='Select a reason'
style={{ width: 170, flexBasis: '50%', height: '32px' }}
options={REASON_BAD_QUALITY}
onChange={setReason}
onChange={(value) => {
let newReason = value;
setReason(newReason);
setSolution(counter_measure_map[newReason]);
}}
value={reason}
/>
{reason === 'other' && (