diff --git a/Pipfile b/Pipfile index 1eb21429..9d96f80c 100644 --- a/Pipfile +++ b/Pipfile @@ -11,8 +11,6 @@ isort = "<6.0" # Unpin when isort==6.0.0 is released [packages] invenio-app-rdm = {version = "~=13.0.0b1.dev20", extras = ["opensearch2"]} - -invenio-logging = {extras = ["sentry_sdk"], version = "~=2.0"} sentry-sdk = ">=1.45,<2.0.0" zenodo_rdm = {editable="True", path="./site"} zenodo_legacy = {editable="True", path="./legacy"} diff --git a/Pipfile.lock b/Pipfile.lock index e1098833..0a6e5a17 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "73ae5d985728afe84230ced9a325c0ac3d63167d7c3c85c5e1cfe34b73db7bd1" + "sha256": "511eeb561390a5b6cf7090c4dd13689b197972a653f489d2d8f285ba006b1cd9" }, "pipfile-spec": 6, "requires": { @@ -1183,11 +1183,11 @@ "sentry_sdk" ], "hashes": [ - "sha256:6e9d74c3b89f85877c212e2e5224272cda04c5b27bed0576efcafc4670172824", - "sha256:f2f93f6a294061ab1e7b12572a9d1685d5476ca24af3062926e44e7b6b44ade1" + "sha256:0e8bbb6a3fe862ac9b3c2ec2d12e5589b836d51b4139d87e41ee538801e6d89c", + "sha256:71e0eb80488955a6d7a569074da38de5586e9c4b57a4e6e6de94a25834953026" ], - "index": "pypi", - "version": "==2.1.2" + "markers": "python_version >= '3.8'", + "version": "==2.1.1" }, "invenio-mail": { "hashes": [ diff --git a/invenio.cfg b/invenio.cfg index 9d955672..8d595735 100644 --- a/invenio.cfg +++ b/invenio.cfg @@ -84,6 +84,7 @@ from zenodo_rdm.queryparser import word_communities, word_doi from zenodo_rdm.subcommunities import ( ZenodoSubCommunityRequest, ZenodoSubcommunityRequestSchema, + ZenodoSubCommunityInvitationRequest ) from zenodo_rdm.tokens import RATSubjectSchema from zenodo_rdm.views import frontpage_view_function @@ -1049,6 +1050,9 @@ COMMUNITIES_SUB_SERVICE_SCHEMA = ZenodoSubcommunityRequestSchema COMMUNITIES_SUB_REQUEST_CLS = ZenodoSubCommunityRequest """Request type for subcommunities.""" +COMMUNITIES_SUB_INVITATION_REQUEST_CLS = ZenodoSubCommunityInvitationRequest +"""Request type for subcommunity invitations.""" + ANNOSTOR_COMMUNITIES = {} """Annostor communities configuration. diff --git a/scripts/sleep.py b/scripts/sleep.py new file mode 100644 index 00000000..c4effe8d --- /dev/null +++ b/scripts/sleep.py @@ -0,0 +1,4 @@ +import time + +while True: + time.sleep(60 * 60) diff --git a/site/zenodo_rdm/config.py b/site/zenodo_rdm/config.py index cdf7272f..e87e4158 100644 --- a/site/zenodo_rdm/config.py +++ b/site/zenodo_rdm/config.py @@ -6,7 +6,6 @@ # under the terms of the MIT License; see LICENSE file for more details. """Custom code config.""" - from .params import ZenodoArgsSchema, ZenodoSearchOptions from .redirector import ( communities_detail_view_function, diff --git a/site/zenodo_rdm/subcommunities/__init__.py b/site/zenodo_rdm/subcommunities/__init__.py index fee8df5a..19b8981b 100644 --- a/site/zenodo_rdm/subcommunities/__init__.py +++ b/site/zenodo_rdm/subcommunities/__init__.py @@ -6,10 +6,11 @@ # it under the terms of the MIT License; see LICENSE file for more details. """Subcommunities implementation.""" -from .request import ZenodoSubCommunityRequest +from .request import ZenodoSubCommunityInvitationRequest, ZenodoSubCommunityRequest from .schema import ZenodoSubcommunityRequestSchema __all__ = ( "ZenodoSubcommunityRequestSchema", "ZenodoSubCommunityRequest", + "ZenodoSubCommunityInvitationRequest", ) diff --git a/site/zenodo_rdm/subcommunities/request.py b/site/zenodo_rdm/subcommunities/request.py index af6c3b68..6927339a 100644 --- a/site/zenodo_rdm/subcommunities/request.py +++ b/site/zenodo_rdm/subcommunities/request.py @@ -6,12 +6,19 @@ # it under the terms of the MIT License; see LICENSE file for more details. """Subcommunities request implementation for ZenodoRDM.""" +import invenio_communities.notifications.builders as notifications from invenio_access.permissions import system_identity +from invenio_communities.proxies import current_communities from invenio_communities.subcommunities.services.request import ( AcceptSubcommunity, + AcceptSubcommunityInvitation, + CreateSubcommunityInvitation, DeclineSubcommunity, + DeclineSubcommunityInvitation, + SubCommunityInvitationRequest, SubCommunityRequest, ) +from invenio_notifications.services.uow import NotificationOp from invenio_rdm_records.proxies import ( current_community_records_service, current_rdm_records, @@ -23,28 +30,28 @@ from marshmallow import fields +def _add_community_records(child, parent, uow): + """Add records from child to parent.""" + records = current_community_records_service.search( + system_identity, community_id=child + ) + current_rdm_records.record_communities_service.bulk_add( + system_identity, parent, (x["id"] for x in records), uow=uow + ) + + class SubcommunityAcceptAction(AcceptSubcommunity): """Represents an accept action used to accept a subcommunity. Zenodo re-implementation of the accept action, to also move the records. """ - def _get_community_records(self, community_id): - """Get the records of a community.""" - return current_community_records_service.search( - system_identity, community_id=community_id - ) - def execute(self, identity, uow): """Execute approve action.""" to_be_moved = self.request.topic.resolve().id move_to = self.request.receiver.resolve().id - # Move records - records = self._get_community_records(to_be_moved) - current_rdm_records.record_communities_service.bulk_add( - system_identity, move_to, (x["id"] for x in records), uow=uow - ) + _add_community_records(to_be_moved, move_to, uow) super().execute(identity, uow) @@ -113,8 +120,116 @@ class ZenodoSubCommunityRequest(SubCommunityRequest): available_actions = { "delete": actions.DeleteAction, - "create": SubcommunityCreateAction, "cancel": actions.CancelAction, + # Custom implemented actions + "create": SubcommunityCreateAction, "accept": SubcommunityAcceptAction, "decline": DeclineSubcommunity, } + + +class SubcommunityInvitationCreateAction(CreateSubcommunityInvitation): + """Represents an action to create and submit a subcommunity invitation.""" + + def execute(self, identity, uow): + """Execute approve action.""" + self.request["title"] = "Invitation to join the EU Open Research Repository" + + # example: "May 11, 2024" + expires_at = self.request.expires_at.strftime("%B %d, %Y") + NAME = self.request.get("payload", {}).get("community-name") + ACRONYM = self.request.get("payload", {}).get("project-acronym") + self.request["description"] = ( + "
We would like to invite you to join the " + "EU Open Research Repository because we have detected that your Zenodo community " + "is likely related to an EU-funded project: