Split send_data channel into send_data_projector and send_data_site for projector prioritization. Fixed #3426.
This commit is contained in:
parent
cfefd1c7b7
commit
aaeb85db61
@ -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),
|
||||||
]
|
]
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user