From 8453e9efaea7a53289eabbd849ad9300fb3f0f1d Mon Sep 17 00:00:00 2001 From: eblondel Date: Tue, 14 May 2024 02:45:10 +0200 Subject: [PATCH] #133 method reserveDOI --- R/ZenodoManager.R | 46 +++++++++++++++++++++++-- R/ZenodoRecord.R | 76 +++++++++++++++++++++------------------- man/ZenodoManager.Rd | 27 +++++++++++++-- man/ZenodoRecord.Rd | 82 +++++++++++++++++++------------------------- 4 files changed, 145 insertions(+), 86 deletions(-) diff --git a/R/ZenodoManager.R b/R/ZenodoManager.R index d2d829a..150c070 100644 --- a/R/ZenodoManager.R +++ b/R/ZenodoManager.R @@ -1095,10 +1095,11 @@ ZenodoManager <- R6Class("ZenodoManager", #' @description Deposits a record on Zenodo. #' @param record the record to deposit, object of class \code{ZenodoRecord} + #' @param reserveDOI reserve DOI. By default \code{TRUE} #' @param publish object of class \code{logical} indicating if record has to be published (default \code{FALSE}). #' Can be set to \code{TRUE} (to use CAUTIOUSLY, only if you want to publish your record) - #' @return \code{TRUE} if deposited (and eventually published), \code{FALSE} otherwise - depositRecord = function(record, publish = FALSE){ + #' @return object of class \code{ZenodoRecord} + depositRecord = function(record, reserveDOI = TRUE, publish = FALSE){ data <- record type <- ifelse(is.null(record$id), "POST", "PUT") request <- ifelse(is.null(record$id), "records", @@ -1113,6 +1114,18 @@ ZenodoManager <- R6Class("ZenodoManager", infoMsg = "Successful record deposition" cli::cli_alert_success(infoMsg) self$INFO(infoMsg) + + if(reserveDOI){ + if(is.null(record$pids$doi)){ + out <- self$reserveDOI(out) + }else{ + warnMsg = sprintf("Existing DOI (%s) for record %s. Aborting DOI reservation!", record$pids$doi$identifier, out$id) + cli::cli_alert_warning(warnMsg) + self$WARN(warnMsg) + } + + } + }else{ out <- zenReq$getResponse() errMsg = sprintf("Error while depositing record: %s", out$message) @@ -1132,6 +1145,35 @@ ZenodoManager <- R6Class("ZenodoManager", return(out) }, + #'@description Reserves a DOI for a deposition (draft record) + #' @param record the record to deposit, object of class \code{ZenodoRecord} + #'@return object of class \code{ZenodoRecord} + reserveDOI = function(record){ + request <- sprintf("records/%s/draft/pids/doi", record$id) + zenReq <- ZenodoRequest$new(private$url, "POST", request, data = NULL, + token = self$getToken(), + logger = self$loggerType) + zenReq$execute() + out <- NULL + if(zenReq$getStatus() == 201){ + out <- ZenodoRecord$new(obj = zenReq$getResponse()) + infoMsg = sprintf("Successful reserved DOI for record %s", record$id) + cli::cli_alert_success(infoMsg) + self$INFO(infoMsg) + }else{ + out <- zenReq$getResponse() + errMsg = sprintf("Error while reserving DOI for record %s: %s", record$id, out$message) + cli::cli_alert_danger(errMsg) + self$ERROR(errMsg) + for(error in out$errors){ + errMsg = sprintf("Error: %s - %s", error$field, error$message) + cli::cli_alert_danger(errMsg) + self$ERROR(errMsg) + } + } + return(out) + }, + #' @description Deposits a record version on Zenodo. For details about the behavior of this function, #' see \href{https://developers.zenodo.org/#new-version}{https://developers.zenodo.org/#new-version} #' @param record the record version to deposit, object of class \code{ZenodoRecord} diff --git a/R/ZenodoRecord.R b/R/ZenodoRecord.R index f8f39a7..99c0da1 100644 --- a/R/ZenodoRecord.R +++ b/R/ZenodoRecord.R @@ -70,29 +70,24 @@ ZenodoRecord <- R6Class("ZenodoRecord", } ), public = list( + + #' @field created record creation date + created = NULL, #' @field access access policies access = list( record = "public", files = "public" ), + + #v LEGACY (TO ANALYZE) #' @field conceptdoi record Concept DOI (common to all record versions) conceptdoi = NULL, #' @field conceptrecid record concept id conceptrecid = NULL, - #' @field created record creation date - created = NULL, #' @field doi record doi doi = NULL, #' @field doi_url record doi URL doi_url = NULL, - #' @field files list of files associated to the record - files = list(), - #' @field id record id - id = NULL, - #' @field links list of links associated to the record - links = list(), - #' @field metadata metadata elements associated to the record - metadata = list(), #' @field modified record modification date modified = NULL, #' @field owners record owners @@ -107,6 +102,25 @@ ZenodoRecord <- R6Class("ZenodoRecord", submitted = FALSE, #' @field revision record revision revision = NULL, + #^ LEGACY + + #' @field files list of files associated to the record + files = list(), + #' @field id record id + id = NULL, + #' @field links list of links associated to the record + links = list(), + #' @field media_files media files + media_files = list(), + #' @field metadata metadata elements associated to the record + metadata = list(), + #' @field parent parent record + parent = NULL, + #' @field pids pids + pids = list(), + + #zen4R specific fields + #' @field stats stats stats = NULL, @@ -119,6 +133,15 @@ ZenodoRecord <- R6Class("ZenodoRecord", if(!is.null(obj)) private$fromList(obj) }, + #zen4R specific methods + #--------------------------------------------------------------------------- + + #' @description Get record statistics + #' @return statistics as \code{data.frame} + getStats = function(){ + return(self$stats) + }, + #Invenio RDM API new methods #--------------------------------------------------------------------------- #'@description Set the access policy for record, among values "public" (default) or "restricted" @@ -142,29 +165,17 @@ ZenodoRecord <- R6Class("ZenodoRecord", self$access$embargo = list(active = active, until = until, reason = reason) }, - #legacy REST API methods (to be evaluated under Zenodo Invenio RDM migration) - #---------------------------------------------------------------------------- - - #' @description Set prereserve_doi if \code{TRUE}, \code{FALSE} otherwise to create a record without - #' prereserved DOI by Zenodo. By default, this method will be called to prereserve a DOI assuming - #' the record created doesn't yet handle a DOI. To avoid prereserving a DOI call \code{$prereserveDOI(FALSE)} - #' on your record. - #' @param prereserve whether a DOI has to be pre-reserved by Zenodo - prereserveDOI = function(prereserve){ - if(!is(prereserve,"logical")){ - stop("The argument should be 'logical' (TRUE/FALSE)") - } - self$metadata$prereserve_doi <- prereserve - }, - #' @description Set the DOI. This method can be used if a DOI has been already assigned outside Zenodo. - #' This method will call the method \code{$prereserveDOI(FALSE)}. #' @param doi DOI to set for the record - setDOI = function(doi){ - self$metadata$doi <- doi - self$prereserveDOI(FALSE) + #' @param provider DOI provider + #' @param client DOI client + setDOI = function(doi, provider = NULL, client = NULL){ + self$pids = list(doi = list(identifier = doi, provider = provider, client = client)) }, + #legacy REST API methods (to be evaluated under Zenodo Invenio RDM migration) + #---------------------------------------------------------------------------- + #' @description Get the concept (generic) DOI. The concept DOI is a generic DOI common to all versions #' of a Zenodo record. When a deposit is unsubmitted, this concept DOI is inherited based #' on the prereserved DOI of the first record version. @@ -231,12 +242,7 @@ ZenodoRecord <- R6Class("ZenodoRecord", return(versions) }, - - #' @description Get record statistics - #' @return statistics as \code{data.frame} - getStats = function(){ - return(self$stats) - }, + #' @description Set the resource type (mandatory). #' @param resourceType record resource type diff --git a/man/ZenodoManager.Rd b/man/ZenodoManager.Rd index 88d9f33..f3e61e5 100644 --- a/man/ZenodoManager.Rd +++ b/man/ZenodoManager.Rd @@ -118,6 +118,7 @@ Emmanuel Blondel \item \href{#method-ZenodoManager-getDepositionById}{\code{ZenodoManager$getDepositionById()}} \item \href{#method-ZenodoManager-getDepositionByConceptId}{\code{ZenodoManager$getDepositionByConceptId()}} \item \href{#method-ZenodoManager-depositRecord}{\code{ZenodoManager$depositRecord()}} +\item \href{#method-ZenodoManager-reserveDOI}{\code{ZenodoManager$reserveDOI()}} \item \href{#method-ZenodoManager-depositRecordVersion}{\code{ZenodoManager$depositRecordVersion()}} \item \href{#method-ZenodoManager-deleteRecord}{\code{ZenodoManager$deleteRecord()}} \item \href{#method-ZenodoManager-deleteRecordByDOI}{\code{ZenodoManager$deleteRecordByDOI()}} @@ -788,7 +789,7 @@ an object of class \code{ZenodoRecord} if record does exist, NULL otherwise \subsection{Method \code{depositRecord()}}{ Deposits a record on Zenodo. \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{ZenodoManager$depositRecord(record, publish = FALSE)}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{ZenodoManager$depositRecord(record, reserveDOI = TRUE, publish = FALSE)}\if{html}{\out{
}} } \subsection{Arguments}{ @@ -796,13 +797,35 @@ Deposits a record on Zenodo. \describe{ \item{\code{record}}{the record to deposit, object of class \code{ZenodoRecord}} +\item{\code{reserveDOI}}{reserve DOI. By default \code{TRUE}} + \item{\code{publish}}{object of class \code{logical} indicating if record has to be published (default \code{FALSE}). Can be set to \code{TRUE} (to use CAUTIOUSLY, only if you want to publish your record)} } \if{html}{\out{}} } \subsection{Returns}{ -\code{TRUE} if deposited (and eventually published), \code{FALSE} otherwise +object of class \code{ZenodoRecord} +} +} +\if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-ZenodoManager-reserveDOI}{}}} +\subsection{Method \code{reserveDOI()}}{ +Reserves a DOI for a deposition (draft record) +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{ZenodoManager$reserveDOI(record)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{record}}{the record to deposit, object of class \code{ZenodoRecord}} +} +\if{html}{\out{
}} +} +\subsection{Returns}{ +object of class \code{ZenodoRecord} } } \if{html}{\out{
}} diff --git a/man/ZenodoRecord.Rd b/man/ZenodoRecord.Rd index 7bee606..f6e9a49 100644 --- a/man/ZenodoRecord.Rd +++ b/man/ZenodoRecord.Rd @@ -33,26 +33,18 @@ Emmanuel Blondel \section{Public fields}{ \if{html}{\out{
}} \describe{ +\item{\code{created}}{record creation date} + \item{\code{access}}{access policies} \item{\code{conceptdoi}}{record Concept DOI (common to all record versions)} \item{\code{conceptrecid}}{record concept id} -\item{\code{created}}{record creation date} - \item{\code{doi}}{record doi} \item{\code{doi_url}}{record doi URL} -\item{\code{files}}{list of files associated to the record} - -\item{\code{id}}{record id} - -\item{\code{links}}{list of links associated to the record} - -\item{\code{metadata}}{metadata elements associated to the record} - \item{\code{modified}}{record modification date} \item{\code{owners}}{record owners} @@ -67,6 +59,20 @@ Emmanuel Blondel \item{\code{revision}}{record revision} +\item{\code{files}}{list of files associated to the record} + +\item{\code{id}}{record id} + +\item{\code{links}}{list of links associated to the record} + +\item{\code{media_files}}{media files} + +\item{\code{metadata}}{metadata elements associated to the record} + +\item{\code{parent}}{parent record} + +\item{\code{pids}}{pids} + \item{\code{stats}}{stats} } \if{html}{\out{
}} @@ -75,16 +81,15 @@ Emmanuel Blondel \subsection{Public methods}{ \itemize{ \item \href{#method-ZenodoRecord-new}{\code{ZenodoRecord$new()}} +\item \href{#method-ZenodoRecord-getStats}{\code{ZenodoRecord$getStats()}} \item \href{#method-ZenodoRecord-setAccessPolicyRecord}{\code{ZenodoRecord$setAccessPolicyRecord()}} \item \href{#method-ZenodoRecord-setAccessPolicyFiles}{\code{ZenodoRecord$setAccessPolicyFiles()}} \item \href{#method-ZenodoRecord-setAccessPolicyEmbargo}{\code{ZenodoRecord$setAccessPolicyEmbargo()}} -\item \href{#method-ZenodoRecord-prereserveDOI}{\code{ZenodoRecord$prereserveDOI()}} \item \href{#method-ZenodoRecord-setDOI}{\code{ZenodoRecord$setDOI()}} \item \href{#method-ZenodoRecord-getConceptDOI}{\code{ZenodoRecord$getConceptDOI()}} \item \href{#method-ZenodoRecord-getFirstDOI}{\code{ZenodoRecord$getFirstDOI()}} \item \href{#method-ZenodoRecord-getLastDOI}{\code{ZenodoRecord$getLastDOI()}} \item \href{#method-ZenodoRecord-getVersions}{\code{ZenodoRecord$getVersions()}} -\item \href{#method-ZenodoRecord-getStats}{\code{ZenodoRecord$getStats()}} \item \href{#method-ZenodoRecord-setResourceType}{\code{ZenodoRecord$setResourceType()}} \item \href{#method-ZenodoRecord-setUploadType}{\code{ZenodoRecord$setUploadType()}} \item \href{#method-ZenodoRecord-setPublicationType}{\code{ZenodoRecord$setPublicationType()}} @@ -212,6 +217,19 @@ or "DEBUG" (for complete curl http calls logs)} } } \if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-ZenodoRecord-getStats}{}}} +\subsection{Method \code{getStats()}}{ +Get record statistics +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{ZenodoRecord$getStats()}\if{html}{\out{
}} +} + +\subsection{Returns}{ +statistics as \code{data.frame} +} +} +\if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ZenodoRecord-setAccessPolicyRecord}{}}} \subsection{Method \code{setAccessPolicyRecord()}}{ @@ -267,39 +285,22 @@ Set access policy embargo options } } \if{html}{\out{
}} -\if{html}{\out{}} -\if{latex}{\out{\hypertarget{method-ZenodoRecord-prereserveDOI}{}}} -\subsection{Method \code{prereserveDOI()}}{ -Set prereserve_doi if \code{TRUE}, \code{FALSE} otherwise to create a record without - prereserved DOI by Zenodo. By default, this method will be called to prereserve a DOI assuming - the record created doesn't yet handle a DOI. To avoid prereserving a DOI call \code{$prereserveDOI(FALSE)} - on your record. -\subsection{Usage}{ -\if{html}{\out{
}}\preformatted{ZenodoRecord$prereserveDOI(prereserve)}\if{html}{\out{
}} -} - -\subsection{Arguments}{ -\if{html}{\out{
}} -\describe{ -\item{\code{prereserve}}{whether a DOI has to be pre-reserved by Zenodo} -} -\if{html}{\out{
}} -} -} -\if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ZenodoRecord-setDOI}{}}} \subsection{Method \code{setDOI()}}{ Set the DOI. This method can be used if a DOI has been already assigned outside Zenodo. - This method will call the method \code{$prereserveDOI(FALSE)}. \subsection{Usage}{ -\if{html}{\out{
}}\preformatted{ZenodoRecord$setDOI(doi)}\if{html}{\out{
}} +\if{html}{\out{
}}\preformatted{ZenodoRecord$setDOI(doi, provider = NULL, client = NULL)}\if{html}{\out{
}} } \subsection{Arguments}{ \if{html}{\out{
}} \describe{ \item{\code{doi}}{DOI to set for the record} + +\item{\code{provider}}{DOI provider} + +\item{\code{client}}{DOI client} } \if{html}{\out{
}} } @@ -360,19 +361,6 @@ a \code{data.frame} with the record versions } } \if{html}{\out{
}} -\if{html}{\out{}} -\if{latex}{\out{\hypertarget{method-ZenodoRecord-getStats}{}}} -\subsection{Method \code{getStats()}}{ -Get record statistics -\subsection{Usage}{ -\if{html}{\out{
}}\preformatted{ZenodoRecord$getStats()}\if{html}{\out{
}} -} - -\subsection{Returns}{ -statistics as \code{data.frame} -} -} -\if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-ZenodoRecord-setResourceType}{}}} \subsection{Method \code{setResourceType()}}{