updates
This commit is contained in:
1 parent
defd0c59ee
commit
d02b470ca0
2 files changed
+189
-293
No files matched your search
@@ -1,132 +0,0 @@
|
|||||||
import django.db
|
|
||||||
from rest_framework import serializers
|
|
||||||
from .models import (Attendance, AttendanceRecord, Batch, Course, Expenses, FCMDevice, Fee,
|
|
||||||
Institute, Routine, Salary, Staff, Student, StudentRoutine, Subtopic, Topic, Vendor)
|
|
||||||
|
|
||||||
class FCMDeviceSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = FCMDevice
|
|
||||||
fields = ['id', 'token']
|
|
||||||
depth = 10
|
|
||||||
|
|
||||||
class InstituteSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Institute
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'name', 'phone', 'email', 'address', 'pan_no', 'reg_no', 'logo', 'description']
|
|
||||||
|
|
||||||
|
|
||||||
class SubtopicSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Subtopic
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'name']
|
|
||||||
|
|
||||||
|
|
||||||
class TopicSerializer(serializers.ModelSerializer):
|
|
||||||
subtopics = SubtopicSerializer(read_only=True, many=True).data
|
|
||||||
class Meta:
|
|
||||||
model = Topic
|
|
||||||
fields = ['id', 'name', 'subtopics']
|
|
||||||
depth = 10
|
|
||||||
|
|
||||||
|
|
||||||
class CourseSerializer(serializers.ModelSerializer):
|
|
||||||
topics = TopicSerializer(read_only=True, many=True).data
|
|
||||||
class Meta:
|
|
||||||
model = Course
|
|
||||||
depth = 3
|
|
||||||
fields = ['id', 'name', 'amount', 'duration', 'duration_type', 'remarks', 'topics']
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class StudentSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Student
|
|
||||||
depth = 10
|
|
||||||
fields = [
|
|
||||||
'id', 'name', 'status', 'gender', 'birth_date', 'email', 'phone',
|
|
||||||
'temporary_address', 'permanent_address', 'marital_status', 'parent_name',
|
|
||||||
'parent_phone', 'citizenship_no', 'qualification', 'image', 'batches', 'courses',
|
|
||||||
'subtotal', 'discount', 'total', 'paid', 'remaining', 'joining_date', 'file', 'remarks'
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BatchSerializer(serializers.ModelSerializer):
|
|
||||||
students = StudentSerializer(many=True).data
|
|
||||||
class Meta:
|
|
||||||
model = Batch
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'name', 'start_date', 'end_date', 'students']
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FeeSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Fee
|
|
||||||
fields = [
|
|
||||||
'id', 'student', 'old_total', 'old_paid', 'old_remaining', 'balance_amount',
|
|
||||||
'payment_date', 'payment_method', 'total', 'paid', 'remaining', 'remarks'
|
|
||||||
]
|
|
||||||
depth = 10
|
|
||||||
|
|
||||||
class VendorSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Vendor
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'name', 'address', 'phone']
|
|
||||||
|
|
||||||
class ExpensesSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Expenses
|
|
||||||
depth = 10
|
|
||||||
fields = [
|
|
||||||
'id', 'name', 'amount', 'date', 'vendor', 'paid', 'credit', 'credit_date', 'remarks'
|
|
||||||
]
|
|
||||||
|
|
||||||
class SalarySerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Salary
|
|
||||||
depth = 10
|
|
||||||
fields = '__all__'
|
|
||||||
|
|
||||||
class StaffSerializer(serializers.ModelSerializer):
|
|
||||||
salaries = SalarySerializer(many=True).data
|
|
||||||
class Meta:
|
|
||||||
model = Staff
|
|
||||||
depth = 10
|
|
||||||
fields = '__all__'
|
|
||||||
# fields = [
|
|
||||||
# 'id', 'name', 'gender', 'designation', 'birth_date', 'phone', 'email',
|
|
||||||
# 'temporary_address', 'permanent_address', 'marital_status', 'parent_name',
|
|
||||||
# 'parent_phone', 'citizenship_no', 'passport', 'image', 'monthly', 'pending_salary', 'remarks', 'salaries'
|
|
||||||
# ]
|
|
||||||
|
|
||||||
class RoutineSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Routine
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'name', 'start_time', 'end_time', 'teacher']
|
|
||||||
|
|
||||||
class StudentRoutineSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = StudentRoutine
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'student', 'routine', 'course', 'course_status']
|
|
||||||
|
|
||||||
|
|
||||||
class AttendanceRecordSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = AttendanceRecord
|
|
||||||
depth = 10
|
|
||||||
fields = ['id', 'attendance', 'student', 'student_attend']
|
|
||||||
|
|
||||||
|
|
||||||
class AttendanceSerializer(serializers.ModelSerializer):
|
|
||||||
records = AttendanceRecordSerializer(many=True).data
|
|
||||||
class Meta:
|
|
||||||
model = Attendance
|
|
||||||
depth = 1
|
|
||||||
fields = ['id', 'date', 'routine', 'teacher', 'teacher_attend', 'class_status', 'records']
|
|
||||||
|
|
||||||
+189
-161
@@ -7,11 +7,17 @@ from django.db.models import Count, Q, Avg
|
|||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from .models import (
|
from .models import (
|
||||||
Student, Course, CourseTracking,
|
Student,
|
||||||
Student_Leave, Staff_leave,
|
Course,
|
||||||
Attendance, AttendanceRecord,
|
CourseTracking,
|
||||||
StudentFeedback, Routine, StudentRoutine,
|
Student_Leave,
|
||||||
Staff
|
Staff_leave,
|
||||||
|
Attendance,
|
||||||
|
AttendanceRecord,
|
||||||
|
StudentFeedback,
|
||||||
|
Routine,
|
||||||
|
StudentRoutine,
|
||||||
|
Staff,
|
||||||
)
|
)
|
||||||
from app.admin import custom_admin_site
|
from app.admin import custom_admin_site
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
@@ -32,13 +38,13 @@ def showFirebaseJS(request):
|
|||||||
importScripts('https://www.gstatic.com/firebasejs/11.0.2/firebase-messaging-compat.js');
|
importScripts('https://www.gstatic.com/firebasejs/11.0.2/firebase-messaging-compat.js');
|
||||||
|
|
||||||
firebase.initializeApp({
|
firebase.initializeApp({
|
||||||
apiKey: "AIzaSyAVzOJh5v8_oZg4MoQkq0CzrAbeyHGn4z4",
|
apiKey: "",
|
||||||
authDomain: "institute-management-sys-a2d20.firebaseapp.com",
|
authDomain: "",
|
||||||
projectId: "institute-management-sys-a2d20",
|
projectId: "",
|
||||||
storageBucket: "institute-management-sys-a2d20.firebasestorage.app",
|
storageBucket: "",
|
||||||
messagingSenderId: "777235542100",
|
messagingSenderId: "",
|
||||||
appId: "1:777235542100:web:4d0cb9553918cb3cc23dc1",
|
appId: "",
|
||||||
measurementId: "G-4QP9GYV0SJ"
|
measurementId: ""
|
||||||
});
|
});
|
||||||
|
|
||||||
const messaging = firebase.messaging();
|
const messaging = firebase.messaging();
|
||||||
@@ -56,14 +62,15 @@ def showFirebaseJS(request):
|
|||||||
"""
|
"""
|
||||||
return HttpResponse(data, content_type="text/javascript")
|
return HttpResponse(data, content_type="text/javascript")
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def dashboard(request):
|
def dashboard(request):
|
||||||
user = request.user
|
user = request.user
|
||||||
user_groups = user.groups.values_list('name', flat=True)
|
user_groups = user.groups.values_list("name", flat=True)
|
||||||
if 'Student' in user_groups:
|
if "Student" in user_groups:
|
||||||
return redirect('studentDashboard')
|
return redirect("studentDashboard")
|
||||||
elif 'Teacher' in user_groups:
|
elif "Teacher" in user_groups:
|
||||||
return redirect('teacherDashboard')
|
return redirect("teacherDashboard")
|
||||||
# Get current date and date ranges
|
# Get current date and date ranges
|
||||||
today = timezone.now().date()
|
today = timezone.now().date()
|
||||||
last_week = today - timedelta(days=7)
|
last_week = today - timedelta(days=7)
|
||||||
@@ -71,113 +78,126 @@ def dashboard(request):
|
|||||||
|
|
||||||
# Student Statistics
|
# Student Statistics
|
||||||
total_students = Student.objects.count()
|
total_students = Student.objects.count()
|
||||||
active_students = Student.objects.filter(status='Active').count()
|
active_students = Student.objects.filter(status="Active").count()
|
||||||
completed_students = Student.objects.filter(status='Completed').count()
|
completed_students = Student.objects.filter(status="Completed").count()
|
||||||
on_leave_students = Student.objects.filter(status='Leave').count()
|
on_leave_students = Student.objects.filter(status="Leave").count()
|
||||||
|
|
||||||
# Course Statistics
|
# Course Statistics
|
||||||
total_courses = Course.objects.count()
|
total_courses = Course.objects.count()
|
||||||
active_courses = Course.objects.filter(student_trackings__progress_status='In Progress').distinct().count()
|
active_courses = (
|
||||||
completed_courses = Course.objects.filter(student_trackings__progress_status='Completed').distinct().count()
|
Course.objects.filter(student_trackings__progress_status="In Progress")
|
||||||
|
.distinct()
|
||||||
|
.count()
|
||||||
|
)
|
||||||
|
completed_courses = (
|
||||||
|
Course.objects.filter(student_trackings__progress_status="Completed")
|
||||||
|
.distinct()
|
||||||
|
.count()
|
||||||
|
)
|
||||||
|
|
||||||
# Course Tracking Statistics
|
# Course Tracking Statistics
|
||||||
course_trackings = CourseTracking.objects.all()
|
course_trackings = CourseTracking.objects.all()
|
||||||
in_progress_trackings = course_trackings.filter(progress_status='In Progress')
|
in_progress_trackings = course_trackings.filter(progress_status="In Progress")
|
||||||
completed_trackings = course_trackings.filter(progress_status='Completed')
|
completed_trackings = course_trackings.filter(progress_status="Completed")
|
||||||
dropped_trackings = course_trackings.filter(progress_status='Dropped')
|
dropped_trackings = course_trackings.filter(progress_status="Dropped")
|
||||||
|
|
||||||
# Recent Leave Requests
|
# Recent Leave Requests
|
||||||
recent_student_leaves = Student_Leave.objects.filter(
|
recent_student_leaves = Student_Leave.objects.filter(
|
||||||
created_at__gte=last_week
|
created_at__gte=last_week
|
||||||
).order_by('-created_at')[:5]
|
).order_by("-created_at")[:5]
|
||||||
|
|
||||||
recent_staff_leaves = Staff_leave.objects.filter(
|
recent_staff_leaves = Staff_leave.objects.filter(
|
||||||
created_at__gte=last_week
|
created_at__gte=last_week
|
||||||
).order_by('-created_at')[:5]
|
).order_by("-created_at")[:5]
|
||||||
|
|
||||||
# Attendance Statistics
|
# Attendance Statistics
|
||||||
today_attendance = Attendance.objects.filter(date=today).count()
|
today_attendance = Attendance.objects.filter(date=today).count()
|
||||||
today_present = AttendanceRecord.objects.filter(
|
today_present = AttendanceRecord.objects.filter(
|
||||||
attendance__date=today,
|
attendance__date=today, student_attend=True
|
||||||
student_attend=True
|
|
||||||
).count()
|
).count()
|
||||||
|
|
||||||
# Recent Feedback
|
# Recent Feedback
|
||||||
recent_feedback = StudentFeedback.objects.order_by('-created_at')[:5]
|
recent_feedback = StudentFeedback.objects.order_by("-created_at")[:5]
|
||||||
|
|
||||||
# Course Progress Overview
|
# Course Progress Overview
|
||||||
course_progress = []
|
course_progress = []
|
||||||
for course in Course.objects.all():
|
for course in Course.objects.all():
|
||||||
trackings = course.student_trackings.all()
|
trackings = course.student_trackings.all()
|
||||||
if trackings.exists():
|
if trackings.exists():
|
||||||
avg_progress = trackings.aggregate(avg_progress=Avg('completion_percentage'))['avg_progress']
|
avg_progress = trackings.aggregate(
|
||||||
course_progress.append({
|
avg_progress=Avg("completion_percentage")
|
||||||
'course': course,
|
)["avg_progress"]
|
||||||
'total_students': trackings.count(),
|
course_progress.append(
|
||||||
'in_progress': trackings.filter(progress_status='In Progress').count(),
|
{
|
||||||
'completed': trackings.filter(progress_status='Completed').count(),
|
"course": course,
|
||||||
'average_progress': round(avg_progress, 1) if avg_progress else 0
|
"total_students": trackings.count(),
|
||||||
})
|
"in_progress": trackings.filter(
|
||||||
|
progress_status="In Progress"
|
||||||
|
).count(),
|
||||||
|
"completed": trackings.filter(progress_status="Completed").count(),
|
||||||
|
"average_progress": round(avg_progress, 1) if avg_progress else 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# Monthly Statistics
|
# Monthly Statistics
|
||||||
monthly_stats = {
|
monthly_stats = {
|
||||||
'new_students': Student.objects.filter(joining_date__gte=last_month).count(),
|
"new_students": Student.objects.filter(joining_date__gte=last_month).count(),
|
||||||
'completed_courses': completed_trackings.filter(actual_end_date__gte=last_month).count(),
|
"completed_courses": completed_trackings.filter(
|
||||||
'attendance_rate': round(
|
actual_end_date__gte=last_month
|
||||||
(AttendanceRecord.objects.filter(
|
).count(),
|
||||||
attendance__date__gte=last_month,
|
"attendance_rate": round(
|
||||||
student_attend=True
|
(
|
||||||
).count() /
|
|
||||||
AttendanceRecord.objects.filter(
|
AttendanceRecord.objects.filter(
|
||||||
|
attendance__date__gte=last_month, student_attend=True
|
||||||
|
).count()
|
||||||
|
/ AttendanceRecord.objects.filter(
|
||||||
attendance__date__gte=last_month
|
attendance__date__gte=last_month
|
||||||
).count() * 100) if AttendanceRecord.objects.filter(
|
).count()
|
||||||
attendance__date__gte=last_month
|
* 100
|
||||||
).exists() else 0,
|
|
||||||
1
|
|
||||||
)
|
)
|
||||||
|
if AttendanceRecord.objects.filter(
|
||||||
|
attendance__date__gte=last_month
|
||||||
|
).exists()
|
||||||
|
else 0,
|
||||||
|
1,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
**custom_admin_site.each_context(request), # This adds the admin context, including the sidebar.
|
**custom_admin_site.each_context(
|
||||||
|
request
|
||||||
|
), # This adds the admin context, including the sidebar.
|
||||||
# Student Statistics
|
# Student Statistics
|
||||||
'total_students': total_students,
|
"total_students": total_students,
|
||||||
'active_students': active_students,
|
"active_students": active_students,
|
||||||
'completed_students': completed_students,
|
"completed_students": completed_students,
|
||||||
'on_leave_students': on_leave_students,
|
"on_leave_students": on_leave_students,
|
||||||
|
|
||||||
# Course Statistics
|
# Course Statistics
|
||||||
'total_courses': total_courses,
|
"total_courses": total_courses,
|
||||||
'active_courses': active_courses,
|
"active_courses": active_courses,
|
||||||
'completed_courses': completed_courses,
|
"completed_courses": completed_courses,
|
||||||
|
|
||||||
# Course Tracking Statistics
|
# Course Tracking Statistics
|
||||||
'in_progress_trackings': in_progress_trackings.count(),
|
"in_progress_trackings": in_progress_trackings.count(),
|
||||||
'completed_trackings': completed_trackings.count(),
|
"completed_trackings": completed_trackings.count(),
|
||||||
'dropped_trackings': dropped_trackings.count(),
|
"dropped_trackings": dropped_trackings.count(),
|
||||||
|
|
||||||
# Leave Requests
|
# Leave Requests
|
||||||
'recent_student_leaves': recent_student_leaves,
|
"recent_student_leaves": recent_student_leaves,
|
||||||
'recent_staff_leaves': recent_staff_leaves,
|
"recent_staff_leaves": recent_staff_leaves,
|
||||||
|
|
||||||
# Attendance Statistics
|
# Attendance Statistics
|
||||||
'today_attendance': today_attendance,
|
"today_attendance": today_attendance,
|
||||||
'today_present': today_present,
|
"today_present": today_present,
|
||||||
'attendance_rate': round(
|
"attendance_rate": round(
|
||||||
(today_present / today_attendance * 100) if today_attendance > 0 else 0,
|
(today_present / today_attendance * 100) if today_attendance > 0 else 0, 1
|
||||||
1
|
|
||||||
),
|
),
|
||||||
|
|
||||||
# Recent Feedback
|
# Recent Feedback
|
||||||
'recent_feedback': recent_feedback,
|
"recent_feedback": recent_feedback,
|
||||||
|
|
||||||
# Course Progress
|
# Course Progress
|
||||||
'course_progress': course_progress,
|
"course_progress": course_progress,
|
||||||
|
|
||||||
# Monthly Statistics
|
# Monthly Statistics
|
||||||
'monthly_stats': monthly_stats,
|
"monthly_stats": monthly_stats,
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'dashboard.html', context)
|
return render(request, "dashboard.html", context)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -191,34 +211,38 @@ def studentDashboard(request):
|
|||||||
# Course Progress
|
# Course Progress
|
||||||
course_trackings = CourseTracking.objects.filter(student=student)
|
course_trackings = CourseTracking.objects.filter(student=student)
|
||||||
total_courses = course_trackings.count()
|
total_courses = course_trackings.count()
|
||||||
completed_courses = course_trackings.filter(progress_status='Completed').count()
|
completed_courses = course_trackings.filter(progress_status="Completed").count()
|
||||||
in_progress_courses = course_trackings.filter(progress_status='In Progress').count()
|
in_progress_courses = course_trackings.filter(progress_status="In Progress").count()
|
||||||
completion_percentage = (completed_courses / total_courses * 100) if total_courses > 0 else 0
|
completion_percentage = (
|
||||||
|
(completed_courses / total_courses * 100) if total_courses > 0 else 0
|
||||||
|
)
|
||||||
|
|
||||||
# Course Details
|
# Course Details
|
||||||
course_details = {}
|
course_details = {}
|
||||||
for tracking in course_trackings:
|
for tracking in course_trackings:
|
||||||
course_details[tracking.course.name] = {
|
course_details[tracking.course.name] = {
|
||||||
'start_date': tracking.start_date,
|
"start_date": tracking.start_date,
|
||||||
'end_date': tracking.end_date,
|
"end_date": tracking.end_date,
|
||||||
'completion_percentage': tracking.completion_percentage,
|
"completion_percentage": tracking.completion_percentage,
|
||||||
'progress_status': tracking.progress_status,
|
"progress_status": tracking.progress_status,
|
||||||
'book': tracking.course.book if hasattr(tracking.course, 'book') else None,
|
"book": tracking.course.book if hasattr(tracking.course, "book") else None,
|
||||||
'topics': [] # This will be populated if you have topic tracking
|
"topics": [], # This will be populated if you have topic tracking
|
||||||
}
|
}
|
||||||
|
|
||||||
# Attendance Statistics
|
# Attendance Statistics
|
||||||
attendance_records = AttendanceRecord.objects.filter(student=student)
|
attendance_records = AttendanceRecord.objects.filter(student=student)
|
||||||
total_classes = attendance_records.count()
|
total_classes = attendance_records.count()
|
||||||
classes_attended = attendance_records.filter(student_attend=True).count()
|
classes_attended = attendance_records.filter(student_attend=True).count()
|
||||||
attendance_percentage = (classes_attended / total_classes * 100) if total_classes > 0 else 0
|
attendance_percentage = (
|
||||||
|
(classes_attended / total_classes * 100) if total_classes > 0 else 0
|
||||||
|
)
|
||||||
|
|
||||||
# Calculate attendance streaks
|
# Calculate attendance streaks
|
||||||
current_streak = 0
|
current_streak = 0
|
||||||
longest_streak = 0
|
longest_streak = 0
|
||||||
temp_streak = 0
|
temp_streak = 0
|
||||||
|
|
||||||
for record in attendance_records.order_by('-attendance__date'):
|
for record in attendance_records.order_by("-attendance__date"):
|
||||||
if record.student_attend:
|
if record.student_attend:
|
||||||
temp_streak += 1
|
temp_streak += 1
|
||||||
if temp_streak > longest_streak:
|
if temp_streak > longest_streak:
|
||||||
@@ -229,44 +253,44 @@ def studentDashboard(request):
|
|||||||
temp_streak = 0
|
temp_streak = 0
|
||||||
|
|
||||||
# Recent Leave Requests
|
# Recent Leave Requests
|
||||||
recent_leaves = Student_Leave.objects.filter(
|
recent_leaves = Student_Leave.objects.filter(student=student).order_by(
|
||||||
student=student
|
"-created_at"
|
||||||
).order_by('-created_at')[:5]
|
)[:5]
|
||||||
|
|
||||||
# Recent Feedback
|
# Recent Feedback
|
||||||
recent_feedback = StudentFeedback.objects.filter(
|
recent_feedback = StudentFeedback.objects.filter(student=student).order_by(
|
||||||
student=student
|
"-created_at"
|
||||||
).order_by('-created_at')[:5]
|
)[:5]
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
**custom_admin_site.each_context(request), # This adds the admin context, including the sidebar.
|
**custom_admin_site.each_context(
|
||||||
'student': student,
|
request
|
||||||
'title': 'Student Dashboard',
|
), # This adds the admin context, including the sidebar.
|
||||||
|
"student": student,
|
||||||
|
"title": "Student Dashboard",
|
||||||
# Course Summary
|
# Course Summary
|
||||||
'course_summary': {
|
"course_summary": {
|
||||||
'total_courses': total_courses,
|
"total_courses": total_courses,
|
||||||
'completed_courses': completed_courses,
|
"completed_courses": completed_courses,
|
||||||
'ongoing_courses': in_progress_courses,
|
"ongoing_courses": in_progress_courses,
|
||||||
'completion_percentage': completion_percentage,
|
"completion_percentage": completion_percentage,
|
||||||
'details': course_details
|
"details": course_details,
|
||||||
},
|
},
|
||||||
|
|
||||||
# Attendance Summary
|
# Attendance Summary
|
||||||
'attendance_summary': {
|
"attendance_summary": {
|
||||||
'total_classes': total_classes,
|
"total_classes": total_classes,
|
||||||
'classes_attended': classes_attended,
|
"classes_attended": classes_attended,
|
||||||
'attendance_percentage': attendance_percentage,
|
"attendance_percentage": attendance_percentage,
|
||||||
'current_streak': current_streak,
|
"current_streak": current_streak,
|
||||||
'longest_streak': longest_streak
|
"longest_streak": longest_streak,
|
||||||
},
|
},
|
||||||
|
|
||||||
# Recent Activity
|
# Recent Activity
|
||||||
'recent_leaves': recent_leaves,
|
"recent_leaves": recent_leaves,
|
||||||
'recent_feedback': recent_feedback,
|
"recent_feedback": recent_feedback,
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'student_dashboard.html', context)
|
return render(request, "student_dashboard.html", context)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def teacherDashboard(request):
|
def teacherDashboard(request):
|
||||||
@@ -277,9 +301,8 @@ def teacherDashboard(request):
|
|||||||
|
|
||||||
# Get today's routines through attendance
|
# Get today's routines through attendance
|
||||||
today_routines = Routine.objects.filter(
|
today_routines = Routine.objects.filter(
|
||||||
teacher=teacher,
|
teacher=teacher, attendances__date=today
|
||||||
attendances__date=today
|
).order_by("start_time")
|
||||||
).order_by('start_time')
|
|
||||||
|
|
||||||
# Process routines to include status and attendance
|
# Process routines to include status and attendance
|
||||||
processed_routines = []
|
processed_routines = []
|
||||||
@@ -287,40 +310,48 @@ def teacherDashboard(request):
|
|||||||
attendance = routine.attendances.filter(date=today).first()
|
attendance = routine.attendances.filter(date=today).first()
|
||||||
|
|
||||||
total_students = StudentRoutine.objects.filter(routine=routine).count()
|
total_students = StudentRoutine.objects.filter(routine=routine).count()
|
||||||
attendance_count = 0 if not attendance else AttendanceRecord.objects.filter(
|
attendance_count = (
|
||||||
attendance=attendance,
|
0
|
||||||
student_attend=True
|
if not attendance
|
||||||
|
else AttendanceRecord.objects.filter(
|
||||||
|
attendance=attendance, student_attend=True
|
||||||
).count()
|
).count()
|
||||||
|
)
|
||||||
|
|
||||||
processed_routines.append({
|
processed_routines.append(
|
||||||
'name': routine.name,
|
{
|
||||||
'start_time': routine.start_time,
|
"name": routine.name,
|
||||||
'end_time': routine.end_time,
|
"start_time": routine.start_time,
|
||||||
'is_completed': routine.end_time < current_time,
|
"end_time": routine.end_time,
|
||||||
'is_ongoing': routine.start_time <= current_time <= routine.end_time,
|
"is_completed": routine.end_time < current_time,
|
||||||
'total_students': total_students,
|
"is_ongoing": routine.start_time <= current_time <= routine.end_time,
|
||||||
'attendance_count': attendance_count
|
"total_students": total_students,
|
||||||
})
|
"attendance_count": attendance_count,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# Calculate class statistics
|
# Calculate class statistics
|
||||||
total_classes = today_routines.count()
|
total_classes = today_routines.count()
|
||||||
completed_classes = len([r for r in processed_routines if r['is_completed']])
|
completed_classes = len([r for r in processed_routines if r["is_completed"]])
|
||||||
|
|
||||||
# Get student statistics
|
# Get student statistics
|
||||||
total_students = StudentRoutine.objects.filter(
|
total_students = (
|
||||||
routine__teacher=teacher
|
StudentRoutine.objects.filter(routine__teacher=teacher)
|
||||||
).values('student').distinct().count()
|
.values("student")
|
||||||
|
.distinct()
|
||||||
|
.count()
|
||||||
|
)
|
||||||
|
|
||||||
# Calculate present students for today
|
# Calculate present students for today
|
||||||
present_students = AttendanceRecord.objects.filter(
|
present_students = AttendanceRecord.objects.filter(
|
||||||
attendance__routine__teacher=teacher,
|
attendance__routine__teacher=teacher,
|
||||||
attendance__date=today,
|
attendance__date=today,
|
||||||
student_attend=True
|
student_attend=True,
|
||||||
).count()
|
).count()
|
||||||
|
|
||||||
# Get teacher's feedback statistics
|
# Get teacher's feedback statistics
|
||||||
feedback = StudentFeedback.objects.filter(teacher=teacher)
|
feedback = StudentFeedback.objects.filter(teacher=teacher)
|
||||||
avg_rating = feedback.aggregate(Avg('rating'))['rating__avg'] or 0
|
avg_rating = feedback.aggregate(Avg("rating"))["rating__avg"] or 0
|
||||||
avg_rating_rounded = int(avg_rating)
|
avg_rating_rounded = int(avg_rating)
|
||||||
remaining_stars = 5 - avg_rating_rounded
|
remaining_stars = 5 - avg_rating_rounded
|
||||||
|
|
||||||
@@ -331,36 +362,33 @@ def teacherDashboard(request):
|
|||||||
rejected_leaves = leaves.filter(status=2).count()
|
rejected_leaves = leaves.filter(status=2).count()
|
||||||
|
|
||||||
# Get recent activity
|
# Get recent activity
|
||||||
recent_leaves = leaves.order_by('-created_at')[:5]
|
recent_leaves = leaves.order_by("-created_at")[:5]
|
||||||
recent_feedback = feedback.order_by('-created_at')[:5]
|
recent_feedback = feedback.order_by("-created_at")[:5]
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
**custom_admin_site.each_context(request), # This adds the admin context, including the sidebar.
|
**custom_admin_site.each_context(
|
||||||
'teacher': teacher,
|
request
|
||||||
'title': 'Teacher Dashboard',
|
), # This adds the admin context, including the sidebar.
|
||||||
|
"teacher": teacher,
|
||||||
|
"title": "Teacher Dashboard",
|
||||||
# Class Statistics
|
# Class Statistics
|
||||||
'today_classes': total_classes,
|
"today_classes": total_classes,
|
||||||
'completed_classes': completed_classes,
|
"completed_classes": completed_classes,
|
||||||
'today_routines': processed_routines,
|
"today_routines": processed_routines,
|
||||||
|
|
||||||
# Student Statistics
|
# Student Statistics
|
||||||
'total_students': total_students,
|
"total_students": total_students,
|
||||||
'present_students': present_students,
|
"present_students": present_students,
|
||||||
|
|
||||||
# Feedback Statistics
|
# Feedback Statistics
|
||||||
'avg_rating': avg_rating,
|
"avg_rating": avg_rating,
|
||||||
'avg_rating_rounded': avg_rating_rounded,
|
"avg_rating_rounded": avg_rating_rounded,
|
||||||
'remaining_stars': remaining_stars,
|
"remaining_stars": remaining_stars,
|
||||||
|
|
||||||
# Leave Statistics
|
# Leave Statistics
|
||||||
'pending_leaves': pending_leaves,
|
"pending_leaves": pending_leaves,
|
||||||
'approved_leaves': approved_leaves,
|
"approved_leaves": approved_leaves,
|
||||||
'rejected_leaves': rejected_leaves,
|
"rejected_leaves": rejected_leaves,
|
||||||
|
|
||||||
# Recent Activity
|
# Recent Activity
|
||||||
'recent_leaves': recent_leaves,
|
"recent_leaves": recent_leaves,
|
||||||
'recent_feedback': recent_feedback,
|
"recent_feedback": recent_feedback,
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'teacher_dashboard.html', context)
|
return render(request, "teacher_dashboard.html", context)
|
||||||
Reference in new issue
Block a user