Skip to content

Commit

Permalink
add 2 new notifications for accepted/rejected applications
Browse files Browse the repository at this point in the history
  • Loading branch information
richard-jones committed Jan 16, 2025
1 parent 98ad1f6 commit 04e708d
Show file tree
Hide file tree
Showing 6 changed files with 264 additions and 0 deletions.
12 changes: 12 additions & 0 deletions cms/data/notifications.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# ~~Notifications:Data~~
application:assed:acceptreject:notify:
long: |
The application for **{application_title}** that you reviewed has been **{decision}** by the Managing Editor.
short:
One of your applications ({issns}) marked as '{decision}'

application:assed:assigned:notify:
long: |
An application for **{journal_title}** has been assigned to you by the Editor of **{group_name}**. Please start work on this within 1 week.
Expand All @@ -11,6 +17,12 @@ application:assed:inprogress:notify:
short:
One of your applications ({issns}) has not passed review

application:editor:acceptreject:notify:
long: |
The application for **{application_title}** that you reviewed has been **{decision}** by the Managing Editor.
short:
One of your applications ({issns}) marked as '{decision}'

application:editor:completed:notify:
long: |
**{associate_editor}** has finished a review of the application for **{application_title}**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from lib2to3.fixes.fix_input import context

from portality import models
from portality import constants
from portality.bll import exceptions
from doajtest.helpers import DoajTestCase
from portality.events.consumers.application_assed_acceptreject_notify import ApplicationAssedAcceptRejectNotify
from doajtest.fixtures import ApplicationFixtureFactory
import time


class TestApplicationAssedAcceptRejectNotify(DoajTestCase):
def setUp(self):
super(TestApplicationAssedAcceptRejectNotify, self).setUp()

def tearDown(self):
super(TestApplicationAssedAcceptRejectNotify, self).tearDown()

def test_should_consume(self):

event = models.Event(constants.EVENT_APPLICATION_STATUS, context={"application" : {}, "old_status" : "completed", "new_status": constants.APPLICATION_STATUS_ACCEPTED})
assert ApplicationAssedAcceptRejectNotify.should_consume(event)

event = models.Event(constants.EVENT_APPLICATION_STATUS,
context={"application": {}, "old_status": "completed", "new_status": constants.APPLICATION_STATUS_REJECTED})
assert ApplicationAssedAcceptRejectNotify.should_consume(event)

event = models.Event(constants.EVENT_APPLICATION_STATUS, context={"old_status": "ready", "new_status": "ready"})
assert not ApplicationAssedAcceptRejectNotify.should_consume(event)

event = models.Event("test:event", context={"application" : "2345"})
assert not ApplicationAssedAcceptRejectNotify.should_consume(event)

event = models.Event(constants.EVENT_APPLICATION_STATUS)
assert not ApplicationAssedAcceptRejectNotify.should_consume(event)

def test_consume_success(self):
with self._make_and_push_test_context_manager("/"):

source = ApplicationFixtureFactory.make_application_source()
app = models.Application(**source)
app.set_application_status(constants.APPLICATION_STATUS_ACCEPTED)
# app.save()

acc = models.Account()
acc.set_id("associate")
acc.set_email("[email protected]")
acc.save()

eg = models.EditorGroup()
eg.set_name(app.editor_group)
eg.set_maned(acc.id)
eg.save(blocking=True)

event = models.Event(constants.EVENT_APPLICATION_STATUS, context={"application" : app.data, "old_status": "completed", "new_status": app.application_status})
ApplicationAssedAcceptRejectNotify.consume(event)

time.sleep(1)
ns = models.Notification.all()
assert len(ns) == 1

n = ns[0]
assert n.who == "associate"
assert n.created_by == ApplicationAssedAcceptRejectNotify.ID
assert n.classification == constants.NOTIFICATION_CLASSIFICATION_STATUS_CHANGE
assert n.long is not None
assert n.short is not None
assert n.action is not None
assert not n.is_seen()

def test_consume_fail(self):
event = models.Event(constants.EVENT_APPLICATION_ASSED_ASSIGNED, context={"application": {"key" : "value"}})
with self.assertRaises(exceptions.NoSuchObjectException):
ApplicationAssedAcceptRejectNotify.consume(event)

Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from lib2to3.fixes.fix_input import context

from portality import models
from portality import constants
from portality.bll import exceptions
from doajtest.helpers import DoajTestCase
from portality.events.consumers.application_editor_acceptreject_notify import ApplicationEditorAcceptRejectNotify
from doajtest.fixtures import ApplicationFixtureFactory
import time


class TestApplicationEditorAcceptRejectNotify(DoajTestCase):
def setUp(self):
super(TestApplicationEditorAcceptRejectNotify, self).setUp()

def tearDown(self):
super(TestApplicationEditorAcceptRejectNotify, self).tearDown()

def test_should_consume(self):

event = models.Event(constants.EVENT_APPLICATION_STATUS, context={"application" : {}, "old_status" : "completed", "new_status": constants.APPLICATION_STATUS_ACCEPTED})
assert ApplicationEditorAcceptRejectNotify.should_consume(event)

event = models.Event(constants.EVENT_APPLICATION_STATUS,
context={"application": {}, "old_status": "completed", "new_status": constants.APPLICATION_STATUS_REJECTED})
assert ApplicationEditorAcceptRejectNotify.should_consume(event)

event = models.Event(constants.EVENT_APPLICATION_STATUS, context={"old_status": "ready", "new_status": "ready"})
assert not ApplicationEditorAcceptRejectNotify.should_consume(event)

event = models.Event("test:event", context={"application" : "2345"})
assert not ApplicationEditorAcceptRejectNotify.should_consume(event)

event = models.Event(constants.EVENT_APPLICATION_STATUS)
assert not ApplicationEditorAcceptRejectNotify.should_consume(event)

def test_consume_success(self):
with self._make_and_push_test_context_manager("/"):

source = ApplicationFixtureFactory.make_application_source()
app = models.Application(**source)
app.set_application_status(constants.APPLICATION_STATUS_ACCEPTED)
# app.save()

acc = models.Account()
acc.set_id("editor")
acc.set_email("[email protected]")
acc.save()

eg = models.EditorGroup()
eg.set_name(app.editor_group)
eg.set_editor(acc.id)
eg.save(blocking=True)

event = models.Event(constants.EVENT_APPLICATION_STATUS, context={"application" : app.data, "old_status": "completed", "new_status": app.application_status})
ApplicationEditorAcceptRejectNotify.consume(event)

time.sleep(1)
ns = models.Notification.all()
assert len(ns) == 1

n = ns[0]
assert n.who == acc.id
assert n.created_by == ApplicationEditorAcceptRejectNotify.ID
assert n.classification == constants.NOTIFICATION_CLASSIFICATION_STATUS_CHANGE
assert n.long is not None
assert n.short is not None
assert n.action is not None
assert not n.is_seen()

def test_consume_fail(self):
event = models.Event(constants.EVENT_APPLICATION_ASSED_ASSIGNED, context={"application": {"key" : "value"}})
with self.assertRaises(exceptions.NoSuchObjectException):
ApplicationEditorAcceptRejectNotify.consume(event)

5 changes: 5 additions & 0 deletions portality/bll/services/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from portality.events.consumers.account_created_email import AccountCreatedEmail
from portality.events.consumers.application_assed_inprogress_notify import ApplicationAssedInprogressNotify
from portality.events.consumers.application_assed_assigned_notify import ApplicationAssedAssignedNotify
from portality.events.consumers.application_assed_acceptreject_notify import ApplicationAssedAcceptRejectNotify
from portality.events.consumers.bg_job_finished_notify import BGJobFinishedNotify
from portality.events.consumers.application_maned_ready_notify import ApplicationManedReadyNotify
from portality.events.consumers.application_publisher_created_notify import ApplicationPublisherCreatedNotify
Expand All @@ -23,6 +24,8 @@
from portality.events.consumers.application_publisher_inprogress_notify import ApplicationPublisherInprogressNotify
from portality.events.consumers.update_request_publisher_rejected_notify import UpdateRequestPublisherRejectedNotify
from portality.events.consumers.journal_discontinuing_soon_notify import JournalDiscontinuingSoonNotify
from portality.events.consumers.application_editor_acceptreject_notify import ApplicationEditorAcceptRejectNotify



class EventsService(object):
Expand All @@ -38,8 +41,10 @@ class EventsService(object):
EVENT_CONSUMERS = [
AccountCreatedEmail,
AccountPasswordResetEmail,
ApplicationAssedAcceptRejectNotify,
ApplicationAssedAssignedNotify,
ApplicationAssedInprogressNotify,
ApplicationEditorAcceptRejectNotify,
ApplicationEditorCompletedNotify,
ApplicationEditorGroupAssignedNotify,
ApplicationEditorInProgressNotify,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# ~~ApplicationAssedInProgressNotify:Consumer~~
from portality.events import consumer_utils
from portality.util import url_for
from portality.events.consumer import EventConsumer
from portality import constants
from portality import models
from portality.bll import DOAJ


class ApplicationAssedAcceptRejectNotify(EventConsumer):
ID = "application:assed:acceptreject:notify"

@classmethod
def should_consume(cls, event):
return event.id == constants.EVENT_APPLICATION_STATUS and \
event.context.get("application") is not None and \
event.context.get("new_status") in [constants.APPLICATION_STATUS_ACCEPTED, constants.APPLICATION_STATUS_REJECTED]

@classmethod
def consume(cls, event):
app_source = event.context.get("application")

application = consumer_utils.parse_application(app_source)
if not application.editor:
return

# ~~-> Notifications:Service ~~
svc = DOAJ.notificationsService()

notification = models.Notification()
notification.who = application.editor
notification.created_by = cls.ID
notification.classification = constants.NOTIFICATION_CLASSIFICATION_STATUS_CHANGE
notification.long = svc.long_notification(cls.ID).format(
application_title=application.bibjson().title,
decision=application.application_status
)

notification.short = svc.short_notification(cls.ID).format(
issns=application.bibjson().issns_as_text(),
decision=application.application_status
)
notification.action = url_for("editor.application", application_id=application.id)

svc.notify(notification)
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# ~~ApplicationAssedInProgressNotify:Consumer~~
from portality.events import consumer_utils
from portality.util import url_for
from portality.events.consumer import EventConsumer
from portality import constants
from portality import models
from portality.bll import DOAJ


class ApplicationEditorAcceptRejectNotify(EventConsumer):
ID = "application:editor:acceptreject:notify"

@classmethod
def should_consume(cls, event):
return event.id == constants.EVENT_APPLICATION_STATUS and \
event.context.get("application") is not None and \
event.context.get("new_status") in [constants.APPLICATION_STATUS_ACCEPTED, constants.APPLICATION_STATUS_REJECTED]

@classmethod
def consume(cls, event):
app_source = event.context.get("application")

application = consumer_utils.parse_application(app_source)
if not application.editor_group:
return

eg = models.EditorGroup.pull_by_key("name", application.editor_group)
if not eg:
return

if not eg.editor:
return

# ~~-> Notifications:Service ~~
svc = DOAJ.notificationsService()

notification = models.Notification()
notification.who = eg.editor
notification.created_by = cls.ID
notification.classification = constants.NOTIFICATION_CLASSIFICATION_STATUS_CHANGE
notification.long = svc.long_notification(cls.ID).format(
application_title=application.bibjson().title,
decision=application.application_status
)

notification.short = svc.short_notification(cls.ID).format(
issns=application.bibjson().issns_as_text(),
decision=application.application_status
)
notification.action = url_for("editor.application", application_id=application.id)

svc.notify(notification)

0 comments on commit 04e708d

Please sign in to comment.