logo

searx

Unnamed repository; edit this file 'description' to name the repository.
commit: c30f73f8fda2b51cfd95967a29cc34a2036ffddd
parent: 3bd5ce65950cb86ec678ff3d074635638d63fb5d
Author: Adam Tauber <asciimoo@gmail.com>
Date:   Sat, 15 Jul 2017 18:24:48 +0200

Merge pull request #961 from kvch/user-visible-engine-errors

show engine errors in infobox && add new error alert

Diffstat:

searx/results.py | 4++++
searx/search.py | 4++++
searx/templates/oscar/messages/no_results.html | 16++++++++++++----
searx/templates/oscar/results.html | 10++++++++++
searx/webapp.py | 4+++-
tests/unit/test_webapp.py | 1+
6 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/searx/results.py b/searx/results.py @@ -135,6 +135,7 @@ class ResultContainer(object): self._number_of_results = [] self._ordered = False self.paging = False + self.unresponsive_engines = [] def extend(self, engine_name, results): for result in list(results): @@ -304,3 +305,6 @@ class ResultContainer(object): if not resultnum_sum or not self._number_of_results: return 0 return resultnum_sum / len(self._number_of_results) + + def add_unresponsive_engine(self, engine_name): + self.unresponsive_engines.append(engine_name) diff --git a/searx/search.py b/searx/search.py @@ -20,6 +20,7 @@ import sys import threading from time import time from uuid import uuid4 +from flask_babel import gettext import requests.exceptions import searx.poolrequests as requests_lib from searx.engines import ( @@ -133,18 +134,21 @@ def search_one_request_safe(engine_name, query, request_params, result_container requests_exception = False if (issubclass(e.__class__, requests.exceptions.Timeout)): + result_container.add_unresponsive_engine((engine_name, gettext('timeout'))) # requests timeout (connect or read) logger.error("engine {0} : HTTP requests timeout" "(search duration : {1} s, timeout: {2} s) : {3}" .format(engine_name, search_duration, timeout_limit, e.__class__.__name__)) requests_exception = True elif (issubclass(e.__class__, requests.exceptions.RequestException)): + result_container.add_unresponsive_engine((engine_name, gettext('request exception'))) # other requests exception logger.exception("engine {0} : requests exception" "(search duration : {1} s, timeout: {2} s) : {3}" .format(engine_name, search_duration, timeout_limit, e)) requests_exception = True else: + result_container.add_unresponsive_engine((engine_name, gettext('unexpected crash'))) # others errors logger.exception('engine {0} : exception : {1}'.format(engine_name, e)) diff --git a/searx/templates/oscar/messages/no_results.html b/searx/templates/oscar/messages/no_results.html @@ -1,9 +1,17 @@ {% from 'oscar/macros.html' import icon %} +{% if unresponsive_engines %} +<div class="alert alert-danger fade in" role="alert"> + <p><strong class="lead">{{ icon('remove-sign') }} {{ _('Error!') }}</strong> {{ _('Engines cannot retrieve results.') }}</p> + <p> + {% for engine_name, error_type in unresponsive_engines %} + {{ engine_name }} ({{ error_type }}){% if not loop.last %}, {% endif %} + {% endfor %} + </p> + <p><small>{{ _('Please, try again later or find another searx instance.') }}</small></p> +</div> +{% else %} <div class="alert alert-info fade in" role="alert"> - <button class="close" data-dismiss="alert" type="button"> - <span aria-hidden="true">×</span> - <span class="sr-only">{{ _('Close') }}</span> - </button> <strong class="lead">{{ icon('info-sign') }} {{ _('Sorry!') }}</strong> {{ _('we didn\'t find any results. Please use another query or search in more categories.') }} </div> +{% endif %} diff --git a/searx/templates/oscar/results.html b/searx/templates/oscar/results.html @@ -94,6 +94,16 @@ {% if number_of_results != '0' %} <p><small>{{ _('Number of results') }}: {{ number_of_results }}</small></p> {% endif %} + + {% if unresponsive_engines and results|length >= 1 %} + <div class="alert alert-danger fade in" role="alert"> + <p>{{ _('Engines cannot retrieve results') }}:</p> + {% for engine_name, error_type in unresponsive_engines %} + {{ engine_name }} ({{ error_type }}){% if not loop.last %}, {% endif %} + {% endfor %} + </div> + {% endif %} + {% if infoboxes %} {% for infobox in infoboxes %} {% include 'oscar/infobox.html' %} diff --git a/searx/webapp.py b/searx/webapp.py @@ -534,7 +534,8 @@ def index(): 'answers': list(result_container.answers), 'corrections': list(result_container.corrections), 'infoboxes': result_container.infoboxes, - 'suggestions': list(result_container.suggestions)}), + 'suggestions': list(result_container.suggestions), + 'unresponsive_engines': list(result_container.unresponsive_engines)}), mimetype='application/json') elif output_format == 'csv': csv = UnicodeWriter(StringIO()) @@ -573,6 +574,7 @@ def index(): corrections=result_container.corrections, infoboxes=result_container.infoboxes, paging=result_container.paging, + unresponsive_engines=result_container.unresponsive_engines, current_language=search_query.lang, base_url=get_base_url(), theme=get_current_theme_name(), diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py @@ -39,6 +39,7 @@ class ViewsTestCase(SearxTestCase): corrections=set(), suggestions=set(), infoboxes=[], + unresponsive_engines=[], results=self.test_results, results_number=lambda: 3, results_length=lambda: len(self.test_results))