.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)
 
 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 376 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 379 of file preferences.py.

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

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 490 of file preferences.py.

490 def get_as_url_params(self):
491 """Return preferences as URL parameters"""
492 settings_kv = {}
493 for k, v in self.key_value_settings.items():
494 if v.locked:
495 continue
496 if isinstance(v, MultipleChoiceSetting):
497 settings_kv[k] = ','.join(v.get_value())
498 else:
499 settings_kv[k] = v.get_value()
500
501 settings_kv['disabled_engines'] = ','.join(self.engines.disabled)
502 settings_kv['enabled_engines'] = ','.join(self.engines.enabled)
503
504 settings_kv['disabled_plugins'] = ','.join(self.plugins.disabled)
505 settings_kv['enabled_plugins'] = ','.join(self.plugins.enabled)
506
507 settings_kv['tokens'] = ','.join(self.tokens.values)
508
509 return urlsafe_b64encode(compress(urlencode(settings_kv).encode())).decode()
510

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

◆ get_value()

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

Definition at line 562 of file preferences.py.

562 def get_value(self, user_setting_name: str):
563 """Returns the value for ``user_setting_name``"""
564 ret_val = None
565 if user_setting_name in self.key_value_settings:
566 ret_val = self.key_value_settings[user_setting_name].get_value()
567 return ret_val
568

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 519 of file preferences.py.

519 def parse_dict(self, input_data: Dict[str, str]):
520 """parse preferences from request (``flask.request.form``)"""
521 for user_setting_name, user_setting in input_data.items():
522 if user_setting_name in self.key_value_settings:
523 if self.key_value_settings[user_setting_name].locked:
524 continue
525 self.key_value_settings[user_setting_name].parse(user_setting)
526 elif user_setting_name == 'disabled_engines':
527 self.engines.parse_cookie(input_data.get('disabled_engines', ''), input_data.get('enabled_engines', ''))
528 elif user_setting_name == 'disabled_plugins':
529 self.plugins.parse_cookie(input_data.get('disabled_plugins', ''), input_data.get('enabled_plugins', ''))
530 elif user_setting_name == 'tokens':
531 self.tokens.parse(user_setting)
532

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 511 of file preferences.py.

511 def parse_encoded_data(self, input_data: str):
512 """parse (base64) preferences from request (``flask.request.form['preferences']``)"""
513 bin_data = decompress(urlsafe_b64decode(input_data))
514 dict_data = {}
515 for x, y in parse_qs(bin_data.decode('ascii'), keep_blank_values=True).items():
516 dict_data[x] = y[0]
517 self.parse_dict(dict_data)
518

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 533 of file preferences.py.

533 def parse_form(self, input_data: Dict[str, str]):
534 """Parse formular (``<input>``) data from a ``flask.request.form``"""
535 disabled_engines = []
536 enabled_categories = []
537 disabled_plugins = []
538
539 # boolean preferences are not sent by the form if they're false,
540 # so we have to add them as false manually if they're not sent (then they would be true)
541 for key, setting in self.key_value_settings.items():
542 if key not in input_data.keys() and isinstance(setting, BooleanSetting):
543 input_data[key] = 'False'
544
545 for user_setting_name, user_setting in input_data.items():
546 if user_setting_name in self.key_value_settings:
547 self.key_value_settings[user_setting_name].parse(user_setting)
548 elif user_setting_name.startswith('engine_'):
549 disabled_engines.append(user_setting_name)
550 elif user_setting_name.startswith('category_'):
551 enabled_categories.append(user_setting_name[len('category_') :])
552 elif user_setting_name.startswith('plugin_'):
553 disabled_plugins.append(user_setting_name)
554 elif user_setting_name == 'tokens':
555 self.tokens.parse_form(user_setting)
556
557 self.key_value_settings['categories'].parse_form(enabled_categories)
558 self.engines.parse_form(disabled_engines)
559 self.plugins.parse_form(disabled_plugins)
560

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 569 of file preferences.py.

569 def save(self, resp: flask.Response):
570 """Save cookie in the HTTP response object"""
571 for user_setting_name, user_setting in self.key_value_settings.items():
572 # pylint: disable=unnecessary-dict-index-lookup
573 if self.key_value_settings[user_setting_name].locked:
574 continue
575 user_setting.save(user_setting_name, resp)
576 self.engines.save(resp)
577 self.plugins.save(resp)
578 self.tokens.save('tokens', resp)
579 return resp
580

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 581 of file preferences.py.

581 def validate_token(self, engine):
582 valid = True
583 if hasattr(engine, 'tokens') and engine.tokens:
584 valid = False
585 for token in self.tokens.values:
586 if token in engine.tokens:
587 valid = True
588 break
589
590 return valid
591
592

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

Member Data Documentation

◆ client

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

Definition at line 488 of file preferences.py.

◆ engines

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

Definition at line 485 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 390 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 486 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 487 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: