Browse Source

[enh] category specific engine deactivation - closes #205

Adam Tauber 10 years ago
parent
commit
1de781a143

+ 1
- 1
searx/query.py View File

@@ -107,7 +107,7 @@ class Query(object):
107 107
                     self.engines.extend({'category': prefix,
108 108
                                          'name': engine.name}
109 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 112
             if query_part[0] == '!':
113 113
                 self.specific = True

+ 3
- 3
searx/search.py View File

@@ -411,9 +411,9 @@ class Search(object):
411 411
             # declared under the specific categories
412 412
             for categ in self.categories:
413 413
                 self.engines.extend({'category': categ,
414
-                                     'name': x.name}
415
-                                    for x in categories[categ]
416
-                                    if x.name not in self.blocked_engines)
414
+                                     'name': engine.name}
415
+                                    for engine in categories[categ]
416
+                                    if (engine.name, categ) not in self.blocked_engines)
417 417
 
418 418
     # do search-request
419 419
     def search(self, request):

+ 1
- 1
searx/templates/courgette/preferences.html View File

@@ -99,7 +99,7 @@
99 99
                     <td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</td>
100 100
                     <td>{{ _(categ) }}</td>
101 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 103
                         <label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
104 104
                         <label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
105 105
                     </td>

+ 1
- 1
searx/templates/default/preferences.html View File

@@ -87,7 +87,7 @@
87 87
                 <td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</td>
88 88
                 <td>{{ _(categ) }}</td>
89 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 91
                     <label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
92 92
                     <label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
93 93
                 </td>

+ 1
- 1
searx/templates/oscar/preferences.html View File

@@ -128,7 +128,7 @@
128 128
                                 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</div>
129 129
                                 <div class="col-xs-6 col-sm-4 col-md-4">
130 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 132
                                     <label class="btn btn-success label_hide_if_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
133 133
                                     <label class="btn btn-danger label_hide_if_not_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
134 134
                                     </div>

+ 17
- 3
searx/utils.py View File

@@ -231,7 +231,21 @@ def prettify_url(url):
231 231
 
232 232
 def get_blocked_engines(engines, cookies):
233 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(',')
237
-            if engine in engines]
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)
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

+ 11
- 16
searx/webapp.py View File

@@ -28,7 +28,6 @@ import os
28 28
 import hashlib
29 29
 
30 30
 from datetime import datetime, timedelta
31
-from itertools import chain
32 31
 from urllib import urlencode
33 32
 from flask import (
34 33
     Flask, request, render_template, url_for, Response, make_response,
@@ -234,11 +233,9 @@ def render(template_name, override_theme=None, **kwargs):
234 233
     if autocomplete not in autocomplete_backends:
235 234
         autocomplete = None
236 235
 
237
-    nonblocked_categories = (engines[e].categories
238
-                             for e in engines
239
-                             if e not in blocked_engines)
240
-
241
-    nonblocked_categories = set(chain.from_iterable(nonblocked_categories))
236
+    nonblocked_categories = set(category for engine_name in engines
237
+                                for category in engines[engine_name].categories
238
+                                if (engine_name, category) not in blocked_engines)
242 239
 
243 240
     if 'categories' not in kwargs:
244 241
         kwargs['categories'] = ['general']
@@ -492,21 +489,19 @@ def preferences():
492 489
             elif pd_name == 'method':
493 490
                 method = pd
494 491
             elif pd_name.startswith('engine_'):
495
-                engine_name = pd_name.replace('engine_', '', 1)
496
-                if engine_name in engines:
497
-                    blocked_engines.append(engine_name)
492
+                if pd_name.find('__') > -1:
493
+                    engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
494
+                    if engine_name in engines and category in engines[engine_name].categories:
495
+                        blocked_engines.append((engine_name, category))
498 496
             elif pd_name == 'theme':
499 497
                 theme = pd if pd in themes else default_theme
500 498
             else:
501 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(
507
-                'blocked_engines', ','.join(blocked_engines),
508
-                max_age=cookie_max_age
509
-            )
501
+        resp.set_cookie(
502
+            'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
503
+            max_age=cookie_max_age
504
+        )
510 505
 
511 506
         if locale:
512 507
             resp.set_cookie(