Files
Student-Management-System-I…/app/adminViews.py
T
2025-01-19 14:44:28 +05:45

725 lines
25 KiB
Python

import json
import requests
from django.contrib.admin import site
from django.contrib import messages
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
from app.models import (
Student,
Teacher,
Subject,
Course,
LeaveReportStudent,
LeaveReportTeacher,
Attendance,
AttendanceReport,
AcademicYear,
FeedbackStudent,
FeedbackTeacher,
)
from django.contrib.auth.decorators import login_required, user_passes_test
from app.forms import SubjectForm
admin_site = site
@login_required
@user_passes_test(lambda u: u.is_superuser)
def admin_home(request):
student_count1 = Student.objects.all().count()
teacher_count = Teacher.objects.all().count()
subject_count = Subject.objects.all().count()
course_count = Course.objects.all().count()
course_all = Course.objects.all()
course_name_list = []
subject_count_list = []
student_count_list_in_course = []
for course in course_all:
subjects = Subject.objects.filter(course_id=course.id).count()
students = Student.objects.filter(course_id=course.id).count()
course_name_list.append(course.name)
subject_count_list.append(subjects)
student_count_list_in_course.append(students)
# subjects_all = Subject.objects.all()
# subject_list = []
# student_count_list_in_subject = []
# for subject in subjects_all:
# course = subject.course
# student_count = Student.objects.filter(course_id=course.id).count()
# subject_list.append(subject.name)
# student_count_list_in_subject.append(student_count)
# teacher = Teacher.objects.all()
# attendance_present_list_teacher = []
# attendance_absent_list_teacher = []
# teacher_name_list = []
# for teacher in teacher:
# subject_ids = Subject.objects.filter(teacher=teacher).values_list(
# "id", flat=True
# )
# attendance = Attendance.objects.filter(
# subject_id__in=subject_ids,
# ).count()
# leaves = LeaveReportTeacher.objects.filter(
# teacher_id=teacher.id, leave_status=1
# ).count()
# attendance_present_list_teacher.append(attendance)
# attendance_absent_list_teacher.append(leaves)
# teacher_name_list.append(teacher.first_name)
# students_all = Student.objects.all()
# attendance_present_list_student = []
# attendance_absent_list_student = []
# student_name_list = []
# for student in students_all:
# attendance = AttendanceReport.objects.filter(
# student_id=student.id, status=True
# ).count()
# absent = AttendanceReport.objects.filter(
# student_id=student.id, status=False
# ).count()
# leaves = LeaveReportStudent.objects.filter(
# student_id=student.id, leave_status=1
# ).count()
# attendance_present_list_student.append(attendance)
# attendance_absent_list_student.append(leaves + absent)
# student_name_list.append(student.username)
context = {
**admin_site.each_context(request),
"title": "Admin Dashboard",
"student_count": student_count1,
"teacher_count": teacher_count,
"subject_count": subject_count,
"course_count": course_count,
# "course_name_list": course_name_list,
"subject_count_list": subject_count_list,
# "student_count_list_in_course": student_count_list_in_course,
# "student_count_list_in_subject": student_count_list_in_subject,
# "subject_list": subject_list,
# "teacher_name_list": teacher_name_list,
# "attendance_present_list_teacher": attendance_present_list_teacher,
# "attendance_absent_list_teacher": attendance_absent_list_teacher,
# "student_name_list": student_name_list,
# "attendance_present_list_student": attendance_present_list_student,
# "attendance_absent_list_student": attendance_absent_list_student,
"opts": Student._meta,
}
return render(request, "hod/dashboard.html", context)
def add_course(request):
admin_site = site
if request.method == "POST":
name = request.POST.get("name")
course_type = request.POST.get("course_type")
duration = request.POST.get("duration")
if not name or not course_type or not duration:
messages.error(request, "All fields are required!")
return redirect("add_course")
try:
duration = int(duration)
if duration <= 0:
raise ValueError
except ValueError:
messages.error(request, "Duration must be a positive number!")
return redirect("add_course")
if Course.objects.filter(name=name).exists():
messages.error(request, "A course with this name already exists.")
return redirect("add_course")
Course.objects.create(name=name, course_type=course_type, duration=duration)
messages.success(request, "Course added successfully!")
return redirect("add_course")
context = {
**admin_site.each_context(request),
"title": "Add Course",
"COURSE_TYPE_CHOICES": Course.COURSE_TYPE_CHOICES,
"opts": Course._meta,
}
return render(request, "hod/add_course.html", context)
def manage_course(request):
courses = Course.objects.all()
context = {
**admin_site.each_context(request),
"courses": courses,
"title": "Manage Courses",
"opts": Course._meta,
}
return render(request, "hod/manage_course.html", context)
def edit_course(request, course_id):
course = get_object_or_404(Course, id=course_id)
if request.method == "POST":
name = request.POST.get("name")
course_type = request.POST.get("course_type")
duration = request.POST.get("duration")
# Validate unique name if it changed
if name != course.name and Course.objects.filter(name=name).exists():
messages.error(request, "A course with this name already exists.")
return render(
request, "edit_course.html", {"course": course, "title": "Edit Course"}
)
try:
course.name = name
course.course_type = course_type
course.duration = duration
course.save()
messages.success(request, "Course updated successfully.")
return redirect("manage_course")
except Exception as e:
messages.error(request, f"Error updating course: {str(e)}")
context = {
**admin_site.each_context(request),
"title": "Edit Course",
"course": course,
}
return render(request, "hod/edit_course.html", context)
def delete_course(request, course_id):
course = Course.objects.get(id=course_id)
try:
course.delete()
messages.success(request, "Course Deleted Successfully.")
return redirect("manage_course")
except:
messages.error(request, "Failed to Delete Course.")
return redirect("manage_course")
def add_academicyear(request):
if request.method == "POST":
start_date = request.POST.get("start_date")
academic_year = AcademicYear.objects.create(start_date=start_date)
messages.success(request, "Academic Year added successfully.")
return redirect("manage_academicyear")
context = {
**admin_site.each_context(request),
"title": "Add Academic Year",
# "academic_year": academic_year,
"opts": AcademicYear._meta,
}
return render(request, "hod/add_academicyear.html", context)
def edit_academicyear(request, pk):
academic_year = get_object_or_404(AcademicYear, pk=pk)
if request.method == "POST":
start_date = request.POST.get("start_date")
if start_date:
academic_year.start_date = start_date
academic_year.save()
messages.success(request, "Academic Year updated successfully.")
return redirect("manage_academicyear")
else:
messages.error(request, "Please provide a valid start date.")
context = {
**admin_site.each_context(request),
"title": "Edit Academic Year",
"opts": AcademicYear._meta,
}
return render(request, "hod/edit_academicyear.html", context)
def manage_academicyear(request):
context = {
**admin_site.each_context(request),
"academic_years": AcademicYear.objects.all(),
"title": "Manage Academic Year",
"opts": AcademicYear._meta,
}
return render(request, "hod/manage_academicyear.html", context)
def delete_academicyear(request, academic_year_id):
academic_year = AcademicYear.objects.get(id=academic_year_id)
try:
academic_year.delete()
messages.success(request, "AcademicYear Deleted Successfully.")
return redirect("manage_academicyear")
except:
messages.error(request, "Failed to Delete AcademicYear.")
return redirect("manage_academicyear")
def manage_subjects(request):
subjects = Subject.objects.all()
courses = Course.objects.all()
selected_course_id = request.GET.get("course")
selected_duration = request.GET.get("duration", "")
if selected_course_id and selected_duration:
subjects = Subject.objects.filter(
course_id=selected_course_id, duration=selected_duration
)
elif selected_course_id:
subjects = Subject.objects.filter(course_id=selected_course_id)
elif selected_duration:
subjects = Subject.objects.filter(duration=selected_duration)
else:
subjects = Subject.objects.all()
context = {
**admin_site.each_context(request),
"subjects": subjects,
"selected_course_id": selected_course_id,
"selected_duration": selected_duration,
"title": "Manage Subjects",
"courses": courses,
"opts": Subject._meta,
}
return render(request, "hod/manage_subject.html", context)
def add_subject(request):
courses = Course.objects.all()
if request.method == "POST":
form = SubjectForm(request.POST)
if form.is_valid():
form.save()
return redirect("manage_subjects")
else:
form = SubjectForm()
context = {
**admin_site.each_context(request),
"title": "Add Subject",
"courses": courses,
"form": form,
"opts": Subject._meta,
}
return render(request, "hod/add_subject.html", context)
def edit_subject(request, pk):
subject = get_object_or_404(Subject, pk=pk)
courses = Course.objects.all()
if request.method == "POST":
form = SubjectForm(request.POST, instance=subject)
if form.is_valid():
form.save()
return redirect("manage_subject")
else:
form = SubjectForm(instance=subject)
context = {
**admin_site.each_context(request),
"title": "Add Subject",
"courses": courses,
"form": form,
"opts": Subject._meta,
}
return render(request, "hod/edit_subject.html", context)
def delete_subject(request, subject_id):
subject = Subject.objects.get(id=subject_id)
try:
subject.delete()
messages.success(request, "Subject Deleted Successfully.")
return redirect("manage_subject")
except:
messages.error(request, "Failed to Delete Subject.")
return redirect("manage_subject")
def manage_student(request):
search_query = request.GET.get("search", "")
students = Student.objects.all()
if search_query:
students = (
students.filter(first_name__icontains=search_query)
| students.filter(last_name__icontains=search_query)
| students.filter(email__icontains=search_query)
)
context = {
**admin_site.each_context(request),
"title": "Manage Students",
"students": students,
"search_query": search_query,
}
return render(request, "hod/manage_student.html", context)
def add_student(request):
courses = Course.objects.all()
academic_years = AcademicYear.objects.all()
occupation_choices = dict(Student.occupation_choice)
relationship_choices = dict(Student.relationship_choice)
if request.method == "POST":
first_name = request.POST.get("first_name")
middle_name = request.POST.get("middle_name")
last_name = request.POST.get("last_name")
email = request.POST.get("email")
phone = request.POST.get("phone")
dob = request.POST.get("dob")
gender = request.POST.get("gender")
course_id = request.POST.get("course")
academic_year_id = request.POST.get("academic_year")
address = request.POST.get("address")
father_name = request.POST.get("father_name")
father_occupation = request.POST.get("father_occupation")
mother_name = request.POST.get("mother_name")
mother_occupation = request.POST.get("mother_occupation")
guardian_name = request.POST.get("guardian_name")
guardian_number = request.POST.get("guardian_number")
parents_number = request.POST.get("parents_number")
relationship_with_student = request.POST.get("relationship_with_student")
try:
course = get_object_or_404(Course, id=course_id)
academic_year = get_object_or_404(AcademicYear, id=academic_year_id)
Student.objects.create(
first_name=first_name,
middle_name=middle_name,
last_name=last_name,
email=email,
phone=phone,
dob=dob,
gender=gender,
course=course,
academic_year=academic_year,
address=address,
father_name=father_name,
father_occupation=father_occupation,
mother_name=mother_name,
mother_occupation=mother_occupation,
guardian_name=guardian_name,
guardian_number=guardian_number,
parents_number=parents_number,
relationship_with_student=relationship_with_student,
)
messages.success(request, "Student added successfully!")
return redirect("manage_student")
except Exception as e:
messages.error(request, f"Error adding student: {e}")
context = {
**admin_site.each_context(request),
"title": "Add Student",
"courses": courses,
"academic_years": academic_years,
"occupation_choices": occupation_choices.items(),
"relationship_choices": relationship_choices.items(),
}
return render(request, "hod/add_student.html", context)
def edit_student(request, student_id):
student = get_object_or_404(Student, id=student_id)
courses = Course.objects.all()
academic_years = AcademicYear.objects.all()
occupation_choices = dict(Student.occupation_choice)
relationship_choices = dict(Student.relationship_choice)
if request.method == "POST":
student.first_name = request.POST.get("first_name")
student.middle_name = request.POST.get("middle_name")
student.last_name = request.POST.get("last_name")
student.email = request.POST.get("email")
student.phone = request.POST.get("phone")
student.dob = request.POST.get("dob")
student.gender = request.POST.get("gender")
student.course = get_object_or_404(Course, id=request.POST.get("course"))
student.academic_year = get_object_or_404(
AcademicYear, id=request.POST.get("academic_year")
)
student.father_occupation = request.POST.get("father_occupation")
student.relationship_with_student = request.POST.get(
"relationship_with_student"
)
try:
student.save()
messages.success(request, "Student updated successfully!")
return redirect("manage_student")
except Exception as e:
messages.error(request, f"Error updating student: {e}")
context = {
**admin_site.each_context(request),
"title": "Edit Student",
"student": student,
"courses": courses,
"academic_years": academic_years,
"occupation_choices": occupation_choices.items(),
"relationship_choices": relationship_choices.items(),
}
return render(request, "hod/edit_student.html", context)
def delete_student(request, student_id):
student = get_object_or_404(Student, id=student_id)
student.delete()
messages.success(request, "Student deleted successfully!")
return redirect("manage_student")
def manage_teacher(request):
teachers = Teacher.objects.all()
context = {
**admin_site.each_context(request),
"title": "Manage Teachers",
"teachers": teachers,
}
return render(request, "hod/manage_teacher.html", context)
def add_teacher(request):
if request.method == "POST":
try:
Teacher.objects.create(
first_name=request.POST.get("first_name"),
middle_name=request.POST.get("middle_name"),
last_name=request.POST.get("last_name"),
email=request.POST.get("email"),
phone=request.POST.get("phone"),
dob=request.POST.get("dob"),
gender=request.POST.get("gender"),
address=request.POST.get("address"),
# username=request.POST.get("username"),
# password=request.POST.get("password"),
qualification=request.POST.get("qualification"),
specialization_on=request.POST.get("specialization_on"),
marital_status=request.POST.get("marital_status"),
date_of_joining=request.POST.get("date_of_joining"),
)
messages.success(request, "Teacher added successfully!")
return redirect("manage_teacher")
except Exception as e:
messages.error(request, f"Error adding teacher: {e}")
context = {
**admin_site.each_context(request),
"title": "Add Teacher",
"qualification_choices": dict(Teacher.qualification_choice).items(),
"marital_status_choices": dict(Teacher.marital_status_choice).items(),
}
return render(request, "hod/add_teacher.html", context)
def edit_teacher(request, teacher_id):
teacher = get_object_or_404(Teacher, id=teacher_id)
if request.method == "POST":
try:
teacher.first_name = request.POST.get("first_name")
teacher.middle_name = request.POST.get("middle_name")
teacher.last_name = request.POST.get("last_name")
teacher.email = request.POST.get("email")
teacher.phone = request.POST.get("phone")
teacher.dob = request.POST.get("dob")
teacher.gender = request.POST.get("gender")
teacher.address = request.POST.get("address")
teacher.qualification = request.POST.get("qualification")
teacher.specialization_on = request.POST.get("specialization_on")
teacher.marital_status = request.POST.get("marital_status")
teacher.date_of_joining = request.POST.get("date_of_joining")
teacher.save()
messages.success(request, "Teacher updated successfully!")
return redirect("manage_teacher")
except Exception as e:
messages.error(request, f"Error updating teacher: {e}")
context = {
**admin_site.each_context(request),
"title": "Edit Teacher",
"teacher": teacher,
"qualification_choices": dict(Teacher.qualification_choice).items(),
"marital_status_choices": dict(Teacher.marital_status_choice).items(),
}
return render(request, "hod/edit_teacher.html", context)
def delete_teacher(request, teacher_id):
teacher = get_object_or_404(Teacher, id=teacher_id)
teacher.delete()
messages.success(request, "Teacher deleted successfully!")
return redirect("manage_teacher")
def student_feedback_message(request):
feedbacks = FeedbackStudent.objects.all()
context = {
**admin_site.each_context(request),
"title": "Student's Feedback",
"feedbacks": feedbacks,
}
return render(request, "hod/student_feedback.html", context)
@csrf_exempt
def student_feedback_message_reply(request):
feedback_id = request.POST.get("id")
feedback_reply = request.POST.get("reply")
try:
feedback = FeedbackStudent.objects.get(id=feedback_id)
feedback.feedback_reply = feedback_reply
feedback.save()
return HttpResponse("True")
except:
return HttpResponse("False")
def teacher_feedback(request):
feedbacks = FeedbackTeacher.objects.all()
context = {
**admin_site.each_context(request),
"title": "Staff's Feedback",
"feedbacks": feedbacks,
}
return render(request, "hod/teacher_feedback.html", context)
@csrf_exempt
def teacher_feedback_replied(request):
feedback_id = request.POST.get("id")
feedback_message = request.POST.get("message")
try:
feedback = FeedbackTeacher.objects.get(id=feedback_id)
feedback.feedback_reply = feedback_message
feedback.save()
return HttpResponse("True")
except Exception:
return HttpResponse("False")
def student_leave_view(request):
leaves = LeaveReportStudent.objects.all()
context = {
**admin_site.each_context(request),
"title": "Student Application",
"leaves": leaves,
}
return render(request, "hod/student_leave_view.html", context)
def student_leave_approve(request, leave_id):
leave = LeaveReportStudent.objects.get(id=leave_id)
leave.leave_status = 1
leave.save()
return HttpResponseRedirect(reverse("student_leave_view"))
def student_leave_reject(request, leave_id):
leave = LeaveReportStudent.objects.get(id=leave_id)
leave.leave_status = 2
leave.save()
return HttpResponseRedirect(reverse("student_leave_view"))
def teacher_leave_view(request):
leaves = LeaveReportTeacher.objects.all()
context = {
**admin_site.each_context(request),
"title": "Teacher Application",
"leaves": leaves,
}
return render(request, "hod/teacher_leave_view.html", context)
def teacher_leave_approve(request, leave_id):
leave = LeaveReportTeacher.objects.get(id=leave_id)
leave.leave_status = 1
leave.save()
return HttpResponseRedirect(reverse("teacher_leave_view"))
def teacher_leave_reject(request, leave_id):
leave = LeaveReportTeacher.objects.get(id=leave_id)
leave.leave_status = 2
leave.save()
return HttpResponseRedirect(reverse("teacher_leave_view"))
def admin_view_attendance(request):
subjects = Subject.objects.all()
academic_years = AcademicYear.objects.all()
context = {
**admin_site.each_context(request),
"subjects": subjects,
"academic_years": academic_years,
}
return render(request, "hod/view_attendance.html", context)
@csrf_exempt
def admin_get_attendance_dates(request):
# Getting Values from Ajax POST 'Fetch Student'
subject_id = request.POST.get("subject")
academic_year = request.POST.get("academic_year_id")
# Students enroll to Course, Course has Subjects
# Getting all data from subject model based on subject_id
subject_model = Subject.objects.get(id=subject_id)
academic_model = AcademicYear.objects.get(id=academic_year)
# students = Students.objects.filter(course_id=subject_model.course_id, session_year_id=session_model)
attendance = Attendance.objects.filter(
subject_id=subject_model, academic_year_id=academic_model
)
# Only Passing Student Id and Student Name Only
list_data = []
for attendance_single in attendance:
data_small = {
"id": attendance_single.id,
"attendance_date": str(attendance_single.attendance_date),
"academic_year_id": attendance_single.academic_year_id.id,
}
list_data.append(data_small)
return JsonResponse(
json.dumps(list_data), content_type="application/json", safe=False
)
@csrf_exempt
def admin_get_attendance_student(request):
# Getting Values from Ajax POST 'Fetch Student'
attendance_date = request.POST.get("attendance_date")
attendance = Attendance.objects.get(id=attendance_date)
attendance_data = AttendanceReport.objects.filter(attendance_id=attendance)
# Only Passing Student Id and Student Name Only
list_data = []
for student in attendance_data:
data_small = {
"id": student.student_id.id,
"name": student.student_id.first_name + " " + student.student_id.last_name,
"status": student.status,
}
list_data.append(data_small)
return JsonResponse(
json.dumps(list_data), content_type="application/json", safe=False
)