2023-01-12 23:17:10 +03:00

478 lines
17 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.db.models import Sum, Avg, Max, Min, Count
from django.contrib.auth.decorators import login_required
from django.views.generic import CreateView
from django.core.paginator import Paginator
from django.conf import settings
from django.utils.decorators import method_decorator
from django.views.generic import ListView
from accounts.models import User, Student
from app.models import Session, Semester
from result.models import TakenCourse
from accounts.decorators import lecturer_required, student_required
from .forms import (
ProgramForm, CourseAddForm, CourseAllocationForm,
EditCourseAllocationForm, UploadFormFile, UploadFormVideo
)
from .models import Program, Course, CourseAllocation, Upload, UploadVideo
from coursemanagement.models import CourseSetting
# ########################################################
# Program views
# ########################################################
@login_required
def program_view(request):
programs = Program.objects.all()
program_filter = request.GET.get('program_filter')
if program_filter:
programs = Program.objects.filter(title__icontains=program_filter)
return render(request, 'course/program_list.html', {
'title': "Programs | DjangoSMS",
'programs': programs,
})
@login_required
@lecturer_required
def program_add(request):
if request.method == 'POST':
form = ProgramForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, request.POST.get('title') + ' program has been created.')
return redirect('programs')
else:
messages.error(request, 'Correct the error(S) below.')
else:
form = ProgramForm()
return render(request, 'course/program_add.html', {
'title': "Add Program | DjangoSMS",
'form': form,
})
@login_required
def program_detail(request, pk):
program = Program.objects.get(pk=pk)
courses = Course.objects.filter(program_id=pk).order_by('-year')
credits = Course.objects.aggregate(Sum('credit'))
paginator = Paginator(courses, 10)
page = request.GET.get('page')
courses = paginator.get_page(page)
return render(request, 'course/program_single.html', {
'title': program.title,
'program': program, 'courses': courses, 'credits': credits
}, )
@login_required
@lecturer_required
def program_edit(request, pk):
program = Program.objects.get(pk=pk)
if request.method == 'POST':
form = ProgramForm(request.POST, instance=program)
if form.is_valid():
form.save()
messages.success(request, str(request.POST.get('title')) + ' program has been updated.')
return redirect('programs')
else:
form = ProgramForm(instance=program)
return render(request, 'course/program_add.html', {
'title': "Edit Program | DjangoSMS",
'form': form
})
@login_required
@lecturer_required
def program_delete(request, pk):
program = Program.objects.get(pk=pk)
title = program.title
program.delete()
messages.success(request, 'Program ' + title + ' has been deleted.')
return redirect('programs')
# ########################################################
# ########################################################
# Course views
# ########################################################
@login_required
def course_single(request, slug):
course = Course.objects.get(slug=slug)
files = Upload.objects.filter(course__slug=slug)
videos = UploadVideo.objects.filter(course__slug=slug)
# lecturers = User.objects.filter(allocated_lecturer__pk=course.id)
lecturers = CourseAllocation.objects.filter(courses__pk=course.id)
return render(request, 'course/course_single.html', {
'title': course.title,
'course': course,
'files': files,
'videos': videos,
'lecturers': lecturers,
'media_url': settings.MEDIA_ROOT,
}, )
@login_required
@lecturer_required
def course_add(request, pk):
users = User.objects.all()
if request.method == 'POST':
form = CourseAddForm(request.POST)
course_name = request.POST.get('title')
course_code = request.POST.get('code')
if form.is_valid():
form.save()
messages.success(request, (course_name + '(' + course_code + ')' + ' has been created.'))
return redirect('program_detail', pk=request.POST.get('program'))
else:
messages.error(request, 'Correct the error(s) below.')
else:
form = CourseAddForm(initial={'program': Program.objects.get(pk=pk)})
return render(request, 'course/course_add.html', {
'title': "Add Course | DjangoSMS",
'form': form, 'program': pk, 'users': users
}, )
@login_required
@lecturer_required
def course_edit(request, slug):
course = get_object_or_404(Course, slug=slug)
if request.method == 'POST':
form = CourseAddForm(request.POST, instance=course)
course_name = request.POST.get('title')
course_code = request.POST.get('code')
if form.is_valid():
form.save()
messages.success(request, (course_name + '(' + course_code + ')' + ' has been updated.'))
return redirect('program_detail', pk=request.POST.get('program'))
else:
messages.error(request, 'Correct the error(s) below.')
else:
form = CourseAddForm(instance=course)
return render(request, 'course/course_add.html', {
'title': "Edit Course | DjangoSMS",
# 'form': form, 'program': pk, 'course': pk
'form': form
}, )
@login_required
@lecturer_required
def course_delete(request, slug):
course = Course.objects.get(slug=slug)
# course_name = course.title
course.delete()
messages.success(request, 'Course ' + course.title + ' has been deleted.')
return redirect('program_detail', pk=course.program.id)
# ########################################################
# ########################################################
# Course Allocation
# ########################################################
@method_decorator([login_required], name='dispatch')
class CourseAllocationFormView(CreateView):
form_class = CourseAllocationForm
template_name = 'course/course_allocation_form.html'
def get_form_kwargs(self):
kwargs = super(CourseAllocationFormView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self, form):
# if a staff has been allocated a course before update it else create new
lecturer = form.cleaned_data['lecturer']
selected_courses = form.cleaned_data['courses']
courses = ()
for course in selected_courses:
courses += (course.pk,)
# print(courses)
try:
a = CourseAllocation.objects.get(lecturer=lecturer)
except:
a = CourseAllocation.objects.create(lecturer=lecturer)
for i in range(0, selected_courses.count()):
a.courses.add(courses[i])
a.save()
return redirect('course_allocation_view')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = "Assign Course | DjangoSMS"
return context
@login_required
def course_allocation_view(request):
allocated_courses = CourseAllocation.objects.all()
return render(request, 'course/course_allocation_view.html', {
'title': "Course Allocations | DjangoSMS",
"allocated_courses": allocated_courses
})
@login_required
@lecturer_required
def edit_allocated_course(request, pk):
allocated = get_object_or_404(CourseAllocation, pk=pk)
if request.method == 'POST':
form = EditCourseAllocationForm(request.POST, instance=allocated)
if form.is_valid():
form.save()
messages.success(request, 'course assigned has been updated.')
return redirect('course_allocation_view')
else:
form = EditCourseAllocationForm(instance=allocated)
return render(request, 'course/course_allocation_form.html', {
'title': "Edit Course Allocated | DjangoSMS",
'form': form, 'allocated': pk
}, )
@login_required
@lecturer_required
def deallocate_course(request, pk):
course = CourseAllocation.objects.get(pk=pk)
course.delete()
messages.success(request, 'successfully deallocate!')
return redirect("course_allocation_view")
# ########################################################
# ########################################################
# File Upload views
# ########################################################
@login_required
@lecturer_required
def handle_file_upload(request, slug):
course = Course.objects.get(slug=slug)
if request.method == 'POST':
form = UploadFormFile(request.POST, request.FILES, {'course': course})
# file_name = request.POST.get('name')
if form.is_valid():
form.save()
messages.success(request, (request.POST.get('title') + ' has been uploaded.'))
return redirect('course_detail', slug=slug)
else:
form = UploadFormFile()
return render(request, 'upload/upload_file_form.html', {
'title': "File Upload | DjangoSMS",
'form': form, 'course': course
})
@login_required
@lecturer_required
def handle_file_edit(request, slug, file_id):
course = Course.objects.get(slug=slug)
instance = Upload.objects.get(pk=file_id)
if request.method == 'POST':
form = UploadFormFile(request.POST, request.FILES, instance=instance)
# file_name = request.POST.get('name')
if form.is_valid():
form.save()
messages.success(request, (request.POST.get('title') + ' has been updated.'))
return redirect('course_detail', slug=slug)
else:
form = UploadFormFile(instance=instance)
return render(request, 'upload/upload_file_form.html', {
'title': instance.title,
'form': form, 'course': course})
def handle_file_delete(request, slug, file_id):
file = Upload.objects.get(pk=file_id)
# file_name = file.name
file.delete()
messages.success(request, (file.title + ' has been deleted.'))
return redirect('course_detail', slug=slug)
# ########################################################
# Video Upload views
# ########################################################
@login_required
@lecturer_required
def handle_video_upload(request, slug):
course = Course.objects.get(slug=slug)
if request.method == 'POST':
form = UploadFormVideo(request.POST, request.FILES, {'course': course})
if form.is_valid():
form.save()
messages.success(request, (request.POST.get('title') + ' has been uploaded.'))
return redirect('course_detail', slug=slug)
else:
form = UploadFormVideo()
return render(request, 'upload/upload_video_form.html', {
'title': "Video Upload | DjangoSMS",
'form': form, 'course': course
})
@login_required
# @lecturer_required
def handle_video_single(request, slug, video_slug):
course = get_object_or_404(Course, slug=slug)
video = get_object_or_404(UploadVideo, slug=video_slug)
return render(request, 'upload/video_single.html', {'video': video})
@login_required
@lecturer_required
def handle_video_edit(request, slug, video_slug):
course = Course.objects.get(slug=slug)
instance = UploadVideo.objects.get(slug=video_slug)
if request.method == 'POST':
form = UploadFormVideo(request.POST, request.FILES, instance=instance)
if form.is_valid():
form.save()
messages.success(request, (request.POST.get('title') + ' has been updated.'))
return redirect('course_detail', slug=slug)
else:
form = UploadFormVideo(instance=instance)
return render(request, 'upload/upload_video_form.html', {
'title': instance.title,
'form': form, 'course': course})
def handle_video_delete(request, slug, video_slug):
video = get_object_or_404(UploadVideo, slug=video_slug)
# video = UploadVideo.objects.get(slug=video_slug)
video.delete()
messages.success(request, (video.title + ' has been deleted.'))
return redirect('course_detail', slug=slug)
# ########################################################
# ########################################################
# Course Registration
# ########################################################
@login_required
@student_required
def course_registration(request):
if request.method == 'POST':
ids = ()
data = request.POST.copy()
data.pop('csrfmiddlewaretoken', None) # remove csrf_token
for key in data.keys():
ids = ids + (str(key),)
for s in range(0, len(ids)):
student = Student.objects.get(student__pk=request.user.id)
course = Course.objects.get(pk=ids[s])
obj = TakenCourse.objects.create(student=student, course=course)
obj.save()
messages.success(request, 'Courses Registered Successfully!')
return redirect('course_registration')
else:
# student = Student.objects.get(student__pk=request.user.id)
student = get_object_or_404(Student, student__id=request.user.id)
taken_courses = TakenCourse.objects.filter(student__student__id=request.user.id)
t = ()
for i in taken_courses:
t += (i.course.pk,)
current_semester = Semester.objects.get(is_current_semester=True)
courses = Course.objects.filter(program__pk=student.department.id, level=student.level, semester=current_semester
).exclude(id__in=t).order_by('year')
all_courses = Course.objects.filter(level=student.level, program__pk=student.department.id)
no_course_is_registered = False # Check if no course is registered
all_courses_are_registered = False
registered_courses = Course.objects.filter(level=student.level).filter(id__in=t)
if registered_courses.count() == 0: # Check if number of registered courses is 0
no_course_is_registered = True
if registered_courses.count() == all_courses.count():
all_courses_are_registered = True
total_first_semester_credit = 0
total_sec_semester_credit = 0
total_registered_credit = 0
for i in courses:
if i.semester == "First":
total_first_semester_credit += int(i.credit)
if i.semester == "Second":
total_sec_semester_credit += int(i.credit)
for i in registered_courses:
total_registered_credit += int(i.credit)
context = {
"is_calender_on": True,
"all_courses_are_registered": all_courses_are_registered,
"no_course_is_registered": no_course_is_registered,
"current_semester": current_semester,
"courses": courses,
"total_first_semester_credit": total_first_semester_credit,
"total_sec_semester_credit": total_sec_semester_credit,
"registered_courses": registered_courses,
"total_registered_credit": total_registered_credit,
"student": student,
}
return render(request, 'course/course_registration.html', context)
@login_required
@student_required
def course_drop(request):
if request.method == 'POST':
ids = ()
data = request.POST.copy()
data.pop('csrfmiddlewaretoken', None) # remove csrf_token
for key in data.keys():
ids = ids + (str(key),)
for s in range(0, len(ids)):
student = Student.objects.get(student__pk=request.user.id)
course = Course.objects.get(pk=ids[s])
obj = TakenCourse.objects.get(student=student, course=course)
obj.delete()
messages.success(request, 'Successfully Dropped!')
return redirect('course_registration')
# ########################################################
@login_required
def user_course_list(request):
if request.user.is_lecturer:
courses = Course.objects.filter(allocated_course__lecturer__pk=request.user.id)
return render(request, 'course/user_course_list.html', {'courses': courses})
elif request.user.is_student:
student = Student.objects.get(student__pk=request.user.id)
taken_courses = TakenCourse.objects.filter(student__student__id=student.student.id)
courses = Course.objects.filter(level=student.level).filter(program__pk=student.department.id)
return render(request, 'course/user_course_list.html', {
'student': student,
'taken_courses': taken_courses,
'courses': courses
})
else:
return render(request, 'course/user_course_list.html')