Coverage for website/views/SearchView.py: 90%

21 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2025-09-13 15:29 -0300

1from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator 

2from django.db.models import Q 

3from django.shortcuts import render 

4 

5from website.forms.SearchForm import SearchForm 

6from website.models.PostModel import Post 

7 

8 

9def search_posts(request): 

10 form = SearchForm(request.GET) 

11 query = request.GET.get("query", "") 

12 results = [] 

13 

14 if query: 

15 # Search in title, text, and author name 

16 results = Post.objects.filter( 

17 Q(title__icontains=query) 

18 | Q(text__icontains=query) 

19 | Q(author__author_name__icontains=query) 

20 ).order_by("-published_date") 

21 

22 # Pagination 

23 paginator = Paginator(results, 6) # Show 6 posts per page 

24 page = request.GET.get("page") 

25 

26 try: 

27 posts = paginator.page(page) 

28 except PageNotAnInteger: 

29 # If page is not an integer, deliver first page 

30 posts = paginator.page(1) 

31 except EmptyPage: 

32 # If page is out of range, deliver last page of results 

33 posts = paginator.page(paginator.num_pages) 

34 

35 context = { 

36 "form": form, 

37 "query": query, 

38 "posts": posts, 

39 "results_count": results.count() if query else 0, 

40 } 

41 

42 return render(request, "search/search_results.html", context)