Beispiel #1
0
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()})
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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())
Beispiel #5
0
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(),
    )
Beispiel #6
0
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())
Beispiel #7
0
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())
Beispiel #8
0
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())
Beispiel #9
0
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,
    )
Beispiel #10
0
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()})
Beispiel #11
0
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())
Beispiel #12
0
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()})
Beispiel #13
0
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(),
    )
Beispiel #14
0
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())
Beispiel #15
0
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)