diff --git a/README.md b/README.md index 24cb780..c9c56d9 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Now, you can install Django by doing `pipenv install django`. This will create you a virtual environment and install Django into it. -### Django-Redis installation +### Django-Redis installation Type `pip install redis` to install redis. diff --git a/redis_app/views.py b/redis_app/views.py index 1c501e1..45e9d34 100644 --- a/redis_app/views.py +++ b/redis_app/views.py @@ -9,19 +9,22 @@ from .models import Person DEFAULT_EXPIRE_TIME = 120 EXPIRE_REFRESH_TIME = 60 -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 get_uuid4(): + return str(uuid.uuid4()).replace('-', '') + def getCoursesFromPerson(person_id): global redis_connection course_keys = redis_connection.keys(f"course:*") courses = [] + person = redis_connection.hgetall(f"person:{person_id}") for key in course_keys: course_data = redis_connection.hgetall(key) - if personLoggedIn['role'] == "Student": + if person['role'] == "Student": if person_id in course_data.get('students', '').split(","): course_id = getCourseId2(course_data['title'], course_data['teacher']) if course_id == False: @@ -80,16 +83,15 @@ def getCourseId(course): def home(request): - global personLoggedIn - return render(request, 'home.html', {'person': personLoggedIn}) + person = request.session.get("person", "") + return render(request, 'home.html', {'person': person}) -def isPersonRegisteredToCourse(course): - global personLoggedIn +def isPersonRegisteredToCourse(course, person): global redis_connection - if not personLoggedIn: + if not person: return False - person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]).split(":")[1] + person_id = getPersonId(person["name"], person["role"]).split(":")[1] if not person_id: return False @@ -100,7 +102,7 @@ def isPersonRegisteredToCourse(course): course_keys = redis_connection.keys(f"course:*") for key in course_keys: course_data = redis_connection.hgetall(key) - if personLoggedIn['role'] == "Student": + if person['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: @@ -110,8 +112,8 @@ def isPersonRegisteredToCourse(course): return False def details(request, course_id, error_message=''): + person = request.session.get("person", "") global redis_connection - global personLoggedIn if isExpired(course_id): raise Http404("Course has expired... Get faster next time!") course = redis_connection.hgetall(f"course:{course_id}") @@ -122,13 +124,11 @@ def details(request, course_id, error_message=''): if not teacher: raise Http404("Teacher does not exist") course['teacher_name'] = teacher['name'] - register = isPersonRegisteredToCourse(course) + register = isPersonRegisteredToCourse(course, person) full = isCourseFull(course) - return render(request, 'details.html', {'course': course, 'person': personLoggedIn, 'register': register, 'full': full, 'error_message': error_message}) + return render(request, 'details.html', {'course': course, 'person': person, 'register': register, 'full': full, 'error_message': error_message}) def register(request): - global personLoggedIn - global redis_connection if request.method == 'POST': person_name = request.POST['name'] person_role = request.POST['role'] @@ -137,19 +137,19 @@ def register(request): # First element = number of results if results[0] > 0: return render(request, 'register.html', {'person': Person(name="", role=""), "error_message": "This user already exists!"}) - person_key = f"person:{uuid.uuid4()}" + person_key = f"person:{get_uuid4()}" redis_connection.hset(person_key, mapping={ 'name': person_name, 'role': person_role }) - personLoggedIn = redis_connection.hgetall(person_key) + + + request.session["person"] = redis_connection.hgetall(person_key) return home(request) return render(request, 'register.html', {'person': Person(name="", role=""), "error_message": "The form has been wrongly filled!"}) def login(request): - global personLoggedIn - global redis_connection if request.method == 'POST': person_name = request.POST['name'] person_role = request.POST['role'] @@ -158,7 +158,7 @@ def login(request): results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query) if results[0] > 0: person_key = results[1] - personLoggedIn = redis_connection.hgetall(person_key) + request.session["person"] = redis_connection.hgetall(person_key) return home(request) return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "No user found!"}) @@ -171,44 +171,44 @@ def login_form(request): return render(request, 'login.html', {'person': Person(name="", role="")}) def logout(request): - global personLoggedIn - personLoggedIn = "" + request.session["person"] = "" return render(request, 'login.html', {'person': Person(name="", role="")}) def courses(request): - global personLoggedIn - if personLoggedIn == "": + person = request.session.get("person", "") + if person == "": return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) - person_id = getPersonId(personLoggedIn["name"], personLoggedIn["role"]).split(":")[1] + person_id = getPersonId(person["name"], person["role"]).split(":")[1] courses = getCoursesFromPerson(person_id) - return render(request, 'courses.html', {'person': personLoggedIn, 'courses': courses}) + return render(request, 'courses.html', {'person': person, 'courses': courses}) def change_profile(request): - global personLoggedIn - if personLoggedIn == '': + person = request.session.get("person", "") + if person == '': 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(personLoggedIn["name"], personLoggedIn["role"]) + person_id = getPersonId(person["name"], person["role"]) if not person_id: - return render(request, 'profile.html', {'person': personLoggedIn, "error_message": "Internal error: No user found!"}) + 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}) - personLoggedIn["name"] = person_name - personLoggedIn["role"] = person_role - return render(request, 'profile.html', {'person': personLoggedIn}) + person["name"] = person_name + person["role"] = person_role + request.session["person"] = person + return render(request, 'profile.html', {'person': person}) return login_form(request) def profile(request): - global personLoggedIn - if personLoggedIn == '': + person = request.session.get("person", "") + if person == '': return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) - return render(request, 'profile.html', {'person': personLoggedIn}) + return render(request, 'profile.html', {'person': person}) @@ -223,7 +223,6 @@ def delete_course(course_id): return True def delete_course_view(request, course_id): - global personLoggedIn if isExpired(course_id): raise Http404("Course has expired... Get faster next time!") res = delete_course(course_id) @@ -232,7 +231,7 @@ def delete_course_view(request, course_id): return courses(request) def create_course(course_title, course_summary, course_level, course_places, course_teacher): - course_id = uuid.uuid4() + course_id = get_uuid4() redis_connection.hset(f"course:{course_id}", mapping={ "title": course_title, "summary": course_summary, @@ -254,21 +253,21 @@ def update_course(course_id, course_title, course_summary, course_level, course_ 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]) + person = request.session.get("person", "") + courses_fetched = getCoursesFromPerson(getPersonId(person['name'], person['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}) + return render(request, 'publish_message.html', {'person': person, 'courses': courses_fetched}) def publish_message_form(request): - global personLoggedIn + person = request.session.get("person", "") global redis_connection - if personLoggedIn == '': + if person == '': 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 person['role'] == 'Student': + return render(request, 'publish_message.html', {'person': person, "error_message": "The form has been wrongly filled!"}) if request.method == 'POST': course_id = request.POST['course_id'] message = request.POST['message'] @@ -278,14 +277,14 @@ def publish_message_form(request): publish(course_id, message) return publish_message(request) - return render(request, 'publish_message.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"}) + return render(request, 'publish_message.html', {'person': person, "error_message": "The form has been wrongly filled!"}) def create_course_view(request): - global personLoggedIn - return render(request, 'create.html', {'person': personLoggedIn}) + person = request.session.get("person", "") + return render(request, 'create.html', {'person': person}) def update_course_view(request, course_id): - global personLoggedIn + 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}") @@ -295,41 +294,41 @@ def update_course_view(request, course_id): if course_id == False: raise Http404("Course does not exist") course['id'] = course_id.split(":")[1] - return render(request, 'update.html', {'person': personLoggedIn, 'course': course}) + return render(request, 'update.html', {'person': person, 'course': course}) def create_course_form(request): - global personLoggedIn + person = request.session.get("person", "") global redis_connection - if personLoggedIn == '': + if person == '': return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) if request.method == 'POST': course_title = request.POST['title'] course_summary = request.POST['summary'] course_level = request.POST['level'] course_places = request.POST['places'] - course_teacher = getPersonId(personLoggedIn['name'], personLoggedIn['role']).split(":")[1] + course_teacher = getPersonId(person['name'], person['role']).split(":")[1] create_course(course_title, course_summary, course_level, course_places, course_teacher) return courses(request) - return render(request, 'create.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"}) + return render(request, 'create.html', {'person': person, "error_message": "The form has been wrongly filled!"}) def update_course_form(request, course_id): - global personLoggedIn + person = request.session.get("person", "") global redis_connection if isExpired(course_id): raise Http404("Course has expired... Get faster next time!") - if personLoggedIn == '': + if person == '': return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) if request.method == 'POST': course_title = request.POST['title'] course_summary = request.POST['summary'] course_level = request.POST['level'] course_places = request.POST['places'] - course_teacher = getPersonId(personLoggedIn['name'], personLoggedIn['role']).split(":")[1] + course_teacher = getPersonId(person['name'], person['role']).split(":")[1] update_course(course_id, course_title, course_summary, course_level, course_places, course_teacher) return courses(request) - return render(request, 'update.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"}) + return render(request, 'update.html', {'person': person, "error_message": "The form has been wrongly filled!"}) # Test if places are not limited def course_register(course_id, person_id): @@ -379,11 +378,11 @@ def course_unregister(course_id, person_id): return True def course_register_view(request, course_id): - global personLoggedIn + person = request.session.get("person", "") 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] + person_id = getPersonId(person["name"], person["role"]).split(":")[1] if not person_id: raise Http404("Person not found") course = redis_connection.hgetall(f"course:{course_id}") @@ -399,13 +398,13 @@ def course_register_view(request, course_id): return details(request, course_id, "Could not register to the course. Try again later.") def course_unregister_view(request, course_id): - global personLoggedIn + person = request.session.get("person", "") 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] + person_id = getPersonId(person["name"], person["role"]).split(":")[1] if not person_id: raise Http404("Person not found") course = redis_connection.hgetall(f"course:{course_id}") @@ -470,11 +469,11 @@ def search(keywords): return courses def search_view(request): - global personLoggedIn - return render(request, 'search.html', {'person': personLoggedIn}) + person = request.session.get("person", "") + return render(request, 'search.html', {'person': person}) def search_form(request): - global personLoggedIn + person = request.session.get("person", "") global redis_connection if request.method == 'POST': keywords = request.POST['keywords'] @@ -486,22 +485,22 @@ def search_form(request): continue course['id'] = course_id.split(":")[1] courses.append(course) - return render(request, 'search.html', {'person': personLoggedIn, 'courses': courses}) + return render(request, 'search.html', {'person': person, 'courses': courses}) - return render(request, 'search.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"}) + return render(request, 'search.html', {'person': person, "error_message": "The form has been wrongly filled!"}) def notifications_view(request): - global personLoggedIn + person = request.session.get("person", "") global messages - return render(request, 'notifications.html', {'person': personLoggedIn, 'messages': messages}) + return render(request, 'notifications.html', {'person': person, 'messages': messages}) def notifications(request): - global personLoggedIn + person = request.session.get("person", "") global messages - if personLoggedIn == "": + 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(personLoggedIn['name'], personLoggedIn['role']).split(":")[1])] + courses_id = [course['id'] for course in getCoursesFromPerson(getPersonId(person['name'], person['role']).split(":")[1])] if not courses_id: return courses(request) pub_sub.psubscribe(*courses_id)