diff --git a/vulnerabilities/templates/includes/pagination.html b/vulnerabilities/templates/includes/pagination.html
index 0d6dad430..0d4cf22ed 100644
--- a/vulnerabilities/templates/includes/pagination.html
+++ b/vulnerabilities/templates/includes/pagination.html
@@ -1,39 +1,46 @@
-
\ No newline at end of file
+
+
+
+{% endif %}
diff --git a/vulnerabilities/templates/packages.html b/vulnerabilities/templates/packages.html
index 1f7687429..6ca0ec026 100644
--- a/vulnerabilities/templates/packages.html
+++ b/vulnerabilities/templates/packages.html
@@ -18,6 +18,16 @@
{{ page_obj.paginator.count|intcomma }} results
+
+
+
+ 20 per page
+ 50 per page
+ 100 per page
+ 200 per page
+
+
+
{% if is_paginated %}
{% include 'includes/pagination.html' with page_obj=page_obj %}
{% endif %}
@@ -81,4 +91,12 @@
{% endif %}
+
{% endblock %}
diff --git a/vulnerabilities/templates/vulnerabilities.html b/vulnerabilities/templates/vulnerabilities.html
index 023d3f97f..3d9a3d3b5 100644
--- a/vulnerabilities/templates/vulnerabilities.html
+++ b/vulnerabilities/templates/vulnerabilities.html
@@ -18,7 +18,17 @@
{{ page_obj.paginator.count|intcomma }} results
- {% if is_paginated %}
+
+
+
+ 20 per page
+ 50 per page
+ 100 per page
+ 200 per page
+
+
+
+ {% if is_paginated %}
{% include 'includes/pagination.html' with page_obj=page_obj %}
{% endif %}
@@ -77,5 +87,13 @@
{% endif %}
{% endif %}
-
+
+
{% endblock %}
diff --git a/vulnerabilities/views.py b/vulnerabilities/views.py
index 394dc1c36..040a1cca3 100644
--- a/vulnerabilities/views.py
+++ b/vulnerabilities/views.py
@@ -36,6 +36,8 @@
from vulnerabilities.utils import get_severity_range
from vulnerablecode.settings import env
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+
PAGE_SIZE = 20
@@ -66,13 +68,17 @@ class PackageSearch(ListView):
model = models.Package
template_name = "packages.html"
ordering = ["type", "namespace", "name", "version"]
- paginate_by = PAGE_SIZE
+ paginate_by = 20 # Default value
+
+ def get_paginate_by(self, queryset):
+ return int(self.request.GET.get('page_size', self.paginate_by))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
request_query = self.request.GET
context["package_search_form"] = PackageSearchForm(request_query)
context["search"] = request_query.get("search")
+ context["page_size"] = self.get_paginate_by(self.get_queryset())
return context
def get_queryset(self, query=None):
@@ -89,24 +95,51 @@ def get_queryset(self, query=None):
.order_by("package_url")
)
+ def paginate_queryset(self, queryset, page_size):
+ paginator = Paginator(queryset, page_size)
+ page = self.request.GET.get('page')
+ try:
+ page_obj = paginator.page(page)
+ except PageNotAnInteger:
+ page_obj = paginator.page(1)
+ except EmptyPage:
+ page_obj = paginator.page(paginator.num_pages)
+ return (paginator, page_obj, page_obj.object_list, page_obj.has_other_pages())
+
+
class VulnerabilitySearch(ListView):
model = models.Vulnerability
template_name = "vulnerabilities.html"
ordering = ["vulnerability_id"]
- paginate_by = PAGE_SIZE
+ paginate_by = 20 # Default value
+
+ def get_paginate_by(self, queryset):
+ return int(self.request.GET.get('page_size', self.paginate_by))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
request_query = self.request.GET
context["vulnerability_search_form"] = VulnerabilitySearchForm(request_query)
context["search"] = request_query.get("search")
+ context["page_size"] = self.get_paginate_by(self.get_queryset())
return context
- def get_queryset(self, query=None):
- query = query or self.request.GET.get("search") or ""
+ def get_queryset(self):
+ query = self.request.GET.get("search") or ""
return self.model.objects.search(query=query).with_package_counts()
+ def paginate_queryset(self, queryset, page_size):
+ paginator = Paginator(queryset, page_size)
+ page = self.request.GET.get('page')
+ try:
+ page_obj = paginator.page(page)
+ except PageNotAnInteger:
+ page_obj = paginator.page(1)
+ except EmptyPage:
+ page_obj = paginator.page(paginator.num_pages)
+ return (paginator, page_obj, page_obj.object_list, page_obj.has_other_pages())
+
class PackageDetails(DetailView):
model = models.Package