diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/PublishButton.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/PublishButton.js index 34518b157..2e9082af2 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/PublishButton.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/controls/PublishButton/PublishButton.js @@ -33,19 +33,19 @@ class PublishButtonComponent extends Component { handlePublish = (event, handleSubmit, publishWithoutCommunity) => { const { setSubmitContext } = this.context; const { formik, raiseDOINeededButNotReserved, isDOIRequired } = this.props; - const noINeedOne = formik?.values?.noINeedOne; + const noINeedDOI = formik?.values?.noINeedDOI; // Check for explicit DOI reservation via the "GET DOI button" only when DOI is // optional in the instance's settings. If it is required, backend will automatically // mint one even if it was not explicitly reserved const shouldCheckForExplicitDOIReservation = isDOIRequired !== undefined && // isDOIRequired is undefined when no value was provided from Invenio-app-rdm !isDOIRequired && - noINeedOne && + noINeedDOI && Object.keys(formik?.values?.pids).length === 0; if (shouldCheckForExplicitDOIReservation) { const errors = { pids: { - doi: i18next.t("DOI is needed. Please click on the button to reserve it."), + doi: i18next.t("DOI is needed. You need to reserve a DOI before publishing."), }, }; formik.setErrors(errors); diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField.js index e49437ef1..74e63df37 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/Identifiers/PIDField.js @@ -497,14 +497,14 @@ class CustomPIDField extends Component { form.setFieldValue("pids", {}); if (!required) { // We set the - form.setFieldValue("noINeedOne", true); + form.setFieldValue("noINeedDOI", true); } } else if (userSelectedNoNeed) { form.setFieldValue("pids", {}); - form.setFieldValue("noINeedOne", false); + form.setFieldValue("noINeedDOI", false); } else { this.onExternalIdentifierChanged(""); - form.setFieldValue("noINeedOne", false); + form.setFieldValue("noINeedDOI", false); } form.setFieldError(fieldPath, false); this.setState({ diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/actions/deposit.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/actions/deposit.js index f26659f68..393898bbd 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/actions/deposit.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/actions/deposit.js @@ -30,6 +30,7 @@ import { RESERVE_PID_STARTED, RESERVE_PID_SUCCEEDED, SET_COMMUNITY, + SET_DOI_NEEDED, } from "../types"; async function changeURLAfterCreation(draftURL) { @@ -152,6 +153,16 @@ export const save = (draft) => { type: DRAFT_SAVE_SUCCEEDED, payload: { data: response.data }, }); + + if (draft.noINeedDOI) { + // Save the choice that user selected that DOI is needed. This is used to validate + // if user has reserved a DOI before clicking publish. This check is valid when + // DOI is optional + dispatch({ + type: SET_DOI_NEEDED, + payload: { noINeedDOI: draft.noINeedDOI }, + }); + } }; }; @@ -344,3 +355,12 @@ export const changeSelectedCommunity = (community) => { }); }; }; + +export const setDOINeeded = (value) => { + return async (dispatch) => { + dispatch({ + type: SET_DOI_NEEDED, + payload: { noINeedDOI: value }, + }); + }; +}; diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/reducers/deposit.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/reducers/deposit.js index d910ece74..60e6ac2fb 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/reducers/deposit.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/reducers/deposit.js @@ -29,6 +29,7 @@ import { RESERVE_PID_STARTED, RESERVE_PID_SUCCEEDED, SET_COMMUNITY, + SET_DOI_NEEDED, } from "../types"; export class DepositStatus { @@ -332,13 +333,21 @@ const depositReducer = (state = {}, action) => { }, }; } - return { ...state, record: recordCopy, editorState: computeDepositState(recordCopy, action.payload.community), }; } + case SET_DOI_NEEDED: { + const recordCopy = { + ...state.record, + }; + return { + ...state, + record: { ...recordCopy, ...action.payload }, + }; + } default: return state; } diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/types/index.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/types/index.js index 81263b65f..bfb472ae3 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/types/index.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/state/types/index.js @@ -43,6 +43,8 @@ export const DISCARD_PID_STARTED = "DISCARD_PID_STARTED"; export const DISCARD_PID_SUCCEEDED = "DISCARD_PID_SUCCEEDED"; export const DISCARD_PID_FAILED = "DISCARD_PID_FAILED"; +export const SET_DOI_NEEDED = "SET_DOI_NEEDED"; + // Files export const FILE_UPLOAD_ADDED = "FILE_UPLOAD_ADDED"; export const FILE_UPLOAD_IN_PROGRESS = "FILE_UPLOAD_IN_PROGRESS"; diff --git a/invenio_rdm_records/services/components/pids.py b/invenio_rdm_records/services/components/pids.py index cb0401d05..2a35312ed 100644 --- a/invenio_rdm_records/services/components/pids.py +++ b/invenio_rdm_records/services/components/pids.py @@ -107,9 +107,9 @@ def update_draft(self, identity, data=None, record=None, errors=None): # if DOI is not required in an instance check validate allowed providers # for each record version - if "doi" not in required_schemes and not self.service.check_permission( - identity, "pid_manage" - ): + doi_required = "doi" in required_schemes + can_manage_dois = self.service.check_permission(identity, "pid_manage") + if not doi_required and not can_manage_dois: previous_published = self.service.record_cls.get_latest_published_by_parent( record.parent ) @@ -151,9 +151,9 @@ def publish(self, identity, draft=None, record=None): # if DOI is not required in an instance check validate allowed providers # for each record version - if "doi" not in required_schemes and not self.service.check_permission( - identity, "pid_manage" - ): + doi_required = "doi" in required_schemes + can_manage_dois = self.service.check_permission(identity, "pid_manage") + if not doi_required and not can_manage_dois: # if a doi was ever minted for the parent record then we always require one # for any version of the record that will be published if draft.parent.get("pids", {}).get("doi"): diff --git a/tests/services/test_rdm_service.py b/tests/services/test_rdm_service.py index 48351bc0d..76c2b7d05 100644 --- a/tests/services/test_rdm_service.py +++ b/tests/services/test_rdm_service.py @@ -13,7 +13,6 @@ from copy import deepcopy import pytest - from invenio_access.permissions import system_identity from invenio_rdm_records.proxies import current_rdm_records