def test_get_paginated_scans_with_invalid_arguments( prepare_environment: Any) -> None: """Test for fetching Scans in the paginated way with invalid arguments.""" api_client = get_api_client() user_token = get_token_for_logged_in_user('admin') # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') # Step 2. Add example Scans to the system for _ in range(50): ScansRepository.add_new_scan(dataset, number_of_slices=3) # Step 3. Fetch them with MedTagger REST API in the wrong way response = api_client.get('/api/v1/scans?dataset_key=KIDNEYS&page=-1', headers=get_headers(token=user_token)) assert response.status_code == 400 json_response = json.loads(response.data) assert json_response['message'] == 'Invalid arguments.' assert json_response['details'] == 'Page cannot be smaller than 1.' # Step 4. Make a mistake again response = api_client.get( '/api/v1/scans?dataset_key=KIDNEYS&per_page=5000', headers=get_headers(token=user_token)) assert response.status_code == 400 json_response = json.loads(response.data) assert json_response['message'] == 'Invalid arguments.' assert json_response[ 'details'] == 'Cannot fetch more than 100 entries at once.'
def test_get_paginated_scans(prepare_environment: Any) -> None: """Test for fetching Scans in the paginated way.""" api_client = get_api_client() user_token = get_token_for_logged_in_user('admin') # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') # Step 2. Add example Scans to the system for _ in range(50): ScansRepository.add_new_scan(dataset, number_of_slices=3) # Step 3. Fetch them with MedTagger REST API response = api_client.get('/api/v1/scans?dataset_key=KIDNEYS', headers=get_headers(token=user_token)) assert response.status_code == 200 json_response = json.loads(response.data) assert json_response['pagination']['page'] == 1 assert json_response['pagination']['per_page'] == 25 assert json_response['pagination']['total'] == 50 assert len(json_response['scans']) == 25 # Step 4. Fetch the next page with different size response = api_client.get( '/api/v1/scans?dataset_key=KIDNEYS&page=2&per_page=10', headers=get_headers(token=user_token)) assert response.status_code == 200 json_response = json.loads(response.data) assert json_response['pagination']['page'] == 2 assert json_response['pagination']['per_page'] == 10 assert json_response['pagination']['total'] == 50 assert len(json_response['scans']) == 10
def test_get_predefined_brush_label_elements(prepare_environment: Any) -> None: """Test for fetching Predefined Brush Label Elements.""" # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') task = TasksRepository.add_task('MARK_KIDNEYS', 'Mark Kidneys', 'path/to/image', ['KIDNEYS'], []) label_tag = LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag', [LabelTool.RECTANGLE], task.id) scan = ScansRepository.add_new_scan(dataset, 3) user_id = UsersRepository.add_new_user( User('user@medtagger', 'HASH', 'Admin', 'Admin')) user = UsersRepository.get_user_by_id(user_id) # Step 2. Add Label with Brush Elements label = LabelsRepository.add_new_label(scan.id, task.key, user, LabelingTime(0), is_predefined=True) LabelsRepository.add_new_brush_label_element(label.id, 0, 0, 0, b'', label_tag) LabelsRepository.add_new_brush_label_element(label.id, 1, 0, 0, b'', label_tag) LabelsRepository.add_new_brush_label_element(label.id, 2, 0, 0, b'', label_tag) # Step 3. Check if there is is Predefined Label brush_label_elements = LabelsRepository.get_predefined_brush_label_elements( scan.id, task.id, 0, 3) assert len(brush_label_elements) == 3 brush_label_elements = LabelsRepository.get_predefined_brush_label_elements( scan.id, task.id, 0, 1) assert len(brush_label_elements) == 1
def test_get_predefined_label_for_scan_in_task__predefined_label( prepare_environment: Any) -> None: """Test for fetching Predefined Label that exists.""" # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') task = TasksRepository.add_task('MARK_KIDNEYS', 'Mark Kidneys', 'path/to/image', ['KIDNEYS'], []) LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag', [LabelTool.RECTANGLE], task.id) scan = ScansRepository.add_new_scan(dataset, 0) user_id = UsersRepository.add_new_user( User('user@medtagger', 'HASH', 'Admin', 'Admin')) user = UsersRepository.get_user_by_id(user_id) # Step 2. Add Label which is predefined label = LabelsRepository.add_new_label(scan.id, task.key, user, LabelingTime(0), is_predefined=True) # Step 3. Check if there is is Predefined Label predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task( scan, task) assert predefined_label assert predefined_label.id == label.id
def create_empty_scan(dataset_key: str, declared_number_of_slices: int) -> Scan: """Create new empty scan. :param dataset_key: string with dataset key :param declared_number_of_slices: number of Slices that will be uploaded :return: Newly created Scan object """ user = get_current_user() dataset = DatasetsRepository.get_dataset_by_key(dataset_key) return ScansRepository.add_new_scan(dataset, declared_number_of_slices, user)
def test_get_paginated_scans_by_volunteer(prepare_environment: Any) -> None: """Test for fetching Scans in the paginated way by volunteers.""" api_client = get_api_client() user_token = get_token_for_logged_in_user('volunteer') # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') # Step 2. Add example Scans to the system for _ in range(50): ScansRepository.add_new_scan(dataset, number_of_slices=3) # Step 3. Fetch them with MedTagger REST API response = api_client.get('/api/v1/scans?dataset_key=KIDNEYS', headers=get_headers(token=user_token)) assert response.status_code == 403 json_response = json.loads(response.data) assert json_response['message'] == 'Access forbidden' assert json_response[ 'details'] == 'You don\'t have required roles to access this method.'
def prepare_scan_and_tag_for_labeling() -> Tuple[models.Scan, models.LabelTag]: """Create needed Scan and Label Tag for labeling purpose.""" dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') task = TasksRepository.add_task('MARK_KIDNEYS', 'Mark Kidneys', 'path/to/image', ['KIDNEYS'], []) label_tag = LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag', [definitions.LabelTool.POINT], task.id) scan = ScansRepository.add_new_scan(dataset, number_of_slices=3) for _ in range(3): scan.add_slice() return scan, label_tag
def test_get_predefined_label_for_scan_in_task__no_predefined_label( prepare_environment: Any) -> None: """Test for fetching Predefined Label that does not exist.""" # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') task = TasksRepository.add_task('MARK_KIDNEYS', 'Mark Kidneys', 'path/to/image', ['KIDNEYS'], []) LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag', [LabelTool.RECTANGLE], task.id) scan = ScansRepository.add_new_scan(dataset, 0) # Step 2. Check if there is no Predefined Label predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task( scan, task) assert not predefined_label
def test_get_predefined_label_for_scan_in_task__predefined_label_for_given_task( prepare_environment: Any) -> None: """Test for fetching Predefined Label only for specific Task.""" # Step 1. Prepare a structure for the test dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys') task_left = TasksRepository.add_task('MARK_LEFT', 'Mark Left', 'path/to/image', ['KIDNEYS'], '', [], []) task_right = TasksRepository.add_task('MARK_RIGHT', 'Mark Right', 'path/to/image', ['KIDNEYS'], '', [], []) LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag', [LabelTool.RECTANGLE], task_left.id) scan = ScansRepository.add_new_scan(dataset, 0) user_id = UsersRepository.add_new_user( User('user@medtagger', 'HASH', 'Admin', 'Admin')) user = UsersRepository.get_user_by_id(user_id) # Step 2. Add Labels for each Task label_left = LabelsRepository.add_new_label(scan.id, task_left.key, user, LabelingTime(0), is_predefined=True) label_right = LabelsRepository.add_new_label(scan.id, task_right.key, user, LabelingTime(0), is_predefined=True) # Step 3. Check if there are these Predefined Labels predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task( scan, task_left) assert predefined_label assert predefined_label.id == label_left.id predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task( scan, task_right) assert predefined_label assert predefined_label.id == label_right.id
logging.config.fileConfig('logging.conf') logger = logging.getLogger(__name__) parser = argparse.ArgumentParser(description='Import data to the MedTagger.') parser.add_argument('--source', type=str, required=True, help='Source directory') parser.add_argument('--dataset', type=str, required=True, help='Dataset key for these scans') args = parser.parse_args() if __name__ == '__main__': logger.info('Checking Dataset...') dataset = DatasetsRepository.get_dataset_by_key(args.dataset) source = args.source.rstrip('/') for scan_directory in glob.iglob(source + '/*'): if not os.path.isdir(scan_directory): logger.warning('"%s" is not a directory. Skipping...', scan_directory) continue logger.info('Adding new Scan from "%s".', scan_directory) slice_names = glob.glob(scan_directory + '/*.dcm') number_of_slices = len(slice_names) scan = ScansRepository.add_new_scan(dataset, number_of_slices, None) for slice_name in slice_names: logger.info('Adding new Slice to Scan "%s" based on "%s".', scan.id, slice_name) with open(slice_name, 'rb') as slice_dicom_file: _slice = scan.add_slice() image = slice_dicom_file.read() parse_dicom_and_update_slice.delay(_slice.id, image)