From 77f41ce1a9f13fa3c153958de3b48b1ae5663543 Mon Sep 17 00:00:00 2001 From: AlexejStukov Date: Thu, 28 Jul 2016 11:55:28 +0200 Subject: [PATCH] Added WebsocketBindingWithMembers (#262) * Added WebsocketBindingWithMembers WebsocketBindingWithMembers inherits WebsocketBinding and additionally enables sending of member variables, properties and methods. * pep fixes * pep fixes * Changed to Mixin More flexible this way; also checking if members are callable now, not just a try-except. * moved BindingWithMembersMixin to base.py * moved BindingWithMembersMixin to base.py * undo moving to base.py * undo moving to base.py; undo Mixin * use DjangoJSONEncoder to serialize members * missing self * removed nasty whitespace --- channels/binding/websockets.py | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/channels/binding/websockets.py b/channels/binding/websockets.py index c99eb00..14897ef 100644 --- a/channels/binding/websockets.py +++ b/channels/binding/websockets.py @@ -1,6 +1,7 @@ import json from django.core import serializers +from django.core.serializers.json import DjangoJSONEncoder from .base import Binding from ..generic.websockets import WebsocketDemultiplexer @@ -92,3 +93,44 @@ class WebsocketBinding(Binding): for name in data.keys(): setattr(instance, name, getattr(hydrated.object, name)) instance.save() + + +class WebsocketBindingWithMembers(WebsocketBinding): + """ + Outgoing binding binding subclass based on WebsocketBinding. + Additionally enables sending of member variables, properties and methods. + Member methods can only have self as a required argument. + Just add the name of the member to the send_members-list. + Example: + + class MyModel(models.Model): + my_field = models.IntegerField(default=0) + my_var = 3 + + @property + def my_property(self): + return self.my_var + self.my_field + + def my_function(self): + return self.my_var - self.my_vield + + class MyBinding(BindingWithMembersMixin, WebsocketBinding): + model = MyModel + stream = 'mystream' + + send_members = ['my_var', 'my_property', 'my_function'] + """ + + send_members = [] + + encoder = DjangoJSONEncoder() + + def serialize_data(self, instance): + data = super(WebsocketBindingWithMembers, self).serialize_data(instance) + for m in self.send_members: + member = getattr(instance, m) + if callable(member): + data[m] = self.encoder.encode(member()) + else: + data[m] = self.encoder.encode(member) + return data