feature: add doi retrieve endpoint

This commit is contained in:
David Eckhard
2021-03-15 17:41:36 +01:00
committed by Mojib Wali
parent e3897c8d46
commit 6cb248644b
2 changed files with 35 additions and 13 deletions

View File

@@ -110,7 +110,8 @@ TUG_ROUTES = {
"comingsoon": "/comingsoon", "comingsoon": "/comingsoon",
"deposit_create": "/uploads/new", "deposit_create": "/uploads/new",
"deposit_edit": "/uploads/<pid_value>", "deposit_edit": "/uploads/<pid_value>",
"record_detail": "/records/<pid_value>" "getdoi": "/getdoi",
"record_detail": "/records/<pid_value>",
} }
# Datacite # Datacite

View File

@@ -12,8 +12,9 @@ import binascii
from os import environ from os import environ
from typing import Dict from typing import Dict
import requests
from elasticsearch_dsl.utils import AttrDict from elasticsearch_dsl.utils import AttrDict
from flask import Blueprint, current_app, g, render_template from flask import Blueprint, current_app, g, render_template, request
from flask_login import login_required from flask_login import login_required
from flask_menu import current_menu from flask_menu import current_menu
from invenio_app_rdm.records_ui.views.decorators import ( from invenio_app_rdm.records_ui.views.decorators import (
@@ -51,6 +52,7 @@ def ui_blueprint(app):
blueprint.add_url_rule(routes["comingsoon"], view_func=comingsoon) blueprint.add_url_rule(routes["comingsoon"], view_func=comingsoon)
blueprint.add_url_rule(routes["deposit_create"], view_func=deposit_create) blueprint.add_url_rule(routes["deposit_create"], view_func=deposit_create)
blueprint.add_url_rule(routes["record_detail"], view_func=record_detail) blueprint.add_url_rule(routes["record_detail"], view_func=record_detail)
blueprint.add_url_rule(routes["getdoi"], view_func=retrieve_doi, methods=["POST"])
@blueprint.app_template_filter("make_dict_like") @blueprint.app_template_filter("make_dict_like")
def make_dict_like(value: str, key: str) -> Dict[str, str]: def make_dict_like(value: str, key: str) -> Dict[str, str]:
@@ -83,22 +85,40 @@ def comingsoon():
def get_datacite_details(): def get_datacite_details():
"""Application credentials for DOI.""" """Application credentials for DOI."""
url = environ.get('INVENIO_DATACITE_URL') or "" prefix = environ.get("INVENIO_DATACITE_PREFIX")
username = environ.get('INVENIO_DATACITE_UNAME') or ""
password = environ.get('INVENIO_DATACITE_PASS') or ""
prefix = environ.get('INVENIO_DATACITE_PREFIX') or ""
password_iv, encrypted_password = Cryptor.encrypt(password, Cryptor.KEY)
details = { details = {
"datacite_url": url,
"datacite_uname": username,
"datacite_pass": binascii.b2a_base64(encrypted_password).rstrip(),
"datacite_prefix": prefix, "datacite_prefix": prefix,
"datacite_password_iv": password_iv,
} }
return details return details
@login_required
def retrieve_doi():
"""Retrieve DOI from datacite API."""
doi_metadata = request.get_json()
url = environ.get("INVENIO_DATACITE_URL")
username = environ.get("INVENIO_DATACITE_UNAME")
password = environ.get("INVENIO_DATACITE_PASS")
doi_response = requests.post(
url,
auth=(username, password),
json=doi_metadata,
)
response_data = {"code": doi_response.status_code}
try:
doi_response.raise_for_status()
response_data["data"] = doi_response.json()
except requests.exceptions.RequestException:
response_data["errors"] = doi_response.json()["errors"]
return response_data, response_data["code"]
# #
# TODO: change this override behaviour once # TODO: change this override behaviour once
# PR is merged: # PR is merged:
@@ -138,6 +158,7 @@ def deposit_edit(draft=None, pid_value=None):
# TODO: get the `is_published` field when reading the draft # TODO: get the `is_published` field when reading the draft
from invenio_pidstore.errors import PIDUnregistered from invenio_pidstore.errors import PIDUnregistered
try: try:
service().draft_cls.pid.resolve(pid_value, registered_only=True) service().draft_cls.pid.resolve(pid_value, registered_only=True)
record["is_published"] = True record["is_published"] = True
@@ -158,7 +179,7 @@ def deposit_edit(draft=None, pid_value=None):
@pass_record @pass_record
@pass_record_files @pass_record_files
@user_permissions(actions=['update_draft']) @user_permissions(actions=["update_draft"])
def record_detail(record=None, files=None, pid_value=None, permissions=None): def record_detail(record=None, files=None, pid_value=None, permissions=None):
"""Record detail page (aka landing page).""" """Record detail page (aka landing page)."""
files_dict = None if files is None else files.to_dict() files_dict = None if files is None else files.to_dict()