From d24008d064b10f39e337730e7242c874ce61a689 Mon Sep 17 00:00:00 2001 From: Maximilian Moser <maximilian.moser@tuwien.ac.at> Date: Fri, 29 Nov 2024 21:52:01 +0100 Subject: [PATCH 1/2] Send out notification emails after records have been published --- invenio_config_tuw/services.py | 23 ++++++++++++++++++++ invenio_config_tuw/tasks.py | 38 +++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/invenio_config_tuw/services.py b/invenio_config_tuw/services.py index 4d88d1e..fe45ac7 100644 --- a/invenio_config_tuw/services.py +++ b/invenio_config_tuw/services.py @@ -10,7 +10,11 @@ """Overrides for core services.""" from invenio_drafts_resources.services.records.components import ServiceComponent +from invenio_pidstore.models import PIDStatus from invenio_rdm_records.services.components import DefaultRecordsComponents +from invenio_records_resources.services.uow import TaskOp + +from .tasks import send_publication_notification_email class ParentAccessSettingsComponent(ServiceComponent): @@ -24,7 +28,26 @@ class ParentAccessSettingsComponent(ServiceComponent): settings.secret_link_expiration = 30 +class PublicationNotificationComponent(ServiceComponent): + """Component for notifying users about the publication of their record.""" + + def publish(self, identity, draft=None, record=None, **kwargs): + """Register a task to send off the notification email.""" + # the first time the record gets published, the PID's status + # gets set to "R" but that won't have been transferred to the + # record's data until the `record.commit()` from the unit of work + has_been_published = ( + draft.pid.status == draft["pid"]["status"] == PIDStatus.REGISTERED + ) + + if not has_been_published: + self.uow.register( + TaskOp(send_publication_notification_email, record.pid.pid_value) + ) + + TUWRecordsComponents = [ *DefaultRecordsComponents, ParentAccessSettingsComponent, + PublicationNotificationComponent, ] diff --git a/invenio_config_tuw/tasks.py b/invenio_config_tuw/tasks.py index 69e07f3..92634ce 100644 --- a/invenio_config_tuw/tasks.py +++ b/invenio_config_tuw/tasks.py @@ -12,9 +12,12 @@ from typing import List, Optional import requests from celery import shared_task -from flask import current_app +from flask import current_app, render_template from invenio_access.permissions import system_identity +from invenio_accounts.proxies import current_datastore from invenio_db import db +from invenio_mail.tasks import send_email +from invenio_rdm_records.proxies import current_rdm_records_service as records_service from invenio_records_resources.services.uow import UnitOfWork from invenio_vocabularies.contrib.names.api import Name @@ -134,3 +137,36 @@ def sync_names_from_tiss(): uow.commit() return results + + +@shared_task(ignore_result=True) +def send_publication_notification_email(recid: str, user_id: Optional[str] = None): + """Send the record uploader an email about the publication of their record.""" + record = records_service.read(identity=system_identity, id_=recid) + if user_id is not None: + user = current_datastore.get_user(user_id) + else: + owner = record._obj.parent.access.owner + if owner is not None and owner.owner_type == "user": + user = owner.resolve() + + html_message = render_template( + "invenio_theme_tuw/mails/record_published.html", + uploader=user, + record=record, + ) + message = render_template( + "invenio_theme_tuw/mails/record_published.txt", + uploader=user, + record=record, + ) + + record_title = record["metadata"]["title"] + send_email( + { + "subject": f'Your record "{record_title}" was published', + "html": html_message, + "body": message, + "recipients": [user.email], + } + ) -- GitLab From eaae4ba6c60752c02668303b6c3ad2349c48446a Mon Sep 17 00:00:00 2001 From: Maximilian Moser <maximilian.moser@tuwien.ac.at> Date: Fri, 29 Nov 2024 22:34:37 +0100 Subject: [PATCH 2/2] Bump version to v2024.4.2 --- CHANGES.rst | 3 ++- invenio_config_tuw/__init__.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 04cd3fe..baeccb9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,12 +8,13 @@ Changes ======= -Version 2024.4 (released 2024-11-26, updated 2024-11-27) +Version 2024.4 (released 2024-11-26, updated 2024-11-29) - Pin `Flask-Menu`` dependency - Add `Invenio-DAMAP` to the dependencies - Implement TU Wien user identity generator for connection to DAMAP - Cast TISS ID into string for the Invenio-DAMAP integration +- Send out notification emails when records get published Version 2024.3 (released 2024-10-01, updated 2024-11-13) diff --git a/invenio_config_tuw/__init__.py b/invenio_config_tuw/__init__.py index 6fd7143..65144e5 100644 --- a/invenio_config_tuw/__init__.py +++ b/invenio_config_tuw/__init__.py @@ -9,6 +9,6 @@ from .ext import InvenioConfigTUW -__version__ = "2024.4.1" +__version__ = "2024.4.2" __all__ = ("__version__", "InvenioConfigTUW") -- GitLab