Cleaned up config app. Removed OPTIONS request. Fixed #3531.
This commit is contained in:
parent
b5157cd418
commit
1527cc69dd
@ -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].
|
||||||
|
@ -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):
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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__,
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user