@ -8,14 +8,36 @@ from .models import Person
DEFAULT_EXPIRE_TIME = 120
EXPIRE_REFRESH_TIME = 60
COURSE_CHANNEL = " course "
cancel = True
personLoggedIn = " "
messages = [ ] # All messages obtained with pub/sub. Will refresh the view every time a message is received
redis_connection = redis . Redis ( host = ' localhost ' , port = 6379 , decode_responses = True )
pub_sub = redis_connection . pubsub ( )
create_index ( redis_connection = redis_connection )
def getCoursesFromPerson ( person_id ) :
global redis_connection
course_keys = redis_connection . keys ( f " course:* " )
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 ( " , " ) :
course_id = getCourseId2 ( course_data [ ' title ' ] , course_data [ ' teacher ' ] )
if course_id == False :
continue
course_data [ ' id ' ] = course_id . split ( " : " ) [ 1 ]
courses . append ( course_data )
else :
teacher_id = course_data [ " teacher " ]
if teacher_id == person_id :
course_id = getCourseId2 ( course_data [ ' title ' ] , course_data [ ' teacher ' ] )
if course_id == False :
continue
course_data [ ' id ' ] = course_id . split ( " : " ) [ 1 ]
courses . append ( course_data )
return courses
def isExpired ( course_id ) :
global redis_connection
ttl = redis_connection . ttl ( f " course: { course_id } " )
@ -58,9 +80,7 @@ def getCourseId(course):
def home ( request ) :
global cancel
global personLoggedIn
cancel = True
return render ( request , ' home.html ' , { ' person ' : personLoggedIn } )
def isPersonRegisteredToCourse ( course ) :
@ -91,9 +111,7 @@ def isPersonRegisteredToCourse(course):
def details ( request , course_id , error_message = ' ' ) :
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 } " )
@ -111,8 +129,6 @@ def details(request, course_id, error_message=''):
def register ( request ) :
global personLoggedIn
global redis_connection
global cancel
cancel = True
if request . method == ' POST ' :
person_name = request . POST [ ' name ' ]
person_role = request . POST [ ' role ' ]
@ -134,8 +150,6 @@ def register(request):
def login ( request ) :
global personLoggedIn
global redis_connection
global cancel
cancel = True
if request . method == ' POST ' :
person_name = request . POST [ ' name ' ]
person_role = request . POST [ ' role ' ]
@ -151,55 +165,27 @@ def login(request):
return login_form ( request )
def register_form ( request ) :
global cancel
cancel = True
return render ( request , ' register.html ' , { ' person ' : Person ( name = " " , role = " " ) } )
def login_form ( request ) :
global cancel
cancel = True
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) } )
def logout ( request ) :
global personLoggedIn
global cancel
cancel = True
personLoggedIn = " "
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) } )
def courses ( request ) :
global personLoggedIn
global cancel
cancel = True
if personLoggedIn == " " :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
person_id = getPersonId ( personLoggedIn [ " name " ] , personLoggedIn [ " role " ] ) . split ( " : " ) [ 1 ]
course_keys = redis_connection . keys ( f " course:* " )
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 ( " , " ) :
course_id = getCourseId2 ( course_data [ ' title ' ] , course_data [ ' teacher ' ] )
if course_id == False :
continue
course_data [ ' id ' ] = course_id . split ( " : " ) [ 1 ]
courses . append ( course_data )
else :
teacher_id = course_data [ " teacher " ]
if teacher_id == person_id :
course_id = getCourseId2 ( course_data [ ' title ' ] , course_data [ ' teacher ' ] )
if course_id == False :
continue
course_data [ ' id ' ] = course_id . split ( " : " ) [ 1 ]
courses . append ( course_data )
courses = getCoursesFromPerson ( person_id )
return render ( request , ' courses.html ' , { ' person ' : personLoggedIn , ' courses ' : courses } )
def change_profile ( request ) :
global personLoggedIn
global cancel
cancel = True
if personLoggedIn == ' ' :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
@ -220,8 +206,6 @@ def change_profile(request):
def profile ( request ) :
global personLoggedIn
global cancel
cancel = True
if personLoggedIn == ' ' :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
return render ( request , ' profile.html ' , { ' person ' : personLoggedIn } )
@ -267,6 +251,34 @@ def update_course(course_id, course_title, course_summary, course_level, course_
" teacher " : course_teacher
} )
redis_connection . expire ( f " course: { course_id } " , DEFAULT_EXPIRE_TIME )
publish ( course_id , f " UPDATE: Course: { course_id } is now: Title: { course_title } , Summary: { course_summary } , Level: { course_level } , Places: { course_places } , Teacher: { course_teacher } " )
def publish_message ( request ) :
global personLoggedIn
courses_fetched = getCoursesFromPerson ( getPersonId ( personLoggedIn [ ' name ' ] , personLoggedIn [ ' role ' ] ) . split ( " : " ) [ 1 ] )
for course in courses_fetched :
course [ ' id ' ] = getCourseId ( course ) . split ( ' : ' ) [ 1 ]
if not courses_fetched :
return courses ( request )
return render ( request , ' publish_message.html ' , { ' person ' : personLoggedIn , ' courses ' : courses_fetched } )
def publish_message_form ( request ) :
global personLoggedIn
global redis_connection
if personLoggedIn == ' ' :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
if personLoggedIn [ ' role ' ] == ' Student ' :
return render ( request , ' publish_message.html ' , { ' person ' : personLoggedIn , " error_message " : " The form has been wrongly filled! " } )
if request . method == ' POST ' :
course_id = request . POST [ ' course_id ' ]
message = request . POST [ ' message ' ]
course = redis_connection . hgetall ( f ' course: { course_id } ' )
if not course :
raise Http404 ( " Course not found " )
publish ( course_id , message )
return publish_message ( request )
return render ( request , ' publish_message.html ' , { ' person ' : personLoggedIn , " error_message " : " The form has been wrongly filled! " } )
def create_course_view ( request ) :
global personLoggedIn
@ -288,8 +300,6 @@ def update_course_view(request, course_id):
def create_course_form ( request ) :
global personLoggedIn
global redis_connection
global cancel
cancel = True
if personLoggedIn == ' ' :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
if request . method == ' POST ' :
@ -306,8 +316,6 @@ def create_course_form(request):
def update_course_form ( request , course_id ) :
global personLoggedIn
global redis_connection
global cancel
cancel = True
if isExpired ( course_id ) :
raise Http404 ( " Course has expired... Get faster next time! " )
if personLoggedIn == ' ' :
@ -422,18 +430,15 @@ def refresh_expire(course_id):
redis_connection . expire ( f " course: { course_id } " , ttl + EXPIRE_REFRESH_TIME )
return True
def publish ( course ) :
pub_sub . publish ( COURSE_CHANNEL + " : " + getCourseId ( course ) , str ( course ) )
def publish ( course_id , message ) :
global redis_connection
redis_connection . publish ( course_id , message )
# Courses is a list of course e id to subscribe to
# Courses is a list of course id to subscribe to
def subscribe ( courses_id ) :
global cancel
cancel = False
pub_sub . psubscribe ( * courses_id )
for message in pub_sub . listen ( ) :
if cancel :
break
if message [ " type " ] != ' pmessage ' :
continue
send_new_course_notification ( message )
@ -471,8 +476,6 @@ def search_view(request):
def search_form ( request ) :
global personLoggedIn
global redis_connection
global cancel
cancel = True
if request . method == ' POST ' :
keywords = request . POST [ ' keywords ' ]
courses = [ ]
@ -487,4 +490,31 @@ def search_form(request):
return render ( request , ' search.html ' , { ' person ' : personLoggedIn , " error_message " : " The form has been wrongly filled! " } )
def notifications_view ( request ) :
global personLoggedIn
global messages
return render ( request , ' notifications.html ' , { ' person ' : personLoggedIn , ' messages ' : messages } )
def notifications ( request ) :
global personLoggedIn
global messages
if personLoggedIn == " " :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
pub_sub . punsubscribe ( )
courses_id = [ course [ ' id ' ] for course in getCoursesFromPerson ( getPersonId ( personLoggedIn [ ' name ' ] , personLoggedIn [ ' role ' ] ) . split ( " : " ) [ 1 ] ) ]
if not courses_id :
return courses ( request )
pub_sub . psubscribe ( * courses_id )
for message in pub_sub . listen ( ) :
if message [ " type " ] != ' pmessage ' :
continue
messages . append ( message )
return notifications_view ( request )
def clear_notifications ( request ) :
global messages
messages = [ ]
return notifications_view ( request )
# Every id is only the number, not the course:number or person:number