diff --git a/README.md b/README.md index 594c22b..9681762 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,4 @@ Don't try to go into http://localhost:8000/admin, you won't have the rights and - Publish a message -- Register to a course - -- Unregister to a course - - Subscribe to course channel \ No newline at end of file diff --git a/redis_app/templates/courses.html b/redis_app/templates/courses.html index 902e6a7..634fae2 100644 --- a/redis_app/templates/courses.html +++ b/redis_app/templates/courses.html @@ -29,13 +29,5 @@ Create {% endif %} {% endif %} -

Expired courses

- {% if courses %} - {% for course in expired_courses %} - {{ course.title }} - {% endfor %} - {% else %} -

No course yet

- {% endif %} \ No newline at end of file diff --git a/redis_app/templates/details.html b/redis_app/templates/details.html index 97eb0f6..bb0a085 100644 --- a/redis_app/templates/details.html +++ b/redis_app/templates/details.html @@ -43,7 +43,11 @@ {% if register %} Unregister {% else %} - Register + {% if full == False %} + Register + {% else %} +

The course if full.

+ {% endif %} {% endif %} {% endif %} {% endif %} diff --git a/redis_app/views.py b/redis_app/views.py index 3e67c82..4ff61c0 100644 --- a/redis_app/views.py +++ b/redis_app/views.py @@ -23,6 +23,19 @@ def isExpired(course_id): return True return False +def isCourseFull(course): + students = course.get('students', '') # Because it crashes with ['students'], we have to put a default value: '' here + if not students: + return False + + try: + places = int(course['places']) + if len(students.split(',')) >= places: + return True + return False + except: + return False + def getPersonId(person_name, person_role): query = f"@name:{person_name} @role:{person_role}" results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) @@ -40,7 +53,7 @@ def getCourseId2(course_title, course_teacher): return False def getCourseId(course): - return getCourseId2(course.get("title"), course.get("teacher")) + return getCourseId2(course['title'], course['teacher']) @@ -68,7 +81,7 @@ def isPersonRegisteredToCourse(course): for key in course_keys: course_data = redis_connection.hgetall(key) if personLoggedIn['role'] == "Student": - if person_id in course_data.get("students", "").split(","): + if person_id in course_data.get('students', '').split(","): current_course_id = getCourseId2(course_data['title'], course_data['teacher']) if current_course_id == False: continue @@ -76,7 +89,7 @@ def isPersonRegisteredToCourse(course): return True return False -def details(request, course_id): +def details(request, course_id, error_message=''): global redis_connection global cancel global personLoggedIn @@ -90,19 +103,19 @@ def details(request, 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') + course['teacher_name'] = teacher['name'] register = isPersonRegisteredToCourse(course) - return render(request, 'details.html', {'course': course, 'person': personLoggedIn, 'register': register}) + full = isCourseFull(course) + return render(request, 'details.html', {'course': course, 'person': personLoggedIn, 'register': register, 'full': full, 'error_message': error_message}) -# Handle error messages. def register(request): global personLoggedIn global redis_connection global cancel cancel = True if request.method == 'POST': - person_name = request.POST.get('name') - person_role = request.POST.get('role') + person_name = request.POST['name'] + person_role = request.POST['role'] query = f"@name:{person_name} @role:{person_role}" results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) # First element = number of results @@ -124,8 +137,8 @@ def login(request): global cancel cancel = True if request.method == 'POST': - person_name = request.POST.get('name') - person_role = request.POST.get('role') + person_name = request.POST['name'] + person_role = request.POST['role'] query = f"@name:{person_name} @role:{person_role}" results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) @@ -164,19 +177,15 @@ def courses(request): course_keys = redis_connection.keys(f"course:*") courses = [] - expired_courses = [] for key in course_keys: course_data = redis_connection.hgetall(key) if personLoggedIn['role'] == "Student": - if person_id in course_data.get("students", "").split(","): + if person_id in course_data.get('students', '').split(","): course_id = getCourseId2(course_data['title'], course_data['teacher']) if course_id == False: continue course_data['id'] = course_id.split(":")[1] - if isExpired(course_data['id']): - expired_courses.append(course_data) - else: - courses.append(course_data) + courses.append(course_data) else: teacher_id = course_data["teacher"] if teacher_id == person_id: @@ -184,11 +193,8 @@ def courses(request): if course_id == False: continue course_data['id'] = course_id.split(":")[1] - if isExpired(course_data['id']): - expired_courses.append(course_data) - else: - courses.append(course_data) - return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses, 'expired_courses': expired_courses}) + courses.append(course_data) + return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses}) def change_profile(request): global personLoggedIn @@ -198,8 +204,8 @@ def change_profile(request): return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) if request.method == 'POST': - person_name = request.POST.get('name') - person_role = request.POST.get('role') + person_name = request.POST['name'] + person_role = request.POST['role'] person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]) if not person_id: @@ -234,9 +240,9 @@ def delete_course(course_id): def delete_course_view(request, course_id): global personLoggedIn - res = delete_course(course_id) if isExpired(course_id): raise Http404("Course has expired... Get faster next time!") + res = delete_course(course_id) if not res: return courses(request) return courses(request) @@ -287,11 +293,11 @@ def create_course_form(request): if personLoggedIn == '': return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) if request.method == 'POST': - course_title = request.POST.get('title') - course_summary = request.POST.get('summary') - course_level = request.POST.get('level') - course_places = request.POST.get('places') - course_teacher = getPersonId(personLoggedIn.get('name'), personLoggedIn.get('role')).split(":")[1] + course_title = request.POST['title'] + course_summary = request.POST['summary'] + course_level = request.POST['level'] + course_places = request.POST['places'] + course_teacher = getPersonId(personLoggedIn['name'], personLoggedIn['role']).split(":")[1] create_course(course_title, course_summary, course_level, course_places, course_teacher) return courses(request) @@ -307,11 +313,11 @@ def update_course_form(request, course_id): if personLoggedIn == '': return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) if request.method == 'POST': - course_title = request.POST.get('title') - course_summary = request.POST.get('summary') - course_level = request.POST.get('level') - course_places = request.POST.get('places') - course_teacher = getPersonId(personLoggedIn.get('name'), personLoggedIn.get('role')).split(":")[1] + course_title = request.POST['title'] + course_summary = request.POST['summary'] + course_level = request.POST['level'] + course_places = request.POST['places'] + course_teacher = getPersonId(personLoggedIn['name'], personLoggedIn['role']).split(":")[1] update_course(course_id, course_title, course_summary, course_level, course_places, course_teacher) return courses(request) @@ -328,6 +334,15 @@ def course_register(course_id, person_id): if person_id in students.split(','): return True + try: + places = int(course['places']) + if students != '': + students_nb = len(students.split(',')) + if students_nb and students_nb >= places: + return False + except: + return False + if not students: new_students = person_id else: @@ -370,10 +385,10 @@ def course_register_view(request, 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') + course['teacher_name'] = teacher['name'] if course_register(course_id, person_id): - return render(request, 'details.html', {'person': personLoggedIn, 'course': course, 'register': True}) - return render(request, 'details.html', {'person': personLoggedIn, 'course': course, 'register': False, "error_message": "Could not register to the course. Try again later."}) + return details(request, course_id) + return details(request, course_id, "Could not register to the course. Try again later.") def course_unregister_view(request, course_id): global personLoggedIn @@ -392,10 +407,10 @@ def course_unregister_view(request, 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') + course['teacher_name'] = teacher['name'] if course_unregister(course_id, person_id): - return render(request, 'details.html', {'person': personLoggedIn, 'course': course, 'register': False}) - return render(request, 'details.html', {'person': personLoggedIn, 'course': course, 'register': False, "error_message": "Could not unregister from the course. Try again later."}) + return details(request, course_id) + return details(request, course_id, "Could not unregister to the course. Try again later.") def refresh_expire(course_id): course = redis_connection.hgetall(f"course:{course_id}") @@ -459,7 +474,7 @@ def search_form(request): global cancel cancel = True if request.method == 'POST': - keywords = request.POST.get('keywords') + keywords = request.POST['keywords'] courses = [] courses_id = search(keywords) for course_id in courses_id: