From 7ab21c484630d8ba08ea6d3b6d72bd740d3af5ab Mon Sep 17 00:00:00 2001 From: Pierre Chiquet Date: Thu, 23 Feb 2017 19:17:43 +0100 Subject: [PATCH] Set self.kwargs in Binding.trigger_inbound when setting self.message (#541) Allows options passed in (like a consumer) to be accessible to further code. --- channels/binding/base.py | 1 + tests/test_binding.py | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/channels/binding/base.py b/channels/binding/base.py index 88ae8e8..59cf43a 100644 --- a/channels/binding/base.py +++ b/channels/binding/base.py @@ -214,6 +214,7 @@ class Binding(object): from django.contrib.auth.models import AnonymousUser self = cls() self.message = message + self.kwargs = kwargs # Deserialize message self.action, self.pk, self.data = self.deserialize(self.message) self.user = getattr(self.message, "user", AnonymousUser()) diff --git a/tests/test_binding.py b/tests/test_binding.py index 4f86f50..61056bc 100644 --- a/tests/test_binding.py +++ b/tests/test_binding.py @@ -349,3 +349,29 @@ class TestsBinding(ChannelTestCase): self.assertIsNone(User.objects.filter(pk=user.pk).first()) self.assertIsNone(client.receive()) + + def test_route_params_saved_in_kwargs(self): + + class UserBinding(WebsocketBinding): + model = User + stream = 'users' + fields = ['username', 'email', 'password', 'last_name'] + + @classmethod + def group_names(cls, instance): + return ['users_outbound'] + + def has_permission(self, user, action, pk): + return True + + class Demultiplexer(WebsocketDemultiplexer): + consumers = { + 'users': UserBinding.consumer, + } + + groups = ['inbound'] + + with apply_routes([Demultiplexer.as_route(path='/path/(?P\d+)')]): + client = HttpClient() + consumer = client.send_and_consume('websocket.connect', path='/path/789') + self.assertEqual(consumer.kwargs['id'], '789')