From 13967bda722ee1f6bee60908f602b5f369f1e801 Mon Sep 17 00:00:00 2001 From: zzacharo Date: Tue, 14 Jan 2025 14:44:32 +0100 Subject: [PATCH 1/2] pids: pass optional DOI transitions in the upload form --- invenio_app_rdm/records_ui/views/deposits.py | 39 ++++++++++++++++++- .../invenio_app_rdm/deposit/RDMDepositForm.js | 1 + 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/invenio_app_rdm/records_ui/views/deposits.py b/invenio_app_rdm/records_ui/views/deposits.py index 79793b312..a9ccfe73b 100644 --- a/invenio_app_rdm/records_ui/views/deposits.py +++ b/invenio_app_rdm/records_ui/views/deposits.py @@ -23,6 +23,9 @@ from invenio_rdm_records.proxies import current_rdm_records from invenio_rdm_records.records.api import get_files_quota from invenio_rdm_records.resources.serializers import UIJSONSerializer +from invenio_rdm_records.services.components.pids import ( + _get_optional_doi_transitions, +) from invenio_rdm_records.services.schemas import RDMRecordSchema from invenio_rdm_records.services.schemas.utils import dump_empty from invenio_records_resources.services.errors import PermissionDeniedError @@ -45,7 +48,7 @@ # # Helpers # -def get_form_pids_config(): +def get_form_pids_config(record=None): """Prepare configuration for the pids field. Currently supporting only doi. @@ -55,17 +58,45 @@ def get_form_pids_config(): # FIXME: User provider.is_managed() requires tiny fix in config can_be_managed = True can_be_unmanaged = True + # We initialize the optional doi to empty to indicate that there is no restriction on the transitions + # This is valid for new uploads and when the DOI is required in an instance + optional_doi_transitions = [] for scheme in service.config.pids_providers.keys(): if not scheme == "doi": continue + record_pid_config = current_app.config["RDM_PERSISTENT_IDENTIFIERS"] scheme_label = record_pid_config.get(scheme, {}).get("label", scheme) is_doi_required = record_pid_config.get(scheme, {}).get("required") default_selected = ( record_pid_config.get(scheme, {}).get("ui", {}).get("default_selected") ) + if record is not None and not is_doi_required: + sitename = current_app.config.get("THEME_SITENAME", "this repository") + previous_published_record = ( + service.record_cls.get_latest_published_by_parent(record.parent) + ) + optional_doi_transitions = _get_optional_doi_transitions( + previous_published_record + ) + if optional_doi_transitions: + optional_doi_transitions["message"] = optional_doi_transitions.get( + "message" + ).format(sitename=sitename) + if set(optional_doi_transitions.get("allowed_providers", [])) - set( + ["external", "not_needed"] + ): + # In case we have locally managed provider as an allowed one, we need to + # select it by default. That is relevant for the case when the + # user creates a new version of the record and the previous version + # had a datacite DOI. + default_selected = "no" + + # if the DOI is required but the default selected is not_needed then we set it to yes + # to force the user to mint a DOI if is_doi_required and default_selected == "not_needed": default_selected = "yes" + pids_provider = { "scheme": scheme, "field_label": "Digital Object Identifier", @@ -89,6 +120,7 @@ def get_form_pids_config(): "unambiguously cited. Example: 10.1234/foo.bar" ).format(scheme_label=scheme_label), "default_selected": default_selected, + "optional_doi_transitions": optional_doi_transitions, } pids_providers.append(pids_provider) @@ -332,6 +364,8 @@ def get_form_config(**kwargs): if record_quota: quota["maxStorage"] = record_quota["quota_size"] + record = kwargs.pop("record", None) + return dict( vocabularies=VocabulariesOptions().dump(), autocomplete_names=conf.get( @@ -339,7 +373,7 @@ def get_form_config(**kwargs): ), current_locale=str(current_i18n.locale), default_locale=conf.get("BABEL_DEFAULT_LOCALE", "en"), - pids=get_form_pids_config(), + pids=get_form_pids_config(record=record), quota=quota, decimal_size_display=conf.get("APP_RDM_DISPLAY_DECIMAL_FILE_SIZES", True), links=dict( @@ -490,6 +524,7 @@ def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True): # hide react community component hide_community_selection=community_use_jinja_header, is_doi_required=is_doi_required, + record=draft._record, ) if is_doi_required and not record.get("pids", {}).get("doi"): diff --git a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js index ef0329622..997d64c5f 100644 --- a/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +++ b/invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js @@ -211,6 +211,7 @@ export class RDMDepositForm extends Component { btnLabelGetPID={pid.btn_label_get_pid} canBeManaged={pid.can_be_managed} canBeUnmanaged={pid.can_be_unmanaged} + optionalDOItransitions={pid.optional_doi_transitions} fieldPath={`pids.${pid.scheme}`} fieldLabel={pid.field_label} isEditingPublishedRecord={ From b32d974eb299547622759ed6272c3c63a191c352 Mon Sep 17 00:00:00 2001 From: zzacharo Date: Mon, 20 Jan 2025 13:59:37 +0100 Subject: [PATCH 2/2] deposit: force no caching in the response headers Co-authored-by: jrcastro2 closes https://github.com/CERNDocumentServer/cds-rdm/issues/302 --- .../records_ui/views/decorators.py | 21 +++++++++++++++++++ invenio_app_rdm/records_ui/views/deposits.py | 7 ++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/invenio_app_rdm/records_ui/views/decorators.py b/invenio_app_rdm/records_ui/views/decorators.py index 122c2af18..7db8f81c4 100644 --- a/invenio_app_rdm/records_ui/views/decorators.py +++ b/invenio_app_rdm/records_ui/views/decorators.py @@ -403,3 +403,24 @@ def view(**kwargs): return view return decorator + + +def no_cache_response(f): + """Add appropriate response headers to force no caching. + + This decorator is used to prevent caching of the response in the browser. This is needed + in the deposit form as we initialize the form with the record metadata included in the html page + and we don't want the browser to cache this page so that the user always gets the latest version of the record. + """ + + @wraps(f) + def view(*args, **kwargs): + response = make_response(f(*args, **kwargs)) + + response.cache_control.no_cache = True + response.cache_control.no_store = True + response.cache_control.must_revalidate = True + + return response + + return view diff --git a/invenio_app_rdm/records_ui/views/deposits.py b/invenio_app_rdm/records_ui/views/deposits.py index a9ccfe73b..d1932b7d5 100644 --- a/invenio_app_rdm/records_ui/views/deposits.py +++ b/invenio_app_rdm/records_ui/views/deposits.py @@ -23,9 +23,7 @@ from invenio_rdm_records.proxies import current_rdm_records from invenio_rdm_records.records.api import get_files_quota from invenio_rdm_records.resources.serializers import UIJSONSerializer -from invenio_rdm_records.services.components.pids import ( - _get_optional_doi_transitions, -) +from invenio_rdm_records.services.components.pids import _get_optional_doi_transitions from invenio_rdm_records.services.schemas import RDMRecordSchema from invenio_rdm_records.services.schemas.utils import dump_empty from invenio_records_resources.services.errors import PermissionDeniedError @@ -37,6 +35,7 @@ from ..utils import set_default_value from .decorators import ( + no_cache_response, pass_draft, pass_draft_community, pass_draft_files, @@ -424,6 +423,7 @@ def new_record(): # Views # @login_required +@no_cache_response @pass_draft_community def deposit_create(community=None): """Create a new deposit.""" @@ -475,6 +475,7 @@ def deposit_create(community=None): @secret_link_or_login_required() @pass_draft(expand=True) @pass_draft_files +@no_cache_response def deposit_edit(pid_value, draft=None, draft_files=None, files_locked=True): """Edit an existing deposit.""" # don't show draft's deposit form if the user can't edit it