Ejemplo n.º 1
0
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.'
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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.'
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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)