Пример #1
0
def dataverse_set_config(node_addon, auth, **kwargs):
    """Saves selected Dataverse and dataset to node settings"""

    user_settings = node_addon.user_settings
    user = auth.user

    if user_settings and user_settings.owner != user:
        raise HTTPError(http.FORBIDDEN)

    try:
        assert_clean(request.json)
    except AssertionError:
        # TODO: Test me!
        raise HTTPError(http.NOT_ACCEPTABLE)

    alias = request.json.get('dataverse', {}).get('alias')
    doi = request.json.get('dataset', {}).get('doi')

    if doi is None or alias is None:
        return HTTPError(http.BAD_REQUEST)

    connection = client.connect_from_settings(node_addon)
    dataverse = client.get_dataverse(connection, alias)
    dataset = client.get_dataset(dataverse, doi)

    node_addon.set_folder(dataverse, dataset, auth)

    return {'dataverse': dataverse.title, 'dataset': dataset.title}, http.OK
Пример #2
0
    def serialized_node_settings(self):
        result = super(DataverseSerializer, self).serialized_node_settings
        result['hosts'] = DEFAULT_HOSTS

        # Update with Dataverse specific fields
        if self.node_settings.has_auth:
            external_account = self.node_settings.external_account
            dataverse_host = external_account.oauth_key

            connection = client.connect_from_settings(self.node_settings)
            dataverses = client.get_dataverses(connection)
            result.update({
                'dataverseHost': dataverse_host,
                'connected': connection is not None,
                'dataverses': [
                    {'title': dataverse.title, 'alias': dataverse.alias}
                    for dataverse in dataverses
                ],
                'savedDataverse': {
                    'title': self.node_settings.dataverse,
                    'alias': self.node_settings.dataverse_alias,
                },
                'savedDataset': {
                    'title': self.node_settings.dataset,
                    'doi': self.node_settings.dataset_doi,
                }
            })

        return result
Пример #3
0
def dataverse_set_config(node_addon, auth, **kwargs):
    """Saves selected Dataverse and dataset to node settings"""

    user_settings = node_addon.user_settings
    user = auth.user

    if user_settings and user_settings.owner != user:
        raise HTTPError(http.FORBIDDEN)

    try:
        assert_clean(request.json)
    except AssertionError:
        # TODO: Test me!
        raise HTTPError(http.NOT_ACCEPTABLE)

    alias = request.json.get('dataverse', {}).get('alias')
    doi = request.json.get('dataset', {}).get('doi')

    if doi is None or alias is None:
        return HTTPError(http.BAD_REQUEST)

    connection = client.connect_from_settings(node_addon)
    dataverse = client.get_dataverse(connection, alias)
    dataset = client.get_dataset(dataverse, doi)

    node_addon.set_folder(dataverse, dataset, auth)

    return {'dataverse': dataverse.title, 'dataset': dataset.title}, http.OK
Пример #4
0
def dataverse_set_config(node_addon, auth, **kwargs):
    """Saves selected Dataverse and dataset to node settings"""

    user_settings = node_addon.user_settings
    user = auth.user

    if user_settings and user_settings.owner != user:
        raise HTTPError(http_status.HTTP_403_FORBIDDEN)

    alias = request.json.get('dataverse', {}).get('alias')
    doi = request.json.get('dataset', {}).get('doi')

    if doi is None or alias is None:
        return HTTPError(http_status.HTTP_400_BAD_REQUEST)

    connection = client.connect_from_settings(node_addon)
    dataverse = client.get_dataverse(connection, alias)
    dataset = client.get_dataset(dataverse, doi)

    node_addon.set_folder(dataverse, dataset, auth)

    return {
        'dataverse': dataverse.title,
        'dataset': dataset.title
    }, http_status.HTTP_200_OK
Пример #5
0
    def test_connect_from_settings(self, mock_connect):
        node_settings = NodeSettings()
        node_settings.external_account = create_external_account(
            self.host, self.token,
        )

        connection = connect_from_settings(node_settings)
        assert_true(connection)
        mock_connect.assert_called_once_with(self.host, self.token)
Пример #6
0
    def test_connect_from_settings(self, mock_connect):
        node_settings = NodeSettings()
        node_settings.external_account = create_external_account(
            self.host,
            self.token,
        )

        connection = connect_from_settings(node_settings)
        assert_true(connection)
        mock_connect.assert_called_once_with(self.host, self.token)
Пример #7
0
def dataverse_get_datasets(node_addon, **kwargs):
    """Get list of datasets from provided Dataverse alias"""
    alias = request.json.get('alias')

    connection = client.connect_from_settings(node_addon)
    dataverse = client.get_dataverse(connection, alias)
    datasets = client.get_datasets(dataverse)
    ret = {
        'alias': alias,  # include alias to verify dataset container
        'datasets': [{'title': dataset.title, 'doi': dataset.doi} for dataset in datasets],
    }
    return ret, http.OK
Пример #8
0
 def test_connect_from_settings_none(self):
     connection = connect_from_settings(None)
     assert_is_none(connection)
Пример #9
0
 def test_connect_from_settings_none(self):
     connection = connect_from_settings(None)
     assert_is_none(connection)
Пример #10
0
def _dataverse_root_folder(node_addon, auth, **kwargs):
    node = node_addon.owner

    default_version = 'latest-published'
    version = 'latest-published' if not node.can_edit(
        auth) else default_version

    # Quit if no dataset linked
    if not node_addon.complete:
        return []

    can_edit = node.can_edit(auth)

    permissions = {
        'edit': can_edit and not node.is_registration,
        'view': node.can_view(auth)
    }

    try:
        connection = client.connect_from_settings(node_addon)
        dataverse = client.get_dataverse(connection,
                                         node_addon.dataverse_alias)
        dataset = client.get_dataset(dataverse, node_addon.dataset_doi)
    except SSLError:
        return [
            rubeus.build_addon_root(
                node_addon,
                node_addon.dataset,
                permissions=permissions,
                private_key=kwargs.get('view_only', None),
            )
        ]

    # Quit if doi does not produce a dataset
    if dataset is None:
        return []

    published_files = client.get_files(dataset, published=True)

    # Produce draft version or quit if no published version is available
    if not published_files:
        if can_edit:
            version = 'latest'
        else:
            return []

    urls = {
        'publish': node.api_url_for('dataverse_publish_dataset'),
    }

    # determine if there are any changes between the published and draft
    # versions of the dataset
    try:
        dataset.get_metadata('latest-published')
        dataset_is_published = True
        dataset_draft_modified = dataset.get_state() == 'DRAFT'
    except VersionJsonNotFoundError:
        dataset_is_published = False
        dataset_draft_modified = True

    # Get the dataverse host
    # (stored in oauth_key because dataverse doesn't use that)
    dataverse_host = node_addon.external_account.oauth_key

    try:
        host_custom_publish_text = client.get_custom_publish_text(connection)
    except OperationFailedError:
        host_custom_publish_text = ''

    return [
        rubeus.build_addon_root(
            node_addon,
            node_addon.dataset,
            urls=urls,
            permissions=permissions,
            dataset=node_addon.dataset,
            doi=dataset.doi,
            dataverse=dataverse.title,
            hasPublishedFiles=bool(published_files),
            dataverseIsPublished=dataverse.is_published,
            datasetIsPublished=dataset_is_published,
            datasetDraftModified=dataset_draft_modified,
            version=version,
            host=dataverse_host,
            hostCustomPublishText=host_custom_publish_text,
            private_key=kwargs.get('view_only', None),
        )
    ]
Пример #11
0
def _dataverse_root_folder(node_addon, auth, **kwargs):
    node = node_addon.owner

    default_version = 'latest-published'
    version = 'latest-published' if not node.can_edit(auth) else default_version

    # Quit if no dataset linked
    if not node_addon.complete:
        return []

    can_edit = node.can_edit(auth)

    permissions = {
        'edit': can_edit and not node.is_registration,
        'view': node.can_view(auth)
    }

    try:
        connection = client.connect_from_settings(node_addon)
        dataverse = client.get_dataverse(connection, node_addon.dataverse_alias)
        dataset = client.get_dataset(dataverse, node_addon.dataset_doi)
    except SSLError:
        return [rubeus.build_addon_root(
            node_addon,
            node_addon.dataset,
            permissions=permissions,
            private_key=kwargs.get('view_only', None),
        )]

    # Quit if doi does not produce a dataset
    if dataset is None:
        return []

    published_files = client.get_files(dataset, published=True)

    # Produce draft version or quit if no published version is available
    if not published_files:
        if can_edit:
            version = 'latest'
        else:
            return []

    urls = {
        'publish': node.api_url_for('dataverse_publish_dataset'),
    }

    # determine if there are any changes between the published and draft
    # versions of the dataset
    try:
        dataset.get_metadata('latest-published')
        dataset_is_published = True
        dataset_draft_modified = dataset.get_state() == 'DRAFT'
    except VersionJsonNotFoundError:
        dataset_is_published = False
        dataset_draft_modified = True

    # Get the dataverse host
    # (stored in oauth_key because dataverse doesn't use that)
    dataverse_host = node_addon.external_account.oauth_key

    try:
        host_custom_publish_text = client.get_custom_publish_text(connection)
    except OperationFailedError:
        host_custom_publish_text = ''

    return [rubeus.build_addon_root(
        node_addon,
        node_addon.dataset,
        urls=urls,
        permissions=permissions,
        dataset=node_addon.dataset,
        doi=dataset.doi,
        dataverse=dataverse.title,
        hasPublishedFiles=bool(published_files),
        dataverseIsPublished=dataverse.is_published,
        datasetIsPublished=dataset_is_published,
        datasetDraftModified=dataset_draft_modified,
        version=version,
        host=dataverse_host,
        hostCustomPublishText=host_custom_publish_text,
        private_key=kwargs.get('view_only', None),
    )]