Split send_data channel into send_data_projector and send_data_site for projector prioritization. Fixed #3426.

This commit is contained in:
Norman Jäckel 2018-01-20 09:45:02 +01:00
parent cfefd1c7b7
commit aaeb85db61
3 changed files with 45 additions and 12 deletions

View File

@ -1,7 +1,8 @@
from channels.routing import include, route from channels.routing import include, route
from openslides.utils.autoupdate import ( from openslides.utils.autoupdate import (
send_data, send_data_projector,
send_data_site,
ws_add_projector, ws_add_projector,
ws_add_site, ws_add_site,
ws_disconnect_projector, ws_disconnect_projector,
@ -23,5 +24,6 @@ site_routing = [
channel_routing = [ channel_routing = [
include(projector_routing, path=r'^/ws/projector/(?P<projector_id>\d+)/$'), include(projector_routing, path=r'^/ws/projector/(?P<projector_id>\d+)/$'),
include(site_routing, path=r'^/ws/site/$'), include(site_routing, path=r'^/ws/site/$'),
route("autoupdate.send_data", send_data), route("autoupdate.send_data_projector", send_data_projector),
route("autoupdate.send_data_site", send_data_site),
] ]

View File

@ -245,9 +245,9 @@ def ws_disconnect_projector(message: Any, projector_id: int) -> None:
Group('projector-{}'.format(projector_id)).discard(message.reply_channel) Group('projector-{}'.format(projector_id)).discard(message.reply_channel)
def send_data(message: ChannelMessageFormat) -> None: def send_data_projector(message: ChannelMessageFormat) -> None:
""" """
Informs all site users and projector clients about changed data. Informs all projector clients about changed data.
""" """
collection_elements = from_channel_message(message) collection_elements = from_channel_message(message)
@ -277,6 +277,13 @@ def send_data(message: ChannelMessageFormat) -> None:
Group('projector-{}'.format(projector.pk)).send, Group('projector-{}'.format(projector.pk)).send,
{'text': json.dumps(output)}) {'text': json.dumps(output)})
def send_data_site(message: ChannelMessageFormat) -> None:
"""
Informs all site users about changed data.
"""
collection_elements = from_channel_message(message)
# Send data to site users. # Send data to site users.
for user_id, channel_names in websocket_user_cache.get_all().items(): for user_id, channel_names in websocket_user_cache.get_all().items():
if not user_id: if not user_id:
@ -386,7 +393,10 @@ def send_autoupdate(collection_elements: List[CollectionElement]) -> None:
""" """
if collection_elements: if collection_elements:
send_or_wait( send_or_wait(
Channel('autoupdate.send_data').send, Channel('autoupdate.send_data_projector').send,
to_channel_message(collection_elements))
send_or_wait(
Channel('autoupdate.send_data_site').send,
to_channel_message(collection_elements)) to_channel_message(collection_elements))

View File

@ -29,7 +29,12 @@ class TestsInformChangedData(ChannelTestCase):
inform_changed_data(topic) inform_changed_data(topic)
channel_message = self.get_next_message('autoupdate.send_data', require=True) channel_message = self.get_next_message('autoupdate.send_data_projector', require=True)
self.assertEqual(len(channel_message['elements']), 1)
self.assertEqual(
channel_message['elements'][0]['collection_string'],
'topics/topic')
channel_message = self.get_next_message('autoupdate.send_data_site', require=True)
self.assertEqual(len(channel_message['elements']), 1) self.assertEqual(len(channel_message['elements']), 1)
self.assertEqual( self.assertEqual(
channel_message['elements'][0]['collection_string'], channel_message['elements'][0]['collection_string'],
@ -44,7 +49,9 @@ class TestsInformChangedData(ChannelTestCase):
inform_changed_data(topics) inform_changed_data(topics)
channel_message = self.get_next_message('autoupdate.send_data', require=True) channel_message = self.get_next_message('autoupdate.send_data_projector', require=True)
self.assertEqual(len(channel_message['elements']), 3)
channel_message = self.get_next_message('autoupdate.send_data_site', require=True)
self.assertEqual(len(channel_message['elements']), 3) self.assertEqual(len(channel_message['elements']), 3)
def test_change_with_non_root_rest_elements(self): def test_change_with_non_root_rest_elements(self):
@ -59,7 +66,9 @@ class TestsInformChangedData(ChannelTestCase):
inform_changed_data((assignment, poll)) inform_changed_data((assignment, poll))
channel_message = self.get_next_message('autoupdate.send_data', require=True) channel_message = self.get_next_message('autoupdate.send_data_projector', require=True)
self.assertEqual(len(channel_message['elements']), 1)
channel_message = self.get_next_message('autoupdate.send_data_site', require=True)
self.assertEqual(len(channel_message['elements']), 1) self.assertEqual(len(channel_message['elements']), 1)
def test_change_only_non_root_rest_element(self): def test_change_only_non_root_rest_element(self):
@ -73,7 +82,9 @@ class TestsInformChangedData(ChannelTestCase):
inform_changed_data(poll) inform_changed_data(poll)
channel_message = self.get_next_message('autoupdate.send_data', require=True) channel_message = self.get_next_message('autoupdate.send_data_projector', require=True)
self.assertEqual(len(channel_message['elements']), 1)
channel_message = self.get_next_message('autoupdate.send_data_site', require=True)
self.assertEqual(len(channel_message['elements']), 1) self.assertEqual(len(channel_message['elements']), 1)
def test_change_no_autoupdate_model(self): def test_change_no_autoupdate_model(self):
@ -90,14 +101,22 @@ class TestsInformChangedData(ChannelTestCase):
with self.assertRaises(AssertionError): with self.assertRaises(AssertionError):
# self.get_next_message() with require=True raises a AssertionError # self.get_next_message() with require=True raises a AssertionError
# if there is no message in the channel # if there is no message in the channel
self.get_next_message('autoupdate.send_data', require=True) self.get_next_message('autoupdate.send_data_projector', require=True)
with self.assertRaises(AssertionError):
# self.get_next_message() with require=True raises a AssertionError
# if there is no message in the channel
self.get_next_message('autoupdate.send_data_site', require=True)
def test_delete_one_element(self): def test_delete_one_element(self):
channel_layers[DEFAULT_CHANNEL_LAYER].flush() channel_layers[DEFAULT_CHANNEL_LAYER].flush()
inform_deleted_data([('topics/topic', 1)]) inform_deleted_data([('topics/topic', 1)])
channel_message = self.get_next_message('autoupdate.send_data', require=True) channel_message = self.get_next_message('autoupdate.send_data_projector', require=True)
self.assertEqual(len(channel_message['elements']), 1)
self.assertTrue(channel_message['elements'][0]['deleted'])
channel_message = self.get_next_message('autoupdate.send_data_site', require=True)
self.assertEqual(len(channel_message['elements']), 1) self.assertEqual(len(channel_message['elements']), 1)
self.assertTrue(channel_message['elements'][0]['deleted']) self.assertTrue(channel_message['elements'][0]['deleted'])
@ -106,5 +125,7 @@ class TestsInformChangedData(ChannelTestCase):
inform_deleted_data([('topics/topic', 1), ('topics/topic', 2), ('testmodule/model', 1)]) inform_deleted_data([('topics/topic', 1), ('topics/topic', 2), ('testmodule/model', 1)])
channel_message = self.get_next_message('autoupdate.send_data', require=True) channel_message = self.get_next_message('autoupdate.send_data_projector', require=True)
self.assertEqual(len(channel_message['elements']), 3)
channel_message = self.get_next_message('autoupdate.send_data_site', require=True)
self.assertEqual(len(channel_message['elements']), 3) self.assertEqual(len(channel_message['elements']), 3)