Coverage for apis_core/utils/filters.py: 40%

20 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-09-16 07:42 +0000

1from django.db.models import Q 

2from django.template import loader 

3from rest_framework.filters import SearchFilter 

4 

5from apis_core.apis_entities.utils import get_entity_classes 

6from apis_core.generic.helpers import generate_search_filter 

7 

8 

9class CustomSearchFilter(SearchFilter): 

10 def filter_queryset(self, request, queryset, view): 

11 search_terms = self.get_search_terms(request) 

12 if not search_terms: 

13 return queryset 

14 entities = get_entity_classes() 

15 q = Q() 

16 for entity in entities: 

17 name = entity._meta.model_name 

18 q |= Q(**{f"{name}__isnull": False}) & generate_search_filter( 

19 entity, search_terms, prefix=f"{name}__" 

20 ) 

21 return queryset.filter(q) 

22 

23 def to_html(self, request, queryset, view): 

24 context = { 

25 "param": self.search_param, 

26 "term": request.query_params.get(self.search_param, ""), 

27 } 

28 template = loader.get_template(self.template) 

29 return template.render(context)