Skip to content

Commit

Permalink
WIP More robust DOI commitment flow
Browse files Browse the repository at this point in the history
  • Loading branch information
zachmullen committed Aug 24, 2023
1 parent cad89ff commit f7ef814
Showing 1 changed file with 34 additions and 14 deletions.
48 changes: 34 additions & 14 deletions isic/core/services/collection/doi.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,17 @@ def collection_build_doi(*, collection: Collection, doi_id: str) -> dict:
}


def collection_build_draft_doi(*, doi_id: str) -> dict:
return {
"data": {
"type": "dois",
"attributes": {
"doi": doi_id,
},
}
}


def collection_generate_random_doi_id():
# pad DOI with leading zeros so all DOIs are prefix/6 digits
return f"{settings.ISIC_DATACITE_DOI_PREFIX}/{random.randint(10_000, 999_999):06}"
Expand Down Expand Up @@ -91,20 +102,29 @@ def _datacite_create_doi(doi: dict) -> None:
def collection_create_doi(*, user: User, collection: Collection) -> Doi:
collection_check_create_doi_allowed(user=user, collection=collection)
doi_id = collection_generate_random_doi_id()
draft_doi = collection_build_draft_doi(doi_id=doi_id)
doi = collection_build_doi(collection=collection, doi_id=doi_id)

try:
_datacite_create_doi(doi)
except HTTPError as e:
logger.error(e)
raise ValidationError("Something went wrong creating the DOI.")
else:
with transaction.atomic():
doi = Doi(id=doi_id, creator=user, url=f"https://doi.org/{doi_id}")
doi.full_clean()
doi.save()
collection_lock(collection=collection)
collection_update(collection=collection, doi=doi, ignore_lock=True)
logger.info("User %d created DOI %s for collection %d", user.id, doi.id, collection.id)

with transaction.atomic():
# First, create the local DOI record to validate uniqueness within our known set
doi = Doi(id=doi_id, creator=user, url=f"https://doi.org/{doi_id}")
doi.full_clean()
doi.save()

# Lock the collection, set the DOI on it
collection_lock(collection=collection)
collection_update(collection=collection, doi=doi, ignore_lock=True)

try:
# Reserve the DOI using the draft mechanism
_datacite_create_doi(draft_doi)
except HTTPError as e:
logger.error(e)
# Transaction will rollback, nothing in our database will change
raise ValidationError("Something went wrong creating the DOI.")
else:
logger.info("User %d created DOI %s for collection %d", user.id, doi.id, collection.id)

# Convert to a published DOI. Only question now is what happens if this fails.
_datacite_create_doi(doi)
return doi

0 comments on commit f7ef814

Please sign in to comment.