def list_engines(): """Render engines page. List of all supported engines. """ return render('engines.html', categs=categories.items(), shortcuts={y: x for x, y in engine_shortcuts.items()})
def preferences(): """Render preferences page && save user preferences""" # save preferences if request.method == 'POST': resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index')))) try: request.preferences.parse_form(request.form) except ValidationException: request.errors.append(gettext('Invalid settings, please edit your preferences')) return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value('image_proxy') lang = request.preferences.get_value('language') disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # 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 stats[e.name]['supports_selected_language'] = _is_selected_language_supported(e, request.preferences) # get first element [0], the engine time, # and then the second element [1] : the time (the first one is the label) 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(), image_proxy=image_proxy, engines_by_category=categories, stats=stats, answerers=[{'info': a.self_info(), 'keywords': a.keywords} for a in answerers], disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, doi_resolvers=settings['doi_resolvers'], current_doi_resolver=get_doi_resolver(request.args, request.preferences.get_value('doi_resolver')), allowed_plugins=allowed_plugins, theme=get_current_theme_name(), preferences_url_params=request.preferences.get_as_url_params(), base_url=get_base_url(), preferences=True)
def preferences(): """Render preferences page && save user preferences""" # save preferences if request.method == 'POST': resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index')))) try: request.preferences.parse_form(request.form) except ValidationException: request.errors.append(gettext('Invalid settings, please edit your preferences')) return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value('image_proxy') lang = request.preferences.get_value('language') disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # 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 stats[e.name]['supports_selected_language'] = _is_selected_language_supported(e, request.preferences) # get first element [0], the engine time, # and then the second element [1] : the time (the first one is the label) 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(), image_proxy=image_proxy, engines_by_category=categories, stats=stats, answerers=[{'info': a.self_info(), 'keywords': a.keywords} for a in answerers], disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, doi_resolvers=settings['doi_resolvers'], current_doi_resolver=get_doi_resolver(request.args, request.preferences.get_value('doi_resolver')), allowed_plugins=allowed_plugins, theme=get_current_theme_name(), preferences_url_params=request.preferences.get_as_url_params(), base_url=get_base_url(), preferences=True)
def preferences(): """Render preferences page && save user preferences""" # save preferences if request.method == 'POST': resp = make_response( redirect(urljoin(settings['server']['base_url'], url_for('index')))) try: request.preferences.parse_form(request.form) except ValidationException: # TODO use flash feature of flask return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value('image_proxy') lang = request.preferences.get_value('language') disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # 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, image_proxy=image_proxy, language_codes=language_codes, engines_by_category=categories, stats=stats, disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, allowed_plugins=allowed_plugins, theme=get_current_theme_name())
def preferences(): """Render preferences page && save user preferences""" # save preferences if request.method == "POST": resp = make_response(redirect(urljoin(settings["server"]["base_url"], url_for("index")))) try: request.preferences.parse_form(request.form) except ValidationException: request.errors.append(gettext("Invalid settings, please edit your preferences")) return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value("image_proxy") lang = request.preferences.get_value("language") disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # 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 # get first element [0], the engine time, # and then the second element [1] : the time (the first one is the label) 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, image_proxy=image_proxy, language_codes=language_codes, engines_by_category=categories, stats=stats, answerers=[{"info": a.self_info(), "keywords": a.keywords} for a in answerers], disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, allowed_plugins=allowed_plugins, theme=get_current_theme_name(), )
def preferences(): """Render preferences page && save user preferences""" # save preferences if request.method == 'POST': resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index')))) try: request.preferences.parse_form(request.form) except ValidationException: # TODO use flash feature of flask return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value('image_proxy') lang = request.preferences.get_value('language') disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # 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, image_proxy=image_proxy, language_codes=language_codes, engines_by_category=categories, stats=stats, disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, allowed_plugins=allowed_plugins, theme=get_current_theme_name())
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 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 preferences(): """Render preferences page && save user preferences""" # save preferences if request.method == "POST": resp = make_response( redirect(urljoin(settings["server"]["base_url"], url_for("index")))) try: request.preferences.parse_form(request.form) except ValidationException: request.errors.append( gettext("Invalid settings, please edit your preferences")) return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value("image_proxy") disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # stats for preferences page stats = {} engines_by_category = {} for c in categories: engines_by_category[c] = [] for e in categories[c]: if not request.preferences.validate_token(e): continue stats[e.name] = { "time": None, "warn_timeout": False, "warn_time": False } if e.timeout > settings["outgoing"]["request_timeout"]: stats[e.name]["warn_timeout"] = True stats[e.name][ "supports_selected_language"] = _is_selected_language_supported( e, request.preferences) engines_by_category[c].append(e) # get first element [0], the engine time, # and then the second element [1] : the time (the first one is the label) for engine_stat in get_engines_stats(request.preferences)[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 locked_preferences = list() if "preferences" in settings and "lock" in settings["preferences"]: locked_preferences = settings["preferences"]["lock"] return render( "preferences.html", selected_categories=get_selected_categories(request.preferences, request.form), all_categories=_get_ordered_categories(), locales=settings["locales"], current_locale=request.preferences.get_value("locale"), image_proxy=image_proxy, engines_by_category=engines_by_category, stats=stats, answerers=[{ "info": a.self_info(), "keywords": a.keywords } for a in answerers], disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, doi_resolvers=settings["doi_resolvers"], current_doi_resolver=get_doi_resolver( request.args, request.preferences.get_value("doi_resolver")), allowed_plugins=allowed_plugins, theme=get_current_theme_name(), preferences_url_params=request.preferences.get_as_url_params(), base_url=get_base_url(), locked_preferences=locked_preferences, preferences=True, )
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): lang = request.cookies['language'] blocked_engines = [] if request.method == 'GET': blocked_engines = request.cookies.get('blocked_engines', '').split(',') else: selected_categories = [] locale = None for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] if not category in categories: continue selected_categories.append(category) elif pd_name == 'locale' and pd in settings['locales']: locale = pd elif pd_name == 'language' and (pd == 'all' or pd in (x[0] for x in language_codes)): lang = pd elif pd_name.startswith('engine_'): engine_name = pd_name.replace('engine_', '', 1) if engine_name in engines: blocked_engines.append(engine_name) resp = make_response(redirect('/')) user_blocked_engines = request.cookies.get('blocked_engines', '').split(',') # noqa if sorted(blocked_engines) != sorted(user_blocked_engines): # cookie max age: 4 weeks resp.set_cookie( 'blocked_engines', ','.join(blocked_engines), max_age=60 * 60 * 24 * 7 * 4 ) if locale: # cookie max age: 4 weeks resp.set_cookie( 'locale', locale, max_age=60 * 60 * 24 * 7 * 4 ) if lang: # cookie max age: 4 weeks resp.set_cookie( 'language', lang, max_age=60 * 60 * 24 * 7 * 4 ) if selected_categories: # cookie max age: 4 weeks resp.set_cookie( 'categories', ','.join(selected_categories), max_age=60 * 60 * 24 * 7 * 4 ) return resp return render('preferences.html', locales=settings['locales'], current_locale=get_locale(), current_language=lang or 'all', language_codes=language_codes, categs=categories.items(), blocked_engines=blocked_engines, shortcuts={y: x for x, y in engine_shortcuts.items()})
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): lang = request.cookies['language'] blocked_engines = [] if request.method == 'GET': blocked_engines = request.cookies.get('blocked_engines', '').split(',') else: # on save selected_categories = [] locale = None autocomplete = '' method = 'POST' for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] if not category in categories: continue selected_categories.append(category) elif pd_name == 'locale' and pd in settings['locales']: locale = 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.startswith('engine_'): engine_name = pd_name.replace('engine_', '', 1) if engine_name in engines: blocked_engines.append(engine_name) elif pd_name == 'theme': theme = pd if pd in themes else default_theme resp = make_response(redirect(url_for('index'))) user_blocked_engines = request.cookies.get('blocked_engines', '').split(',') # noqa if sorted(blocked_engines) != sorted(user_blocked_engines): resp.set_cookie( 'blocked_engines', ','.join(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( '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', 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())
def preferences(): """Render preferences page. Settings that are going to be saved as cookies.""" lang = None if request.cookies.get('language')\ and request.cookies['language'] in (x[0] for x in language_codes): lang = request.cookies['language'] blocked_engines = [] if request.method == 'GET': blocked_engines = request.cookies.get('blocked_engines', '').split(',') else: selected_categories = [] locale = None autocomplete = '' method = 'POST' for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] if not category in categories: continue selected_categories.append(category) elif pd_name == 'locale' and pd in settings['locales']: locale = 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.startswith('engine_'): engine_name = pd_name.replace('engine_', '', 1) if engine_name in engines: blocked_engines.append(engine_name) resp = make_response(redirect(url_for('index'))) user_blocked_engines = request.cookies.get('blocked_engines', '').split(',') # noqa if sorted(blocked_engines) != sorted(user_blocked_engines): resp.set_cookie('blocked_engines', ','.join(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) return resp return render('preferences.html', locales=settings['locales'], current_locale=get_locale(), current_language=lang or 'all', 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()})
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 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())
def preferences(): """Render preferences page && save user preferences""" # pylint: disable=too-many-locals, too-many-return-statements, too-many-branches # pylint: disable=too-many-statements # save preferences if request.method == 'POST': resp = make_response(redirect(url_for('index', _external=True))) try: request.preferences.parse_form(request.form) except ValidationException: request.errors.append( gettext('Invalid settings, please edit your preferences')) return resp return request.preferences.save(resp) # render preferences image_proxy = request.preferences.get_value('image_proxy') # pylint: disable=redefined-outer-name disabled_engines = request.preferences.engines.get_disabled() allowed_plugins = request.preferences.plugins.get_enabled() # stats for preferences page filtered_engines = dict( filter(lambda kv: (kv[0], request.preferences.validate_token(kv[1])), engines.items())) engines_by_category = {} for c in categories: engines_by_category[c] = [ e for e in categories[c] if e.name in filtered_engines ] # sort the engines alphabetically since the order in settings.yml is meaningless. list.sort(engines_by_category[c], key=lambda e: e.name) # get first element [0], the engine time, # and then the second element [1] : the time (the first one is the label) stats = {} # pylint: disable=redefined-outer-name max_rate95 = 0 for _, e in filtered_engines.items(): h = histogram('engine', e.name, 'time', 'total') median = round(h.percentage(50), 1) if h.count > 0 else None rate80 = round(h.percentage(80), 1) if h.count > 0 else None rate95 = round(h.percentage(95), 1) if h.count > 0 else None max_rate95 = max(max_rate95, rate95 or 0) result_count_sum = histogram('engine', e.name, 'result', 'count').sum successful_count = counter('engine', e.name, 'search', 'count', 'successful') result_count = int(result_count_sum / float(successful_count)) if successful_count else 0 stats[e.name] = { 'time': median, 'rate80': rate80, 'rate95': rate95, 'warn_timeout': e.timeout > settings['outgoing']['request_timeout'], 'supports_selected_language': _is_selected_language_supported(e, request.preferences), 'result_count': result_count, } # end of stats # reliabilities reliabilities = {} engine_errors = get_engine_errors(filtered_engines) checker_results = checker_get_result() checker_results = checker_results['engines'] \ if checker_results['status'] == 'ok' and 'engines' in checker_results else {} for _, e in filtered_engines.items(): checker_result = checker_results.get(e.name, {}) checker_success = checker_result.get('success', True) errors = engine_errors.get(e.name) or [] if counter('engine', e.name, 'search', 'count', 'sent') == 0: # no request reliablity = None elif checker_success and not errors: reliablity = 100 elif 'simple' in checker_result.get('errors', {}): # the basic (simple) test doesn't work: the engine is broken accoding to the checker # even if there is no exception reliablity = 0 else: reliablity = 100 - sum([ error['percentage'] for error in errors if not error.get('secondary') ]) reliabilities[e.name] = { 'reliablity': reliablity, 'errors': [], 'checker': checker_results.get(e.name, {}).get('errors', {}).keys(), } # keep the order of the list checker_results[e.name]['errors'] and deduplicate. # the first element has the highest percentage rate. reliabilities_errors = [] for error in errors: error_user_text = None if error.get('secondary') or 'exception_classname' not in error: continue error_user_text = exception_classname_to_text.get( error.get('exception_classname')) if not error: error_user_text = exception_classname_to_text[None] if error_user_text not in reliabilities_errors: reliabilities_errors.append(error_user_text) reliabilities[e.name]['errors'] = reliabilities_errors # supports supports = {} for _, e in filtered_engines.items(): supports_selected_language = _is_selected_language_supported( e, request.preferences) safesearch = e.safesearch time_range_support = e.time_range_support for checker_test_name in checker_results.get(e.name, {}).get('errors', {}): if supports_selected_language and checker_test_name.startswith( 'lang_'): supports_selected_language = '?' elif safesearch and checker_test_name == 'safesearch': safesearch = '?' elif time_range_support and checker_test_name == 'time_range': time_range_support = '?' supports[e.name] = { 'supports_selected_language': supports_selected_language, 'safesearch': safesearch, 'time_range_support': time_range_support, } return render( 'preferences.html', selected_categories=get_selected_categories(request.preferences, request.form), locales=settings['locales'], current_locale=request.preferences.get_value("locale"), image_proxy=image_proxy, engines_by_category=engines_by_category, stats=stats, max_rate95=max_rate95, reliabilities=reliabilities, supports=supports, answerers=[{ 'info': a.self_info(), 'keywords': a.keywords } for a in answerers], disabled_engines=disabled_engines, autocomplete_backends=autocomplete_backends, shortcuts={y: x for x, y in engine_shortcuts.items()}, themes=themes, plugins=plugins, doi_resolvers=settings['doi_resolvers'], current_doi_resolver=get_doi_resolver( request.args, request.preferences.get_value('doi_resolver')), allowed_plugins=allowed_plugins, theme=get_current_theme_name(), preferences_url_params=request.preferences.get_as_url_params(), locked_preferences=settings['preferences']['lock'], preferences=True)