Skip to content

Commit 598d3fb

Browse files
committed
add basic search functionality
1 parent 0dfb4b5 commit 598d3fb

5 files changed

Lines changed: 126 additions & 32 deletions

File tree

frontend/locale/de_DE/LC_MESSAGES/django.po

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,38 +35,40 @@ msgstr "Soll der folgende Kommentar wirklich gelöscht werden?"
3535

3636
#: frontend/templates/frontend/content/addcontent.html:23
3737
#: frontend/templates/frontend/course/create.html:29
38+
#: frontend/templates/frontend/course/edit.html:29
3839
msgid "Create"
3940
msgstr "Erzeugen"
4041

4142
#: frontend/templates/frontend/content/addcontent.html:24
4243
#: frontend/templates/frontend/content/detail.html:80
4344
#: frontend/templates/frontend/course/create.html:30
45+
#: frontend/templates/frontend/course/edit.html:30
4446
#: frontend/templates/frontend/profile/profile_edit.html:19
4547
msgid "Cancel"
4648
msgstr "Abbrechen"
4749

4850
#: frontend/templates/frontend/content/detail.html:18
49-
#: frontend/templates/frontend/course/view.html:25
51+
#: frontend/templates/frontend/course/view.html:24
5052
msgid "Actions"
5153
msgstr "Aktionen"
5254

53-
#: frontend/templates/frontend/content/detail.html:46
55+
#: frontend/templates/frontend/content/detail.html:43
5456
msgid "Back to course "
5557
msgstr "Zurück zum Kurs "
5658

57-
#: frontend/templates/frontend/content/detail.html:52
59+
#: frontend/templates/frontend/content/detail.html:49
5860
msgid "By"
5961
msgstr "Von"
6062

61-
#: frontend/templates/frontend/content/detail.html:62
63+
#: frontend/templates/frontend/content/detail.html:59
6264
msgid "Created at"
6365
msgstr "Erstellt am"
6466

65-
#: frontend/templates/frontend/content/detail.html:70
67+
#: frontend/templates/frontend/content/detail.html:67
6668
msgid "Delete"
6769
msgstr "Löschen"
6870

69-
#: frontend/templates/frontend/content/detail.html:74
71+
#: frontend/templates/frontend/content/detail.html:71
7072
#, python-format
7173
msgid ""
7274
"\n"
@@ -80,38 +82,26 @@ msgstr ""
8082
" "
8183

8284
#: frontend/templates/frontend/content/detail.html:83
83-
#: frontend/templates/frontend/course/create.html:30
84-
#: frontend/templates/frontend/course/edit.html:30
85-
#: frontend/templates/frontend/profile/profile_edit.html:19
86-
msgid "Cancel"
87-
msgstr "Abbrechen"
88-
89-
#: frontend/templates/frontend/content/detail.html:86
9085
msgid "Confirm"
9186
msgstr "Bestätigen"
9287

93-
#: frontend/templates/frontend/content/detail.html:102
88+
#: frontend/templates/frontend/content/detail.html:99
9489
#: frontend/templates/frontend/course/topic_contents.html:29
9590
msgid "Rating"
9691
msgstr "Bewertung"
9792

98-
#: frontend/templates/frontend/content/detail.html:112
93+
#: frontend/templates/frontend/content/detail.html:109
9994
msgid "Comments"
10095
msgstr "Kommentare"
10196

102-
#: frontend/templates/frontend/content/detail.html:118
97+
#: frontend/templates/frontend/content/detail.html:115
10398
msgid "Add comment"
10499
msgstr "Kommentar hinzufügen"
105100

106101
#: frontend/templates/frontend/course/create.html:11
107102
msgid "Create a new course"
108103
msgstr "Neuen Kurs anlegen"
109104

110-
#: frontend/templates/frontend/course/create.html:29
111-
#: frontend/templates/frontend/course/edit.html:29
112-
msgid "Create"
113-
msgstr "Erzeugen"
114-
115105
#: frontend/templates/frontend/course/dropdown_topic.html:10
116106
msgid "Add Content"
117107
msgstr "Inhalte hinzufügen"
@@ -120,16 +110,15 @@ msgstr "Inhalte hinzufügen"
120110
msgid "Edit course"
121111
msgstr "Kurs bearbeiten"
122112

123-
#: frontend/templates/frontend/course/view.html:26
113+
#: frontend/templates/frontend/course/view.html:35
124114
msgid "Edit Course"
125115
msgstr "Kurs hinzufügen"
126116

127-
#: frontend/templates/frontend/course/view.html:27
117+
#: frontend/templates/frontend/course/view.html:36
128118
msgid "Delete Course"
129119
msgstr "Kurs löschen"
130120

131-
#: frontend/templates/frontend/course/view.html:63
132-
#: frontend/templates/frontend/course/view.html:78
121+
#: frontend/templates/frontend/course/view.html:76
133122
msgid "No topics yet"
134123
msgstr "Bisher keine Themen"
135124

@@ -157,7 +146,7 @@ msgstr "Kurse für Kategorie"
157146

158147
#: frontend/templates/frontend/course_lists/courses_category.html:18
159148
#: frontend/templates/frontend/course_lists/courses_period.html:18
160-
#: frontend/templates/frontend/navbar.html:5
149+
#: frontend/templates/frontend/navbar.html:12
161150
msgid "All Courses"
162151
msgstr "Alle Kurse"
163152

@@ -201,11 +190,16 @@ msgstr "Login"
201190
msgid "Go to dashboard"
202191
msgstr "Zum Dashboard"
203192

204-
#: frontend/templates/frontend/navbar.html:7
193+
#: frontend/templates/frontend/navbar.html:8
194+
#: frontend/templates/frontend/search.html:11
195+
msgid "Search"
196+
msgstr "Suche"
197+
198+
#: frontend/templates/frontend/navbar.html:14
205199
msgid "Admin Menu"
206200
msgstr "Admin-Menü"
207201

208-
#: frontend/templates/frontend/navbar.html:12
202+
#: frontend/templates/frontend/navbar.html:19
209203
msgid "Logout"
210204
msgstr "Logout"
211205

@@ -237,6 +231,18 @@ msgstr "Zurücksetzen"
237231
msgid "Submit"
238232
msgstr "Abschicken"
239233

234+
#: frontend/templates/frontend/search.html:19
235+
msgid "Search Results for "
236+
msgstr "Suchergebnisse für "
237+
238+
#: frontend/templates/frontend/search.html:30
239+
msgid "No courses found"
240+
msgstr "Keine Kurse gefunden"
241+
242+
#: frontend/templates/frontend/search.html:45
243+
msgid "No topics found"
244+
msgstr "Keine Themen gefunden"
245+
240246
#: frontend/views/comment.py:33 frontend/views/comment.py:107
241247
msgid "You don't have permission to do this."
242248
msgstr "Keine Berechtigung, um das durchzuführen"
@@ -268,6 +274,3 @@ msgstr "Kurs '{cleaned_data['title']}' erfolgreich bearbeitet"
268274
#: frontend/views/profile.py:25
269275
msgid "Profile updated"
270276
msgstr "Profil aktualisiert"
271-
272-
#~ msgid "Delete Course"
273-
#~ msgstr "Kurs löschen"

frontend/templates/frontend/navbar.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
{% load i18n %}
2+
{% load fontawesome_5 %}
23

34
{% if user.is_authenticated %}
45
<div class="float-right" style="color: #ffffff;font-weight: bold;">
6+
7+
<form class="form-inline float-left" action="{% url 'frontend:search' %}">
8+
<input class="form-control" type="search" name="q" placeholder="{% trans 'Search' %}" aria-label="Search">
9+
<button class="btn btn-outline-success" type="submit">{% fa5_icon "search" "far" %}</button>
10+
</form>
11+
512
<a href="{% url "frontend:courses" %}" class="btn btn-primary" style="">{% trans "All Courses" %}</a>
613
{% if user.is_superuser %}
714
<a href="{% url "admin:index" %}" class="btn btn-danger" style="">{% trans "Admin Menu" %}</a>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{% extends 'frontend/base_logged_in.html' %}
2+
3+
{# Load the tag library #}
4+
{% load bootstrap4 %}
5+
{% load i18n %}
6+
{% load static %}
7+
{% load fontawesome_5 %}
8+
9+
{# Load CSS and JavaScript #}
10+
11+
{% block title %}{% trans "Search" %} - Collab Coursebook{% endblock %}
12+
13+
{% block imports %}
14+
<link rel="stylesheet" href="{% static 'vendor/chosen-js/chosen.css' %}">
15+
<link rel="stylesheet" href="{% static 'css/bootstrap-chosen.css' %}">
16+
{% endblock %}
17+
18+
{% block content %}
19+
<h1>{% trans 'Search Results for ' %}"{{ search_query }}"</h1>
20+
<h3>Courses</h3>
21+
{% if search_data.courses %}
22+
<ul style="list-style-type: none;">
23+
{% for course in search_data.courses %}
24+
<li>{{ forloop.counter }}.
25+
<a href="{% url 'frontend:course' course.id %}"><b>{{ course.title }}</b></a>
26+
</li>
27+
{% endfor %}
28+
</ul>
29+
{% else %}
30+
<p>{% trans 'No courses found' %}</p>
31+
{% endif %}
32+
33+
<h3>Topics</h3>
34+
{% if search_data.course_structure_entries %}
35+
<ul style="list-style-type: none;">
36+
{% for entry in search_data.course_structure_entries %}
37+
<li>{{ forloop.counter }}.
38+
<a href="{% url 'frontend:course' entry.course.id %}">
39+
{{ entry.course.title }}: <b>{{ entry.topic.title }}</b>
40+
</a>
41+
</li>
42+
{% endfor %}
43+
</ul>
44+
{% else %}
45+
<p>{% trans 'No topics found' %}</p>
46+
{% endif %}
47+
48+
49+
50+
{% endblock %}
51+
52+
{% block bottom_script %}
53+
<script src="{% static 'vendor/chosen-js/chosen.jquery.js' %}"></script>
54+
<script>
55+
$(function () {
56+
$('.chosen-select').chosen();
57+
});
58+
</script>
59+
{% endblock %}

frontend/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
from content.models import CONTENT_TYPES
44
from frontend import views
5+
from frontend.views.search import SearchView
56

67
app_name = "frontend"
78

89
urlpatterns = [
910
path('', views.StartView.as_view(), name="index"),
1011
path('dashboard/', views.DashboardView.as_view(), name="dashboard"),
11-
12+
path('search/', views.search.SearchView.as_view(), name='search'),
1213
path('profile/<int:pk>/', views.ProfileView.as_view(), name="profile"),
1314
path('profile/edit/', views.ProfileEditView.as_view(), name="profile-edit"),
1415

frontend/views/search.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from django.views.generic import ListView
2+
from django.contrib.auth.mixins import LoginRequiredMixin
3+
from base.models import Course, CourseStructureEntry
4+
5+
6+
class SearchView(ListView, LoginRequiredMixin):
7+
"""
8+
Search for course and topic titles
9+
"""
10+
model = Course
11+
template_name = 'frontend/search.html'
12+
context_object_name = 'search_data'
13+
14+
def get_queryset(self):
15+
query = self.request.GET.get('q')
16+
query = query.strip().lower()
17+
courses = Course.objects.filter(title__icontains=query)
18+
course_structure_entries = CourseStructureEntry.objects.filter(topic__title__icontains=query)
19+
return {'courses': courses, 'course_structure_entries': course_structure_entries}
20+
21+
def get_context_data(self, *, object_list=None, **kwargs):
22+
context = super().get_context_data(**kwargs)
23+
context['search_query'] = self.request.GET.get('q')
24+
return context

0 commit comments

Comments
 (0)