Added register/unregister to a course feature 🎉

master
Corentin LEMAIRE 6 months ago
parent d6321f5718
commit ebf618d0cc

@ -9,6 +9,7 @@
<a href="{% url 'courses' %}">Courses</a> <a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a> <a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a> <a href="{% url 'search' %}">Search</a>
<a href="{% url 'logout' %}">Logout</a>
{% endif %} {% endif %}
</nav> </nav>
<h1>Courses for {{ person.name }}</h1> <h1>Courses for {{ person.name }}</h1>
@ -19,11 +20,22 @@
{% else %} {% else %}
<p>No course yet</p> <p>No course yet</p>
{% endif %} {% endif %}
<p>
Register to a course by <a href="{% url 'search' %}">Searching</a>
</p>
<br/> <br/>
{% if person %} {% if person %}
{% if person.role == "Teacher" %} {% if person.role == "Teacher" %}
<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>

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

@ -9,6 +9,7 @@
<a href="{% url 'courses' %}">Courses</a> <a href="{% url 'courses' %}">Courses</a>
<a href="{% url 'profile' %}">Profile</a> <a href="{% url 'profile' %}">Profile</a>
<a href="{% url 'search' %}">Search</a> <a href="{% url 'search' %}">Search</a>
<a href="{% url 'logout' %}">Logout</a>
{% endif %} {% endif %}
</nav> </nav>
{% if error_message %} {% if error_message %}
@ -38,6 +39,12 @@
{% if person.role == "Teacher" %} {% if person.role == "Teacher" %}
<a href="{% url 'delete_course' course.id %}">Delete</a> <a href="{% url 'delete_course' course.id %}">Delete</a>
<a href="{% url 'update_course' course.id %}">Update</a> <a href="{% url 'update_course' course.id %}">Update</a>
{% else %}
{% if register %}
<a href="{% url 'course_unregister' course.id %}">Unregister</a>
{% else %}
<a href="{% url 'course_register' course.id %}">Register</a>
{% endif %}
{% endif %} {% endif %}
{% endif %} {% endif %}
</body> </body>

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

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

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

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

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

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

@ -15,6 +15,8 @@ urlpatterns = [
path('create_course_form', views.create_course_form, name='create_course_form'), path('create_course_form', views.create_course_form, name='create_course_form'),
path('search', views.search_view, name='search'), path('search', views.search_view, name='search'),
path('search_form', views.search_form, name='search_form'), path('search_form', views.search_form, name='search_form'),
path('course_register/<str:course_id>', views.course_register_view, name='course_register'),
path('course_unregister/<str:course_id>', views.course_unregister_view, name='course_unregister'),
path('update_course/<str:course_id>', views.update_course_view, name='update_course'), 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('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'), path('delete/<str:course_id>', views.delete_course_view, name='delete_course'),

@ -16,7 +16,12 @@ redis_connection = redis.Redis(host='localhost', port=6379, decode_responses=Tru
pub_sub = redis_connection.pubsub() pub_sub = redis_connection.pubsub()
create_index(redis_connection=redis_connection) create_index(redis_connection=redis_connection)
def isExpired(course_id):
global redis_connection
ttl = redis_connection.ttl(f"course:{course_id}")
if ttl == -2 or ttl == 0: # If -1, the key has no expiration
return True
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}"
@ -45,11 +50,39 @@ def home(request):
cancel = True cancel = True
return render(request, 'home.html', {'person': personLoggedIn}) return render(request, 'home.html', {'person': personLoggedIn})
def isPersonRegisteredToCourse(course):
global personLoggedIn
global redis_connection
if not personLoggedIn:
return False
person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]).split(":")[1]
if not person_id:
return False
course_id = getCourseId(course)
if not course_id:
return False
course_keys = redis_connection.keys(f"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(","):
current_course_id = getCourseId2(course_data['title'], course_data['teacher'])
if current_course_id == False:
continue
if course_id == current_course_id:
return True
return False
def details(request, course_id): def details(request, course_id):
global redis_connection global redis_connection
global cancel global cancel
global personLoggedIn global personLoggedIn
cancel = True cancel = True
if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!")
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
if not course: if not course:
raise Http404("Course does not exist") raise Http404("Course does not exist")
@ -58,7 +91,8 @@ def details(request, course_id):
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.get('name')
return render(request, 'details.html', {'course': course, 'person': personLoggedIn}) register = isPersonRegisteredToCourse(course)
return render(request, 'details.html', {'course': course, 'person': personLoggedIn, 'register': register})
# Handle error messages. # Handle error messages.
def register(request): def register(request):
@ -130,6 +164,7 @@ 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":
@ -138,7 +173,10 @@ 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]
courses.append(course_data) if isExpired(course_data['id']):
expired_courses.append(course_data)
else:
courses.append(course_data)
else: else:
teacher_id = course_data["teacher"] teacher_id = course_data["teacher"]
if teacher_id == person_id: if teacher_id == person_id:
@ -146,8 +184,11 @@ 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]
courses.append(course_data) if isExpired(course_data['id']):
return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses}) expired_courses.append(course_data)
else:
courses.append(course_data)
return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses, 'expired_courses': expired_courses})
def change_profile(request): def change_profile(request):
global personLoggedIn global personLoggedIn
@ -194,6 +235,8 @@ 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) res = delete_course(course_id)
if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!")
if not res: if not res:
return courses(request) return courses(request)
return courses(request) return courses(request)
@ -225,6 +268,8 @@ def create_course_view(request):
def update_course_view(request, course_id): def update_course_view(request, course_id):
global personLoggedIn global personLoggedIn
if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!")
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
if not course: if not course:
raise Http404("Course does not exist") raise Http404("Course does not exist")
@ -257,6 +302,8 @@ def update_course_form(request, course_id):
global redis_connection global redis_connection
global cancel global cancel
cancel = True cancel = True
if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!")
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':
@ -270,6 +317,7 @@ def update_course_form(request, course_id):
return render(request, 'update.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"}) return render(request, 'update.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"})
# Test if places are not limited
def course_register(course_id, person_id): def course_register(course_id, person_id):
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
person = redis_connection.hgetall(f"person:{person_id}") person = redis_connection.hgetall(f"person:{person_id}")
@ -280,7 +328,7 @@ def course_register(course_id, person_id):
if person_id in students.split(','): if person_id in students.split(','):
return True return True
if students: if not students:
new_students = person_id new_students = person_id
else: else:
new_students = students + "," + person_id new_students = students + "," + person_id
@ -307,6 +355,48 @@ def course_unregister(course_id, person_id):
redis_connection.hset(f"course:{course_id}", "students", new_students) redis_connection.hset(f"course:{course_id}", "students", new_students)
return True return True
def course_register_view(request, course_id):
global personLoggedIn
global redis_connection
if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!")
person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]).split(":")[1]
if not person_id:
raise Http404("Person not found")
course = redis_connection.hgetall(f"course:{course_id}")
if not course:
raise Http404("Course not found")
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')
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."})
def course_unregister_view(request, course_id):
global personLoggedIn
global redis_connection
if personLoggedIn == "":
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"})
if isExpired(course_id):
raise Http404("Course has expired... Get faster next time!")
person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]).split(":")[1]
if not person_id:
raise Http404("Person not found")
course = redis_connection.hgetall(f"course:{course_id}")
if not course:
raise Http404("Course not found")
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')
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."})
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}")
if not course: if not course:

Loading…
Cancel
Save