[enh] simplify and clean up preferences (#6126)

- The 'engine tokens' field is only shown now if there are any engines with tokens configured.

- DOI Resolver now has combined the previous two settings (one dropdown and one toggle) into just a single dropdown similar to the favicon resolver.
This commit is contained in:
Brock Vojkovic
2026-10-02 18:36:07 +08:00
committed by GitHub
parent a5659a5364
commit 26b90797e0
5 changed files with 31 additions and 28 deletions
+9 -8
View File
@@ -19,9 +19,6 @@ if typing.TYPE_CHECKING:
from searx.plugins import PluginCfg
ahmia_blacklist: list = []
def filter_url_field(result: "Result|LegacyResult", field_name: str, url_src: str) -> bool | str:
"""Returns bool ``True`` to use URL unchanged (``False`` to ignore URL).
If URL should be modified, the returned string is the new URL to use."""
@@ -29,11 +26,15 @@ def filter_url_field(result: "Result|LegacyResult", field_name: str, url_src: st
if field_name != "url":
return True # use it unchanged
resolver_url = get_doi_resolver()
if not resolver_url:
return True # use it unchanged
doi = extract_doi(result.parsed_url)
if doi and len(doi) < 50:
for suffix in ("/", ".pdf", ".xml", "/full", "/meta", "/abstract"):
doi = doi.removesuffix(suffix)
new_url = get_doi_resolver() + doi
new_url = resolver_url + doi
if "doi" not in result:
result["doi"] = doi
log.debug("oa_doi_rewrite: [URL field: %s] %s -> %s", field_name, url_src, new_url)
@@ -53,7 +54,7 @@ class SXNGPlugin(Plugin):
id=self.id,
name=gettext("Open Access DOI rewrite"),
description=gettext("Avoid paywalls by redirecting to open-access versions of publications when available"),
preference_section="general",
preference_section=None,
)
def on_result(
@@ -83,7 +84,7 @@ def extract_doi(url):
def get_doi_resolver() -> str:
doi_resolvers = get_setting("doi_resolvers")
selected_resolver = sxng_request.preferences.get_value('doi_resolver')[0]
if selected_resolver not in doi_resolvers:
selected_resolver = get_setting("default_doi_resolver")
selected_resolver = sxng_request.preferences.get_value("doi_resolver")
if not selected_resolver or selected_resolver not in doi_resolvers:
return ""
return doi_resolvers[selected_resolver]
+7 -3
View File
@@ -457,10 +457,10 @@ class Preferences:
get_setting("ui.results_on_new_tab"),
locked="results_on_new_tab" in self.cfg.lock,
),
'doi_resolver': MultipleChoiceSetting(
[get_setting("default_doi_resolver")],
"doi_resolver": EnumStringSetting(
get_setting("default_doi_resolver"),
locked="doi_resolver" in self.cfg.lock,
choices=DOI_RESOLVERS,
choices=["", *DOI_RESOLVERS],
),
'simple_style': EnumStringSetting(
get_setting("ui.theme_args.simple_style"),
@@ -536,6 +536,8 @@ class Preferences:
self.plugins.parse_cookie(input_data.get('disabled_plugins', ''), input_data.get('enabled_plugins', ''))
elif user_setting_name == 'tokens':
self.tokens.parse(user_setting)
if "oa_doi_rewrite" in self.plugins.choices:
self.plugins.choices["oa_doi_rewrite"] = bool(self.get_value("doi_resolver"))
def parse_form(self, input_data: dict[str, str]):
"""Parse formular (``<input>``) data from a ``flask.request.form``"""
@@ -564,6 +566,8 @@ class Preferences:
self.key_value_settings['categories'].parse_form(enabled_categories) # type: ignore
self.engines.parse_form(disabled_engines)
self.plugins.parse_form(disabled_plugins)
if "oa_doi_rewrite" in self.plugins.choices:
self.plugins.choices["oa_doi_rewrite"] = bool(self.get_value("doi_resolver"))
# cannot be used in case of engines or plugins
def get_value(self, user_setting_name: str) -> t.Any:
+6 -6
View File
@@ -183,16 +183,16 @@
{%- if 'favicon_resolver' not in locked_preferences -%}
{%- include 'simple/preferences/favicon.html' -%}
{%- endif -%}
{%- if 'doi_resolver' not in locked_preferences -%}
{%- include 'simple/preferences/doi_resolver.html' -%}
{%- endif -%}
{% if 'safesearch' not in locked_preferences %}
{%- include 'simple/preferences/safesearch.html' -%}
{%- endif -%}
{%- include 'simple/preferences/tokens.html' -%}
{{- plugin_preferences('general') -}}
{%- if 'doi_resolver' not in locked_preferences %}
{%- include 'simple/preferences/doi_resolver.html' -%}
{%- if engines_with_tokens -%}
{%- include 'simple/preferences/tokens.html' -%}
{%- endif -%}
{{- plugin_preferences('general') -}}
{{- tab_footer() -}}
{# tab: ui #}
@@ -1,20 +1,17 @@
<div class="pref-group">{{- _('Digital Object Identifier (DOI)') -}}</div>
{{- plugin_preferences('general/doi_resolver') -}}
<fieldset>{{- '' -}}
<legend id="pref_doi_resolver">{{- _('Open Access DOI resolver') -}}</legend>{{- '' -}}
<legend id="pref_doi_resolver">{{- _('DOI Resolver') -}}</legend>{{- '' -}}
<div class="value">{{- '' -}}
<select id='doi_resolver' name='doi_resolver' aria-labelledby="pref_doi_resolver">{{- '' -}}
{%- for doi_resolver_name,doi_resolver_url in doi_resolvers.items() -%}
<select name="doi_resolver" aria-labelledby="pref_doi_resolver">{{- '' -}}
<option value=""> - </option>
{%- for doi_resolver_name in doi_resolvers -%}
<option value="{{ doi_resolver_name }}"
{%- if doi_resolver_url == current_doi_resolver %} selected="selected" {%- endif -%}>
{{- doi_resolver_name }} - {{ doi_resolver_url -}}
{%- if doi_resolver_name == current_doi_resolver %} selected="selected" {%- endif -%}>
{{- doi_resolver_name -}}
</option>
{%- endfor -%}
</select>{{- '' -}}
</div>{{- '' -}}
<div class="description">
{{- _('Select service used by DOI rewrite') -}}
{{- _('Avoid paywalls by redirecting to open-access versions of publications when available') -}}
</div>{{- '' -}}
</fieldset>{{- '' -}}
+2 -1
View File
@@ -959,6 +959,7 @@ def preferences():
# fmt: off
'preferences.html',
preferences = True,
engines_with_tokens = any(getattr(e, "tokens", None) for e in engines.values()),
selected_categories = get_selected_categories(sxng_request.preferences, sxng_request.form),
locales = LOCALE_NAMES,
current_locale = sxng_request.preferences.get_value("locale"),
@@ -975,7 +976,7 @@ def preferences():
shortcuts = {y: x for x, y in engine_shortcuts.items()},
themes = themes,
plugins_storage = searx.plugins.STORAGE.info,
current_doi_resolver = get_doi_resolver(),
current_doi_resolver = sxng_request.preferences.get_value("doi_resolver"),
allowed_plugins = allowed_plugins,
preferences_url_params = sxng_request.preferences.get_as_url_params(),
locked_preferences = get_setting("preferences").lock,