diff --git a/redis_app/templates/courses.html b/redis_app/templates/courses.html index 60f251b..902e6a7 100644 --- a/redis_app/templates/courses.html +++ b/redis_app/templates/courses.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %}

Courses for {{ person.name }}

@@ -19,11 +20,22 @@ {% else %}

No course yet

{% endif %} +

+ Register to a course by Searching +


{% if person %} {% if person.role == "Teacher" %} 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/create.html b/redis_app/templates/create.html index a2a9d58..5a31de5 100644 --- a/redis_app/templates/create.html +++ b/redis_app/templates/create.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %}
diff --git a/redis_app/templates/details.html b/redis_app/templates/details.html index 763c774..97eb0f6 100644 --- a/redis_app/templates/details.html +++ b/redis_app/templates/details.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} {% if error_message %} @@ -38,6 +39,12 @@ {% if person.role == "Teacher" %} Delete Update + {% else %} + {% if register %} + Unregister + {% else %} + Register + {% endif %} {% endif %} {% endif %} diff --git a/redis_app/templates/home.html b/redis_app/templates/home.html index ad4f125..de77586 100644 --- a/redis_app/templates/home.html +++ b/redis_app/templates/home.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} {% if person != '' %} diff --git a/redis_app/templates/login.html b/redis_app/templates/login.html index e0c3fb0..79e7c3c 100644 --- a/redis_app/templates/login.html +++ b/redis_app/templates/login.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} diff --git a/redis_app/templates/profile.html b/redis_app/templates/profile.html index 8a753ae..8337239 100644 --- a/redis_app/templates/profile.html +++ b/redis_app/templates/profile.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} diff --git a/redis_app/templates/register.html b/redis_app/templates/register.html index baf5b65..40664b2 100644 --- a/redis_app/templates/register.html +++ b/redis_app/templates/register.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} diff --git a/redis_app/templates/search.html b/redis_app/templates/search.html index d97e08a..126233c 100644 --- a/redis_app/templates/search.html +++ b/redis_app/templates/search.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} diff --git a/redis_app/templates/update.html b/redis_app/templates/update.html index 82dc965..72c6e1c 100644 --- a/redis_app/templates/update.html +++ b/redis_app/templates/update.html @@ -9,6 +9,7 @@ Courses Profile Search + Logout {% endif %} diff --git a/redis_app/urls.py b/redis_app/urls.py index 18d682e..4ac9392 100644 --- a/redis_app/urls.py +++ b/redis_app/urls.py @@ -15,6 +15,8 @@ urlpatterns = [ 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('course_register/', views.course_register_view, name='course_register'), + path('course_unregister/', views.course_unregister_view, name='course_unregister'), 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 d1cd26a..3e67c82 100644 --- a/redis_app/views.py +++ b/redis_app/views.py @@ -16,7 +16,12 @@ redis_connection = redis.Redis(host='localhost', port=6379, decode_responses=Tru pub_sub = redis_connection.pubsub() 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): query = f"@name:{person_name} @role:{person_role}" @@ -45,11 +50,39 @@ def home(request): cancel = True 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): global redis_connection global cancel global personLoggedIn cancel = True + if isExpired(course_id): + raise Http404("Course has expired... Get faster next time!") course = redis_connection.hgetall(f"course:{course_id}") if not course: raise Http404("Course does not exist") @@ -58,7 +91,8 @@ def details(request, course_id): if not teacher: raise Http404("Teacher does not exist") 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. def register(request): @@ -130,6 +164,7 @@ 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": @@ -138,7 +173,10 @@ def courses(request): if course_id == False: continue 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: teacher_id = course_data["teacher"] if teacher_id == person_id: @@ -146,8 +184,11 @@ def courses(request): if course_id == False: continue course_data['id'] = course_id.split(":")[1] - courses.append(course_data) - return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses}) + 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}) def change_profile(request): global personLoggedIn @@ -194,6 +235,8 @@ 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!") if not res: return courses(request) return courses(request) @@ -225,6 +268,8 @@ def create_course_view(request): def update_course_view(request, course_id): global personLoggedIn + if isExpired(course_id): + raise Http404("Course has expired... Get faster next time!") course = redis_connection.hgetall(f"course:{course_id}") if not course: raise Http404("Course does not exist") @@ -257,6 +302,8 @@ def update_course_form(request, course_id): global redis_connection global cancel cancel = True + if isExpired(course_id): + raise Http404("Course has expired... Get faster next time!") if personLoggedIn == '': return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) 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!"}) +# Test if places are not limited def course_register(course_id, person_id): course = redis_connection.hgetall(f"course:{course_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(','): return True - if students: + if not students: new_students = person_id else: 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) 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): course = redis_connection.hgetall(f"course:{course_id}") if not course: