Send all data to the client at startup
This commit is contained in:
parent
1bc35faa55
commit
ebf686ef34
@ -95,6 +95,8 @@ Other:
|
||||
- Added new caching system with support for Redis.
|
||||
- Support https as websocket protocol (wss).
|
||||
- Added migration path from 2.0.
|
||||
- Add an api for apps to send data when the websocket connection is established.
|
||||
- Used this api for all models expect of users to send all data to the client.
|
||||
|
||||
|
||||
Version 2.0 (2016-04-18)
|
||||
|
@ -35,3 +35,7 @@ class AgendaAppConfig(AppConfig):
|
||||
|
||||
# Register viewsets.
|
||||
router.register(self.get_model('Item').get_collection_string(), ItemViewSet)
|
||||
|
||||
def get_startup_elements(self):
|
||||
from ..utils.collection import Collection
|
||||
return [Collection(self.get_model('Item').get_collection_string())]
|
||||
|
@ -24,3 +24,7 @@ class AssignmentsAppConfig(AppConfig):
|
||||
# Register viewsets.
|
||||
router.register(self.get_model('Assignment').get_collection_string(), AssignmentViewSet)
|
||||
router.register('assignments/poll', AssignmentPollViewSet)
|
||||
|
||||
def get_startup_elements(self):
|
||||
from ..utils.collection import Collection
|
||||
return [Collection(self.get_model('Assignment').get_collection_string())]
|
||||
|
@ -14,10 +14,10 @@ class CoreAppConfig(AppConfig):
|
||||
|
||||
# Import all required stuff.
|
||||
from django.db.models import signals
|
||||
from openslides.core.config import config
|
||||
from openslides.core.signals import post_permission_creation
|
||||
from openslides.utils.rest_api import router
|
||||
from openslides.utils.search import index_add_instance, index_del_instance
|
||||
from .config import config
|
||||
from .signals import post_permission_creation
|
||||
from ..utils.rest_api import router
|
||||
from ..utils.search import index_add_instance, index_del_instance
|
||||
from .config_variables import get_config_variables
|
||||
from .signals import delete_django_app_permissions
|
||||
from .views import (
|
||||
@ -55,3 +55,10 @@ class CoreAppConfig(AppConfig):
|
||||
signals.m2m_changed.connect(
|
||||
index_add_instance,
|
||||
dispatch_uid='m2m_index_add_instance')
|
||||
|
||||
def get_startup_elements(self):
|
||||
from .config import config
|
||||
from ..utils.collection import Collection
|
||||
for model in ('Projector', 'ChatMessage', 'Tag', 'ProjectorMessage', 'Countdown'):
|
||||
yield Collection(self.get_model(model).get_collection_string())
|
||||
yield Collection(config.get_collection_string())
|
||||
|
@ -18,3 +18,7 @@ class MediafilesAppConfig(AppConfig):
|
||||
|
||||
# Register viewsets.
|
||||
router.register(self.get_model('Mediafile').get_collection_string(), MediafileViewSet)
|
||||
|
||||
def get_startup_elements(self):
|
||||
from ..utils.collection import Collection
|
||||
return [Collection(self.get_model('Mediafile').get_collection_string())]
|
||||
|
@ -34,3 +34,8 @@ class MotionsAppConfig(AppConfig):
|
||||
router.register(self.get_model('MotionChangeRecommendation').get_collection_string(),
|
||||
MotionChangeRecommendationViewSet)
|
||||
router.register('motions/motionpoll', MotionPollViewSet)
|
||||
|
||||
def get_startup_elements(self):
|
||||
from ..utils.collection import Collection
|
||||
for model in ('Category', 'Motion', 'MotionBlock', 'Workflow', 'MotionChangeRecommendation'):
|
||||
yield Collection(self.get_model(model).get_collection_string())
|
||||
|
@ -18,3 +18,7 @@ class TopicsAppConfig(AppConfig):
|
||||
|
||||
# Register viewsets.
|
||||
router.register(self.get_model('Topic').get_collection_string(), TopicViewSet)
|
||||
|
||||
def get_startup_elements(self):
|
||||
from ..utils.collection import Collection
|
||||
return [Collection(self.get_model('Topic').get_collection_string())]
|
||||
|
@ -4,6 +4,7 @@ from collections import Iterable
|
||||
from asgiref.inmemory import ChannelLayer
|
||||
from channels import Channel, Group
|
||||
from channels.auth import channel_session_user, channel_session_user_from_http
|
||||
from django.apps import apps
|
||||
from django.db import transaction
|
||||
|
||||
from ..core.config import config
|
||||
@ -19,12 +20,33 @@ def ws_add_site(message):
|
||||
Adds the websocket connection to a group specific to the connecting user.
|
||||
|
||||
The group with the name 'user-None' stands for all anonymous users.
|
||||
|
||||
Send all "starup-data" through the connection.
|
||||
"""
|
||||
Group('site').add(message.reply_channel)
|
||||
message.channel_session['user_id'] = message.user.id
|
||||
# Saves the reply channel to the user. Uses 0 for anonymous users.
|
||||
websocket_user_cache.add(message.user.id or 0, message.reply_channel.name)
|
||||
message.reply_channel.send({"accept": True})
|
||||
|
||||
# Collect all elements that shoud be send to the client when the websocket
|
||||
# connection is established
|
||||
output = []
|
||||
for app in apps.get_app_configs():
|
||||
try:
|
||||
# Get the method get_startup_elements() from an app.
|
||||
# This method has to return an iterable of Collection objects.
|
||||
get_startup_elements = app.get_startup_elements
|
||||
except AttributeError:
|
||||
# Skip apps that do not implement get_startup_elements
|
||||
continue
|
||||
for collection in get_startup_elements():
|
||||
output.extend(collection.as_autoupdate_for_user(message.user))
|
||||
|
||||
# Send all data. If there is no data, then onyl accept the connection
|
||||
if output:
|
||||
message.reply_channel.send({'text': json.dumps(output)})
|
||||
else:
|
||||
message.reply_channel.send({"accept": True})
|
||||
|
||||
|
||||
@channel_session_user
|
||||
|
@ -352,6 +352,17 @@ class Collection:
|
||||
output.append(content)
|
||||
return output
|
||||
|
||||
def as_autoupdate_for_user(self, user):
|
||||
"""
|
||||
Returns a list of dicts, that can be send though the websocket to a user.
|
||||
"""
|
||||
output = []
|
||||
for collection_element in self.element_generator():
|
||||
content = collection_element.as_autoupdate_for_user(user)
|
||||
if content is not None:
|
||||
output.append(content)
|
||||
return output
|
||||
|
||||
def as_list_for_user(self, user):
|
||||
"""
|
||||
Returns a list of dictonaries to send them to a user, for example over
|
||||
|
Loading…
Reference in New Issue
Block a user