aboutsummaryrefslogtreecommitdiff
path: root/blog/views.py
diff options
context:
space:
mode:
authorBobby <[email protected]>2023-04-27 03:05:18 -0400
committerBobby <[email protected]>2023-04-27 03:05:18 -0400
commit08f57b0f8029ee5f45adba91ceb31e07a7bd65fd (patch)
tree56557ff613b48b93b0ffb8c565fe6ac3d4e10efe /blog/views.py
parent6e3748deb07a4916c516a6b38197a29b91f35c8a (diff)
downloadthatcomputerscientist-08f57b0f8029ee5f45adba91ceb31e07a7bd65fd.tar.xz
thatcomputerscientist-08f57b0f8029ee5f45adba91ceb31e07a7bd65fd.zip
Inworks Search using `haystack`
Diffstat (limited to 'blog/views.py')
-rw-r--r--blog/views.py47
1 files changed, 17 insertions, 30 deletions
diff --git a/blog/views.py b/blog/views.py
index 01e0379b..acab2d74 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -13,6 +13,7 @@ from users.forms import RegisterForm, UpdateUserDetailsForm
from users.tokens import CaptchaTokenGenerator
from django.contrib import messages
from bs4 import BeautifulSoup
+from haystack.query import SearchQuerySet
import re
import os
from dotenv import load_dotenv
@@ -195,40 +196,26 @@ def delete_comment(request, slug, comment_id):
def search(request):
- categories = Category.objects.all()
- tags = request.GET.get('tags')
- category = request.GET.get('category')
- query = request.GET.get('query')
- search_in_body = False
-
- # First check for query constraints
- if len(query) == 0:
- return render(request, 'blog/search.html', {'title': 'Search', 'posts': [], 'categories': categories, 'tags': tags, 'cate': category, 'query': query})
-
- if len(query) < 3:
- return render(request, 'blog/search.html', {'title': 'Search', 'posts': [], 'categories': categories, 'tags': tags, 'cate': category, 'query': query, 'error': 'Query must be at least 3 characters long'})
-
- if len(query) > 100:
- search_in_body = True
-
- # public posts which contain the query in the title or body
- posts = Post.objects.filter(is_public=True, title__icontains=query) if not search_in_body else Post.objects.filter(is_public=True, body__icontains=query) | Post.objects.filter(is_public=True, title__icontains=query)
+ query = request.GET.get('q')
+ search_in = request.GET.getlist('search_in') if request.GET.get('search_in') else ['posts']
+ sort_by = request.GET.get('sort_by') if request.GET.get('sort_by') else 'relevance'
+ order = request.GET.get('order') if request.GET.get('order') else 'ascending'
+ date_range = request.GET.get('date_range') if request.GET.get('date_range') else 'any'
+ search_model_map = {
+ 'posts': Post,
+ 'users': User,
+ }
- # filter by category slug
- if category:
- posts = posts.filter(category__slug=category)
- else:
- category = ''
+ if query:
+ search_results = SearchQuerySet().filter(content=query)
+ if search_in:
+ search_results = search_results.models(*[search_model_map[model] for model in search_in])
- # filter by tags
- if tags:
- posts = posts.filter(tags__name__in=tags.split(','))
+ search_results = [result.object for result in search_results]
else:
- tags = ''
+ search_results = None
- # order by date
- posts = posts.order_by('-date')
- return render(request, 'blog/search.html', {'title': 'Search', 'posts': posts, 'categories': categories, 'tags': tags, 'cate': category, 'query': query})
+ return render(request, 'blog/search.html', {'title': f"Search results for '{query}'", 'query': query, 'search_results': search_results, 'search_in': search_in, 'sort_by': sort_by, 'order': order, 'date_range': date_range})
def articles(request, date=None, cg=None):
type = 'articles'