This file is indexed.

/usr/lib/python3/dist-packages/haystack/panels.py is in python3-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)