@@ -28,7 +28,6 @@ import os
28import hashlib
28import hashlib
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
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)
241− nonblocked_categories = set(chain.from_iterable(nonblocked_categories))
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
501 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
499 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
503− user_blocked_engines = request.cookies.get('blocked_engines', '').split(',') # noqa
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
511 if locale:
506 if locale:
512 resp.set_cookie(
507 resp.set_cookie(