Skip to content

Commit 6852bbb

Browse files
committed
Add send_and_delete to the scheduler classes to have one scheduled job only for the once recurring reminder
1 parent aafbae4 commit 6852bbb

File tree

4 files changed

+43
-17
lines changed

4 files changed

+43
-17
lines changed

backend/apps/nest/schedulers/calendar_events/base.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Base Scheduler for Nest Calendar Events."""
22

3-
from django.utils import timezone
43
from django_rq import get_scheduler
54

65
from apps.nest.models.reminder_schedule import ReminderSchedule
@@ -19,16 +18,11 @@ def schedule(self):
1918
if self.reminder_schedule.recurrence == ReminderSchedule.Recurrence.ONCE:
2019
self.reminder_schedule.job_id = self.scheduler.enqueue_at(
2120
self.reminder_schedule.scheduled_time,
22-
self.__class__.send_message,
21+
self.__class__.send_and_delete,
2322
message=self.reminder_schedule.reminder.message,
2423
channel_id=self.reminder_schedule.reminder.channel_id,
24+
reminder_schedule_id=self.reminder_schedule.pk,
2525
).get_id()
26-
27-
# Schedule deletion of the reminder after sending the message
28-
self.scheduler.enqueue_at(
29-
self.reminder_schedule.scheduled_time + timezone.timedelta(minutes=1),
30-
self.reminder_schedule.reminder.delete,
31-
)
3226
else:
3327
self.reminder_schedule.job_id = self.scheduler.cron(
3428
self.reminder_schedule.cron_expression,
@@ -52,8 +46,8 @@ def cancel(self):
5246
self.reminder_schedule.reminder.delete()
5347

5448
@staticmethod
55-
def send_message(message: str, channel_id: str):
56-
"""Send message to the specified channel. To be implemented by subclasses."""
49+
def send_and_delete(message: str, channel_id: str, reminder_schedule_id: int):
50+
"""Send message to the specified channel and delete the reminder."""
5751
error_message = "Subclasses must implement this method."
5852
raise NotImplementedError(error_message)
5953

@@ -62,3 +56,9 @@ def send_and_update(message: str, channel_id: str, reminder_schedule_id: int):
6256
"""Send message and update the reminder schedule."""
6357
error_message = "Subclasses must implement this method."
6458
raise NotImplementedError(error_message)
59+
60+
@staticmethod
61+
def send_message(message: str, channel_id: str):
62+
"""Send message to the specified channel."""
63+
error_message = "Subclasses must implement this method."
64+
raise NotImplementedError(error_message)

backend/apps/nest/schedulers/calendar_events/slack.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ def send_message(message: str, channel_id: str):
1717
text=message,
1818
)
1919

20+
@staticmethod
21+
def send_and_delete(message: str, channel_id: str, reminder_schedule_id: int):
22+
"""Send message to the specified channel and delete the reminder."""
23+
# Import here to avoid circular import issues
24+
from apps.nest.models.reminder_schedule import ReminderSchedule
25+
26+
SlackScheduler.send_message(message, channel_id)
27+
if reminder_schedule := ReminderSchedule.objects.filter(pk=reminder_schedule_id).first():
28+
reminder_schedule.reminder.delete()
29+
2030
@staticmethod
2131
def send_and_update(message: str, channel_id: str, reminder_schedule_id: int):
2232
"""Send message and update the reminder schedule."""

backend/tests/apps/nest/schedulers/calendar_events/base_test.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,20 @@ def test_schedule_once(self, mock_get_scheduler):
3232
mock_reminder_schedule.scheduled_time = timezone.datetime(2024, 10, 10, 10, 0, 0)
3333
mock_reminder_schedule.reminder.message = "Test Message"
3434
mock_reminder_schedule.reminder.channel_id = "C123456"
35+
mock_reminder_schedule.pk = 4
3536

3637
scheduler_instance = MagicMock()
3738
mock_get_scheduler.return_value = scheduler_instance
3839

3940
base_scheduler = BaseScheduler(reminder_schedule=mock_reminder_schedule)
4041
base_scheduler.schedule()
4142

42-
scheduler_instance.enqueue_at.assert_any_call(
43+
scheduler_instance.enqueue_at.assert_called_once_with(
4344
mock_reminder_schedule.scheduled_time,
44-
BaseScheduler.send_message,
45+
BaseScheduler.send_and_delete,
4546
message="Test Message",
4647
channel_id="C123456",
47-
)
48-
scheduler_instance.enqueue_at.assert_any_call(
49-
mock_reminder_schedule.scheduled_time + timezone.timedelta(minutes=1),
50-
mock_reminder_schedule.reminder.delete,
48+
reminder_schedule_id=mock_reminder_schedule.pk,
5149
)
5250
mock_reminder_schedule.save.assert_called_once_with(update_fields=["job_id"])
5351

@@ -99,8 +97,14 @@ def test_send_message_not_implemented(self):
9997
BaseScheduler.send_message("Test Message", "C123456")
10098
assert str(exc_info.value) == "Subclasses must implement this method."
10199

100+
def test_send_and_delete_not_implemented(self):
101+
"""Test that send_and_delete raises NotImplementedError."""
102+
with pytest.raises(NotImplementedError) as exc_info:
103+
BaseScheduler.send_and_delete("Test Message", "C123456", 4)
104+
assert str(exc_info.value) == "Subclasses must implement this method."
105+
102106
def test_send_and_update_not_implemented(self):
103107
"""Test that send_and_update raises NotImplementedError."""
104108
with pytest.raises(NotImplementedError) as exc_info:
105-
BaseScheduler.send_and_update("Test Message", "C123456", MagicMock())
109+
BaseScheduler.send_and_update("Test Message", "C123456", 4)
106110
assert str(exc_info.value) == "Subclasses must implement this method."

backend/tests/apps/nest/schedulers/calendar_events/slack_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ def test_send_message(self, mock_slack_config):
2020
text="Test Message",
2121
)
2222

23+
@patch("apps.nest.schedulers.calendar_events.slack.SlackScheduler.send_message")
24+
@patch("apps.nest.models.reminder_schedule.ReminderSchedule.objects.filter")
25+
def test_send_and_delete(self, mock_filter, mock_send_message):
26+
"""Test sending a message and deleting it via Slack."""
27+
mock_schedule = MagicMock()
28+
mock_filter.return_value.first.return_value = mock_schedule
29+
SlackScheduler.send_and_delete("Test Message", "C123456", 4)
30+
31+
mock_send_message.assert_called_once_with("Test Message", "C123456")
32+
mock_filter.assert_called_once_with(pk=4)
33+
mock_schedule.reminder.delete.assert_called_once()
34+
2335
@patch("apps.nest.schedulers.calendar_events.slack.SlackScheduler.send_message")
2436
@patch("apps.nest.schedulers.calendar_events.slack.update_reminder_schedule_date")
2537
def test_send_and_update(self, mock_update_reminder_schedule_date, mock_send_message):

0 commit comments

Comments
 (0)