diff --git a/searx/settings_loader.py b/searx/settings_loader.py index d499ffc73..ae577f93b 100644 --- a/searx/settings_loader.py +++ b/searx/settings_loader.py @@ -65,25 +65,54 @@ def update_dict(default_dict, user_dict): def update_settings(default_settings, user_settings): - # merge everything except the engines + # merge everything except the engines and categories_as_tabs for k, v in user_settings.items(): - if k not in ('use_default_settings', 'engines'): - if k in default_settings and isinstance(v, Mapping): - update_dict(default_settings[k], v) - else: - default_settings[k] = v - - categories_as_tabs = user_settings.get('categories_as_tabs') - if categories_as_tabs: - default_settings['categories_as_tabs'] = categories_as_tabs + if k in ('use_default_settings', 'engines', 'categories_as_tabs'): + continue + if k in default_settings and isinstance(v, Mapping): + update_dict(default_settings[k], v) + else: + default_settings[k] = v # parse the engines remove_engines = None keep_only_engines = None + remove_cat = None + keep_only_cat = None use_default_settings = user_settings.get('use_default_settings') if isinstance(use_default_settings, dict): remove_engines = use_default_settings.get('engines', {}).get('remove') keep_only_engines = use_default_settings.get('engines', {}).get('keep_only') + remove_cat = use_default_settings.get('categories_as_tabs', {}).get('remove') + keep_only_cat = use_default_settings.get('categories_as_tabs', {}).get('keep_only') + + if 'categories_as_tabs' in user_settings or remove_cat is not None or keep_only_cat is not None: + categories_as_tabs = default_settings['categories_as_tabs'] + + # parse "use_default_settings.categories_as_tabs.remove" + if remove_cat is not None: + categories_as_tabs = dict( + filterfalse(lambda category_tuple: category_tuple[0] in remove_cat, categories_as_tabs.items()) + ) + + # parse "use_default_settings.categories_as_tabs.keep_only" + if keep_only_cat is not None: + categories_as_tabs = dict( + filter(lambda category_tuple: category_tuple[0] in keep_only_cat, categories_as_tabs.items()) + ) + + # parse "categories_as_tabs" + user_cat = user_settings.get('categories_as_tabs') + if user_cat: + for user_category_name, user_category_definition in user_cat.items(): + default_cat = categories_as_tabs.get(user_category_name) + if default_cat: + update_dict(default_cat, user_category_definition) + else: + categories_as_tabs[user_category_name] = user_category_definition + + # store the result + default_settings['categories_as_tabs'] = categories_as_tabs if 'engines' in user_settings or remove_engines is not None or keep_only_engines is not None: engines = default_settings['engines'] diff --git a/tests/unit/settings/user_settings_keep_only.yml b/tests/unit/settings/user_settings_keep_only.yml index 42401762e..d2281d8ba 100644 --- a/tests/unit/settings/user_settings_keep_only.yml +++ b/tests/unit/settings/user_settings_keep_only.yml @@ -3,6 +3,10 @@ use_default_settings: keep_only: - wikibooks - wikinews + categories_as_tabs: + keep_only: + - general + - images server: secret_key: "user_secret_key" bind_address: "0.0.0.0" diff --git a/tests/unit/settings/user_settings_remove.yml b/tests/unit/settings/user_settings_remove.yml index c15e2c964..cf7390435 100644 --- a/tests/unit/settings/user_settings_remove.yml +++ b/tests/unit/settings/user_settings_remove.yml @@ -3,6 +3,10 @@ use_default_settings: remove: - wikibooks - wikinews + categories_as_tabs: + remove: + - files + - social media server: secret_key: "user_secret_key" bind_address: "0.0.0.0" diff --git a/tests/unit/settings/user_settings_remove2.yml b/tests/unit/settings/user_settings_remove2.yml index 1d594fb81..5c42bebdd 100644 --- a/tests/unit/settings/user_settings_remove2.yml +++ b/tests/unit/settings/user_settings_remove2.yml @@ -3,6 +3,12 @@ use_default_settings: remove: - wikibooks - wikinews + categories_as_tabs: + remove: + - files + - social media +categories_as_tabs: + onions: server: secret_key: "user_secret_key" bind_address: "0.0.0.0" diff --git a/tests/unit/test_settings_loader.py b/tests/unit/test_settings_loader.py index 13a2d4f37..1b8d52bbd 100644 --- a/tests/unit/test_settings_loader.py +++ b/tests/unit/test_settings_loader.py @@ -80,6 +80,11 @@ class TestUserSettings(SearxTestCase): self.assertNotIn('wikinews', engine_names) self.assertNotIn('wikibooks', engine_names) self.assertIn('wikipedia', engine_names) + # check categories_as_tabs + self.assertEqual( + list(settings['categories_as_tabs'].keys()), + ['general', 'images', 'videos', 'news', 'map', 'music', 'it', 'science'], + ) def test_user_settings_remove2(self): with patch.dict( @@ -98,6 +103,11 @@ class TestUserSettings(SearxTestCase): self.assertEqual(wikipedia[0]['tokens'], ['secret_token']) newengine = list(filter(lambda engine: (engine.get('name')) == 'newengine', settings['engines'])) self.assertEqual(newengine[0]['engine'], 'dummy') + # check categories_as_tabs + self.assertEqual( + list(settings['categories_as_tabs'].keys()), + ['general', 'images', 'videos', 'news', 'map', 'music', 'it', 'science', 'onions'], + ) def test_user_settings_keep_only(self): with patch.dict( @@ -109,6 +119,8 @@ class TestUserSettings(SearxTestCase): self.assertEqual(engine_names, ['wikibooks', 'wikinews', 'wikipedia', 'newengine']) # wikipedia has been removed, then added again with the "engine" section of user_settings_keep_only.yml self.assertEqual(len(settings['engines'][2]), 1) + # check categories_as_tabs + self.assertEqual(list(settings['categories_as_tabs'].keys()), ['general', 'images']) def test_custom_settings(self): with patch.dict(