1515from django .contrib import messages
1616from django .core .exceptions import ValidationError
1717from django .core .mail import send_mail
18- from django .core .paginator import EmptyPage
19- from django .core .paginator import PageNotAnInteger
20- from django .core .paginator import Paginator
2118from django .http .response import Http404
2219from django .shortcuts import redirect
2320from django .shortcuts import render
3431from vulnerabilities .forms import PackageSearchForm
3532from vulnerabilities .forms import PaginationForm
3633from vulnerabilities .forms import VulnerabilitySearchForm
37- from vulnerabilities .models import VulnerabilityStatusType
3834from vulnerabilities .severity_systems import EPSS
3935from vulnerabilities .severity_systems import SCORING_SYSTEMS
4036from vulnerabilities .utils import get_severity_range
@@ -67,17 +63,17 @@ def get_purl_version_class(purl: models.Package):
6763 return purl_version_class
6864
6965
66+
7067class BaseSearchView (ListView ):
7168 """Base view for implementing search functionality with pagination."""
7269
7370 paginate_by = PAGE_SIZE
7471 max_page_size = MAX_PAGE_SIZE
7572
76- def get_paginate_by (self ):
73+ def get_paginate_by (self , queryset = None ):
7774 """
78- This function would get and validate the page size from request parameters.
79- It returns a page size between 1 and max_page_size, defaulting to
80- self.paginate_by for invalid inputs.
75+ Get and validate the requested page size.
76+ Required 2 positional_argument get_paginate_by(positional_argument1, positional_argument2)
8177 """
8278 try :
8379 page_size = int (self .request .GET .get ("page_size" , self .paginate_by ))
@@ -88,6 +84,7 @@ def get_paginate_by(self):
8884 return self .paginate_by
8985
9086 def get_context_data (self , ** kwargs ):
87+ """Add pagination form to the template context."""
9188 context = super ().get_context_data (** kwargs )
9289 context .update (
9390 {
@@ -104,47 +101,26 @@ class PackageSearch(BaseSearchView):
104101 ordering = ["type" , "namespace" , "name" , "version" ]
105102
106103 def get_queryset (self , query = None ):
107- """
108- Return a Package queryset based on search parameters.
109-
110- Args:
111- query (str, optional): Direct search query, mainly used for testing.
112- If not provided, uses form data from request.
113- Returns:
114- QuerySet: Filtered and ordered package queryset
115- """
104+ """Get queryset from form's search method."""
116105 if query is not None :
117- # Handle direct query (used in tests)
118- return (
119- self .model .objects .search (query )
120- .with_vulnerability_counts ()
121- .prefetch_related ()
122- .order_by ("package_url" )
123- )
106+ form = self .form_class ()
107+ return form .get_queryset (query = query )
124108
125- # Handle form submission
126- self .form = self .form_class (self .request .GET )
127- if not self .form .is_valid ():
128- return self .model .objects .none ()
129-
130- search_query = self .form .cleaned_data .get ("search" , "" )
131- return (
132- self .model .objects .search (search_query )
133- .with_vulnerability_counts ()
134- .prefetch_related ()
135- .order_by ("package_url" )
136- )
109+ if hasattr (self , "request" ):
110+ self .form = self .form_class (self .request .GET )
111+ return self .form .get_queryset ()
112+
113+ return self .model .objects .none ()
137114
138115 def get_context_data (self , ** kwargs ):
139- """
140- Get the context data for template rendering.
141- Adds form and search parameters to context.
142- """
116+ """Extends the template context with search form and search query for Packages."""
143117 context = super ().get_context_data (** kwargs )
118+ if not hasattr (self , "form" ):
119+ self .form = self .form_class ()
144120 context .update (
145121 {
146122 "package_search_form" : self .form ,
147- "search" : self .request . GET .get ("search" ),
123+ "search" : getattr ( self .request , " GET" , {}) .get ("search" ),
148124 }
149125 )
150126 return context
@@ -157,35 +133,26 @@ class VulnerabilitySearch(BaseSearchView):
157133 ordering = ["vulnerability_id" ]
158134
159135 def get_queryset (self , query = None ):
160- """
161- Return a Vulnerability queryset based on search parameters.
162-
163- Args:
164- query (str, optional): Direct search query, mainly used for testing.
165- If not provided, uses form data from request.
166- Returns:
167- QuerySet: Filtered vulnerability queryset
168- """
136+ """Get queryset from form's search method."""
169137 if query is not None :
170- return self .model .objects .search (query = query ).with_package_counts ()
138+ form = self .form_class ()
139+ return form .get_queryset (query = query )
171140
172- self . form = self . form_class (self . request . GET )
173- if not self .form . is_valid ():
174- return self .model . objects . none ()
141+ if hasattr (self , " request" ):
142+ self .form = self . form_class ( self . request . GET )
143+ return self .form . get_queryset ()
175144
176- search_query = self .form .cleaned_data .get ("search" , "" )
177- return self .model .objects .search (query = search_query ).with_package_counts ()
145+ return self .model .objects .none ()
178146
179147 def get_context_data (self , ** kwargs ):
180- """
181- Get the context data for template rendering.
182- Adds form and search parameters to context.
183- """
148+ """Extends the template context with search form and search query for Vulnerability."""
184149 context = super ().get_context_data (** kwargs )
150+ if not hasattr (self , "form" ):
151+ self .form = self .form_class ()
185152 context .update (
186153 {
187154 "vulnerability_search_form" : self .form ,
188- "search" : self .request . GET .get ("search" ),
155+ "search" : getattr ( self .request , " GET" , {}) .get ("search" ),
189156 }
190157 )
191158 return context
@@ -383,4 +350,4 @@ def form_valid(self, form):
383350 return response
384351
385352 def get_success_url (self ):
386- return reverse_lazy ("api_user_request" )
353+ return reverse_lazy ("api_user_request" )
0 commit comments