on master help sign in
[enh] plugin preferences - server-side ++ oscar theme
37c58fdAdam Tauber
searx/templates/oscar/preferences.html+25−6
@@ -1,4 +1,4 @@
1−{% from 'oscar/macros.html' import preferences_item_header, preferences_item_header_rtl, preferences_item_footer, preferences_item_footer_rtl %}
1+{% from 'oscar/macros.html' import preferences_item_header, preferences_item_header_rtl, preferences_item_footer, preferences_item_footer_rtl, checkbox_toggle %}
2{% extends "oscar/base.html" %}
2{% extends "oscar/base.html" %}
3{% block title %}{{ _('preferences') }} - {% endblock %}
3{% block title %}{{ _('preferences') }} - {% endblock %}
4{% block site_alert_warning_nojs %}
4{% block site_alert_warning_nojs %}
@@ -16,6 +16,7 @@
16 <ul class="nav nav-tabs nav-justified hide_if_nojs" role="tablist" style="margin-bottom:20px;">
16 <ul class="nav nav-tabs nav-justified hide_if_nojs" role="tablist" style="margin-bottom:20px;">
17 <li class="active"><a href="#tab_general" role="tab" data-toggle="tab">{{ _('General') }}</a></li>
17 <li class="active"><a href="#tab_general" role="tab" data-toggle="tab">{{ _('General') }}</a></li>
18 <li><a href="#tab_engine" role="tab" data-toggle="tab">{{ _('Engines') }}</a></li>
18 <li><a href="#tab_engine" role="tab" data-toggle="tab">{{ _('Engines') }}</a></li>
19+ <li><a href="#tab_plugins" role="tab" data-toggle="tab">{{ _('Plugins') }}</a></li>
19 </ul>
20 </ul>
20
21
21 <!-- Tab panes -->
22 <!-- Tab panes -->
@@ -139,11 +140,7 @@
139 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</div>
140 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})</div>
140 {% endif %}
141 {% endif %}
141 <div class="col-xs-6 col-sm-4 col-md-4">
142 <div class="col-xs-6 col-sm-4 col-md-4">
142− <div class="checkbox">
143− <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 %} />
143+ {{ checkbox_toggle('engine_' + search_engine.name|replace(' ', '_') + '__' + categ|replace(' ', '_'), (search_engine.name, categ) in blocked_engines) }}
144− <label class="btn btn-success label_hide_if_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
145− <label class="btn btn-danger label_hide_if_not_checked" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
146− </div>
147 </div>
144 </div>
148 {% if rtl %}
145 {% if rtl %}
149 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})&lrm;</div>
146 <div class="col-xs-6 col-sm-4 col-md-4">{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})&lrm;</div>
@@ -157,6 +154,28 @@
157 {% endfor %}
154 {% endfor %}
158 </div>
155 </div>
159 </div>
156 </div>
157+ <div class="tab-pane active_if_nojs" id="tab_plugins">
158+ <noscript>
159+ <h3>{{ _('Plugins') }}</h3>
160+ </noscript>
161+ <fieldset>
162+ <div class="container-fluid">
163+ {% for plugin in plugins %}
164+ <div class="panel panel-default">
165+ <div class="panel-heading">
166+ <h3 class="panel-title">{{ plugin.name }}</h3>
167+ </div>
168+ <div class="panel-body">
169+ <div class="col-xs-6 col-sm-4 col-md-6">{{ plugin.description }}</div>
170+ <div class="col-xs-6 col-sm-4 col-md-6">
171+ {{ checkbox_toggle('plugin_' + plugin.id, plugin.id not in allowed_plugins) }}
172+ </div>
173+ </div>
174+ </div>
175+ {% endfor %}
176+ </div>
177+ </fieldset>
178+ </div>
160 </div>
179 </div>
161 <p class="text-muted" style="margin:20px 0;">{{ _('These settings are stored in your cookies, this allows us not to store this data about you.') }}
180 <p class="text-muted" style="margin:20px 0;">{{ _('These settings are stored in your cookies, this allows us not to store this data about you.') }}
162 <br />
181 <br />
searx/webapp.py+26−3
@@ -317,8 +317,8 @@ def pre_request():
317 allowed_plugins = request.cookies.get('allowed_plugins', '').split(',')
317 allowed_plugins = request.cookies.get('allowed_plugins', '').split(',')
318 disabled_plugins = request.cookies.get('disabled_plugins', '').split(',')
318 disabled_plugins = request.cookies.get('disabled_plugins', '').split(',')
319 for plugin in plugins:
319 for plugin in plugins:
320− if ((plugin.default_on and plugin.name not in disabled_plugins)
320+ if ((plugin.default_on and plugin.id not in disabled_plugins)
321− or plugin.name in allowed_plugins):
321+ or plugin.id in allowed_plugins):
322 request.user_plugins.append(plugin)
322 request.user_plugins.append(plugin)
323
323
324
324
@@ -508,6 +508,7 @@ def preferences():
508 blocked_engines = get_blocked_engines(engines, request.cookies)
508 blocked_engines = get_blocked_engines(engines, request.cookies)
509 else: # on save
509 else: # on save
510 selected_categories = []
510 selected_categories = []
511+ post_disabled_plugins = []
511 locale = None
512 locale = None
512 autocomplete = ''
513 autocomplete = ''
513 method = 'POST'
514 method = 'POST'
@@ -534,14 +535,34 @@ def preferences():
534 safesearch = pd
535 safesearch = pd
535 elif pd_name.startswith('engine_'):
536 elif pd_name.startswith('engine_'):
536 if pd_name.find('__') > -1:
537 if pd_name.find('__') > -1:
538+ # TODO fix underscore vs space
539+ engine_name, category = [x.replace('_', ' ') for x in
537− engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
540+ pd_name.replace('engine_', '', 1).split('__', 1)]
538 if engine_name in engines and category in engines[engine_name].categories:
541 if engine_name in engines and category in engines[engine_name].categories:
539 blocked_engines.append((engine_name, category))
542 blocked_engines.append((engine_name, category))
540 elif pd_name == 'theme':
543 elif pd_name == 'theme':
541 theme = pd if pd in themes else default_theme
544 theme = pd if pd in themes else default_theme
545+ elif pd_name.startswith('plugin_'):
546+ plugin_id = pd_name.replace('plugin_', '', 1)
547+ if not any(plugin.id == plugin_id for plugin in plugins):
548+ continue
549+ post_disabled_plugins.append(plugin_id)
542 else:
550 else:
543 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
551 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
544
552
553+ disabled_plugins = []
554+ allowed_plugins = []
555+ for plugin in plugins:
556+ if plugin.default_on:
557+ if plugin.id in post_disabled_plugins:
558+ disabled_plugins.append(plugin.id)
559+ elif plugin.id not in post_disabled_plugins:
560+ allowed_plugins.append(plugin.id)
561+
562+ resp.set_cookie('disabled_plugins', ','.join(disabled_plugins), max_age=cookie_max_age)
563+
564+ resp.set_cookie('allowed_plugins', ','.join(allowed_plugins), max_age=cookie_max_age)
565+
545 resp.set_cookie(
566 resp.set_cookie(
546 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
567 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
547 max_age=cookie_max_age
568 max_age=cookie_max_age
@@ -591,6 +612,8 @@ def preferences():
591 autocomplete_backends=autocomplete_backends,
612 autocomplete_backends=autocomplete_backends,
592 shortcuts={y: x for x, y in engine_shortcuts.items()},
613 shortcuts={y: x for x, y in engine_shortcuts.items()},
593 themes=themes,
614 themes=themes,
615+ plugins=plugins,
616+ allowed_plugins=[plugin.id for plugin in request.user_plugins],
594 theme=get_current_theme_name())
617 theme=get_current_theme_name())
595
618
596
619