Skip to content

Commit 404f799

Browse files
committed
Allow overriding of Celery task kwargs
1 parent f47a413 commit 404f799

3 files changed

Lines changed: 22 additions & 9 deletions

File tree

HISTORY.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ not released yet
66
----------------
77

88
* Fix documentation
9+
* Allow overriding of Celery task kwargs (see ``_get_celery_task_kwargs()`` method)
910

1011
0.2.2 (2020-02-11)
1112
------------------

example/tests/test_receivers.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,16 @@ def test_receiver_should_pass_serialized_kwargs_to_celery_task(self):
4747
receiver.receive(self.signal_kwargs)
4848
commit()
4949

50-
receiver.celery_task.delay.assert_called_once_with(
51-
'unittest.mock.MagicMock',
52-
'pynotify.serializers.ModelSerializer',
53-
receiver.serializer_class().serialize(self.signal_kwargs),
50+
receiver.celery_task.delay.assert_called_with(
51+
handler_class='unittest.mock.MagicMock',
52+
serializer_class='pynotify.serializers.ModelSerializer',
53+
signal_kwargs=receiver.serializer_class().serialize(self.signal_kwargs),
5454
)
55+
56+
@override_settings(PYNOTIFY_CELERY_TASK='tests.test_receivers.mock_task')
57+
def test_receiver_should_allow_overriding_of_celery_task_kwargs(self):
58+
receiver = AsynchronousReceiver(MagicMock)
59+
receiver._get_celery_task_kwargs = MagicMock(return_value={'abc': 1})
60+
receiver.receive(self.signal_kwargs)
61+
commit()
62+
receiver.celery_task.delay.assert_called_with(abc=1)

pynotify/receivers.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,15 @@ def _get_celery_task(self):
5151
)
5252
return locate(celery_task)
5353

54+
def _get_celery_task_kwargs(self):
55+
return {
56+
'handler_class': get_import_path(self.handler_class),
57+
'serializer_class': get_import_path(self.serializer_class),
58+
'signal_kwargs': self.serializer_class().serialize(self.signal_kwargs),
59+
}
60+
5461
def receive(self, signal_kwargs):
62+
self.signal_kwargs = signal_kwargs
5563
# Call of the Celery task should be performed after current DB transaction is commited to avoid race condition,
5664
# e.g. accessing referenced object in the task before it has finished saving into DB.
57-
on_commit(lambda: self.celery_task.delay(
58-
get_import_path(self.handler_class),
59-
get_import_path(self.serializer_class),
60-
self.serializer_class().serialize(signal_kwargs),
61-
))
65+
on_commit(lambda: self.celery_task.delay(**self._get_celery_task_kwargs()))

0 commit comments

Comments
 (0)