A generic wrapper to require ES for a view.

This commit is contained in:
Dave Dash 2011-07-13 11:29:22 -07:00
Родитель 3511d3195f
Коммит 6c0893b487
1 изменённых файлов: 38 добавлений и 2 удалений

Просмотреть файл

@ -2,7 +2,7 @@ import logging
from functools import wraps
from threading import local
from pyes import ES
from pyes import ES, exceptions
try:
from django.conf import settings
@ -18,8 +18,9 @@ def get_es():
"""Return one es object."""
if not hasattr(_local, 'es'):
timeout = getattr(settings, 'ES_TIMEOUT', 1)
dump = getattr(settings, 'ES_DUMP_CURL', False)
_local.es = ES(settings.ES_HOSTS, default_indexes=[settings.ES_INDEX],
timeout=timeout)
timeout=timeout, dump_curl=dump)
return _local.es
@ -34,6 +35,40 @@ def es_required(f):
return wrapper
def es_required_or_50x(disabled_msg, error_msg):
"""
This takes a Django view that requires ElasticSearch.
If `ES_DISABLED` is `True` then we raise a 501 Not Implemented and display
the disabled_msg. If we try the view and an ElasticSearch exception is
raised we raise a 503 error with the error_msg.
We use user-supplied templates in elasticutils/501.html and
elasticutils/503.html.
"""
def wrap(f):
@wraps(f)
def wrapper(request, *args, **kw):
from django.shortcuts import render
if settings.ES_DISABLED:
response = render(request, 'elasticutils/501.html',
{'msg': disabled_msg})
response.status_code = 501
return response
else:
try:
return f(request, *args, **kw)
except exceptions.ElasticSearchException as error:
response = render(request, 'elasticutils/503.html',
{'msg': error_msg, 'error': error})
response.status_code = 503
return response
return wrapper
return wrap
def _process_filters(filters):
qfilters = []
for field, value in filters.iteritems():
@ -95,6 +130,7 @@ class S(object):
def _clone(self):
new = self.__class__(self.type)
new.query = self.query
new.filter_ = self.filter_
new.results = list(self.results)
new.facets = dict(self.facets)