Refactor, fixes and can't register to a course if full

master
Corentin LEMAIRE 6 months ago
parent ebf618d0cc
commit bb1b1ff9fc

@ -46,8 +46,4 @@ Don't try to go into http://localhost:8000/admin, you won't have the rights and
- Publish a message - Publish a message
- Register to a course
- Unregister to a course
- Subscribe to course channel - Subscribe to course channel

@ -29,13 +29,5 @@
<a href="{% url 'create_course' %}">Create</a> <a href="{% url 'create_course' %}">Create</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
<h1>Expired courses</h1>
{% if courses %}
{% for course in expired_courses %}
{{ course.title }}
{% endfor %}
{% else %}
<p>No course yet</p>
{% endif %}
</body> </body>
</html> </html>

@ -43,7 +43,11 @@
{% if register %} {% if register %}
<a href="{% url 'course_unregister' course.id %}">Unregister</a> <a href="{% url 'course_unregister' course.id %}">Unregister</a>
{% else %} {% else %}
{% if full == False %}
<a href="{% url 'course_register' course.id %}">Register</a> <a href="{% url 'course_register' course.id %}">Register</a>
{% else %}
<p>The course if full.</p>
{% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}

@ -23,6 +23,19 @@ def isExpired(course_id):
return True return True
return False 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): def getPersonId(person_name, person_role):
query = f"@name:{person_name} @role:{person_role}" query = f"@name:{person_name} @role:{person_role}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query)
@ -40,7 +53,7 @@ def getCourseId2(course_title, course_teacher):
return False return False
def getCourseId(course): 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: for key in course_keys:
course_data = redis_connection.hgetall(key) course_data = redis_connection.hgetall(key)
if personLoggedIn['role'] == "Student": 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']) current_course_id = getCourseId2(course_data['title'], course_data['teacher'])
if current_course_id == False: if current_course_id == False:
continue continue
@ -76,7 +89,7 @@ def isPersonRegisteredToCourse(course):
return True return True
return False return False
def details(request, course_id): def details(request, course_id, error_message=''):
global redis_connection global redis_connection
global cancel global cancel
global personLoggedIn global personLoggedIn
@ -90,19 +103,19 @@ def details(request, course_id):
teacher = redis_connection.hgetall(f"person:{course['teacher']}") teacher = redis_connection.hgetall(f"person:{course['teacher']}")
if not teacher: if not teacher:
raise Http404("Teacher does not exist") raise Http404("Teacher does not exist")
course['teacher_name'] = teacher.get('name') course['teacher_name'] = teacher['name']
register = isPersonRegisteredToCourse(course) 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): def register(request):
global personLoggedIn global personLoggedIn
global redis_connection global redis_connection
global cancel global cancel
cancel = True cancel = True
if request.method == 'POST': if request.method == 'POST':
person_name = request.POST.get('name') person_name = request.POST['name']
person_role = request.POST.get('role') person_role = request.POST['role']
query = f"@name:{person_name} @role:{person_role}" query = f"@name:{person_name} @role:{person_role}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query)
# First element = number of results # First element = number of results
@ -124,8 +137,8 @@ def login(request):
global cancel global cancel
cancel = True cancel = True
if request.method == 'POST': if request.method == 'POST':
person_name = request.POST.get('name') person_name = request.POST['name']
person_role = request.POST.get('role') person_role = request.POST['role']
query = f"@name:{person_name} @role:{person_role}" query = f"@name:{person_name} @role:{person_role}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query)
@ -164,18 +177,14 @@ def courses(request):
course_keys = redis_connection.keys(f"course:*") course_keys = redis_connection.keys(f"course:*")
courses = [] courses = []
expired_courses = []
for key in course_keys: for key in course_keys:
course_data = redis_connection.hgetall(key) course_data = redis_connection.hgetall(key)
if personLoggedIn['role'] == "Student": 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']) course_id = getCourseId2(course_data['title'], course_data['teacher'])
if course_id == False: if course_id == False:
continue continue
course_data['id'] = course_id.split(":")[1] 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: else:
teacher_id = course_data["teacher"] teacher_id = course_data["teacher"]
@ -184,11 +193,8 @@ def courses(request):
if course_id == False: if course_id == False:
continue continue
course_data['id'] = course_id.split(":")[1] 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)
return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses, 'expired_courses': expired_courses}) return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses})
def change_profile(request): def change_profile(request):
global personLoggedIn global personLoggedIn
@ -198,8 +204,8 @@ def change_profile(request):
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"})
if request.method == 'POST': if request.method == 'POST':
person_name = request.POST.get('name') person_name = request.POST['name']
person_role = request.POST.get('role') person_role = request.POST['role']
person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]) person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"])
if not person_id: if not person_id:
@ -234,9 +240,9 @@ def delete_course(course_id):
def delete_course_view(request, course_id): def delete_course_view(request, course_id):
global personLoggedIn global personLoggedIn
res = delete_course(course_id)
if isExpired(course_id): if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!") raise Http404("Course has expired... Get faster next time!")
res = delete_course(course_id)
if not res: if not res:
return courses(request) return courses(request)
return courses(request) return courses(request)
@ -287,11 +293,11 @@ def create_course_form(request):
if personLoggedIn == '': if personLoggedIn == '':
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"})
if request.method == 'POST': if request.method == 'POST':
course_title = request.POST.get('title') course_title = request.POST['title']
course_summary = request.POST.get('summary') course_summary = request.POST['summary']
course_level = request.POST.get('level') course_level = request.POST['level']
course_places = request.POST.get('places') course_places = request.POST['places']
course_teacher = getPersonId(personLoggedIn.get('name'), personLoggedIn.get('role')).split(":")[1] course_teacher = getPersonId(personLoggedIn['name'], personLoggedIn['role']).split(":")[1]
create_course(course_title, course_summary, course_level, course_places, course_teacher) create_course(course_title, course_summary, course_level, course_places, course_teacher)
return courses(request) return courses(request)
@ -307,11 +313,11 @@ def update_course_form(request, course_id):
if personLoggedIn == '': if personLoggedIn == '':
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"})
if request.method == 'POST': if request.method == 'POST':
course_title = request.POST.get('title') course_title = request.POST['title']
course_summary = request.POST.get('summary') course_summary = request.POST['summary']
course_level = request.POST.get('level') course_level = request.POST['level']
course_places = request.POST.get('places') course_places = request.POST['places']
course_teacher = getPersonId(personLoggedIn.get('name'), personLoggedIn.get('role')).split(":")[1] course_teacher = getPersonId(personLoggedIn['name'], personLoggedIn['role']).split(":")[1]
update_course(course_id, course_title, course_summary, course_level, course_places, course_teacher) update_course(course_id, course_title, course_summary, course_level, course_places, course_teacher)
return courses(request) return courses(request)
@ -328,6 +334,15 @@ def course_register(course_id, person_id):
if person_id in students.split(','): if person_id in students.split(','):
return True 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: if not students:
new_students = person_id new_students = person_id
else: else:
@ -370,10 +385,10 @@ def course_register_view(request, course_id):
teacher = redis_connection.hgetall(f"person:{course['teacher']}") teacher = redis_connection.hgetall(f"person:{course['teacher']}")
if not teacher: if not teacher:
raise Http404("Teacher does not exist") raise Http404("Teacher does not exist")
course['teacher_name'] = teacher.get('name') course['teacher_name'] = teacher['name']
if course_register(course_id, person_id): if course_register(course_id, person_id):
return render(request, 'details.html', {'person': personLoggedIn, 'course': course, 'register': True}) return details(request, course_id)
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, "Could not register to the course. Try again later.")
def course_unregister_view(request, course_id): def course_unregister_view(request, course_id):
global personLoggedIn global personLoggedIn
@ -392,10 +407,10 @@ def course_unregister_view(request, course_id):
teacher = redis_connection.hgetall(f"person:{course['teacher']}") teacher = redis_connection.hgetall(f"person:{course['teacher']}")
if not teacher: if not teacher:
raise Http404("Teacher does not exist") raise Http404("Teacher does not exist")
course['teacher_name'] = teacher.get('name') course['teacher_name'] = teacher['name']
if course_unregister(course_id, person_id): if course_unregister(course_id, person_id):
return render(request, 'details.html', {'person': personLoggedIn, 'course': course, 'register': False}) return details(request, course_id)
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, "Could not unregister to the course. Try again later.")
def refresh_expire(course_id): def refresh_expire(course_id):
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
@ -459,7 +474,7 @@ def search_form(request):
global cancel global cancel
cancel = True cancel = True
if request.method == 'POST': if request.method == 'POST':
keywords = request.POST.get('keywords') keywords = request.POST['keywords']
courses = [] courses = []
courses_id = search(keywords) courses_id = search(keywords)
for course_id in courses_id: for course_id in courses_id:

Loading…
Cancel
Save