Skip to content

Commit

Permalink
remove duplicated_ok
Browse files Browse the repository at this point in the history
  • Loading branch information
yuki-mt committed Jun 30, 2019
1 parent d963909 commit 5cd1bac
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 29 deletions.
4 changes: 2 additions & 2 deletions frontend/src/actions/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ export const updateModelDispatcher = asyncAPIRequestDispatcherCreator<Apis.Updat
)

export const uploadEvaluationActionCreators =
new APIRequestActionCreators<Apis.UploadEvaluationParam, boolean>('UPLOAD_EVALUATION')
export const uploadEvaluationDispatcher = asyncAPIRequestDispatcherCreator<Apis.UploadEvaluationParam, boolean>(
new APIRequestActionCreators<Apis.UploadEvaluationParam, Apis.UploadEvaluationResult>('UPLOAD_EVALUATION')
export const uploadEvaluationDispatcher = asyncAPIRequestDispatcherCreator<Apis.UploadEvaluationParam, Apis.UploadEvaluationResult>(
uploadEvaluationActionCreators,
Apis.uploadEvaluation
)
Expand Down
16 changes: 15 additions & 1 deletion frontend/src/apis/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,13 @@ export async function updateModel(params: UpdateModelParam): Promise<boolean> {
return APICore.formDataRequest(`${process.env.API_HOST}:${process.env.API_PORT}/api/projects/${params.projectId}/applications/${params.applicationId}/models/${params.modelId}`, requestBody, convert, 'PATCH')
}

export class UploadEvaluationResult {
constructor(
public evaluationId: number,
public message: string = '',
public status: boolean
) { }
}
export interface UploadEvaluationParam {
projectId: number
applicationId: string
Expand All @@ -292,7 +299,14 @@ export async function uploadEvaluation(params: UploadEvaluationParam) {
...params
}

const convert = (result) => result.status
const convert =
(result): UploadEvaluationResult => {
return {
evaluationId: result.evaluation_id,
message: result.message,
status: result.status,
}
}

return APICore.formDataRequest(`${process.env.API_HOST}:${process.env.API_PORT}/api/projects/${params.projectId}/applications/${params.applicationId}/evaluations`, requestBody, convert, 'POST')
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
addNotification
} from '@src/actions/index'
import { APIRequest, isAPISucceeded, isAPIFailed } from '@src/apis/Core/index'
import { FetchEvaluationByIdParam, UploadEvaluationParam } from '@src/apis'
import { FetchEvaluationByIdParam, UploadEvaluationParam, UploadEvaluationResult } from '@src/apis'
import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'

import * as Yup from "yup";
Expand Down Expand Up @@ -52,15 +52,16 @@ class AddEvaluationFileFormImpl extends React.Component<AddEvaluationFileFormPro
} = nextProps

if (isModalOpen && nextState.submitting) {
const succeeded: boolean = isAPISucceeded<boolean>(uploadEvaluationStatus) && uploadEvaluationStatus.result
const failed: boolean = (isAPISucceeded<boolean>(uploadEvaluationStatus) && !uploadEvaluationStatus.result) || isAPIFailed<boolean>(uploadEvaluationStatus)
if (succeeded) {
if (isAPISucceeded<UploadEvaluationResult>(uploadEvaluationStatus) && uploadEvaluationStatus.result.message) {
nextProps.addNotification({color: 'error', message: uploadEvaluationStatus.result.message})
return {submitting: false}
} else if (isAPISucceeded<UploadEvaluationResult>(uploadEvaluationStatus) && uploadEvaluationStatus.result.status) {
toggle()
reload({color: 'success', message: 'Successfully added evaluation'})
nextProps.fetchAllEvaluations({projectId: nextProps.projectId, applicationId: nextProps.applicationId})
return {submitting: false}
} else if (failed) {
nextProps.addNotification({color: 'error', message: uploadEvaluationStatus['error']['message']})
} else if (isAPIFailed<UploadEvaluationResult>(uploadEvaluationStatus)) {
nextProps.addNotification({color: 'error', message: uploadEvaluationStatus.error.message})
return {submitting: false}
}
}
Expand Down Expand Up @@ -161,7 +162,7 @@ interface CustomProps {
}

interface StateProps {
uploadEvaluationStatus: APIRequest<boolean>
uploadEvaluationStatus: APIRequest<UploadEvaluationResult>
}

const mapStateToProps = (state: any, extraProps: CustomProps) => {
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
<link rel="shortcut icon" href="https://raw.githubusercontent.com/rekcurd/community/master/docs/img/favicon.ico">
<title>Rekcurd Dashboard</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/eruda/1.4.3/eruda.min.js"></script>
<script>eruda.init();</script>
</head>
<body>
<div id="root"></div>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/reducers/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export const uploadModelReducer = APIRequestReducerCreator<Apis.UploadModelParam
Actions.uploadModelActionCreators, 'uploadModel')
export const updateModelReducer = APIRequestReducerCreator<Apis.UpdateModelParam, boolean>(
Actions.updateModelActionCreators, 'updateModel')
export const uploadEvaluationReducer = APIRequestReducerCreator<Apis.UploadEvaluationParam, boolean>(
export const uploadEvaluationReducer = APIRequestReducerCreator<Apis.UploadEvaluationParam, Apis.UploadEvaluationResult>(
Actions.uploadEvaluationActionCreators, 'uploadEvaluation')
export const fetchAllProjectsReducer = APIRequestReducerCreator<{}, Apis.Project[]>(
Actions.fetchAllProjectsActionCreators, 'fetchAllProjects')
Expand Down
12 changes: 5 additions & 7 deletions rekcurd_dashboard/apis/api_evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
})
eval_data_upload = evaluation_api_namespace.model('Result of uploading evaluation data', {
'status': fields.Boolean(required=True),
'message': fields.String(required=False),
'evaluation_id': fields.Integer(required=True, description='ID of uploaded data')
})
evaluation_params = evaluation_api_namespace.model('Evaluation', {
Expand Down Expand Up @@ -77,19 +78,16 @@ def post(self, project_id: int, application_id: str):
args = self.upload_parser.parse_args()
file = args['filepath']
description = args['description']
duplicated_ok = args['duplicated_ok']
checksum = HashUtil.checksum(file)

evaluation_model = db.session.query(EvaluationModel).filter(
EvaluationModel.application_id == application_id,
EvaluationModel.checksum == checksum).one_or_none()
if evaluation_model is not None:
if duplicated_ok:
return {"status": True, "evaluation_id": evaluation_model.evaluation_id}
else:
raise RekcurdDashboardException(
'the file already exists. ID: {}, Description: {}'.format(
evaluation_model.evaluation_id, evaluation_model.description))
return {"status": True,
"message": 'The file already exists. Description: {}'.format(
evaluation_model.description),
"evaluation_id": evaluation_model.evaluation_id}

application_model: ApplicationModel = db.session.query(ApplicationModel).filter(
ApplicationModel.application_id == application_id).first_or_404()
Expand Down
17 changes: 6 additions & 11 deletions test/apis/test_api_evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,22 +88,17 @@ def test_post(self):
url, content_type=content_type,
data={'filepath': (BytesIO(file_content), "file.txt"), 'description': 'eval desc'})
self.assertEqual(200, response.status_code)
self.assertEqual(response.json, {'status': True, 'evaluation_id': 1})
self.assertEqual(response.json, {'status': True, 'evaluation_id': 1, 'message': None})

# duplication check
response = self.client.post(
url, content_type=content_type,
data={'filepath': (BytesIO(file_content), "file.txt"), 'description': 'eval desc'})
self.assertEqual(400, response.status_code)

# duplication check
response = self.client.post(
url, content_type=content_type,
data={'filepath': (BytesIO(file_content), "file.txt"),
'description': 'eval desc',
'duplicated_ok': True})
'description': 'eval desc'})
self.assertEqual(200, response.status_code)
self.assertEqual(response.json, {'status': True, 'evaluation_id': 1})
self.assertEqual(response.json,
{'status': True,
'message': 'The file already exists. Description: eval desc',
'evaluation_id': 1})

evaluation_model = EvaluationModel.query.filter_by(evaluation_id=1).one()
self.assertEqual(evaluation_model.application_id, TEST_APPLICATION_ID)
Expand Down

0 comments on commit 5cd1bac

Please sign in to comment.