Added search feature 🎉

master
Corentin LEMAIRE 6 months ago
parent 799497fe9b
commit d6321f5718

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<h1>Courses for {{ person.name }}</h1>

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<form action="{% url 'create_course_form' %}" method="POST">

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
{% if error_message %}
@ -27,6 +28,9 @@
<p>
There's only {{ course.places }} places
</p>
<p>
The course has been created by {{ course.teacher_name }}
</p>
{% else %}
<h1>No course found!</h1>
{% endif %}

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
{% if person != '' %}

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<form action="{% url 'login' %}" method="POST">

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<form action="{% url 'change_profile' %}" method="POST">

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<form action="{% url 'register' %}" method="POST">

@ -0,0 +1,32 @@
<html>
<body>
<nav>
<a href="{% url 'home' %}">Home</a>
{% if person.name == '' %}
<a href="{% url 'login_form' %}">Login</a>
<a href="{% url 'register_form' %}">Register</a>
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<form action="{% url 'search_form' %}" method="POST">
{% csrf_token %}
<fieldset>
<legend><h1>Search</h1></legend>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<label for="keywords">Keywords</label><br>
<input name="keywords" id="keywords" placeholder="Keywords separated by spaces"><br/>
</fieldset>
<input type="submit" value="Search">
</form>
{% if courses %}
{% for course in courses %}
<a href="{% url 'details' course.id %}">{{ course.title }}</a>
{% endfor %}
{% else %}
<p>No course found</p>
{% endif %}
</body>
</html>

@ -8,6 +8,7 @@
{% else %}
<a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a>
{% endif %}
</nav>
<form action="{% url 'update_course_form' course.id %}" method="POST">

@ -13,6 +13,8 @@ urlpatterns = [
path('logout', views.logout, name='logout'),
path('create_course', views.create_course_view, name='create_course'),
path('create_course_form', views.create_course_form, name='create_course_form'),
path('search', views.search_view, name='search'),
path('search_form', views.search_form, name='search_form'),
path('update_course/<str:course_id>', views.update_course_view, name='update_course'),
path('update_course_form/<str:course_id>', views.update_course_form, name='update_course_form'),
path('delete/<str:course_id>', views.delete_course_view, name='delete_course'),

@ -39,10 +39,11 @@ def getCourseId(course):
def home(request, person=''):
def home(request):
global cancel
global personLoggedIn
cancel = True
return render(request, 'home.html', {'person': person})
return render(request, 'home.html', {'person': personLoggedIn})
def details(request, course_id):
global redis_connection
@ -52,10 +53,11 @@ def details(request, course_id):
course = redis_connection.hgetall(f"course:{course_id}")
if not course:
raise Http404("Course does not exist")
course_id = getCourseId2(course['title'], course['teacher'])
if course_id == False:
raise Http404("Course does not exist")
course['id'] = course_id.split(":")[1]
course['id'] = course_id
teacher = redis_connection.hgetall(f"person:{course['teacher']}")
if not teacher:
raise Http404("Teacher does not exist")
course['teacher_name'] = teacher.get('name')
return render(request, 'details.html', {'course': course, 'person': personLoggedIn})
# Handle error messages.
@ -78,7 +80,7 @@ def register(request):
'role': person_role
})
personLoggedIn = redis_connection.hgetall(person_key)
return home(request, personLoggedIn)
return home(request)
return render(request, 'register.html', {'person': Person(name="", role=""), "error_message": "The form has been wrongly filled!"})
@ -96,7 +98,7 @@ def login(request):
if results[0] > 0:
person_key = results[1]
personLoggedIn = redis_connection.hgetall(person_key)
return home(request, personLoggedIn)
return home(request)
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "No user found!"})
return login_form(request)
@ -334,4 +336,50 @@ def subscribe(courses_id):
def send_new_course_notification(message):
print(message)
def search(keywords):
courses = []
for keyword in keywords.split(' '):
if not keyword: # When the users end his keywords with a ' '
continue
title_query = f"@title:{keyword}"
summary_query = f"@summary:{keyword}"
level_query = f"@level:{keyword}"
teacher_query = f"@teacher:{keyword}"
title_results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', title_query)
summary_results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', summary_query)
level_results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', level_query)
teacher_results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', teacher_query)
for i in range(1, len(title_results), 2):
courses.append(title_results[i])
for i in range(1, len(summary_results), 2):
courses.append(summary_results[i])
for i in range(1, len(level_results), 2):
courses.append(level_results[i])
for i in range(1, len(teacher_results), 2):
courses.append(teacher_results[i])
return courses
def search_view(request):
global personLoggedIn
return render(request, 'search.html', {'person': personLoggedIn})
def search_form(request):
global personLoggedIn
global redis_connection
global cancel
cancel = True
if request.method == 'POST':
keywords = request.POST.get('keywords')
courses = []
courses_id = search(keywords)
for course_id in courses_id:
course = redis_connection.hgetall(course_id)
if not course:
continue
course['id'] = course_id.split(":")[1]
courses.append(course)
return render(request, 'search.html', {'person': personLoggedIn, 'courses': courses})
return render(request, 'search.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"})
# Every id is only the number, not the course:number or person:number
Loading…
Cancel
Save