From 668d2596e716b69117cab2e197885a2788e0bf83 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 4 Feb 2026 06:16:58 +0000 Subject: [PATCH] add live class --- core/__pycache__/urls.cpython-311.pyc | Bin 1860 -> 1971 bytes core/__pycache__/views.cpython-311.pyc | Bin 13208 -> 14481 bytes core/templates/core/live_classroom.html | 57 +++++++++++++++++++++ core/templates/core/student_dashboard.html | 11 +++- core/templates/core/teacher_dashboard.html | 10 +++- core/urls.py | 1 + core/views.py | 30 ++++++++++- 7 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 core/templates/core/live_classroom.html diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index bf0527e2c891024117759c395d9d6dc72a1d5eb6..2cb70862e76361f3039c2d9bbb0164b6b3690976 100644 GIT binary patch delta 216 zcmX@Yx0zpkIWI340}zxwYRZ&kWng#=;=q6~l<~P}qq-;4#0RXJ%Bjp*qA=+cl{IY3 zm>C#W12F`o^GAuLs0K4=s%@@fQe-lyl1|P^EG{m}&(GDj$;>OUDlSdRN=+__&rGq? zzr~l6S(X|PSK+5AK6xI?9Ht`i$>yv9TuMMA8G*R?$mWTxiy1XsY05mz!octt#DM`JDC4u=Ms-gnu5`XA(G=xi22GXC^OzKw tnEf=xCckHyGkF55FP9=vDI*XUuipHebupvB2U&i8rUq^hERqL`0|4Kf7j*yt diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index dc24be36c41cad3299212b0df5384df240bda82d..17137ff28f0f96e9601826e418300460a8a7b204 100644 GIT binary patch delta 3483 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 U`L{7JyvG$5;J@+)0)O>?0Zq5(g8%>k diff --git a/core/templates/core/live_classroom.html b/core/templates/core/live_classroom.html new file mode 100644 index 0000000..35005d8 --- /dev/null +++ b/core/templates/core/live_classroom.html @@ -0,0 +1,57 @@ +{% extends 'base.html' %} +{% load i18n static %} + +{% block title %}{% trans "Live Classroom" %} - {{ subject.name_en }}{% endblock %} + +{% block content %} +
+ +
+ +
+ + + +{% endblock %} diff --git a/core/templates/core/student_dashboard.html b/core/templates/core/student_dashboard.html index a93be93..876f2b3 100644 --- a/core/templates/core/student_dashboard.html +++ b/core/templates/core/student_dashboard.html @@ -126,7 +126,14 @@ {{ subject.teacher.user.get_full_name|default:"No Teacher" }} - {% trans "Go to Class" %} + @@ -179,4 +186,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/teacher_dashboard.html b/core/templates/core/teacher_dashboard.html index b2ca55f..e127cae 100644 --- a/core/templates/core/teacher_dashboard.html +++ b/core/templates/core/teacher_dashboard.html @@ -107,8 +107,14 @@ {{ subject.subscribers.count }} {% trans "Students" %} - diff --git a/core/urls.py b/core/urls.py index ed37225..99dda18 100644 --- a/core/urls.py +++ b/core/urls.py @@ -17,4 +17,5 @@ urlpatterns = [ path('subscribe//', views.subscribe_subject, name='subscribe_subject'), path('payment/success/', views.payment_success, name='payment_success'), path('payment/cancel/', views.payment_cancel, name='payment_cancel'), + path('classroom//', views.live_classroom, name='live_classroom'), ] \ No newline at end of file diff --git a/core/views.py b/core/views.py index b1f44dc..b256573 100644 --- a/core/views.py +++ b/core/views.py @@ -1,3 +1,4 @@ +from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect, get_object_or_404 from django.utils import translation from django.conf import settings @@ -243,4 +244,31 @@ def payment_success(request): @login_required def payment_cancel(request): - return redirect('profile') \ No newline at end of file + return redirect('profile') + +@login_required +def live_classroom(request, subject_id): + subject = get_object_or_404(Subject, pk=subject_id) + + is_teacher = False + is_student = False + + if hasattr(request.user, 'teacher_profile') and subject.teacher and subject.teacher.user == request.user: + is_teacher = True + + if hasattr(request.user, 'student_profile') and request.user.student_profile.subscribed_subjects.filter(pk=subject_id).exists(): + is_student = True + + if not (is_teacher or is_student): + raise PermissionDenied("You are not authorized to join this class.") + + # Generate Room Name + # We use a consistent room name based on Subject ID + room_name = f"EduPlatform_Live_Subject_{subject.id}" + + return render(request, 'core/live_classroom.html', { + 'subject': subject, + 'room_name': room_name, + 'user_display_name': request.user.get_full_name() or request.user.username, + 'is_teacher': is_teacher + })