Skip to content

Commit 1b68320

Browse files
authored
Get paginator limit from url params (#646)
* Get paginator limit from url params When profiling requests with a huge number of queries sometimes we end up with multiple pages. This will allow the user to specify a page size via URL params. * Handle invalid pages, add page size selector
1 parent ea727d3 commit 1b68320

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

project/tests/test_end_points.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,16 @@ def test_request_sql(self):
6161
.filter(request_id__isnull=False)
6262
)
6363
request_id = request_query_data['request_id']
64-
response = self.client.get(silky_reverse('request_sql', kwargs={'request_id': request_id}))
64+
base_url = silky_reverse('request_sql', kwargs={'request_id': request_id})
65+
response = self.client.get(base_url)
66+
self.assertTrue(response.status_code == 200)
67+
68+
# Test with valid page size
69+
response = self.client.get(base_url + "?per_page=100")
70+
self.assertTrue(response.status_code == 200)
71+
72+
# Test with invalid page size
73+
response = self.client.get(base_url + "?per_page=notanumber")
6574
self.assertTrue(response.status_code == 200)
6675

6776
def test_request_sql_detail(self):

silk/templates/silk/sql.html

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,26 @@
2222
<link rel="stylesheet" href="{% static 'silk/css/components/cell.css' %}">
2323
{% endblock %}
2424

25+
{% block filter %}
26+
<form id="filter-form" action="." method="get"></form>
27+
28+
<div class="menu-item">
29+
<div class="menu-item-outer">
30+
<div class="menu-item-inner">
31+
<label>Show:
32+
<select name="per_page" form="filter-form" onchange="this.form.submit();">
33+
{% for option in options_page_size %}
34+
<option value="{{ option }}"
35+
{% if option == per_page %}selected{% endif %}>{{ option }}</option>
36+
{% endfor %}
37+
</select>
38+
</label>
39+
</div>
40+
</div>
41+
</div>
42+
{{ block.super }}
43+
{% endblock %}
44+
2545
{% block menu %}
2646
{% if profile %}
2747
{% profile_menu request profile silk_request %}
@@ -78,13 +98,13 @@
7898

7999
<div class="step-links">
80100
{% if items.has_previous %}
81-
<a href="?page={{ items.previous_page_number }}">previous</a>
101+
<a href="?page={{ items.previous_page_number }}&per_page={{ per_page }}">previous</a>
82102
{% else %}
83103
previous
84104
{% endif %}
85105
|
86106
{% if items.has_next %}
87-
<a href="?page={{ items.next_page_number }}">next</a>
107+
<a href="?page={{ items.next_page_number }}&per_page={{ per_page }}">next</a>
88108
{% else %}
89109
next
90110
{% endif %}

silk/utils/pagination.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
__author__ = 'mtford'
44

55

6-
def _page(request, query_set):
7-
paginator = Paginator(query_set, 200)
6+
def _page(request, query_set, per_page=200):
7+
paginator = Paginator(query_set, per_page)
88
page_number = request.GET.get('page')
99
try:
1010
page = paginator.page(page_number)

silk/views/sql.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,33 @@
1010

1111

1212
class SQLView(View):
13+
page_sizes = [5, 10, 25, 100, 200, 500, 1000]
14+
default_page_size = 200
1315

1416
@method_decorator(login_possibly_required)
1517
@method_decorator(permissions_possibly_required)
1618
def get(self, request, *_, **kwargs):
1719
request_id = kwargs.get('request_id')
1820
profile_id = kwargs.get('profile_id')
21+
try:
22+
per_page = int(request.GET.get('per_page', self.default_page_size))
23+
except (TypeError, ValueError):
24+
per_page = self.default_page_size
1925
context = {
2026
'request': request,
27+
'options_page_size': self.page_sizes,
28+
'per_page': per_page,
2129
}
2230
if request_id:
2331
silk_request = Request.objects.get(id=request_id)
2432
query_set = SQLQuery.objects.filter(request=silk_request).order_by('-start_time')
2533
for q in query_set:
2634
q.start_time_relative = q.start_time - silk_request.start_time
27-
page = _page(request, query_set)
35+
page = _page(request, query_set, per_page)
2836
context['silk_request'] = silk_request
2937
if profile_id:
3038
p = Profile.objects.get(id=profile_id)
31-
page = _page(request, p.queries.order_by('-start_time').all())
39+
page = _page(request, p.queries.order_by('-start_time').all(), per_page)
3240
context['profile'] = p
3341
if not (request_id or profile_id):
3442
raise KeyError('no profile_id or request_id')

0 commit comments

Comments
 (0)