aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2022-12-29 06:07:39 -0500
committerBobby <[email protected]>2022-12-29 06:07:39 -0500
commit5c5493387bbcd6d0b025d395df77ae48af65508e (patch)
treedd54bda7698c45c6a7334fa88b9bc860d683b03a
parent8ae5991bb2481f5fc1de7b9012adcc4ae2e39aba (diff)
downloadthatcomputerscientist-5c5493387bbcd6d0b025d395df77ae48af65508e.tar.xz
thatcomputerscientist-5c5493387bbcd6d0b025d395df77ae48af65508e.zip
Some makeshift search page.; I'm tired now. Maybe I'll watch Konosuba
-rw-r--r--blog/urls.py3
-rw-r--r--blog/views.py40
-rw-r--r--templates/blog/partials/sidebar.html4
-rw-r--r--templates/blog/search.html40
4 files changed, 83 insertions, 4 deletions
diff --git a/blog/urls.py b/blog/urls.py
index 03e6c13d..526093cc 100644
--- a/blog/urls.py
+++ b/blog/urls.py
@@ -6,7 +6,8 @@ app_name = 'blog'
urlpatterns = [
path('', views.home, name='home'),
path('account', views.account, name='account'),
- path('register/', views.register, name='register'),
+ path('register', views.register, name='register'),
+ path('search', views.search, name='search'),
path('articles/<str:slug>', views.post, name='post'),
path('articles/<str:slug>/comment', views.comment, name='comment'),
path('articles/<str:slug>/edit_comment', views.edit_comment, name='edit_comment'),
diff --git a/blog/views.py b/blog/views.py
index fd8d76f5..96faa177 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -5,7 +5,7 @@ from users.models import UserProfile
import hashlib
from random import choice
from string import ascii_letters, digits
-from .models import Post, Comment
+from .models import Category, Post, Comment
from .context_processors import recent_posts, avatar_list
from announcements.models import Announcement
from users.forms import RegisterForm
@@ -167,3 +167,41 @@ def delete_comment(request, slug, comment_id):
return HttpResponse('Comment not found!', status=404)
else:
return redirect('blog:home')
+
+
+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)
+
+ # filter by category slug
+ if category:
+ posts = posts.filter(category__slug=category)
+ else:
+ category = ''
+
+ # filter by tags
+ if tags:
+ posts = posts.filter(tags__name__in=tags.split(','))
+ else:
+ tags = ''
+
+ # 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})
+
diff --git a/templates/blog/partials/sidebar.html b/templates/blog/partials/sidebar.html
index 00be99cc..b7903bff 100644
--- a/templates/blog/partials/sidebar.html
+++ b/templates/blog/partials/sidebar.html
@@ -47,8 +47,8 @@
<div id="search-area" {% if not user.is_authenticated %}class="mtsbitem"{% endif %}>
<h2>Search</h2>
- <form action="#" method="GET">
- <input type="text" name="q" placeholder="Search..." autocomplete="off" style="width: 166px;">
+ <form action="{% url 'blog:search' %}" method="get">
+ <input type="text" name="query" placeholder="Search..." autocomplete="off" style="width: 166px;" value="{{ request.GET.query }}">
<input type="submit" align="center" class="button button-special" value="Search" style="width: 60px;">
</form>
</div>
diff --git a/templates/blog/search.html b/templates/blog/search.html
new file mode 100644
index 00000000..f9eaa71e
--- /dev/null
+++ b/templates/blog/search.html
@@ -0,0 +1,40 @@
+{% extends 'blog/partials/base.html' %} {% block content %}
+
+<div id="search-banner">
+ <h1>Combine your search terms:</h1>
+ <form action="{% url 'blog:search' %}" method="get">
+ <label for="query">Search for:</label>
+ <input type="text" name="query" value="{{ query }}" />
+ <label for="tags">With tags (separate with commas):</label>
+ <input type="text" name="tags" value="{{ tags }}" />
+ <label for="category">In category:</label>
+ <select name="category">
+ <option value="" {% if cate == '' %}selected{% endif %}>All categories</option>
+ {% for category in categories %}
+ <option value="{{ category.slug }}" {% if category.slug == cate %}selected{% endif %}>{{ category.name }}</option>
+ {% endfor %}
+ </select>
+ <input type="submit" value="Search" />
+ </form>
+</div>
+
+{% if posts %}
+ <div id="search-results">
+ <h2>Search results for "{{ query }}"</h2>
+ <ul>
+ {% for post in posts %}
+ <li>
+ <a href="{% url 'blog:post' post.slug %}">{{ post.title }}</a>
+ <p>{{ post.excerpt }}</p>
+ </li>
+ {% endfor %}
+ </ul>
+ </div>
+{% else %}
+ <div id="search-results">
+ <h2>No results found for "{{ query }}"</h2>
+ </div>
+{% endif %}
+
+
+{% endblock %} \ No newline at end of file