@@ -146,13 +146,28 @@ def reflex_message(self, data, **kwargs):
146146 url = data ['url' ]
147147 selectors = data ['selectors' ] if data ['selectors' ] else ['body' ]
148148 target = data ['target' ]
149+ identifier = data ['identifier' ]
149150 reflex_name , method_name = target .split ('#' )
150151 reflex_name = classify (reflex_name )
151152 arguments = data ['args' ] if data .get ('args' ) else []
152153 element = Element (data ['attrs' ])
154+
155+ # TODO can be removed once stimulus-reflex has increased a couple of versions
156+ permanent_attribute_name = data .get ('permanent_attribute_name' )
157+ if not permanent_attribute_name :
158+ # Used in stimulus-reflex >= 3.4
159+ permanent_attribute_name = data ['permanentAttributeName' ]
160+
153161 try :
154162 ReflexClass = self .reflexes .get (reflex_name )
155- reflex = ReflexClass (self , url = url , element = element , selectors = selectors )
163+ reflex = ReflexClass (
164+ self , url = url ,
165+ element = element ,
166+ selectors = selectors ,
167+ identifier = identifier ,
168+ reflex_id = data ['reflexId' ],
169+ permanent_attribute_name = permanent_attribute_name
170+ )
156171 self .delegate_call_to_reflex (reflex , method_name , arguments )
157172 except Exception as e :
158173 error = '{}: {}' .format (e .__class__ .__name__ , str (e ))
@@ -173,7 +188,7 @@ def reflex_message(self, data, **kwargs):
173188 )
174189 self .broadcast_error (message , data , reflex )
175190 _ , _ , traceback = sys .exc_info ()
176- exc = SockpuppetError (msg )
191+ exc = SockpuppetError (message )
177192 raise exc .with_traceback (traceback )
178193
179194 logger .debug ('Reflex took %6.2fms' , (time .perf_counter () - start ) * 1000 )
@@ -214,6 +229,10 @@ def receive_json(self, data, **kwargs):
214229 print ('Unsupported' )
215230
216231 def render_page_and_broadcast_morph (self , reflex , selectors , data ):
232+ if reflex .is_morph :
233+ # The reflex has already sent a message so consumer doesn't need to.
234+ return
235+
217236 html = self .render_page (reflex )
218237 if html :
219238 self .broadcast_morphs (selectors , data , html , reflex )
@@ -245,7 +264,7 @@ def broadcast_morphs(self, selectors, data, html, reflex):
245264 document = BeautifulSoup (html )
246265 selectors = [selector for selector in selectors if document .select (selector )]
247266
248- channel = Channel (reflex .get_channel_id (), identifier = data ['identifier' ])
267+ broadcaster = Channel (reflex .get_channel_id (), identifier = data ['identifier' ])
249268 logger .debug ('Broadcasting to %s' , reflex .get_channel_id ())
250269
251270 # TODO can be removed once stimulus-reflex has increased a couple of versions
@@ -255,14 +274,14 @@ def broadcast_morphs(self, selectors, data, html, reflex):
255274 permanent_attribute_name = data ['permanentAttributeName' ]
256275
257276 for selector in selectors :
258- channel .morph ({
277+ broadcaster .morph ({
259278 'selector' : selector ,
260279 'html' : '' .join ([e .decode_contents () for e in document .select (selector )]),
261280 'children_only' : True ,
262281 'permanent_attribute_name' : permanent_attribute_name ,
263282 'stimulus_reflex' : {** data }
264283 })
265- channel .broadcast ()
284+ broadcaster .broadcast ()
266285
267286 def delegate_call_to_reflex (self , reflex , method_name , arguments ):
268287 method = getattr (reflex , method_name )
0 commit comments