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
                     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

+ 3
- 3
searx/search.py View File

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}
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
     # do search-request
418
     # do search-request
419
     def search(self, request):
419
     def search(self, request):

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

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>

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

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>

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

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>

+ 17
- 3
searx/utils.py View File

231
 
231
 
232
 def get_blocked_engines(engines, cookies):
232
 def 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(',')
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
 import hashlib
28
 import hashlib
29
 
29
 
30
 from datetime import datetime, timedelta
30
 from datetime import datetime, timedelta
31
-from itertools import chain
32
 from urllib import urlencode
31
 from urllib import urlencode
33
 from flask import (
32
 from flask import (
34
     Flask, request, render_template, url_for, Response, make_response,
33
     Flask, request, render_template, url_for, Response, make_response,
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
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
     if 'categories' not in kwargs:
240
     if 'categories' not in kwargs:
244
         kwargs['categories'] = ['general']
241
         kwargs['categories'] = ['general']
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_'):
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
             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(
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
         if locale:
506
         if locale:
512
             resp.set_cookie(
507
             resp.set_cookie(