/usr/lib/python2.7/dist-packages/haystack/panels.py is in python-django-haystack 2.8.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | # encoding: utf-8
from __future__ import absolute_import, division, print_function, unicode_literals
import datetime
from debug_toolbar.panels import DebugPanel
from django.template.loader import render_to_string
from django.utils import six
from django.utils.translation import ugettext_lazy as _
from haystack import connections
class HaystackDebugPanel(DebugPanel):
"""
Panel that displays information about the Haystack queries run while
processing the request.
"""
name = 'Haystack'
has_content = True
def __init__(self, *args, **kwargs):
super(self.__class__, self).__init__(*args, **kwargs)
self._offset = dict((alias, len(connections[alias].queries)) for alias in connections.connections_info.keys())
self._search_time = 0
self._queries = []
self._backends = {}
def nav_title(self):
return _('Haystack')
def nav_subtitle(self):
self._queries = []
self._backends = {}
for alias in connections.connections_info.keys():
search_queries = connections[alias].queries[self._offset[alias]:]
self._backends[alias] = {
'time_spent': sum(float(q['time']) for q in search_queries),
'queries': len(search_queries),
}
self._queries.extend([(alias, q) for q in search_queries])
self._queries.sort(key=lambda x: x[1]['start'])
self._search_time = sum([d['time_spent'] for d in self._backends.itervalues()])
num_queries = len(self._queries)
return "%d %s in %.2fms" % (
num_queries,
(num_queries == 1) and 'query' or 'queries',
self._search_time
)
def title(self):
return _('Search Queries')
def url(self):
return ''
def content(self):
width_ratio_tally = 0
for alias, query in self._queries:
query['alias'] = alias
query['query'] = query['query_string']
if query.get('additional_kwargs'):
if query['additional_kwargs'].get('result_class'):
query['additional_kwargs']['result_class'] = six.text_type(query['additional_kwargs']['result_class'])
try:
query['width_ratio'] = (float(query['time']) / self._search_time) * 100
except ZeroDivisionError:
query['width_ratio'] = 0
query['start_offset'] = width_ratio_tally
width_ratio_tally += query['width_ratio']
context = self.context.copy()
context.update({
'backends': sorted(self._backends.items(), key=lambda x: -x[1]['time_spent']),
'queries': [q for a, q in self._queries],
'sql_time': self._search_time,
})
return render_to_string('panels/haystack.html', context)
|