From 180dedfc38d435a2bd809f4b1d5fbc1533c33a6b Mon Sep 17 00:00:00 2001 From: FinnStutzenstein Date: Mon, 10 Sep 2018 08:15:31 +0200 Subject: [PATCH] Moved the collection of config variables before the generation of angular constants --- client/src/app/app.component.ts | 4 +++- .../settings-list/settings-list.component.ts | 11 ++++++++++- openslides/__main__.py | 3 +++ openslides/agenda/apps.py | 9 +++++---- openslides/assignments/apps.py | 9 +++++---- openslides/core/apps.py | 11 ++++++++--- openslides/core/config.py | 12 ++++++++++++ openslides/motions/apps.py | 9 +++++---- openslides/users/apps.py | 9 +++++---- requirements/development.txt | 2 +- 10 files changed, 57 insertions(+), 22 deletions(-) diff --git a/client/src/app/app.component.ts b/client/src/app/app.component.ts index 8fe2e8a55..1e49adb65 100644 --- a/client/src/app/app.component.ts +++ b/client/src/app/app.component.ts @@ -3,6 +3,7 @@ import { TranslateService } from '@ngx-translate/core'; import { OperatorService } from './core/services/operator.service'; import { LoginDataService } from './core/services/login-data.service'; import { ConfigService } from './core/services/config.service'; +import { ConstantsService } from './core/services/constants.service'; /** * Angular's global App Component @@ -23,7 +24,8 @@ export class AppComponent { translate: TranslateService, operator: OperatorService, configService: ConfigService, - loginDataService: LoginDataService + loginDataService: LoginDataService, + constantsService: ConstantsService // Needs to be started, so it can register itself to the WebsocketService ) { // manually add the supported languages translate.addLangs(['en', 'de', 'fr']); diff --git a/client/src/app/site/settings/settings-list/settings-list.component.ts b/client/src/app/site/settings/settings-list/settings-list.component.ts index 8c02d2559..460a0d824 100644 --- a/client/src/app/site/settings/settings-list/settings-list.component.ts +++ b/client/src/app/site/settings/settings-list/settings-list.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { BaseComponent } from '../../../base.component'; +import { ConstantsService } from '../../../core/services/constants.service'; /** * List view for the global settings @@ -19,7 +20,11 @@ export class SettingsListComponent extends BaseComponent implements OnInit { * @param titleService * @param translate */ - public constructor(titleService: Title, protected translate: TranslateService) { + public constructor( + titleService: Title, + protected translate: TranslateService, + private constantsService: ConstantsService + ) { super(titleService, translate); } @@ -28,5 +33,9 @@ export class SettingsListComponent extends BaseComponent implements OnInit { */ public ngOnInit(): void { super.setTitle('Settings'); + + this.constantsService.get('OpenSlidesConfigVariables').subscribe(data => { + console.log(data); + }); } } diff --git a/openslides/__main__.py b/openslides/__main__.py index 56b572d69..805bf4635 100644 --- a/openslides/__main__.py +++ b/openslides/__main__.py @@ -9,6 +9,7 @@ from django.core.management import call_command, execute_from_command_line import openslides from openslides.utils.arguments import arguments +from openslides.utils.exceptions import OpenSlidesError from openslides.utils.main import ( ExceptionArgumentParser, UnknownCommand, @@ -187,6 +188,8 @@ def start(args): """ Starts OpenSlides: Runs migrations and runs runserver. """ + raise OpenSlidesError('The start command does not work anymore. ' + + 'Please use `createsettings`, `migrate` and `runserver`.') settings_dir = args.settings_dir settings_filename = args.settings_filename local_installation = is_local_installation() diff --git a/openslides/agenda/apps.py b/openslides/agenda/apps.py index ca50d0075..ed5434341 100644 --- a/openslides/agenda/apps.py +++ b/openslides/agenda/apps.py @@ -12,10 +12,8 @@ class AgendaAppConfig(AppConfig): def ready(self): # Import all required stuff. from django.db.models.signals import pre_delete, post_save - from ..core.config import config from ..core.signals import permission_change, user_data_required from ..utils.rest_api import router - from .config_variables import get_config_variables from .projector import get_projector_elements from .signals import ( get_permission_change_data, @@ -24,8 +22,7 @@ class AgendaAppConfig(AppConfig): required_users) from .views import ItemViewSet - # Define config variables and projector elements. - config.update_config_variables(get_config_variables()) + # Define projector elements. register_projector_elements(get_projector_elements()) # Connect signals. @@ -45,6 +42,10 @@ class AgendaAppConfig(AppConfig): # Register viewsets. router.register(self.get_model('Item').get_collection_string(), ItemViewSet) + 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 diff --git a/openslides/assignments/apps.py b/openslides/assignments/apps.py index b3c49a251..301aaca79 100644 --- a/openslides/assignments/apps.py +++ b/openslides/assignments/apps.py @@ -14,16 +14,13 @@ class AssignmentsAppConfig(AppConfig): def ready(self): # Import all required stuff. - from ..core.config import config from ..core.signals import permission_change, user_data_required from ..utils.rest_api import router - from .config_variables import get_config_variables from .projector import get_projector_elements from .signals import get_permission_change_data, required_users from .views import AssignmentViewSet, AssignmentPollViewSet - # Define config variables and projector elements. - config.update_config_variables(get_config_variables()) + # Define projector elements. register_projector_elements(get_projector_elements()) # Connect signals. @@ -38,6 +35,10 @@ class AssignmentsAppConfig(AppConfig): router.register(self.get_model('Assignment').get_collection_string(), AssignmentViewSet) router.register('assignments/poll', AssignmentPollViewSet) + 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 diff --git a/openslides/core/apps.py b/openslides/core/apps.py index 3c56b60d9..6f56fa92d 100644 --- a/openslides/core/apps.py +++ b/openslides/core/apps.py @@ -21,7 +21,6 @@ class CoreAppConfig(AppConfig): # Import all required stuff. from .config import config from ..utils.rest_api import router - from .config_variables import get_config_variables from .projector import get_projector_elements from .signals import ( delete_django_app_permissions, @@ -41,6 +40,9 @@ class CoreAppConfig(AppConfig): ) from ..utils.constants import set_constants, get_constants_from_apps + # Collect all config variables before getting the constants. + config.collect_config_variables_from_apps() + # Set constants try: set_constants(get_constants_from_apps()) @@ -48,8 +50,7 @@ class CoreAppConfig(AppConfig): # Database is not loaded. This happens in tests and migrations. pass - # Define config variables and projector elements. - config.update_config_variables(get_config_variables()) + # Define projector elements. register_projector_elements(get_projector_elements()) # Connect signals. @@ -73,6 +74,10 @@ class CoreAppConfig(AppConfig): router.register(self.get_model('ProjectorMessage').get_collection_string(), ProjectorMessageViewSet) router.register(self.get_model('Countdown').get_collection_string(), CountdownViewSet) + 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 diff --git a/openslides/core/config.py b/openslides/core/config.py index 1f5eacc06..f62d2175f 100644 --- a/openslides/core/config.py +++ b/openslides/core/config.py @@ -10,6 +10,7 @@ from typing import ( ) from asgiref.sync import async_to_sync +from django.apps import apps from django.core.exceptions import ValidationError as DjangoValidationError from django.utils.translation import ugettext as _ from mypy_extensions import TypedDict @@ -170,6 +171,17 @@ class ConfigHandler: if config_variable.on_change: config_variable.on_change() + def collect_config_variables_from_apps(self) -> None: + for app in apps.get_app_configs(): + try: + # Each app can deliver config variables when implementing the + # get_config_variables method. + get_config_variables = app.get_config_variables + except AttributeError: + # The app doesn't have this method. Continue to next app. + continue + self.update_config_variables(get_config_variables()) + def update_config_variables(self, items: Iterable['ConfigVariable']) -> None: """ Updates the config_variables dict. diff --git a/openslides/motions/apps.py b/openslides/motions/apps.py index 2acea6781..f646ace63 100644 --- a/openslides/motions/apps.py +++ b/openslides/motions/apps.py @@ -12,10 +12,8 @@ class MotionsAppConfig(AppConfig): def ready(self): # Import all required stuff. - from openslides.core.config import config from openslides.core.signals import permission_change, user_data_required from openslides.utils.rest_api import router - from .config_variables import get_config_variables from .projector import get_projector_elements from .signals import ( create_builtin_workflows, @@ -33,8 +31,7 @@ class MotionsAppConfig(AppConfig): WorkflowViewSet, ) - # Define config variables and projector elements. - config.update_config_variables(get_config_variables()) + # Define projector elements. register_projector_elements(get_projector_elements()) # Connect signals. @@ -59,6 +56,10 @@ class MotionsAppConfig(AppConfig): router.register(self.get_model('MotionPoll').get_collection_string(), MotionPollViewSet) router.register(self.get_model('State').get_collection_string(), StateViewSet) + 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 diff --git a/openslides/users/apps.py b/openslides/users/apps.py index 85d3820eb..eff921cf9 100644 --- a/openslides/users/apps.py +++ b/openslides/users/apps.py @@ -13,16 +13,13 @@ class UsersAppConfig(AppConfig): def ready(self): # Import all required stuff. - from ..core.config import config from ..core.signals import post_permission_creation, permission_change from ..utils.rest_api import router - from .config_variables import get_config_variables from .projector import get_projector_elements from .signals import create_builtin_groups_and_admin, get_permission_change_data from .views import GroupViewSet, PersonalNoteViewSet, UserViewSet - # Define config variables and projector elements. - config.update_config_variables(get_config_variables()) + # Define projector elements. register_projector_elements(get_projector_elements()) # Connect signals. @@ -42,6 +39,10 @@ class UsersAppConfig(AppConfig): router.register(self.get_model('Group').get_collection_string(), GroupViewSet) router.register(self.get_model('PersonalNote').get_collection_string(), PersonalNoteViewSet) + 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 diff --git a/requirements/development.txt b/requirements/development.txt index b4440966f..0ab902298 100644 --- a/requirements/development.txt +++ b/requirements/development.txt @@ -3,7 +3,7 @@ coverage # Use master of flake8 until flake8 3.6 is released that supports python3.7 git+https://gitlab.com/pycqa/flake8.git isort -mypy +mypy<=0.620 pytest>=3.6,<3.7 pytest-django pytest-asyncio