Skip to content

Commit

Permalink
Allow overriding of Celery task kwargs
Browse files Browse the repository at this point in the history
  • Loading branch information
rubickcz committed Apr 18, 2020
1 parent f47a413 commit 1115c1f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 9 deletions.
1 change: 1 addition & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ not released yet
----------------

* Fix documentation
* Allow overriding of Celery task kwargs (see ``_get_celery_task_kwargs()`` method)

0.2.2 (2020-02-11)
------------------
Expand Down
17 changes: 13 additions & 4 deletions example/tests/test_receivers.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,17 @@ def test_receiver_should_pass_serialized_kwargs_to_celery_task(self):
receiver.receive(self.signal_kwargs)
commit()

receiver.celery_task.delay.assert_called_once_with(
'unittest.mock.MagicMock',
'pynotify.serializers.ModelSerializer',
receiver.serializer_class().serialize(self.signal_kwargs),
receiver.celery_task.delay.assert_called_with(
handler_class='unittest.mock.MagicMock',
serializer_class='pynotify.serializers.ModelSerializer',
signal_kwargs=receiver.serializer_class().serialize(self.signal_kwargs),
)

@override_settings(PYNOTIFY_CELERY_TASK='tests.test_receivers.mock_task')
def test_receiver_should_allow_overriding_of_celery_task_kwargs(self):
receiver = AsynchronousReceiver(MagicMock)
receiver._get_celery_task_kwargs = MagicMock(return_value={'abc': 1})
receiver.receive(self.signal_kwargs)
commit()

receiver.celery_task.delay.assert_called_with(abc=1)
14 changes: 9 additions & 5 deletions pynotify/receivers.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,15 @@ def _get_celery_task(self):
)
return locate(celery_task)

def _get_celery_task_kwargs(self):
return {
'handler_class': get_import_path(self.handler_class),
'serializer_class': get_import_path(self.serializer_class),
'signal_kwargs': self.serializer_class().serialize(self.signal_kwargs),
}

def receive(self, signal_kwargs):
self.signal_kwargs = signal_kwargs
# Call of the Celery task should be performed after current DB transaction is commited to avoid race condition,
# e.g. accessing referenced object in the task before it has finished saving into DB.
on_commit(lambda: self.celery_task.delay(
get_import_path(self.handler_class),
get_import_path(self.serializer_class),
self.serializer_class().serialize(signal_kwargs),
))
on_commit(lambda: self.celery_task.delay(**self._get_celery_task_kwargs()))

0 comments on commit 1115c1f

Please sign in to comment.