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