Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions dandi/cli/cmd_service_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@
from copy import deepcopy
from datetime import datetime
from difflib import unified_diff
import json
import os
from pathlib import PurePosixPath
from textwrap import indent
from typing import Any, TypeVar
import urllib.parse
from uuid import uuid4

import click
from dandischema.consts import DANDI_SCHEMA_VERSION
from packaging.version import Version
from requests.auth import HTTPBasicAuth
from requests.exceptions import HTTPError

from .base import ChoiceList, instance_option, map_to_click_exceptions
from .. import __version__, lgr
Expand All @@ -23,6 +28,12 @@
T = TypeVar("T")


DOI_HUMAN_URLS = {
"https://api.test.datacite.org/dois": "https://doi.test.datacite.org/dois",
"https://api.datacite.org/dois": "https://doi.datacite.org/dois",
}


@click.group()
def service_scripts() -> None:
"""Various utility operations"""
Expand Down Expand Up @@ -123,6 +134,74 @@
asset.set_raw_metadata(mddict)


@service_scripts.command()
@instance_option()
@click.option(
"--version-ref",
metavar="DANDISET_VERSION_ID",
required=True,
help="ID of Dandiset/Version to operate on, ie DANDI:000005/0.250416.1418",
)
def publish_dandiset_version_doi(dandi_instance: str, version_ref: str) -> None:
from dandischema.datacite import to_datacite

Check warning on line 146 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L146

Added line #L146 was not covered by tests

if version_ref.startswith("DANDI:"):
version_ref = version_ref[len("DANDI:") :]
dandiset_id, dandiset_version_id = version_ref.split("/")

Check warning on line 150 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L148-L150

Added lines #L148 - L150 were not covered by tests

with DandiAPIClient.for_dandi_instance(dandi_instance, authenticate=True) as client:
ds = client.get_dandiset(dandiset_id, dandiset_version_id, lazy=False)
version_metadata = ds.get_raw_metadata()

Check warning on line 154 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L152-L154

Added lines #L152 - L154 were not covered by tests

username = os.environ["DJANGO_DANDI_DOI_API_USER"]
password = os.environ["DJANGO_DANDI_DOI_API_PASSWORD"]
base_url = os.environ["DJANGO_DANDI_DOI_API_URL"]

Check warning on line 158 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L156-L158

Added lines #L156 - L158 were not covered by tests

if not (doi := version_metadata.get("doi")):
print(json.dumps(version_metadata, indent=2))
raise NotImplementedError("Need to mint DOI")
if "10.80507" in doi and base_url == "https://api.datacite.org/dois":
if "dandi.123456" in doi:
raise ValueError(f"Hopeless case with fake DOI {doi}")

Check warning on line 165 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L160-L165

Added lines #L160 - L165 were not covered by tests
# we used to try to mint using wrong DOI prefix, fix was in
# https://github.com/dandi/dandi-schema/pull/65
print("Round-tripping through JSON, fixing DOI")

Check warning on line 168 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L168

Added line #L168 was not covered by tests
# round-trip through JSON to replace all such DOIs
version_metadata = json.loads(

Check warning on line 170 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L170

Added line #L170 was not covered by tests
json.dumps(version_metadata).replace("10.80507/", "10.48324/")
)
doi = version_metadata["doi"]

Check warning on line 173 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L173

Added line #L173 was not covered by tests
# TODO: fix up in dandi-archive DB!?
publish_str = os.environ.get("DJANGO_DANDI_DOI_PUBLISH", "False")
publish = {"true": True, "false": False}.get(publish_str.lower(), False)
doi_auth = HTTPBasicAuth(username, password)

Check warning on line 177 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L175-L177

Added lines #L175 - L177 were not covered by tests

headers = {"accept": "application/vnd.api+json", "content-type": "application/json"}
datacite_body = to_datacite(

Check warning on line 180 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L179-L180

Added lines #L179 - L180 were not covered by tests
version_metadata,
# validate=False,
publish=publish,
)
with RESTFullAPIClient(base_url) as doiclient:
try:
doidata = doiclient.post(

Check warning on line 187 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L185-L187

Added lines #L185 - L187 were not covered by tests
"", auth=doi_auth, headers=headers, json=datacite_body
)
except HTTPError as e:
print("Failed to create DOI %s", doi)
print("Datcite payload:")
print(datacite_body)
if e.response:
print(e.response.text)
raise

Check warning on line 196 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L190-L196

Added lines #L190 - L196 were not covered by tests

encoded_doi = urllib.parse.quote(

Check warning on line 198 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L198

Added line #L198 was not covered by tests
doidata["data"]["id"], safe=""
) # encode special chars
verify_url = f"{DOI_HUMAN_URLS[base_url]}/{encoded_doi}"
print(f"DOI successefully created, verify at {verify_url}")

Check warning on line 202 in dandi/cli/cmd_service_scripts.py

View check run for this annotation

Codecov / codecov/patch

dandi/cli/cmd_service_scripts.py#L201-L202

Added lines #L201 - L202 were not covered by tests


@service_scripts.command()
@click.option(
"-d",
Expand Down
Loading