diff --git a/invenio.cfg b/invenio.cfg index 04f18851..2f34eafc 100644 --- a/invenio.cfg +++ b/invenio.cfg @@ -42,8 +42,7 @@ from invenio_rdm_records.services.components import DefaultRecordsComponents from invenio_oauthclient.views.client import auto_redirect_login from invenio_communities.communities.services import facets as community_facets - -from zenodo_rdm.custom_fields import CUSTOM_FIELDS_UI, CUSTOM_FIELDS, CUSTOM_FIELDS_FACETS, NAMESPACES +from zenodo_rdm.custom_fields import CUSTOM_FIELDS_UI, CUSTOM_FIELDS, CUSTOM_FIELDS_FACETS, NAMESPACES,COMMUNITY_FIELDS, COMMUNITY_FIELDS_UI from zenodo_rdm.views import frontpage_view_function from zenodo_rdm.permissions import ZenodoCommunityPermissionPolicy, ZenodoRDMRecordPermissionPolicy from zenodo_rdm.api import ZenodoRDMRecord, ZenodoRDMDraft @@ -642,6 +641,10 @@ RDM_CUSTOM_FIELDS = CUSTOM_FIELDS RDM_CUSTOM_FIELDS_UI = CUSTOM_FIELDS_UI # UI components +COMMUNITIES_CUSTOM_FIELDS_UI = COMMUNITY_FIELDS_UI + +COMMUNITIES_CUSTOM_FIELDS = COMMUNITY_FIELDS + # Invenio-Communities # ============== COMMUNITIES_GROUPS_ENABLED = False diff --git a/site/zenodo_rdm/custom_fields/__init__.py b/site/zenodo_rdm/custom_fields/__init__.py index c8ab2964..939a1cec 100644 --- a/site/zenodo_rdm/custom_fields/__init__.py +++ b/site/zenodo_rdm/custom_fields/__init__.py @@ -34,6 +34,10 @@ THESIS_NAMESPACE, ) +from .community_fields import ( + COMMUNITY_FIELDS, + COMMUNITY_FIELDS_UI, +) from .domain_fields import ( AUDIOVIS_FIELDS, AUDIOVIS_FIELDS_UI, diff --git a/site/zenodo_rdm/custom_fields/community_fields.py b/site/zenodo_rdm/custom_fields/community_fields.py new file mode 100644 index 00000000..351fb17b --- /dev/null +++ b/site/zenodo_rdm/custom_fields/community_fields.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2023 CERN. +# +# ZenodoRDM is free software; you can redistribute it and/or modify it +# under the terms of the MIT License; see LICENSE file for more details. + +"""Custom fields.""" +from invenio_i18n import lazy_gettext as _ +from invenio_vocabularies.services.custom_fields import VocabularyCF +from invenio_vocabularies.contrib.subjects.schema import SubjectRelationSchema +from invenio_vocabularies.contrib.subjects.api import Subject + + +class SubjectCF(VocabularyCF): + """Custom field for subjects.""" + + field_keys = ["id", "subject"] + + def __init__(self, **kwargs): + """Constructor.""" + super().__init__( + vocabulary_id="subjects", + schema=SubjectRelationSchema, + ui_schema=SubjectRelationSchema, + **kwargs + ) + self.pid_field = Subject.pid + + @property + def mapping(self): + """Return the mapping.""" + _mapping = { + "type": "object", + "properties": { + "@v": {"type": "keyword"}, + "id": {"type": "keyword"}, + "subject": {"type": "keyword"}, + }, + } + + return _mapping + + +COMMUNITY_FIELDS_UI = [ + { + "section": _("Subjects"), + "fields": [ + dict( + field="subjects", + ui_widget="SubjectAutocompleteDropdown", + props=dict( + label="Keywords and subjects", + icon="tag", + description="The subjects related to the community", + placeholder="Search for a subject by name e.g. Psychology ...", + autocompleteFrom="api/subjects", + autocompleteFromAcceptHeader="application/vnd.inveniordm.v1+json", + required=False, + multiple=True, + clearable=True, + allowAdditions=False, + ), + ) + ], + } +] + + +COMMUNITY_FIELDS = { + SubjectCF( + name="subjects", + multiple=True, + dump_options=False, + ) +}