Cleaned up config app. Removed OPTIONS request. Fixed #3531.

This commit is contained in:
Norman Jäckel 2018-01-20 15:58:36 +01:00 committed by Emanuel Schütze
parent b5157cd418
commit 1527cc69dd
9 changed files with 41 additions and 64 deletions

View File

@ -103,9 +103,10 @@ Core:
- Added caching for the index views [#3419, #3424]. - Added caching for the index views [#3419, #3424].
- Added projector prioritization [#3425]. - Added projector prioritization [#3425].
- Use native twisted mode for daphne [#3487]. - Use native twisted mode for daphne [#3487].
- Save language selection to session storage [#3543] - Saved language selection to session storage [#3543].
- Set default of projector resolution to 1220x915 [#2549]. - Set default of projector resolution to 1220x915 [#2549].
- Preparations for the SAML plugin; Fixed caching of main views [#3535]. - Preparations for the SAML plugin; Fixed caching of main views [#3535].
- Removed unnecessary OPTIONS request in config [#3541].
Mediafiles: Mediafiles:
- Fixed reloading of PDF on page change [#3274]. - Fixed reloading of PDF on page change [#3274].

View File

@ -1,3 +1,7 @@
from collections import OrderedDict
from operator import attrgetter
from typing import Any, List # noqa
from django.apps import AppConfig from django.apps import AppConfig
from django.conf import settings from django.conf import settings
from django.db.models.signals import post_migrate from django.db.models.signals import post_migrate
@ -68,6 +72,8 @@ class CoreAppConfig(AppConfig):
yield Collection(self.get_model(model).get_collection_string()) yield Collection(self.get_model(model).get_collection_string())
def get_angular_constants(self): def get_angular_constants(self):
from .config import config
# Client settings # Client settings
client_settings_keys = [ client_settings_keys = [
'MOTIONS_ALLOW_AMENDMENTS_OF_AMENDMENTS' 'MOTIONS_ALLOW_AMENDMENTS_OF_AMENDMENTS'
@ -83,7 +89,30 @@ class CoreAppConfig(AppConfig):
client_settings = { client_settings = {
'name': 'OpenSlidesSettings', 'name': 'OpenSlidesSettings',
'value': client_settings_dict} 'value': client_settings_dict}
return [client_settings]
# Config variables
config_groups = [] # type: List[Any] # TODO: Replace Any by correct type
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
if not config_groups or config_groups[-1]['name'] != config_variable.group:
# Add new group.
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.
config_groups[-1]['subgroups'].append(OrderedDict(
name=config_variable.subgroup,
items=[]))
# Add the config variable to the current group and subgroup.
config_groups[-1]['subgroups'][-1]['items'].append(config_variable.data)
config_variables = {
'name': 'OpenSlidesConfigVariables',
'value': config_groups}
return [client_settings, config_variables]
def call_save_default_values(**kwargs): def call_save_default_values(**kwargs):

View File

@ -281,7 +281,7 @@ class ConfigVariable:
@property @property
def data(self) -> ConfigVariableDict: def data(self) -> ConfigVariableDict:
""" """
Property with all data for OPTIONS requests. Property with all data for AngularJS variable on startup.
""" """
return ConfigVariableDict( return ConfigVariableDict(
key=self.name, key=self.name,

View File

@ -878,13 +878,6 @@ angular.module('OpenSlidesApp.core', [
return DS.defineResource({ return DS.defineResource({
name: 'core/config', name: 'core/config',
idAttribute: 'key', idAttribute: 'key',
configOptions: configOptions,
getConfigOptions: function () {
if (!this.configOptions) {
this.configOptions = $http({ 'method': 'OPTIONS', 'url': '/rest/core/config/' });
}
return this.configOptions;
},
translate: function (value) { translate: function (value) {
return gettextCatalog.getString(value); return gettextCatalog.getString(value);
} }

View File

@ -360,11 +360,6 @@ angular.module('OpenSlidesApp.core.site', [
.state('config', { .state('config', {
url: '/config', url: '/config',
controller: 'ConfigCtrl', controller: 'ConfigCtrl',
resolve: {
configOptions: function(Config) {
return Config.getConfigOptions();
}
},
data: { data: {
title: gettext('Settings'), title: gettext('Settings'),
basePerm: 'core.can_manage_config', basePerm: 'core.can_manage_config',
@ -1119,14 +1114,14 @@ angular.module('OpenSlidesApp.core.site', [
'$timeout', '$timeout',
'MajorityMethodChoices', 'MajorityMethodChoices',
'Config', 'Config',
'configOptions', 'OpenSlidesConfigVariables',
'gettextCatalog', 'gettextCatalog',
'DateTimePickerTranslation', 'DateTimePickerTranslation',
'Editor', 'Editor',
function($scope, $timeout, MajorityMethodChoices, Config, configOptions, function($scope, $timeout, MajorityMethodChoices, Config, OpenSlidesConfigVariables,
gettextCatalog, DateTimePickerTranslation, Editor) { gettextCatalog, DateTimePickerTranslation, Editor) {
Config.bindAll({}, $scope, 'configs'); Config.bindAll({}, $scope, 'configs');
$scope.configGroups = configOptions.data.config_groups; $scope.configGroups = OpenSlidesConfigVariables;
$scope.dateTimePickerTranslatedButtons = DateTimePickerTranslation.getButtons(); $scope.dateTimePickerTranslatedButtons = DateTimePickerTranslation.getButtons();
$scope.ckeditorOptions = Editor.getOptions(); $scope.ckeditorOptions = Editor.getOptions();

View File

@ -1,7 +1,5 @@
import json import json
import uuid import uuid
from collections import OrderedDict
from operator import attrgetter
from textwrap import dedent from textwrap import dedent
from typing import Any, Dict, List, cast # noqa from typing import Any, Dict, List, cast # noqa
@ -29,7 +27,6 @@ from ..utils.plugins import (
from ..utils.rest_api import ( from ..utils.rest_api import (
ModelViewSet, ModelViewSet,
Response, Response,
SimpleMetadata,
ValidationError, ValidationError,
detail_route, detail_route,
list_route, list_route,
@ -581,36 +578,6 @@ class TagViewSet(ModelViewSet):
return result return result
class ConfigMetadata(SimpleMetadata):
"""
Custom metadata class to add config info to responses on OPTIONS requests.
"""
def determine_metadata(self, request, view):
# Build tree.
config_groups = [] # type: List[Any] # TODO: Replace Any by correct type
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
if not config_groups or config_groups[-1]['name'] != config_variable.group:
# Add new group.
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.
config_groups[-1]['subgroups'].append(OrderedDict(
name=config_variable.subgroup,
items=[]))
# Add the config variable to the current group and subgroup.
config_groups[-1]['subgroups'][-1]['items'].append(config_variable.data)
# Add tree to metadata.
metadata = super().determine_metadata(request, view)
metadata['config_groups'] = config_groups
return metadata
class ConfigViewSet(ModelViewSet): class ConfigViewSet(ModelViewSet):
""" """
API endpoint for the config. API endpoint for the config.
@ -620,7 +587,6 @@ class ConfigViewSet(ModelViewSet):
""" """
access_permissions = ConfigAccessPermissions() access_permissions = ConfigAccessPermissions()
queryset = ConfigStore.objects.all() queryset = ConfigStore.objects.all()
metadata_class = ConfigMetadata
def check_view_permissions(self): def check_view_permissions(self):
""" """

View File

@ -197,14 +197,6 @@ class ConfigViewSet(TestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.data, {'detail': 'Invalid input. Config value is missing.'}) self.assertEqual(response.data, {'detail': 'Invalid input. Config value is missing.'})
def test_metadata_with_hidden(self):
self.client.login(username='admin', password='admin')
response = self.client.options(reverse('config-list'))
filter_obj = filter(
lambda item: item['key'] == 'test_var_pud2zah2teeNaiP7IoNa',
response.data['config_groups'][0]['subgroups'][0]['items'])
self.assertEqual(len(list(filter_obj)), 0)
def validator_for_testing(value): def validator_for_testing(value):
""" """

View File

@ -26,8 +26,8 @@ class TestConfigVariable(TestCase):
class TestConfigHandler(TestCase): class TestConfigHandler(TestCase):
def test_get_not_found(self): @patch('openslides.core.config.ConfigHandler.save_default_values')
config.key_to_id = 'has to be set or there is a db query' def test_get_not_found(self, mock_save_default_values):
self.assertRaises( self.assertRaises(
ConfigNotFound, ConfigNotFound,
config.__getitem__, config.__getitem__,

View File

@ -170,10 +170,11 @@ class WebclientJavaScriptView(TestCase):
def setUp(self): def setUp(self):
self.request = MagicMock() self.request = MagicMock()
@patch('openslides.core.config.config')
@patch('django.contrib.auth.models.Permission.objects.all') @patch('django.contrib.auth.models.Permission.objects.all')
def test_permissions_as_constant(self, mock_all): def test_permissions_as_constant(self, mock_permissions_all, mock_config):
self.view_instance = views.WebclientJavaScriptView() self.view_instance = views.WebclientJavaScriptView()
self.view_instance.request = self.request self.view_instance.request = self.request
response = self.view_instance.get(realm='site') response = self.view_instance.get(realm='site')
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(mock_all.call_count, 2) self.assertEqual(mock_permissions_all.call_count, 2)