Can add and delete courses

master
Corentin LEMAIRE 6 months ago
parent 41492f75fc
commit 2bcfce7bfd

@ -8,5 +8,11 @@
{% else %} {% else %}
<p>No course yet</p> <p>No course yet</p>
{% endif %} {% endif %}
<br/>
{% if person %}
{% if person.role == "Teacher" %}
<a href="{% url 'create_course' %}">Create</a>
{% endif %}
{% endif %}
</body> </body>
</html> </html>

@ -0,0 +1,32 @@
<html>
<body>
<form action="{% url 'create_course_form' %}" method="POST">
{% csrf_token %}
<fieldset>
<legend><h1>Create a course</h1></legend>
{% if error_message %}
{{ error_message }}
{% endif %}
<label for="title">Course Title</label><br>
<input type="text" name="title" id="title" required><br/>
<label for="summary">Course Summary</label><br>
<textarea name="summary" id="summary" required></textarea><br/>
<label for="level">Course Level</label><br>
<select name="level" id="level" required>
<option value="Beginner">Beginner</option>
<option value="Intermediate">Intermediate</option>
<option value="Advanced">Advanced</option>
</select><br/>
<label for="places">Number of Places</label><br>
<input type="number" name="places" id="places" min="1" required><br/>
</fieldset>
<input type="submit" value="Create Course">
</form>
</body>
</html>

@ -1,5 +1,11 @@
<html> <html>
<body> <body>
{% if error_message %}
{{ error_message }}
{% endif %}
{% if success_message %}
{{ success_message }}
{% endif %}
{% if course %} {% if course %}
<h1>Welcome in the course {{ course.title }}!</h1> <h1>Welcome in the course {{ course.title }}!</h1>
<p> <p>
@ -14,5 +20,10 @@
{% else %} {% else %}
<h1>No course found!</h1> <h1>No course found!</h1>
{% endif %} {% endif %}
{% if person %}
{% if person.role == "Teacher" %}
<a href="{% url 'delete_course' course.id %}">Delete</a>
{% endif %}
{% endif %}
</body> </body>
</html> </html>

@ -15,5 +15,6 @@
</fieldset> </fieldset>
<input type="submit" value="Update"> <input type="submit" value="Update">
</form> </form>
<a href="{% url 'home' %}">Home</a>
</body> </body>
</html> </html>

@ -3,7 +3,6 @@ from . import views
urlpatterns = [ urlpatterns = [
path('', views.home, name='home'), path('', views.home, name='home'),
path('<int:course_id>', views.details, name='details'),
path('register_form', views.register_form, name='register_form'), path('register_form', views.register_form, name='register_form'),
path('register', views.register, name='register'), path('register', views.register, name='register'),
path('login_form', views.login_form, name='login_form'), path('login_form', views.login_form, name='login_form'),
@ -12,4 +11,8 @@ urlpatterns = [
path('change_profile', views.change_profile, name='change_profile'), path('change_profile', views.change_profile, name='change_profile'),
path('profile', views.profile, name='profile'), path('profile', views.profile, name='profile'),
path('logout', views.logout, name='logout'), path('logout', views.logout, name='logout'),
path('create_course', views.create_course_view, name='create_course'),
path('create_course_form', views.create_course_form, name='create_course_form'),
path('<str:course_id>', views.details, name='details'),
path('delete/<str:course_id>', views.delete_course_view, name='delete_course'),
] ]

@ -8,25 +8,62 @@ from .models import Person
DEFAULT_EXPIRE_TIME = 120 DEFAULT_EXPIRE_TIME = 120
EXPIRE_REFRESH_TIME = 60 EXPIRE_REFRESH_TIME = 60
COURSE_CHANNEL = "course"
cancel = True
personLoggedIn = "" personLoggedIn = ""
redis_connection = redis.Redis(host='localhost', port=6379, decode_responses=True) redis_connection = redis.Redis(host='localhost', port=6379, decode_responses=True)
pub_sub = redis_connection.pubsub()
create_index(redis_connection=redis_connection) create_index(redis_connection=redis_connection)
def getPersonId(person_name, person_role):
query = f"@name:{person_name} @role:{person_role}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query)
if results[0] > 0:
person_key = results[1]
return person_key
return False
def getCourseId2(course_title, course_teacher):
query = f"@title:{course_title} @teacher:{course_teacher}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', query)
if results[0] > 0:
course_key = results[1]
return course_key
return False
def getCourseId(course):
return getCourseId2(course.get("title"), course.get("teacher"))
def home(request, person=''): def home(request, person=''):
global cancel
cancel = True
return render(request, 'home.html', {'person': person}) return render(request, 'home.html', {'person': person})
def details(request, course_id): def details(request, course_id):
global redis_connection global redis_connection
global cancel
global personLoggedIn
cancel = True
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
if course is None: if not course:
raise Http404("Course does not exist")
course_id = getCourseId2(course['title'], course['teacher'])
if course_id == False:
raise Http404("Course does not exist") raise Http404("Course does not exist")
return render(request, 'details.html', {'course': course}) course['id'] = course_id.split(":")[1]
return render(request, 'details.html', {'course': course, 'person': personLoggedIn})
# Handle error messages. # Handle error messages.
def register(request): def register(request):
global personLoggedIn global personLoggedIn
global redis_connection global redis_connection
global cancel
cancel = True
if request.method == 'POST': if request.method == 'POST':
person_name = request.POST.get('name') person_name = request.POST.get('name')
person_role = request.POST.get('role') person_role = request.POST.get('role')
@ -48,6 +85,8 @@ def register(request):
def login(request): def login(request):
global personLoggedIn global personLoggedIn
global redis_connection global redis_connection
global cancel
cancel = True
if request.method == 'POST': if request.method == 'POST':
person_name = request.POST.get('name') person_name = request.POST.get('name')
person_role = request.POST.get('role') person_role = request.POST.get('role')
@ -63,18 +102,26 @@ def login(request):
return login_form(request) return login_form(request)
def register_form(request): def register_form(request):
global cancel
cancel = True
return render(request, 'register.html', {'person': Person(name="", role="")}) return render(request, 'register.html', {'person': Person(name="", role="")})
def login_form(request): def login_form(request):
global cancel
cancel = True
return render(request, 'login.html', {'person': Person(name="", role="")}) return render(request, 'login.html', {'person': Person(name="", role="")})
def logout(request): def logout(request):
global personLoggedIn global personLoggedIn
global cancel
cancel = True
personLoggedIn = "" personLoggedIn = ""
return render(request, 'login.html', {'person': Person(name="", role="")}) return render(request, 'login.html', {'person': Person(name="", role="")})
def courses(request): def courses(request):
global personLoggedIn global personLoggedIn
global cancel
cancel = True
if personLoggedIn == "": if personLoggedIn == "":
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) 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(personLoggedIn["name"], personLoggedIn["role"]).split(":")[1]
@ -85,7 +132,7 @@ def courses(request):
course_data = redis_connection.hgetall(key) course_data = redis_connection.hgetall(key)
if personLoggedIn['role'] == "Student": if personLoggedIn['role'] == "Student":
if person_id in course_data.get("students", "").split(","): if person_id in course_data.get("students", "").split(","):
course_id = getCourseId(course_data['title'], course_data['teacher']) course_id = getCourseId2(course_data['title'], course_data['teacher'])
if course_id == False: if course_id == False:
continue continue
course_data['id'] = course_id.split(":")[1] course_data['id'] = course_id.split(":")[1]
@ -93,7 +140,7 @@ def courses(request):
else: else:
teacher_id = course_data["teacher"] teacher_id = course_data["teacher"]
if teacher_id == person_id: if teacher_id == person_id:
course_id = getCourseId(course_data['title'], course_data['teacher']) course_id = getCourseId2(course_data['title'], course_data['teacher'])
if course_id == False: if course_id == False:
continue continue
course_data['id'] = course_id.split(":")[1] course_data['id'] = course_id.split(":")[1]
@ -102,6 +149,8 @@ def courses(request):
def change_profile(request): def change_profile(request):
global personLoggedIn global personLoggedIn
global cancel
cancel = True
if personLoggedIn == '': if personLoggedIn == '':
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"})
@ -122,6 +171,8 @@ def change_profile(request):
def profile(request): def profile(request):
global personLoggedIn global personLoggedIn
global cancel
cancel = True
if personLoggedIn == '': if personLoggedIn == '':
return render(request, 'login.html', {'person': Person(name="", role=""), "error_message": "You must login!"}) 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': personLoggedIn})
@ -130,28 +181,20 @@ def profile(request):
def getPersonId(person_name, person_role):
query = f"@name:{person_name} @role:{person_role}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:persons', query)
if results[0] > 0:
person_key = results[1]
return person_key
return False
def getCourseId(course_title, course_teacher):
query = f"@title:{course_title} @teacher:{course_teacher}"
results = redis_connection.execute_command('FT.SEARCH', 'idx:courses', query)
if results[0] > 0:
course_key = results[1]
return course_key
return False
def delete_course(course_id): def delete_course(course_id):
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
if not course: if not course:
return False return False
redis_connection.delete(f"course:{course_id}") redis_connection.delete(f"course:{course_id}")
return True
def delete_course_view(request, course_id):
global personLoggedIn
res = delete_course(course_id)
if not res:
return courses(request)
return courses(request)
def create_course(course_title, course_summary, course_level, course_places, course_teacher): def create_course(course_title, course_summary, course_level, course_places, course_teacher):
course_id = uuid.uuid4() course_id = uuid.uuid4()
@ -164,6 +207,35 @@ def create_course(course_title, course_summary, course_level, course_places, cou
}) })
redis_connection.expire(f"course:{course_id}", DEFAULT_EXPIRE_TIME) redis_connection.expire(f"course:{course_id}", DEFAULT_EXPIRE_TIME)
def create_course_view(request):
global personLoggedIn
return render(request, 'create.html', {'person': personLoggedIn})
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':
course_title = request.POST.get('title')
course_summary = request.POST.get('summary')
course_level = request.POST.get('level')
course_places = request.POST.get('places')
course_teacher = getPersonId(personLoggedIn.get('name'), personLoggedIn.get('role')).split(":")[1]
course_key = f"course:{uuid.uuid4()}"
redis_connection.hset(course_key, mapping={
'title': course_title,
'summary': course_summary,
'level': course_level,
'places': course_places,
'teacher': course_teacher
})
return courses(request)
return render(request, 'create.html', {'person': personLoggedIn, "error_message": "The form has been wrongly filled!"})
def course_register(course_id, person_id): def course_register(course_id, person_id):
course = redis_connection.hgetall(f"course:{course_id}") course = redis_connection.hgetall(f"course:{course_id}")
person = redis_connection.hgetall(f"person:{person_id}") person = redis_connection.hgetall(f"person:{person_id}")
@ -211,6 +283,23 @@ def refresh_expire(course_id):
redis_connection.expire(f"course:{course_id}", ttl + EXPIRE_REFRESH_TIME) redis_connection.expire(f"course:{course_id}", ttl + EXPIRE_REFRESH_TIME)
return True return True
def publish(course):
pub_sub.publish(COURSE_CHANNEL + ":" + getCourseId(course), str(course))
# Courses is a list of coursee 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)
def send_new_course_notification(message):
print(message)
# Every id is only the number, not the course:number or person:number # Every id is only the number, not the course:number or person:number
Loading…
Cancel
Save