OpenSlides/openslides/core/apps.py

217 lines
7.3 KiB
Python
Raw Normal View History

import logging
2019-01-20 10:05:50 +01:00
import os
import sys
from collections import OrderedDict
from operator import attrgetter
2019-03-26 15:42:43 +01:00
from typing import Any, Dict, List
from django.apps import AppConfig
from django.conf import settings
from django.db.models.signals import post_migrate, pre_delete
from openslides.utils.schema_version import schema_version_handler
class CoreAppConfig(AppConfig):
2019-01-06 16:22:33 +01:00
name = "openslides.core"
verbose_name = "OpenSlides Core"
def ready(self):
# Import all required stuff.
2017-01-14 12:29:42 +01:00
from .config import config
from .projector import register_projector_slides
from . import serializers # noqa
2017-02-21 09:34:24 +01:00
from .signals import (
autoupdate_for_many_to_many_relations,
2019-07-23 12:52:28 +02:00
cleanup_unused_permissions,
2017-02-21 09:34:24 +01:00
delete_django_app_permissions,
get_permission_change_data,
permission_change,
post_permission_creation,
)
2015-06-29 12:08:15 +02:00
from .views import (
ConfigViewSet,
CountdownViewSet,
ProjectorMessageViewSet,
2015-06-29 12:08:15 +02:00
ProjectorViewSet,
ProjectionDefaultViewSet,
2015-06-29 12:08:15 +02:00
TagViewSet,
)
2018-10-26 15:37:29 +02:00
from .websocket import (
NotifyWebsocketClientMessage,
ConstantsWebsocketClientMessage,
GetElementsWebsocketClientMessage,
AutoupdateWebsocketClientMessage,
2018-12-23 11:05:38 +01:00
ListenToProjectors,
PingPong,
2018-10-26 15:37:29 +02:00
)
2018-12-23 11:05:38 +01:00
from ..utils.rest_api import router
from ..utils.websocket import register_client_message
2018-08-30 09:07:06 +02:00
# Collect all config variables before getting the constants.
config.collect_config_variables_from_apps()
# Define projector elements.
register_projector_slides()
# Connect signals.
post_permission_creation.connect(
2019-01-06 16:22:33 +01:00
delete_django_app_permissions, dispatch_uid="delete_django_app_permissions"
)
2019-07-23 12:52:28 +02:00
post_permission_creation.connect(
cleanup_unused_permissions, dispatch_uid="cleanup_unused_permissions"
)
2017-02-21 09:34:24 +01:00
permission_change.connect(
2019-01-06 16:22:33 +01:00
get_permission_change_data, dispatch_uid="core_get_permission_change_data"
)
2019-01-06 16:22:33 +01:00
post_migrate.connect(
manage_config, sender=self, dispatch_uid="core_manage_config"
2019-01-06 16:22:33 +01:00
)
pre_delete.connect(
autoupdate_for_many_to_many_relations,
dispatch_uid="core_autoupdate_for_many_to_many_relations",
)
2017-08-22 14:17:20 +02:00
# Register viewsets.
2019-01-06 16:22:33 +01:00
router.register(
self.get_model("Projector").get_collection_string(), ProjectorViewSet
)
router.register(
self.get_model("Projectiondefault").get_collection_string(),
ProjectionDefaultViewSet,
)
2019-01-06 16:22:33 +01:00
router.register(self.get_model("Tag").get_collection_string(), TagViewSet)
router.register(
self.get_model("ConfigStore").get_collection_string(),
ConfigViewSet,
"config",
)
router.register(
self.get_model("ProjectorMessage").get_collection_string(),
ProjectorMessageViewSet,
)
router.register(
self.get_model("Countdown").get_collection_string(), CountdownViewSet
)
2019-03-19 20:26:12 +01:00
if "runserver" in sys.argv or "changeconfig" in sys.argv:
2019-01-20 10:05:50 +01:00
startup()
2018-09-01 08:00:00 +02:00
2018-10-26 15:37:29 +02:00
# Register client messages
register_client_message(NotifyWebsocketClientMessage())
register_client_message(ConstantsWebsocketClientMessage())
register_client_message(GetElementsWebsocketClientMessage())
register_client_message(AutoupdateWebsocketClientMessage())
2018-12-23 11:05:38 +01:00
register_client_message(ListenToProjectors())
register_client_message(PingPong())
2018-10-26 15:37:29 +02:00
def get_config_variables(self):
from .config_variables import get_config_variables
2019-01-06 16:22:33 +01:00
return get_config_variables()
2017-01-14 12:29:42 +01:00
def get_startup_elements(self):
"""
Yields all Cachables required on startup i. e. opening the websocket
connection.
"""
2019-01-06 16:22:33 +01:00
for model_name in (
"Projector",
"ProjectionDefault",
2019-01-06 16:22:33 +01:00
"Tag",
"ProjectorMessage",
"Countdown",
"ConfigStore",
):
yield self.get_model(model_name)
def get_angular_constants(self):
from .config import config
constants: Dict[str, Any] = {}
# Client settings
client_settings_keys = [
2019-01-06 16:22:33 +01:00
"MOTION_IDENTIFIER_MIN_DIGITS",
"MOTION_IDENTIFIER_WITHOUT_BLANKS",
"MOTIONS_ALLOW_AMENDMENTS_OF_AMENDMENTS",
"PRIORITIZED_GROUP_IDS",
"PING_INTERVAL",
"PING_TIMEOUT",
]
client_settings_dict = {}
for key in client_settings_keys:
try:
client_settings_dict[key] = getattr(settings, key)
except AttributeError:
# Settings key does not exist. Do nothing. The client will
# treat this as undefined.
pass
constants["Settings"] = client_settings_dict
# Config variables
2018-08-22 22:00:08 +02:00
config_groups: List[Any] = []
2019-01-06 16:22:33 +01:00
for config_variable in sorted(
config.config_variables.values(), key=attrgetter("weight")
):
if config_variable.is_hidden():
# Skip hidden config variables. Do not even check groups and subgroups.
continue
2019-01-06 16:22:33 +01:00
if not config_groups or config_groups[-1]["name"] != config_variable.group:
# Add new group.
2019-01-06 16:22:33 +01:00
config_groups.append(
OrderedDict(name=config_variable.group, subgroups=[])
)
if (
not config_groups[-1]["subgroups"]
or config_groups[-1]["subgroups"][-1]["name"]
!= config_variable.subgroup
):
# Add new subgroup.
2019-01-06 16:22:33 +01:00
config_groups[-1]["subgroups"].append(
OrderedDict(name=config_variable.subgroup, items=[])
)
# Add the config variable to the current group and subgroup.
2019-01-06 16:22:33 +01:00
config_groups[-1]["subgroups"][-1]["items"].append(config_variable.data)
constants["ConfigVariables"] = config_groups
constants["SchemaVersion"] = schema_version_handler.get()
return constants
2017-08-22 14:17:20 +02:00
def manage_config(**kwargs):
"""
Should be run after every migration. Saves default values
of all non db-existing config objects into the db. Deletes all
unnecessary old config values, e.g. all db entries, that does
not have a config_variable anymore. Increments the config version,
if at least one of the operations altered some data.
"""
2017-08-22 14:17:20 +02:00
from .config import config
2019-01-06 16:22:33 +01:00
altered = config.save_default_values()
altered = config.cleanup_old_config_values() or altered
if altered:
config.increment_version()
logging.getLogger(__name__).info("Updated config variables")
2019-01-20 10:05:50 +01:00
def startup():
"""
Runs commands that are needed at startup.
Sets the cache, constants and startup history
"""
if os.environ.get("NO_STARTUP"):
return
from openslides.utils.constants import set_constants, get_constants_from_apps
from openslides.utils.cache import element_cache
from openslides.core.models import History
element_cache.ensure_schema_version()
set_constants(get_constants_from_apps())
2019-01-20 10:05:50 +01:00
History.objects.build_history()