From d6321f57187516fe5b64aaa5350568849d6446d6 Mon Sep 17 00:00:00 2001 From: Corentin Date: Sun, 27 Oct 2024 19:22:41 +0100 Subject: [PATCH] Added search feature :tada: --- redis_app/templates/courses.html | 1 + redis_app/templates/create.html | 1 + redis_app/templates/details.html | 4 ++ redis_app/templates/home.html | 1 + redis_app/templates/login.html | 1 + redis_app/templates/profile.html | 1 + redis_app/templates/register.html | 1 + redis_app/templates/search.html | 32 ++++++++++++++++ redis_app/templates/update.html | 1 + redis_app/urls.py | 2 + redis_app/views.py | 64 +++++++++++++++++++++++++++---- 11 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 redis_app/templates/search.html diff --git a/redis_app/templates/courses.html b/redis_app/templates/courses.html index d6aacad..60f251b 100644 --- a/redis_app/templates/courses.html +++ b/redis_app/templates/courses.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %}

Courses for {{ person.name }}

diff --git a/redis_app/templates/create.html b/redis_app/templates/create.html index cce26d8..a2a9d58 100644 --- a/redis_app/templates/create.html +++ b/redis_app/templates/create.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %}
diff --git a/redis_app/templates/details.html b/redis_app/templates/details.html index 8dd870d..763c774 100644 --- a/redis_app/templates/details.html +++ b/redis_app/templates/details.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %} {% if error_message %} @@ -27,6 +28,9 @@

There's only {{ course.places }} places

+

+ The course has been created by {{ course.teacher_name }} +

{% else %}

No course found!

{% endif %} diff --git a/redis_app/templates/home.html b/redis_app/templates/home.html index 6a70f27..ad4f125 100644 --- a/redis_app/templates/home.html +++ b/redis_app/templates/home.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %} {% if person != '' %} diff --git a/redis_app/templates/login.html b/redis_app/templates/login.html index 9ca8983..e0c3fb0 100644 --- a/redis_app/templates/login.html +++ b/redis_app/templates/login.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %} diff --git a/redis_app/templates/profile.html b/redis_app/templates/profile.html index 6919847..8a753ae 100644 --- a/redis_app/templates/profile.html +++ b/redis_app/templates/profile.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %} diff --git a/redis_app/templates/register.html b/redis_app/templates/register.html index c254296..baf5b65 100644 --- a/redis_app/templates/register.html +++ b/redis_app/templates/register.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %} diff --git a/redis_app/templates/search.html b/redis_app/templates/search.html new file mode 100644 index 0000000..d97e08a --- /dev/null +++ b/redis_app/templates/search.html @@ -0,0 +1,32 @@ + + + + + {% csrf_token %} +
+

Search

+ {% if error_message %}

{{ error_message }}

{% endif %} +
+
+
+ +
+ {% if courses %} + {% for course in courses %} + {{ course.title }} + {% endfor %} + {% else %} +

No course found

+ {% endif %} + + \ No newline at end of file diff --git a/redis_app/templates/update.html b/redis_app/templates/update.html index a02d6e9..82dc965 100644 --- a/redis_app/templates/update.html +++ b/redis_app/templates/update.html @@ -8,6 +8,7 @@ {% else %} Courses Profile + Search {% endif %}
diff --git a/redis_app/urls.py b/redis_app/urls.py index 125b41a..18d682e 100644 --- a/redis_app/urls.py +++ b/redis_app/urls.py @@ -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/', views.update_course_view, name='update_course'), path('update_course_form/', views.update_course_form, name='update_course_form'), path('delete/', views.delete_course_view, name='delete_course'), diff --git a/redis_app/views.py b/redis_app/views.py index 0c1312e..d1cd26a 100644 --- a/redis_app/views.py +++ b/redis_app/views.py @@ -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 \ No newline at end of file