add live class

This commit is contained in:
Flatlogic Bot 2026-02-04 06:16:58 +00:00
parent 91858c53d5
commit 668d2596e7
7 changed files with 104 additions and 5 deletions

View File

@ -0,0 +1,57 @@
{% extends 'base.html' %}
{% load i18n static %}
{% block title %}{% trans "Live Classroom" %} - {{ subject.name_en }}{% endblock %}
{% block content %}
<div class="container-fluid p-0" style="height: calc(100vh - 76px); margin-top: 76px;">
<div id="meet" style="width: 100%; height: 100%;"></div>
</div>
<script src='https://meet.jit.si/external_api.js'></script>
<script>
const domain = 'meet.jit.si';
const options = {
roomName: '{{ room_name }}',
width: '100%',
height: '100%',
parentNode: document.querySelector('#meet'),
userInfo: {
displayName: '{{ user_display_name }}'
},
configOverwrite: {
startWithAudioMuted: true,
startWithVideoMuted: true,
{% if not is_teacher %}
// Hide some controls for students
disableRemoteMute: true,
{% endif %}
prejoinPageEnabled: false
},
interfaceConfigOverwrite: {
// Customize toolbar if needed
SHOW_JITSI_WATERMARK: false,
DEFAULT_BACKGROUND: 'white',
DEFAULT_LOCAL_DISPLAY_NAME: '{{ user_display_name }}',
TOOLBAR_BUTTONS: [
'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen',
'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone',
'security'
],
}
};
const api = new JitsiMeetExternalAPI(domain, options);
// Redirect when hanging up
api.addEventListeners({
videoConferenceLeft: function () {
window.location.href = "{% url 'profile' %}";
}
});
</script>
{% endblock %}

View File

@ -126,7 +126,14 @@
<span class="badge bg-primary bg-opacity-10 text-primary">
{{ subject.teacher.user.get_full_name|default:"No Teacher" }}
</span>
<a href="{% url 'subject_detail' subject.id %}" class="btn btn-sm btn-primary rounded-pill">{% trans "Go to Class" %}</a>
<div>
<a href="{% url 'live_classroom' subject.id %}" class="btn btn-sm btn-danger rounded-pill me-1" title="{% trans 'Join Live Class' %}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-camera-video-fill" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M0 5a2 2 0 0 1 2-2h7.5a2 2 0 0 1 1.983 1.738l3.11-1.382A1 1 0 0 1 16 4.269v7.461a1 1 0 0 1-1.406.913l-3.111-1.382A2 2 0 0 1 9.5 13H2a2 2 0 0 1-2-2V5z"/>
</svg>
</a>
<a href="{% url 'subject_detail' subject.id %}" class="btn btn-sm btn-primary rounded-pill">{% trans "Go to Class" %}</a>
</div>
</div>
</div>
</div>
@ -179,4 +186,4 @@
</div>
</div>
</div>
{% endblock %}
{% endblock %}

View File

@ -107,8 +107,14 @@
{{ subject.subscribers.count }} {% trans "Students" %}
</span>
</div>
<div class="mt-3">
<a href="{% url 'subject_detail' subject.id %}" class="btn btn-sm btn-primary w-100 rounded-pill">{% trans "Manage Class" %}</a>
<div class="mt-3 d-grid gap-2">
<a href="{% url 'live_classroom' subject.id %}" class="btn btn-sm btn-danger rounded-pill">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-camera-video-fill me-2" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M0 5a2 2 0 0 1 2-2h7.5a2 2 0 0 1 1.983 1.738l3.11-1.382A1 1 0 0 1 16 4.269v7.461a1 1 0 0 1-1.406.913l-3.111-1.382A2 2 0 0 1 9.5 13H2a2 2 0 0 1-2-2V5z"/>
</svg>
{% trans "Start Live Class" %}
</a>
<a href="{% url 'subject_detail' subject.id %}" class="btn btn-sm btn-primary rounded-pill">{% trans "Manage Class" %}</a>
</div>
</div>
</div>

View File

@ -17,4 +17,5 @@ urlpatterns = [
path('subscribe/<int:subject_id>/', 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/<int:subject_id>/', views.live_classroom, name='live_classroom'),
]

View File

@ -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')
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
})