on master help sign in
[enh] category specific engine deactivation - closes #205
1de781aAdam Tauber
searx/query.py+1−1
@@ -107,7 +107,7 @@ class Query(object):
107 self.engines.extend({'category': prefix,
107 self.engines.extend({'category': prefix,
108 'name': engine.name}
108 'name': engine.name}
109 for engine in categories[prefix]
109 for engine in categories[prefix]
110− if engine not in self.blocked_engines)
110+ if (engine.name, prefix) not in self.blocked_engines)
111
111
112 if query_part[0] == '!':
112 if query_part[0] == '!':
113 self.specific = True
113 self.specific = True
searx/search.py+3−3
@@ -411,9 +411,9 @@ class Search(object):
411 # declared under the specific categories
411 # declared under the specific categories
412 for categ in self.categories:
412 for categ in self.categories:
413 self.engines.extend({'category': categ,
413 self.engines.extend({'category': categ,
414− 'name': x.name}
414+ 'name': engine.name}
415− for x in categories[categ]
415+ for engine in categories[categ]
416− if x.name not in self.blocked_engines)
416+ if (engine.name, categ) not in self.blocked_engines)
417
417
418 # do search-request
418 # do search-request
419 def search(self, request):
419 def search(self, request):
searx/templates/courgette/preferences.html+1−1
@@ -99,7 +99,7 @@
99 <td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</td>
99 <td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</td>
100 <td>{{ _(categ) }}</td>
100 <td>{{ _(categ) }}</td>
101 <td class="engine_checkbox">
101 <td class="engine_checkbox">
102− <input type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}"{% if search_engine.name in blocked_engines %} checked="checked"{% endif %} />
102+ <input type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}__{{ categ }}"{% if (search_engine.name, categ) in blocked_engines %} checked="checked"{% endif %} />
103 <label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
103 <label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
104 <label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
104 <label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
105 </td>
105 </td>
searx/templates/default/preferences.html+1−1
@@ -87,7 +87,7 @@
87 <td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</td>
87 <td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</td>
88 <td>{{ _(categ) }}</td>
88 <td>{{ _(categ) }}</td>
89 <td class="engine_checkbox">
89 <td class="engine_checkbox">
90− <input type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}"{% if search_engine.name in blocked_engines %} checked="checked"{% endif %} />
90+ <input type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}__{{ categ }}"{% if (search_engine.name, categ) in blocked_engines %} checked="checked"{% endif %} />
91 <label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
91 <label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
92 <label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
92 <label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
93 </td>
93 </td>
searx/templates/oscar/preferences.html+1−1
@@ -128,7 +128,7 @@
128 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</div>
128 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</div>
129 <div class="col-xs-6 col-sm-4 col-md-4">
129 <div class="col-xs-6 col-sm-4 col-md-4">
130 <div class="checkbox">
130 <div class="checkbox">
131− <input class="hidden" type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}"{% if search_engine.name in blocked_engines %} checked="checked"{% endif %} />
131+ <input class="hidden" type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}__{{ categ }}"{% if (search_engine.name, categ) in blocked_engines %} checked="checked"{% endif %} />
132 <label class="btn btn-success label_hide_if_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
132 <label class="btn btn-success label_hide_if_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
133 <label class="btn btn-danger label_hide_if_not_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
133 <label class="btn btn-danger label_hide_if_not_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
134 </div>
134 </div>
searx/utils.py+17−3
@@ -231,7 +231,21 @@ def prettify_url(url):
231
231
232def get_blocked_engines(engines, cookies):
232def get_blocked_engines(engines, cookies):
233 if 'blocked_engines' not in cookies:
233 if 'blocked_engines' not in cookies:
234− return [engine for engine in engines if engines[engine].disabled]
234+ return [(engine, category) for engine in engines for category in engines.category if engines[engine].disabled]
235
235
236− return [engine for engine in cookies.get('blocked_engines', '').split(',')
236+ blocked_engine_strings = cookies.get('blocked_engines', '').split(',')
237+ blocked_engines = []
238+
239+ if not blocked_engine_strings:
240+ return blocked_engines
241+
242+ for engine_string in blocked_engine_strings:
243+ if engine_string.find('__') > -1:
244+ engine, category = engine_string.split('__', 1)
237− if engine in engines]
245+ if engine in engines and category in engines[engine].categories:
246+ blocked_engines.append((engine, category))
247+ elif engine_string in engines:
248+ for category in engines[engine_string].categories:
249+ blocked_engines.append((engine_string, category))
250+
251+ return blocked_engines
searx/webapp.py+11−16
@@ -28,7 +28,6 @@ import os
28import hashlib
28import hashlib
29
29
30from datetime import datetime, timedelta
30from datetime import datetime, timedelta
31−from itertools import chain
32from urllib import urlencode
31from urllib import urlencode
33from flask import (
32from flask import (
34 Flask, request, render_template, url_for, Response, make_response,
33 Flask, request, render_template, url_for, Response, make_response,
@@ -234,11 +233,9 @@ def render(template_name, override_theme=None, **kwargs):
234 if autocomplete not in autocomplete_backends:
233 if autocomplete not in autocomplete_backends:
235 autocomplete = None
234 autocomplete = None
236
235
237− nonblocked_categories = (engines[e].categories
236+ nonblocked_categories = set(category for engine_name in engines
238− for e in engines
237+ for category in engines[engine_name].categories
239− if e not in blocked_engines)
238+ if (engine_name, category) not in blocked_engines)
240−
241− nonblocked_categories = set(chain.from_iterable(nonblocked_categories))
242
239
243 if 'categories' not in kwargs:
240 if 'categories' not in kwargs:
244 kwargs['categories'] = ['general']
241 kwargs['categories'] = ['general']
@@ -492,21 +489,19 @@ def preferences():
492 elif pd_name == 'method':
489 elif pd_name == 'method':
493 method = pd
490 method = pd
494 elif pd_name.startswith('engine_'):
491 elif pd_name.startswith('engine_'):
492+ if pd_name.find('__') > -1:
495− engine_name = pd_name.replace('engine_', '', 1)
493+ engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
496− if engine_name in engines:
494+ if engine_name in engines and category in engines[engine_name].categories:
497− blocked_engines.append(engine_name)
495+ blocked_engines.append((engine_name, category))
498 elif pd_name == 'theme':
496 elif pd_name == 'theme':
499 theme = pd if pd in themes else default_theme
497 theme = pd if pd in themes else default_theme
500 else:
498 else:
501 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
499 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
502
500
503− user_blocked_engines = request.cookies.get('blocked_engines', '').split(',') # noqa
504−
505− if sorted(blocked_engines) != sorted(user_blocked_engines):
506− resp.set_cookie(
501+ resp.set_cookie(
507− 'blocked_engines', ','.join(blocked_engines),
502+ 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
508− max_age=cookie_max_age
503+ max_age=cookie_max_age
509− )
504+ )
510
505
511 if locale:
506 if locale:
512 resp.set_cookie(
507 resp.set_cookie(