@ -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 :