@ -1,15 +1,12 @@
from django . shortcuts import render
from django . http import Http404
import redis
from redis_app . utils . index import create_index
# This corresponds to all CRUD and Utils operation associating with redis. This has to be in a different file to separate view logic and CRUD logic.
from redis_app . utils . model import *
# This model only helps us the development part to set rules on objects (we do not use the django model to save objects in it)
from . models import Person
redis_connection = redis . Redis ( host = ' localhost ' , port = 6379 , decode_responses = True )
pub_sub = redis_connection . pubsub ( )
create_index ( redis_connection = redis_connection )
def home ( request ) :
person = request . session . get ( " person " , " " )
return render ( request , ' home.html ' , { ' person ' : person } )
@ -63,7 +60,7 @@ def courses(request, error_message="", success_message=""):
person = request . session . get ( " person " , " " )
if person == " " :
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
person_id = getPersonId ( person [" name " ] , person [ " role " ] ). split ( " : " ) [ 1 ]
person_id = getPersonId ( person ). split ( " : " ) [ 1 ]
courses = getCoursesFromPerson ( person_id )
return render ( request , ' courses.html ' , { ' person ' : person , ' courses ' : courses , ' error_message ' : error_message , ' success_message ' : success_message } )
@ -74,16 +71,12 @@ def change_profile(request):
return render ( request , ' login.html ' , { ' person ' : Person ( name = " " , role = " " ) , " error_message " : " You must login! " } )
if request . method == ' POST ' :
person_name = request . POST [ ' name ' ]
person_role = request . POST [ ' role ' ]
person_id = getPersonId ( person [ " name " ] , person [ " role " ] )
person_id = getPersonId ( person )
if not person_id :
return render ( request , ' profile.html ' , { ' person ' : person , " error_message " : " Internal error: No user found! " } )
redis_connection . hmset ( person_id , mapping = { " name " : person_name , " role " : person_role } )
person [ " name " ] = person_name
person [ " role " ] = person_role
return render ( request , ' profile.html ' , { ' person ' : person , " error_message " : " Internal error, person id not found! " } )
person = changeProfile_redis ( person_id , request . POST [ ' name ' ] , request . POST [ ' role ' ] )
if not person :
return render ( request , ' profile.html ' , { ' person ' : person , " error_message " : " This username with this role is already taken! " } )
request . session [ " person " ] = person
return render ( request , ' profile.html ' , { ' person ' : person , ' success_message ' : ' Your profile has been successfully changed! ' } )
@ -104,14 +97,14 @@ def delete_course_view(request, course_id):
publish ( course_id , f " DELETE: Course: { course_id } has been deleted! " )
return courses ( request )
def publish_message ( request ):
def publish_message ( request , success_message = " " ):
person = request . session . get ( " person " , " " )
courses_fetched = getCoursesFromPerson ( getPersonId ( person [' name ' ] , person [ ' role ' ] ). split ( " : " ) [ 1 ] )
courses_fetched = getCoursesFromPerson ( getPersonId ( person ). split ( " : " ) [ 1 ] )
for course in courses_fetched :
course [ ' id ' ] = getCourseId ( course ) . split ( ' : ' ) [ 1 ]
if not courses_fetched :
return courses ( request , ' You don \' t have any course. You must create one to publish a message! ' )
return render ( request , ' publish_message.html ' , { ' person ' : person , ' courses ' : courses_fetched , ' success_message ' : ' The message has been successfully sent! ' } )
return render ( request , ' publish_message.html ' , { ' person ' : person , ' courses ' : courses_fetched , ' success_message ' : success_message } )
def publish_message_form ( request ) :
person = request . session . get ( " person " , " " )
@ -122,11 +115,11 @@ def publish_message_form(request):
if request . method == ' POST ' :
course_id = request . POST [ ' course_id ' ]
message = request . POST [ ' message ' ]
course = redis_connection. hgetall ( f ' course: { course_id } ' )
course = getCourse( course_id )
if not course :
raise Http404 ( " Course not found " )
publish ( course_id , message )
return publish_message ( request )
return publish_message ( request , ' The message has been successfully sent! ' )
return render ( request , ' publish_message.html ' , { ' person ' : person , " error_message " : " The form has been wrongly filled! " } )
@ -138,10 +131,10 @@ def update_course_view(request, course_id):
person = request . session . get ( " person " , " " )
if isExpired ( course_id ) :
raise Http404 ( " Course has expired... Get faster next time! " )
course = redis_connection. hgetall ( f " course: { course_id } " )
course = getCourse( course_id )
if not course :
raise Http404 ( " Course does not exist " )
course_id = getCourseId 2 ( course [ ' title ' ] , course [ ' teacher ' ] )
course_id = getCourseId ( course )
if course_id == False :
raise Http404 ( " Course does not exist " )
course [ ' id ' ] = course_id . split ( " : " ) [ 1 ]
@ -156,7 +149,7 @@ def create_course_form(request):
course_summary = request . POST [ ' summary ' ]
course_level = request . POST [ ' level ' ]
course_places = request . POST [ ' places ' ]
course_teacher = getPersonId ( person [' name ' ] , person [ ' role ' ] ). split ( " : " ) [ 1 ]
course_teacher = getPersonId ( person ). split ( " : " ) [ 1 ]
create_course ( course_title , course_summary , course_level , course_places , course_teacher )
return courses ( request , " " , " The course has been successfully created! " )
@ -173,8 +166,8 @@ def update_course_form(request, course_id):
course_summary = request . POST [ ' summary ' ]
course_level = request . POST [ ' level ' ]
course_places = request . POST [ ' places ' ]
course_teacher = getPersonId ( person [' name ' ] , person [ ' role ' ] ). split ( " : " ) [ 1 ]
course = redis_connection. hgetall ( f " course: { course_id } " )
course_teacher = getPersonId ( person ). split ( " : " ) [ 1 ]
course = getCourse( course_id )
course [ " id " ] = course_id
course_students = course . get ( " students " , " " )
try :
@ -191,14 +184,14 @@ def course_register_view(request, course_id):
person = request . session . get ( " person " , " " )
if isExpired ( course_id ) :
raise Http404 ( " Course has expired... Get faster next time! " )
person_id = getPersonId ( person [" name " ] , person [ " role " ] ). split ( " : " ) [ 1 ]
person_id = getPersonId ( person ). split ( " : " ) [ 1 ]
if not person_id :
raise Http404 ( " Person not found " )
course = redis_connection. hgetall ( f " course: { course_id } " )
course = getCourse( course_id )
if not course :
raise Http404 ( " Course not found " )
course [ " id " ] = course_id
teacher = redis_connection. hgetall ( f " person: { course [ ' teacher ' ] } " )
teacher = getPerson( course [ ' teacher ' ] )
if not teacher :
raise Http404 ( " Teacher does not exist " )
course [ ' teacher_name ' ] = teacher [ ' name ' ]
@ -212,14 +205,14 @@ def course_unregister_view(request, course_id):
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 ( person [" name " ] , person [ " role " ] ). split ( " : " ) [ 1 ]
person_id = getPersonId ( person ). split ( " : " ) [ 1 ]
if not person_id :
raise Http404 ( " Person not found " )
course = redis_connection. hgetall ( f " course: { course_id } " )
course = getCourse( course_id )
if not course :
raise Http404 ( " Course not found " )
course [ " id " ] = course_id
teacher = redis_connection. hgetall ( f " person: { course [ ' teacher ' ] } " )
teacher = getPerson( course [ ' teacher ' ] )
if not teacher :
raise Http404 ( " Teacher does not exist " )
course [ ' teacher_name ' ] = teacher [ ' name ' ]
@ -228,27 +221,7 @@ def course_unregister_view(request, course_id):
return details ( request , course_id , " Could not unregister to the course. Try again later. " )
def search ( keywords ) :
courses = [ ]
for keyword in keywords . split ( ' ' ) :
if not keyword : # When the users end his keywords with a ' '
continue
title_query = f " @title: { keyword } "
summary_query = f " @summary: { keyword } "
level_query = f " @level: { keyword } "
teacher_query = f " @teacher: { keyword } "
title_results = redis_connection . execute_command ( ' FT.SEARCH ' , ' idx:courses ' , title_query )
summary_results = redis_connection . execute_command ( ' FT.SEARCH ' , ' idx:courses ' , summary_query )
level_results = redis_connection . execute_command ( ' FT.SEARCH ' , ' idx:courses ' , level_query )
teacher_results = redis_connection . execute_command ( ' FT.SEARCH ' , ' idx:courses ' , teacher_query )
for i in range ( 1 , len ( title_results ) , 2 ) :
courses . append ( title_results [ i ] )
for i in range ( 1 , len ( summary_results ) , 2 ) :
courses . append ( summary_results [ i ] )
for i in range ( 1 , len ( level_results ) , 2 ) :
courses . append ( level_results [ i ] )
for i in range ( 1 , len ( teacher_results ) , 2 ) :
courses . append ( teacher_results [ i ] )
return courses
return search_redis ( keywords )
def search_view ( request ) :
person = request . session . get ( " person " , " " )
@ -261,7 +234,7 @@ def search_form(request):
courses = [ ]
courses_id = search ( keywords )
for course_id in courses_id :
course = redis_connection. hgetall ( course_id )
course = getCourse( course_id . split ( ' : ' ) [ 1 ] )
if not course :
continue
course [ ' id ' ] = course_id . split ( " : " ) [ 1 ]
@ -280,19 +253,16 @@ def notifications(request):
messages = request . session . get ( " messages " , [ ] )
if person == " " :
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 ( person [ ' name ' ] , person [ ' role ' ] ) . split ( " : " ) [ 1 ] ) ]
person_id = getPersonId ( person )
if not person_id :
return render ( request , ' notifications.html ' , { ' person ' : person , ' messages ' : messages , ' error_message ' : ' Internale error: person id not found. ' } )
courses_id = [ course [ ' id ' ] for course in getCoursesFromPerson ( person_id . split ( " : " ) [ 1 ] ) ]
if not courses_id :
return courses ( request , " You ' re not registered to any course. Please register to one to follow notifications. " )
pub_sub . psubscribe ( * courses_id )
for message in pub_sub . listen ( ) :
if message [ " type " ] != ' pmessage ' :
continue
message = notifications_redis ( * courses_id )
messages . append ( message )
messages . reverse ( )
request . session [ " message " ] = messages
break
return notifications_view ( request )
def clear_notifications ( request ) :