from typing import Any, Dict, Set from django.apps import AppConfig from ..utils.projector import register_projector_elements class AgendaAppConfig(AppConfig): name = "openslides.agenda" verbose_name = "OpenSlides Agenda" angular_site_module = True angular_projector_module = True def ready(self): # Import all required stuff. from django.db.models.signals import pre_delete, post_save from ..core.signals import permission_change from ..utils.rest_api import router from .projector import get_projector_elements from .signals import ( get_permission_change_data, listen_to_related_object_post_delete, listen_to_related_object_post_save, ) from .views import ItemViewSet from . import serializers # noqa from ..utils.access_permissions import required_user # Define projector elements. register_projector_elements(get_projector_elements()) # Connect signals. post_save.connect( listen_to_related_object_post_save, dispatch_uid="listen_to_related_object_post_save", ) pre_delete.connect( listen_to_related_object_post_delete, dispatch_uid="listen_to_related_object_post_delete", ) permission_change.connect( get_permission_change_data, dispatch_uid="agenda_get_permission_change_data" ) # Register viewsets. router.register(self.get_model("Item").get_collection_string(), ItemViewSet) # register required_users required_user.add_collection_string( self.get_model("Item").get_collection_string(), required_users ) def get_config_variables(self): from .config_variables import get_config_variables return get_config_variables() def get_startup_elements(self): """ Yields all Cachables required on startup i. e. opening the websocket connection. """ yield self.get_model("Item") def required_users(element: Dict[str, Any]) -> Set[int]: """ Returns all user ids that are displayed as speaker in the given element. """ return set(speaker["user_id"] for speaker in element["speakers"])