.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
searx.preferences.Preferences Class Reference

Public Member Functions

 __init__ (self, list[str] themes, list[str] categories, dict[str, Engine] engines, searx.plugins.PluginStorage plugins, ClientPref|None client=None)
 get_as_url_params (self)
 parse_encoded_data (self, str input_data)
 parse_dict (self, dict[str, str] input_data)
 parse_form (self, dict[str, str] input_data)
t.Any get_value (self, str user_setting_name)
 save (self, flask.Response resp)
 validate_token (self, engine)

Public Attributes

dict key_value_settings
 engines = EnginesSetting('engines', engines=engines.values())
 plugins = PluginsSetting('plugins', plugins=plugins)
 tokens = SetSetting('tokens')
 client = client or ClientPref()

Detailed Description

Validates and saves preferences to cookies

Definition at line 390 of file preferences.py.

Constructor & Destructor Documentation

◆ __init__()

searx.preferences.Preferences.__init__ ( self,
list[str] themes,
list[str] categories,
dict[str, Engine] engines,
searx.plugins.PluginStorage plugins,
ClientPref | None client = None )

Definition at line 393 of file preferences.py.

400 ):
401
402 super().__init__()
403
404 self.key_value_settings: dict[str, Setting] = {
405 # fmt: off
406 'categories': MultipleChoiceSetting(
407 ['general'],
408 locked=is_locked('categories'),
409 choices=categories + ['none']
410 ),
411 'language': SearchLanguageSetting(
412 settings['search']['default_lang'],
413 locked=is_locked('language'),
414 choices=settings['search']['languages'] + ['']
415 ),
416 'locale': EnumStringSetting(
417 settings['ui']['default_locale'],
418 locked=is_locked('locale'),
419 choices=list(LOCALE_NAMES.keys()) + ['']
420 ),
421 'autocomplete': EnumStringSetting(
422 settings['search']['autocomplete'],
423 locked=is_locked('autocomplete'),
424 choices=list(autocomplete.backends.keys()) + ['']
425 ),
426 'favicon_resolver': EnumStringSetting(
427 settings['search']['favicon_resolver'],
428 locked=is_locked('favicon_resolver'),
429 choices=list(favicons.proxy.CFG.resolver_map.keys()) + ['']
430 ),
431 'image_proxy': BooleanSetting(
432 settings['server']['image_proxy'],
433 locked=is_locked('image_proxy')
434 ),
435 'method': EnumStringSetting(
436 settings['server']['method'],
437 locked=is_locked('method'),
438 choices=('GET', 'POST')
439 ),
440 'safesearch': MapSetting(
441 settings['search']['safe_search'],
442 locked=is_locked('safesearch'),
443 map={
444 '0': 0,
445 '1': 1,
446 '2': 2
447 }
448 ),
449 'theme': EnumStringSetting(
450 settings['ui']['default_theme'],
451 locked=is_locked('theme'),
452 choices=themes
453 ),
454 'results_on_new_tab': BooleanSetting(
455 settings['ui']['results_on_new_tab'],
456 locked=is_locked('results_on_new_tab')
457 ),
458 'doi_resolver': MultipleChoiceSetting(
459 [settings['default_doi_resolver'], ],
460 locked=is_locked('doi_resolver'),
461 choices=DOI_RESOLVERS
462 ),
463 'simple_style': EnumStringSetting(
464 settings['ui']['theme_args']['simple_style'],
465 locked=is_locked('simple_style'),
466 choices=['', 'auto', 'light', 'dark', 'black']
467 ),
468 'center_alignment': BooleanSetting(
469 settings['ui']['center_alignment'],
470 locked=is_locked('center_alignment')
471 ),
472 'advanced_search': BooleanSetting(
473 settings['ui']['advanced_search'],
474 locked=is_locked('advanced_search')
475 ),
476 'query_in_title': BooleanSetting(
477 settings['ui']['query_in_title'],
478 locked=is_locked('query_in_title')
479 ),
480 'infinite_scroll': BooleanSetting(
481 settings['ui']['infinite_scroll'],
482 locked=is_locked('infinite_scroll')
483 ),
484 'search_on_category_select': BooleanSetting(
485 settings['ui']['search_on_category_select'],
486 locked=is_locked('search_on_category_select')
487 ),
488 'hotkeys': EnumStringSetting(
489 settings['ui']['hotkeys'],
490 choices=['default', 'vim']
491 ),
492 'url_formatting': EnumStringSetting(
493 settings['ui']['url_formatting'],
494 choices=['pretty', 'full', 'host']
495 ),
496 # fmt: on
497 }
498
499 self.engines = EnginesSetting('engines', engines=engines.values())
500 self.plugins = PluginsSetting('plugins', plugins=plugins)
501 self.tokens = SetSetting('tokens')
502 self.client = client or ClientPref()
503

References __init__().

Referenced by __init__().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Function Documentation

◆ get_as_url_params()

searx.preferences.Preferences.get_as_url_params ( self)
Return preferences as URL parameters

Definition at line 504 of file preferences.py.

504 def get_as_url_params(self):
505 """Return preferences as URL parameters"""
506 settings_kv = {}
507 for k, v in self.key_value_settings.items():
508 if v.locked:
509 continue
510 if isinstance(v, MultipleChoiceSetting):
511 settings_kv[k] = ','.join(v.get_value())
512 else:
513 settings_kv[k] = v.get_value()
514
515 settings_kv['disabled_engines'] = ','.join(self.engines.disabled)
516 settings_kv['enabled_engines'] = ','.join(self.engines.enabled)
517
518 settings_kv['disabled_plugins'] = ','.join(self.plugins.disabled)
519 settings_kv['enabled_plugins'] = ','.join(self.plugins.enabled)
520
521 settings_kv['tokens'] = ','.join(self.tokens.values)
522
523 return urlsafe_b64encode(compress(urlencode(settings_kv).encode())).decode()
524

References engines, key_value_settings, plugins, searx.enginelib.Engine.tokens, and tokens.

◆ get_value()

t.Any searx.preferences.Preferences.get_value ( self,
str user_setting_name )
Returns the value for ``user_setting_name``

Definition at line 576 of file preferences.py.

576 def get_value(self, user_setting_name: str) -> t.Any:
577 """Returns the value for ``user_setting_name``"""
578 ret_val = None
579 if user_setting_name in self.key_value_settings:
580 ret_val = self.key_value_settings[user_setting_name].get_value()
581 return ret_val
582

References get_value(), and key_value_settings.

Referenced by get_value().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_dict()

searx.preferences.Preferences.parse_dict ( self,
dict[str, str] input_data )
parse preferences from request (``flask.request.form``)

Definition at line 533 of file preferences.py.

533 def parse_dict(self, input_data: dict[str, str]):
534 """parse preferences from request (``flask.request.form``)"""
535 for user_setting_name, user_setting in input_data.items():
536 if user_setting_name in self.key_value_settings:
537 if self.key_value_settings[user_setting_name].locked:
538 continue
539 self.key_value_settings[user_setting_name].parse(user_setting)
540 elif user_setting_name == 'disabled_engines':
541 self.engines.parse_cookie(input_data.get('disabled_engines', ''), input_data.get('enabled_engines', ''))
542 elif user_setting_name == 'disabled_plugins':
543 self.plugins.parse_cookie(input_data.get('disabled_plugins', ''), input_data.get('enabled_plugins', ''))
544 elif user_setting_name == 'tokens':
545 self.tokens.parse(user_setting)
546

References engines, key_value_settings, plugins, searx.enginelib.Engine.tokens, and tokens.

Referenced by parse_encoded_data().

Here is the caller graph for this function:

◆ parse_encoded_data()

searx.preferences.Preferences.parse_encoded_data ( self,
str input_data )
parse (base64) preferences from request (``flask.request.form['preferences']``)

Definition at line 525 of file preferences.py.

525 def parse_encoded_data(self, input_data: str):
526 """parse (base64) preferences from request (``flask.request.form['preferences']``)"""
527 bin_data = decompress(urlsafe_b64decode(input_data))
528 dict_data = {}
529 for x, y in parse_qs(bin_data.decode('ascii'), keep_blank_values=True).items():
530 dict_data[x] = y[0]
531 self.parse_dict(dict_data)
532

References parse_dict().

Here is the call graph for this function:

◆ parse_form()

searx.preferences.Preferences.parse_form ( self,
dict[str, str] input_data )
Parse formular (``<input>``) data from a ``flask.request.form``

Definition at line 547 of file preferences.py.

547 def parse_form(self, input_data: dict[str, str]):
548 """Parse formular (``<input>``) data from a ``flask.request.form``"""
549 disabled_engines = []
550 enabled_categories = []
551 disabled_plugins = []
552
553 # boolean preferences are not sent by the form if they're false,
554 # so we have to add them as false manually if they're not sent (then they would be true)
555 for key, setting in self.key_value_settings.items():
556 if key not in input_data.keys() and isinstance(setting, BooleanSetting):
557 input_data[key] = 'False'
558
559 for user_setting_name, user_setting in input_data.items():
560 if user_setting_name in self.key_value_settings:
561 self.key_value_settings[user_setting_name].parse(user_setting)
562 elif user_setting_name.startswith('engine_'):
563 disabled_engines.append(user_setting_name)
564 elif user_setting_name.startswith('category_'):
565 enabled_categories.append(user_setting_name[len('category_') :])
566 elif user_setting_name.startswith('plugin_'):
567 disabled_plugins.append(user_setting_name)
568 elif user_setting_name == 'tokens':
569 self.tokens.parse_form(user_setting)
570
571 self.key_value_settings['categories'].parse_form(enabled_categories) # type: ignore
572 self.engines.parse_form(disabled_engines)
573 self.plugins.parse_form(disabled_plugins)
574

References engines, key_value_settings, parse_form(), plugins, searx.enginelib.Engine.tokens, and tokens.

Referenced by parse_form().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ save()

searx.preferences.Preferences.save ( self,
flask.Response resp )
Save cookie in the HTTP response object

Definition at line 583 of file preferences.py.

583 def save(self, resp: flask.Response):
584 """Save cookie in the HTTP response object"""
585 for user_setting_name, user_setting in self.key_value_settings.items():
586 # pylint: disable=unnecessary-dict-index-lookup
587 if self.key_value_settings[user_setting_name].locked:
588 continue
589 user_setting.save(user_setting_name, resp)
590 self.engines.save(resp)
591 self.plugins.save(resp)
592 self.tokens.save('tokens', resp)
593 return resp
594

References engines, key_value_settings, plugins, save(), searx.enginelib.Engine.tokens, and tokens.

Referenced by save().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_token()

searx.preferences.Preferences.validate_token ( self,
engine )

Definition at line 595 of file preferences.py.

595 def validate_token(self, engine):
596 valid = True
597 if hasattr(engine, 'tokens') and engine.tokens:
598 valid = False
599 for token in self.tokens.values:
600 if token in engine.tokens:
601 valid = True
602 break
603
604 return valid
605
606

References searx.enginelib.Engine.tokens, and tokens.

Member Data Documentation

◆ client

searx.preferences.Preferences.client = client or ClientPref()

Definition at line 502 of file preferences.py.

◆ engines

searx.preferences.Preferences.engines = EnginesSetting('engines', engines=engines.values())

Definition at line 499 of file preferences.py.

Referenced by get_as_url_params(), parse_dict(), parse_form(), and save().

◆ key_value_settings

dict searx.preferences.Preferences.key_value_settings

Definition at line 404 of file preferences.py.

Referenced by get_as_url_params(), get_value(), parse_dict(), parse_form(), and save().

◆ plugins

searx.preferences.Preferences.plugins = PluginsSetting('plugins', plugins=plugins)

Definition at line 500 of file preferences.py.

Referenced by get_as_url_params(), parse_dict(), parse_form(), and save().

◆ tokens

searx.preferences.Preferences.tokens = SetSetting('tokens')

Definition at line 501 of file preferences.py.

Referenced by get_as_url_params(), parse_dict(), parse_form(), save(), and validate_token().


The documentation for this class was generated from the following file: