def autocompleter(): """Return autocompleter results""" request_data = {} # select request method if request.method == 'POST': request_data = request.form else: request_data = request.args # set blocked engines blocked_engines = get_blocked_engines(engines, request.cookies) # parse query query = Query(request_data.get('q', '').encode('utf-8'), blocked_engines) query.parse_query() # check if search query is set if not query.getSearchQuery(): return '', 400 # get autocompleter completer = autocomplete_backends.get( request.cookies.get('autocomplete', settings['search']['autocomplete'])) # parse searx specific autocompleter results like !bang raw_results = searx_bang(query) # normal autocompletion results only appear if max 3 inner results returned if len(raw_results) <= 3 and completer: # get language from cookie language = request.cookies.get('language') if not language or language == 'all': language = 'en' else: language = language.split('_')[0] # run autocompletion raw_results.extend(completer(query.getSearchQuery(), language)) # parse results (write :language and !engine back to result string) results = [] for result in raw_results: query.changeSearchQuery(result) # add parsed result results.append(query.getFullQuery()) # return autocompleter results if request_data.get('format') == 'x-suggestions': return Response(json.dumps([query.query, results]), mimetype='application/json') return Response(json.dumps(results), mimetype='application/json')
def autocompleter(): """Return autocompleter results""" request_data = {} # select request method if request.method == 'POST': request_data = request.form else: request_data = request.args # set blocked engines blocked_engines = get_blocked_engines(engines, request.cookies) # parse query query = Query(request_data.get('q', '').encode('utf-8'), blocked_engines) query.parse_query() # check if search query is set if not query.getSearchQuery(): return '', 400 # get autocompleter completer = autocomplete_backends.get(request.cookies.get('autocomplete', settings['search']['autocomplete'])) # parse searx specific autocompleter results like !bang raw_results = searx_bang(query) # normal autocompletion results only appear if max 3 inner results returned if len(raw_results) <= 3 and completer: # get language from cookie language = request.cookies.get('language') if not language or language == 'all': language = 'en' else: language = language.split('_')[0] # run autocompletion raw_results.extend(completer(query.getSearchQuery(), language)) # parse results (write :language and !engine back to result string) results = [] for result in raw_results: query.changeSearchQuery(result) # add parsed result results.append(query.getFullQuery()) # return autocompleter results if request_data.get('format') == 'x-suggestions': return Response(json.dumps([query.query, results]), mimetype='application/json') return Response(json.dumps(results), mimetype='application/json')
def autocompleter(): """Return autocompleter results""" request_data = {} # select request method if request.method == "POST": request_data = request.form else: request_data = request.args # set blocked engines blocked_engines = get_blocked_engines(engines, request.cookies) # parse query query = Query(request_data.get("q", "").encode("utf-8"), blocked_engines) query.parse_query() # check if search query is set if not query.getSearchQuery(): return "", 400 # run autocompleter completer = autocomplete_backends.get(request.cookies.get("autocomplete", settings["search"]["autocomplete"])) # parse searx specific autocompleter results like !bang raw_results = searx_bang(query) # normal autocompletion results only appear if max 3 inner results returned if len(raw_results) <= 3 and completer: # run autocompletion raw_results.extend(completer(query.getSearchQuery())) # parse results (write :language and !engine back to result string) results = [] for result in raw_results: query.changeSearchQuery(result) # add parsed result results.append(query.getFullQuery()) # return autocompleter results if request_data.get("format") == "x-suggestions": return Response(json.dumps([query.query, results]), mimetype="application/json") return Response(json.dumps(results), mimetype="application/json")
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None image_proxy = request.cookies.get('image_proxy', settings['server'].get('image_proxy')) if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): lang = request.cookies['language'] blocked_engines = [] resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index')))) if request.method == 'GET': blocked_engines = get_blocked_engines(engines, request.cookies) else: # on save selected_categories = [] post_disabled_plugins = [] locale = None autocomplete = '' method = 'POST' safesearch = settings['search']['safe_search'] for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] if category not in categories: continue selected_categories.append(category) elif pd_name == 'locale' and pd in settings['locales']: locale = pd elif pd_name == 'image_proxy': image_proxy = pd elif pd_name == 'autocomplete': autocomplete = pd elif pd_name == 'language' and (pd == 'all' or pd in (x[0] for x in language_codes)): lang = pd elif pd_name == 'method': method = pd elif pd_name == 'safesearch': safesearch = pd elif pd_name.startswith('engine_'): if pd_name.find('__') > -1: # TODO fix underscore vs space engine_name, category = [x.replace('_', ' ') for x in pd_name.replace('engine_', '', 1).split('__', 1)] if engine_name in engines and category in engines[engine_name].categories: blocked_engines.append((engine_name, category)) elif pd_name == 'theme': theme = pd if pd in themes else default_theme elif pd_name.startswith('plugin_'): plugin_id = pd_name.replace('plugin_', '', 1) if not any(plugin.id == plugin_id for plugin in plugins): continue post_disabled_plugins.append(plugin_id) else: resp.set_cookie(pd_name, pd, max_age=cookie_max_age) disabled_plugins = [] allowed_plugins = [] for plugin in plugins: if plugin.default_on: if plugin.id in post_disabled_plugins: disabled_plugins.append(plugin.id) elif plugin.id not in post_disabled_plugins: allowed_plugins.append(plugin.id) resp.set_cookie('disabled_plugins', ','.join(disabled_plugins), max_age=cookie_max_age) resp.set_cookie('allowed_plugins', ','.join(allowed_plugins), max_age=cookie_max_age) resp.set_cookie( 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines), max_age=cookie_max_age ) if locale: resp.set_cookie( 'locale', locale, max_age=cookie_max_age ) if lang: resp.set_cookie( 'language', lang, max_age=cookie_max_age ) if selected_categories: # cookie max age: 4 weeks resp.set_cookie( 'categories', ','.join(selected_categories), max_age=cookie_max_age ) resp.set_cookie( 'autocomplete', autocomplete, max_age=cookie_max_age ) resp.set_cookie('method', method, max_age=cookie_max_age) resp.set_cookie('safesearch', str(safesearch), max_age=cookie_max_age) resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age) resp.set_cookie('theme', theme, max_age=cookie_max_age) return resp # stats for preferences page stats = {} for c in categories: for e in categories[c]: stats[e.name] = {'time': None, 'warn_timeout': False, 'warn_time': False} if e.timeout > settings['outgoing']['request_timeout']: stats[e.name]['warn_timeout'] = True for engine_stat in get_engines_stats()[0][1]: stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'), 3) if engine_stat.get('avg') > settings['outgoing']['request_timeout']: stats[engine_stat.get('name')]['warn_time'] = True # end of stats return render('preferences.html', locales=settings['locales'], current_locale=get_locale(), current_language=lang or 'all', image_proxy=image_proxy, language_codes=language_codes, engines_by_category=categories, stats=stats, blocked_engines=blocked_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, allowed_plugins=[plugin.id for plugin in request.user_plugins], theme=get_current_theme_name())
def render(template_name, override_theme=None, **kwargs): blocked_engines = get_blocked_engines(engines, request.cookies) autocomplete = request.cookies.get('autocomplete', settings['search']['autocomplete']) if autocomplete not in autocomplete_backends: autocomplete = None nonblocked_categories = set(category for engine_name in engines for category in engines[engine_name].categories if (engine_name, category) not in blocked_engines) if 'categories' not in kwargs: kwargs['categories'] = ['general'] kwargs['categories'].extend(x for x in sorted(categories.keys()) if x != 'general' and x in nonblocked_categories) if 'all_categories' not in kwargs: kwargs['all_categories'] = ['general'] kwargs['all_categories'].extend(x for x in sorted(categories.keys()) if x != 'general') if 'selected_categories' not in kwargs: kwargs['selected_categories'] = [] for arg in request.args: if arg.startswith('category_'): c = arg.split('_', 1)[1] if c in categories: kwargs['selected_categories'].append(c) if not kwargs['selected_categories']: cookie_categories = request.cookies.get('categories', '').split(',') for ccateg in cookie_categories: if ccateg in categories: kwargs['selected_categories'].append(ccateg) if not kwargs['selected_categories']: kwargs['selected_categories'] = ['general'] if 'autocomplete' not in kwargs: kwargs['autocomplete'] = autocomplete if get_locale() in rtl_locales and 'rtl' not in kwargs: kwargs['rtl'] = True kwargs['searx_version'] = VERSION_STRING kwargs['method'] = request.cookies.get('method', 'POST') kwargs['safesearch'] = request.cookies.get('safesearch', str(settings['search']['safe_search'])) # override url_for function in templates kwargs['url_for'] = url_for_theme kwargs['image_proxify'] = image_proxify kwargs['get_result_template'] = get_result_template kwargs['theme'] = get_current_theme_name(override=override_theme) kwargs['template_name'] = template_name kwargs['cookies'] = request.cookies kwargs['scripts'] = set() for plugin in request.user_plugins: for script in plugin.js_dependencies: kwargs['scripts'].add(script) kwargs['styles'] = set() for plugin in request.user_plugins: for css in plugin.css_dependencies: kwargs['styles'].add(css) return render_template( '{}/{}'.format(kwargs['theme'], template_name), **kwargs)
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None image_proxy = request.cookies.get('image_proxy', settings['server'].get('image_proxy')) if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): lang = request.cookies['language'] blocked_engines = [] resp = make_response( redirect(urljoin(settings['server']['base_url'], url_for('index')))) if request.method == 'GET': blocked_engines = get_blocked_engines(engines, request.cookies) else: # on save selected_categories = [] post_disabled_plugins = [] locale = None autocomplete = '' method = 'POST' safesearch = settings['search']['safe_search'] for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] if category not in categories: continue selected_categories.append(category) elif pd_name == 'locale' and pd in settings['locales']: locale = pd elif pd_name == 'image_proxy': image_proxy = pd elif pd_name == 'autocomplete': autocomplete = pd elif pd_name == 'language' and (pd == 'all' or pd in (x[0] for x in language_codes)): lang = pd elif pd_name == 'method': method = pd elif pd_name == 'safesearch': safesearch = pd elif pd_name.startswith('engine_'): if pd_name.find('__') > -1: # TODO fix underscore vs space engine_name, category = [ x.replace('_', ' ') for x in pd_name.replace( 'engine_', '', 1).split('__', 1) ] if engine_name in engines and category in engines[ engine_name].categories: blocked_engines.append((engine_name, category)) elif pd_name == 'theme': theme = pd if pd in themes else default_theme elif pd_name.startswith('plugin_'): plugin_id = pd_name.replace('plugin_', '', 1) if not any(plugin.id == plugin_id for plugin in plugins): continue post_disabled_plugins.append(plugin_id) else: resp.set_cookie(pd_name, pd, max_age=cookie_max_age) disabled_plugins = [] allowed_plugins = [] for plugin in plugins: if plugin.default_on: if plugin.id in post_disabled_plugins: disabled_plugins.append(plugin.id) elif plugin.id not in post_disabled_plugins: allowed_plugins.append(plugin.id) resp.set_cookie('disabled_plugins', ','.join(disabled_plugins), max_age=cookie_max_age) resp.set_cookie('allowed_plugins', ','.join(allowed_plugins), max_age=cookie_max_age) resp.set_cookie('blocked_engines', ','.join('__'.join(e) for e in blocked_engines), max_age=cookie_max_age) if locale: resp.set_cookie('locale', locale, max_age=cookie_max_age) if lang: resp.set_cookie('language', lang, max_age=cookie_max_age) if selected_categories: # cookie max age: 4 weeks resp.set_cookie('categories', ','.join(selected_categories), max_age=cookie_max_age) resp.set_cookie('autocomplete', autocomplete, max_age=cookie_max_age) resp.set_cookie('method', method, max_age=cookie_max_age) resp.set_cookie('safesearch', str(safesearch), max_age=cookie_max_age) resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age) resp.set_cookie('theme', theme, max_age=cookie_max_age) return resp # stats for preferences page stats = {} for c in categories: for e in categories[c]: stats[e.name] = { 'time': None, 'warn_timeout': False, 'warn_time': False } if e.timeout > settings['outgoing']['request_timeout']: stats[e.name]['warn_timeout'] = True for engine_stat in get_engines_stats()[0][1]: stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'), 3) if engine_stat.get('avg') > settings['outgoing']['request_timeout']: stats[engine_stat.get('name')]['warn_time'] = True # end of stats return render( 'preferences.html', locales=settings['locales'], current_locale=get_locale(), current_language=lang or 'all', image_proxy=image_proxy, language_codes=language_codes, engines_by_category=categories, stats=stats, blocked_engines=blocked_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, allowed_plugins=[plugin.id for plugin in request.user_plugins], theme=get_current_theme_name())
def render(template_name, override_theme=None, **kwargs): blocked_engines = get_blocked_engines(engines, request.cookies) autocomplete = request.cookies.get('autocomplete', settings['search']['autocomplete']) if autocomplete not in autocomplete_backends: autocomplete = None nonblocked_categories = set(category for engine_name in engines for category in engines[engine_name].categories if (engine_name, category) not in blocked_engines) if 'categories' not in kwargs: kwargs['categories'] = ['general'] kwargs['categories'].extend( x for x in sorted(categories.keys()) if x != 'general' and x in nonblocked_categories) if 'all_categories' not in kwargs: kwargs['all_categories'] = ['general'] kwargs['all_categories'].extend(x for x in sorted(categories.keys()) if x != 'general') if 'selected_categories' not in kwargs: kwargs['selected_categories'] = [] for arg in request.args: if arg.startswith('category_'): c = arg.split('_', 1)[1] if c in categories: kwargs['selected_categories'].append(c) if not kwargs['selected_categories']: cookie_categories = request.cookies.get('categories', '').split(',') for ccateg in cookie_categories: if ccateg in categories: kwargs['selected_categories'].append(ccateg) if not kwargs['selected_categories']: kwargs['selected_categories'] = ['general'] if 'autocomplete' not in kwargs: kwargs['autocomplete'] = autocomplete if get_locale() in rtl_locales and 'rtl' not in kwargs: kwargs['rtl'] = True kwargs['searx_version'] = VERSION_STRING kwargs['method'] = request.cookies.get('method', 'POST') kwargs['safesearch'] = request.cookies.get( 'safesearch', str(settings['search']['safe_search'])) # override url_for function in templates kwargs['url_for'] = url_for_theme kwargs['image_proxify'] = image_proxify kwargs['get_result_template'] = get_result_template kwargs['theme'] = get_current_theme_name(override=override_theme) kwargs['template_name'] = template_name kwargs['cookies'] = request.cookies kwargs['instance_name'] = settings['general']['instance_name'] kwargs['scripts'] = set() for plugin in request.user_plugins: for script in plugin.js_dependencies: kwargs['scripts'].add(script) kwargs['styles'] = set() for plugin in request.user_plugins: for css in plugin.css_dependencies: kwargs['styles'].add(css) return render_template('{}/{}'.format(kwargs['theme'], template_name), **kwargs)
def __init__(self, request): # init vars super(Search, self).__init__() self.query = None self.engines = [] self.categories = [] self.paging = False self.pageno = 1 self.lang = 'all' # set blocked engines self.blocked_engines = get_blocked_engines(engines, request.cookies) self.results = [] self.suggestions = set() self.answers = set() self.infoboxes = [] self.request_data = {} # set specific language if set if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): self.lang = request.cookies['language'] # set request method if request.method == 'POST': self.request_data = request.form else: self.request_data = request.args # TODO better exceptions if not self.request_data.get('q'): raise Exception('noquery') # set pagenumber pageno_param = self.request_data.get('pageno', '1') if not pageno_param.isdigit() or int(pageno_param) < 1: raise Exception('wrong pagenumber') self.pageno = int(pageno_param) # parse query, if tags are set, which change # the serch engine or search-language query_obj = Query(self.request_data['q'], self.blocked_engines) query_obj.parse_query() # set query self.query = query_obj.getSearchQuery() # get last selected language in query, if possible # TODO support search with multible languages if len(query_obj.languages): self.lang = query_obj.languages[-1] self.engines = query_obj.engines self.categories = [] # if engines are calculated from query, # set categories by using that informations if self.engines and query_obj.specific: self.categories = list(set(engine['category'] for engine in self.engines)) # otherwise, using defined categories to # calculate which engines should be used else: # set used categories for pd_name, pd in self.request_data.items(): if pd_name.startswith('category_'): category = pd_name[9:] # if category is not found in list, skip if category not in categories: continue if pd != 'off': # add category to list self.categories.append(category) elif category in self.categories: # remove category from list if property is set to 'off' self.categories.remove(category) # if no category is specified for this search, # using user-defined default-configuration which # (is stored in cookie) if not self.categories: cookie_categories = request.cookies.get('categories', '') cookie_categories = cookie_categories.split(',') for ccateg in cookie_categories: if ccateg in categories: self.categories.append(ccateg) # if still no category is specified, using general # as default-category if not self.categories: self.categories = ['general'] # using all engines for that search, which are # declared under the specific categories for categ in self.categories: self.engines.extend({'category': categ, 'name': engine.name} for engine in categories[categ] if (engine.name, categ) not in self.blocked_engines)
def __init__(self, request): # init vars super(Search, self).__init__() self.query = None self.engines = [] self.categories = [] self.paging = False self.pageno = 1 self.lang = 'all' # set blocked engines self.blocked_engines = get_blocked_engines(engines, request.cookies) self.result_container = ResultContainer() self.request_data = {} # set specific language if set if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): self.lang = request.cookies['language'] # set request method if request.method == 'POST': self.request_data = request.form else: self.request_data = request.args # TODO better exceptions if not self.request_data.get('q'): raise Exception('noquery') # set pagenumber pageno_param = self.request_data.get('pageno', '1') if not pageno_param.isdigit() or int(pageno_param) < 1: raise Exception('wrong pagenumber') self.pageno = int(pageno_param) # parse query, if tags are set, which change # the serch engine or search-language query_obj = Query(self.request_data['q'], self.blocked_engines) query_obj.parse_query() # set query self.query = query_obj.getSearchQuery() # get last selected language in query, if possible # TODO support search with multible languages if len(query_obj.languages): self.lang = query_obj.languages[-1] self.engines = query_obj.engines self.categories = [] # if engines are calculated from query, # set categories by using that informations if self.engines and query_obj.specific: self.categories = list( set(engine['category'] for engine in self.engines)) # otherwise, using defined categories to # calculate which engines should be used else: # set categories/engines load_default_categories = True for pd_name, pd in self.request_data.items(): if pd_name == 'categories': self.categories.extend( categ for categ in map(unicode.strip, pd.split(',')) if categ in categories) elif pd_name == 'engines': pd_engines = [{ 'category': engines[engine].categories[0], 'name': engine } for engine in map(unicode.strip, pd.split(',')) if engine in engines] if pd_engines: self.engines.extend(pd_engines) load_default_categories = False elif pd_name.startswith('category_'): category = pd_name[9:] # if category is not found in list, skip if category not in categories: continue if pd != 'off': # add category to list self.categories.append(category) elif category in self.categories: # remove category from list if property is set to 'off' self.categories.remove(category) if not load_default_categories: if not self.categories: self.categories = list( set(engine['category'] for engine in self.engines)) return # if no category is specified for this search, # using user-defined default-configuration which # (is stored in cookie) if not self.categories: cookie_categories = request.cookies.get('categories', '') cookie_categories = cookie_categories.split(',') for ccateg in cookie_categories: if ccateg in categories: self.categories.append(ccateg) # if still no category is specified, using general # as default-category if not self.categories: self.categories = ['general'] # using all engines for that search, which are # declared under the specific categories for categ in self.categories: self.engines.extend({ 'category': categ, 'name': engine.name } for engine in categories[categ] if (engine.name, categ) not in self.blocked_engines)
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None image_proxy = request.cookies.get("image_proxy", settings["server"].get("image_proxy")) if request.cookies.get("language") and request.cookies["language"] in (x[0] for x in language_codes): lang = request.cookies["language"] blocked_engines = [] resp = make_response(redirect(urljoin(settings["server"]["base_url"], url_for("index")))) if request.method == "GET": blocked_engines = get_blocked_engines(engines, request.cookies) else: # on save selected_categories = [] post_disabled_plugins = [] locale = None autocomplete = "" method = "POST" safesearch = settings["search"]["safe_search"] for pd_name, pd in request.form.items(): if pd_name.startswith("category_"): category = pd_name[9:] if category not in categories: continue selected_categories.append(category) elif pd_name == "locale" and pd in settings["locales"]: locale = pd elif pd_name == "image_proxy": image_proxy = pd elif pd_name == "autocomplete": autocomplete = pd elif pd_name == "language" and (pd == "all" or pd in (x[0] for x in language_codes)): lang = pd elif pd_name == "method": method = pd elif pd_name == "safesearch": safesearch = pd elif pd_name.startswith("engine_"): if pd_name.find("__") > -1: # TODO fix underscore vs space engine_name, category = [ x.replace("_", " ") for x in pd_name.replace("engine_", "", 1).split("__", 1) ] if engine_name in engines and category in engines[engine_name].categories: blocked_engines.append((engine_name, category)) elif pd_name == "theme": theme = pd if pd in themes else default_theme elif pd_name.startswith("plugin_"): plugin_id = pd_name.replace("plugin_", "", 1) if not any(plugin.id == plugin_id for plugin in plugins): continue post_disabled_plugins.append(plugin_id) else: resp.set_cookie(pd_name, pd, max_age=cookie_max_age) disabled_plugins = [] allowed_plugins = [] for plugin in plugins: if plugin.default_on: if plugin.id in post_disabled_plugins: disabled_plugins.append(plugin.id) elif plugin.id not in post_disabled_plugins: allowed_plugins.append(plugin.id) resp.set_cookie("disabled_plugins", ",".join(disabled_plugins), max_age=cookie_max_age) resp.set_cookie("allowed_plugins", ",".join(allowed_plugins), max_age=cookie_max_age) resp.set_cookie("blocked_engines", ",".join("__".join(e) for e in blocked_engines), max_age=cookie_max_age) if locale: resp.set_cookie("locale", locale, max_age=cookie_max_age) if lang: resp.set_cookie("language", lang, max_age=cookie_max_age) if selected_categories: # cookie max age: 4 weeks resp.set_cookie("categories", ",".join(selected_categories), max_age=cookie_max_age) resp.set_cookie("autocomplete", autocomplete, max_age=cookie_max_age) resp.set_cookie("method", method, max_age=cookie_max_age) resp.set_cookie("safesearch", str(safesearch), max_age=cookie_max_age) resp.set_cookie("image_proxy", image_proxy, max_age=cookie_max_age) resp.set_cookie("theme", theme, max_age=cookie_max_age) return resp # stats for preferences page stats = {} for c in categories: for e in categories[c]: stats[e.name] = {"time": None, "warn_timeout": False, "warn_time": False} if e.timeout > settings["outgoing"]["request_timeout"]: stats[e.name]["warn_timeout"] = True for engine_stat in get_engines_stats()[0][1]: stats[engine_stat.get("name")]["time"] = round(engine_stat.get("avg"), 3) if engine_stat.get("avg") > settings["outgoing"]["request_timeout"]: stats[engine_stat.get("name")]["warn_time"] = True # end of stats return render( "preferences.html", locales=settings["locales"], current_locale=get_locale(), current_language=lang or "all", image_proxy=image_proxy, language_codes=language_codes, engines_by_category=categories, stats=stats, blocked_engines=blocked_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, allowed_plugins=[plugin.id for plugin in request.user_plugins], theme=get_current_theme_name(), )
def render(template_name, override_theme=None, **kwargs): blocked_engines = get_blocked_engines(engines, request.cookies) autocomplete = request.cookies.get("autocomplete", settings["search"]["autocomplete"]) if autocomplete not in autocomplete_backends: autocomplete = None nonblocked_categories = set( category for engine_name in engines for category in engines[engine_name].categories if (engine_name, category) not in blocked_engines ) if "categories" not in kwargs: kwargs["categories"] = ["general"] kwargs["categories"].extend( x for x in sorted(categories.keys()) if x != "general" and x in nonblocked_categories ) if "all_categories" not in kwargs: kwargs["all_categories"] = ["general"] kwargs["all_categories"].extend(x for x in sorted(categories.keys()) if x != "general") if "selected_categories" not in kwargs: kwargs["selected_categories"] = [] for arg in request.args: if arg.startswith("category_"): c = arg.split("_", 1)[1] if c in categories: kwargs["selected_categories"].append(c) if not kwargs["selected_categories"]: cookie_categories = request.cookies.get("categories", "").split(",") for ccateg in cookie_categories: if ccateg in categories: kwargs["selected_categories"].append(ccateg) if not kwargs["selected_categories"]: kwargs["selected_categories"] = ["general"] if "autocomplete" not in kwargs: kwargs["autocomplete"] = autocomplete if get_locale() in rtl_locales and "rtl" not in kwargs: kwargs["rtl"] = True kwargs["searx_version"] = VERSION_STRING kwargs["method"] = request.cookies.get("method", "POST") kwargs["safesearch"] = request.cookies.get("safesearch", str(settings["search"]["safe_search"])) # override url_for function in templates kwargs["url_for"] = url_for_theme kwargs["image_proxify"] = image_proxify kwargs["get_result_template"] = get_result_template kwargs["theme"] = get_current_theme_name(override=override_theme) kwargs["template_name"] = template_name kwargs["cookies"] = request.cookies kwargs["instance_name"] = settings["general"]["instance_name"] kwargs["scripts"] = set() for plugin in request.user_plugins: for script in plugin.js_dependencies: kwargs["scripts"].add(script) kwargs["styles"] = set() for plugin in request.user_plugins: for css in plugin.css_dependencies: kwargs["styles"].add(css) return render_template("{}/{}".format(kwargs["theme"], template_name), **kwargs)
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None image_proxy = request.cookies.get('image_proxy', settings['server'].get('image_proxy')) if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): lang = request.cookies['language'] blocked_engines = [] resp = make_response(redirect(url_for('index'))) if request.method == 'GET': blocked_engines = get_blocked_engines(engines, request.cookies) else: # on save selected_categories = [] locale = None autocomplete = '' method = 'POST' safesearch = '1' for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] if category not in categories: continue selected_categories.append(category) elif pd_name == 'locale' and pd in settings['locales']: locale = pd elif pd_name == 'image_proxy': image_proxy = pd elif pd_name == 'autocomplete': autocomplete = pd elif pd_name == 'language' and (pd == 'all' or pd in (x[0] for x in language_codes)): lang = pd elif pd_name == 'method': method = pd elif pd_name == 'safesearch': safesearch = pd elif pd_name.startswith('engine_'): if pd_name.find('__') > -1: engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1) if engine_name in engines and category in engines[engine_name].categories: blocked_engines.append((engine_name, category)) elif pd_name == 'theme': theme = pd if pd in themes else default_theme else: resp.set_cookie(pd_name, pd, max_age=cookie_max_age) resp.set_cookie( 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines), max_age=cookie_max_age ) if locale: resp.set_cookie( 'locale', locale, max_age=cookie_max_age ) if lang: resp.set_cookie( 'language', lang, max_age=cookie_max_age ) if selected_categories: # cookie max age: 4 weeks resp.set_cookie( 'categories', ','.join(selected_categories), max_age=cookie_max_age ) resp.set_cookie( 'autocomplete', autocomplete, max_age=cookie_max_age ) resp.set_cookie('method', method, max_age=cookie_max_age) resp.set_cookie('safesearch', safesearch, max_age=cookie_max_age) resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age) resp.set_cookie('theme', theme, max_age=cookie_max_age) return resp return render('preferences.html', locales=settings['locales'], current_locale=get_locale(), current_language=lang or 'all', image_proxy=image_proxy, language_codes=language_codes, categs=categories.items(), blocked_engines=blocked_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, theme=get_current_theme_name())