from django.shortcuts import render, redirect, get_object_or_404
from django.core.paginator import Paginator
from django.contrib.auth.decorators import login_required
from .models import *
# from account.models import Person
from.filters import *
from .forms import *
from django.contrib import messages
from account.models import Person
from django.db.models import Sum

@login_required
def showAdminEarlys(request):
    if request.user.role == "Admin":
        context = {}
        filtered_earlys = EarlyFilter(
            request.GET,
            queryset = Early.objects.all()
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/admin_earlys.html', context=context)
    else:
        return redirect('index')

@login_required
def showAdminGrades(request):
    if request.user.role == "Admin":
        context = {}
        filtered_earlys = GradeFilter(
            request.GET,
            queryset = Grade.objects.all()
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/admin_grades.html', context=context)
    else:
        return redirect('index')

@login_required
def showAdminSecondarys(request):
    if request.user.role == "Admin":
        context = {}
        filtered_earlys = SecondaryFilter(
            request.GET,
            queryset = Secondary.objects.all()
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/admin_secondarys.html', context=context)
    else:
        return redirect('index')

@login_required
def showAdminEarlyResults(request):
    if request.user.role == "Admin":
        context = {}
        filtered_earlys = EarlyFilter(
            request.GET,
            queryset = Early.objects.filter(value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/admin_early_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showAdminGradeResults(request):
    if request.user.role == "Admin":
        context = {}
        filtered_earlys = GradeFilter(
            request.GET,
            queryset = Grade.objects.filter(value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/admin_grade_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showAdminSecondaryResults(request):
    if request.user.role == "Admin":
        context = {}
        filtered_earlys = SecondaryFilter(
            request.GET,
            queryset = Secondary.objects.filter(value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/admin_secondary_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showAdminEarlyReport(request, id):
    if request.user.role=="Admin":
        early = Early.objects.get(id=id)
        student = early.student
        term = early.term
        firsts = Early.objects.all()
        class_students_count = Person.objects.filter(classe=student.classe).count()
        firsts_student = Early.objects.filter(term=term, student=student).order_by('subject__subject')
        firsts_student2 = Early.objects.filter(term=term, student=student).order_by('-total')
        obtainable = Early.objects.filter(term=term, student=student).count()
        obtainable = 100 * obtainable
        teacher_comment = early.teacher_comment
        head_comment = early.head_comment
        response_first = []
        response_first_student = []
        for each in firsts:
            class_students = Early.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
            response_first.append(each)
        subjects_list = [""]
        subjects_total_list = [0]
        for each in firsts_student:
            response_first_student.append(each)
        for each in firsts_student2:
            subjects_list.append(each.subject.subject)
            subjects_total_list.append(each.total)

        number_absent = term.number - early.number_present

        return render(request, 'result/early_admin_report.html', {'firsts':response_first,
        'firsts_student':response_first_student, 'class_students_count':class_students_count,
        'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
        'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showStaffEarlys(request):
    if request.user.role == "Staff":
        context = {}
        filtered_earlys = EarlyFilter(
            request.GET,
            queryset = Early.objects.filter(subject__teacher=request.user)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/staff_earlys.html', context=context)
    else:
        return redirect('index')

@login_required
def showStaffGrades(request):
    if request.user.role == "Staff":
        context = {}
        filtered_earlys = GradeFilter(
            request.GET,
            queryset = Grade.objects.filter(subject__teacher=request.user)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/staff_grades.html', context=context)
    else:
        return redirect('index')

@login_required
def showStaffSecondarys(request):
    if request.user.role == "Staff":
        context = {}
        filtered_earlys = SecondaryFilter(
            request.GET,
            queryset = Secondary.objects.filter(subject__teacher=request.user)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/staff_secondarys.html', context=context)
    else:
        return redirect('index')

@login_required
def showStaffEarlyResults(request):
    if request.user.role == "Staff":
        context = {}
        filtered_earlys = EarlyFilter(
            request.GET,
            queryset = Early.objects.filter(student__classe__teacher=request.user, value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/staff_early_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showStaffGradeResults(request):
    if request.user.role == "Staff":
        context = {}
        filtered_earlys = GradeFilter(
            request.GET,
            queryset = Grade.objects.filter(student__classe__teacher=request.user, value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/staff_grade_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showStaffSecondaryResults(request):
    if request.user.role == "Staff":
        context = {}
        filtered_earlys = SecondaryFilter(
            request.GET,
            queryset = Secondary.objects.filter(student__classe__teacher=request.user, value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/staff_secondary_results.html', context=context)
    else:
        return redirect('index')

@login_required
def updateStaffEarly(request, id):
    if request.user.role == "Staff":
        early = Early.objects.get(id=id)
        if early.subject.teacher == request.user:
            form = EarlyForm(instance=early)
            if request.method=='POST':
                form = EarlyForm(request.POST, instance=early)
                if form.is_valid():
                    term = form.cleaned_data.get('term')
                    student = form.cleaned_data.get('student')
                    subject = form.cleaned_data.get('subject')
                    form.save()

                    class_students_count = Person.objects.filter(classe=student.classe).count()
                    reg = Early.objects.get(term=term, student=student, subject=subject)
                    if reg.subject.teacher != request.user:
                        messages.error(request, "You cannot record a score for " + str(subject) + " because you were not assigned as the subject's teacher")
                    else:
                        reg.student = student
                        teacher = request.user
                        student_first_name = student.first_name
                        old_total = reg.total
                        new_total = reg.test + reg.test2 + reg.exam
                        reg.total = new_total
                        reg.save()
                        reg1 = Early.objects.get(term=term, student=student, subject=subject)
                        reg1.subject_total = reg1.subject_total - old_total
                        reg1.save()
                        reg2 = Early.objects.get(term=term, student=student, subject=subject)
                        reg2.subject_total = reg2.subject_total + new_total
                        reg2.save()
                        reg3 = Early.objects.get(term=term, student=student, subject=subject)
                        reg4 = Early.objects.filter(term=term, subject=subject).order_by('-total')
                        n = reg4.count()
                        d = round((reg3.subject_total/n),2)
                        subject_position = []
                        subject_pos = 0

                        for each in reg4:
                            each.subject_total = reg3.subject_total
                            each.subject_avg = d
                            each.grade = reg3.grade()
                            each.save()

                        for each in reg4:
                            subject_position.append(each.total)

                        for i in range(len(subject_position)):
                            for each in reg4:
                                temp = subject_position.index(each.total)
                                each.subject_pos = temp + 1
                                each.save()

                        reg6 = Early.objects.filter(term=term, student=student)
                        m = reg6.count()
                        all_total = Early.objects.filter(term=term, student=student).aggregate(Sum('total'))['total__sum']
                        cum_perc = round((all_total/m),2)
                        for each in reg6:
                            each.cumulative = all_total
                            each.cum_perc = cum_perc
                            each.static_class = str(each.student.classe)
                            each.static_class_teacher = str(each.student.classe.teacher.first_name) + " " + str(each.student.classe.teacher.last_name)
                            each.static_head_teacher = str(each.term.head.first_name) + " " + str(each.term.head.last_name)
                            each.static_teacher_signature = each.student.classe.signature
                            each.static_student_image = each.student.photograph
                            each.static_age = each.student.age()
                            each.static_number_in_class = class_students_count
                            each.save()

                    messages.success(request, str(student_first_name) + "'s score has been modified successfully")
                    return redirect('staff_earlys')
            return render(request, 'result/early_update.html', {'form': form, 'early': early})
        else:
            return redirect('index')
    else:
        return redirect('index')

@login_required
def updateStaffGrade(request, id):
    if request.user.role == "Staff":
        early = Grade.objects.get(id=id)
        if early.subject.teacher == request.user:
            form = GradeForm(instance=early)
            if request.method=='POST':
                form = GradeForm(request.POST, instance=early)
                if form.is_valid():
                    term = form.cleaned_data.get('term')
                    student = form.cleaned_data.get('student')
                    subject = form.cleaned_data.get('subject')
                    form.save()

                    class_students_count = Person.objects.filter(classe=student.classe).count()
                    reg = Grade.objects.get(term=term, student=student, subject=subject)
                    if reg.subject.teacher != request.user:
                        messages.error(request, "You cannot record a score for " + str(subject) + " because you were not assigned as the subject's teacher")
                    else:
                        reg.student = student
                        teacher = request.user
                        student_first_name = student.first_name
                        old_total = reg.total
                        new_total = reg.test + reg.test2 + reg.exam
                        reg.total = new_total
                        reg.save()
                        reg1 = Grade.objects.get(term=term, student=student, subject=subject)
                        reg1.subject_total = reg1.subject_total - old_total
                        reg1.save()
                        reg2 = Grade.objects.get(term=term, student=student, subject=subject)
                        reg2.subject_total = reg2.subject_total + new_total
                        reg2.save()
                        reg3 = Grade.objects.get(term=term, student=student, subject=subject)
                        reg4 = Grade.objects.filter(term=term, subject=subject).order_by('-total')
                        n = reg4.count()
                        d = round((reg3.subject_total/n),2)
                        subject_position = []
                        subject_pos = 0

                        for each in reg4:
                            each.subject_total = reg3.subject_total
                            each.subject_avg = d
                            each.grade = reg3.grade()
                            each.save()

                        for each in reg4:
                            subject_position.append(each.total)

                        for i in range(len(subject_position)):
                            for each in reg4:
                                temp = subject_position.index(each.total)
                                each.subject_pos = temp + 1
                                each.save()

                        reg6 = Grade.objects.filter(term=term, student=student)
                        m = reg6.count()
                        all_total = Grade.objects.filter(term=term, student=student).aggregate(Sum('total'))['total__sum']
                        cum_perc = round((all_total/m),2)
                        for each in reg6:
                            each.cumulative = all_total
                            each.cum_perc = cum_perc
                            each.static_class = str(each.student.classe)
                            each.static_class_teacher = str(each.student.classe.teacher.first_name) + " " + str(each.student.classe.teacher.last_name)
                            each.static_head_teacher = str(each.term.head.first_name) + " " + str(each.term.head.last_name)
                            each.static_teacher_signature = each.student.classe.signature
                            each.static_student_image = each.student.photograph
                            each.static_age = each.student.age()
                            each.static_number_in_class = class_students_count
                            each.save()

                    messages.success(request, str(student_first_name) + "'s score has been modified successfully")
                    return redirect('staff_grades')
            return render(request, 'result/grade_update.html', {'form': form, 'early': early})
        else:
            return redirect('index')
    else:
        return redirect('index')

@login_required
def updateStaffSecondary(request, id):
    if request.user.role == "Staff":
        early = Secondary.objects.get(id=id)
        if early.subject.teacher == request.user:
            form = SecondaryForm(instance=early)
            if request.method=='POST':
                form = SecondaryForm(request.POST, instance=early)
                if form.is_valid():
                    term = form.cleaned_data.get('term')
                    student = form.cleaned_data.get('student')
                    subject = form.cleaned_data.get('subject')
                    form.save()

                    class_students_count = Person.objects.filter(classe=student.classe).count()
                    reg = Secondary.objects.get(term=term, student=student, subject=subject)
                    if reg.subject.teacher != request.user:
                        messages.error(request, "You cannot record a score for " + str(subject) + " because you were not assigned as the subject's teacher")
                    else:
                        reg.student = student
                        teacher = request.user
                        student_first_name = student.first_name
                        old_total = reg.total
                        new_total = reg.test + reg.test2 + reg.exam
                        reg.total = new_total
                        reg.save()
                        reg1 = Secondary.objects.get(term=term, student=student, subject=subject)
                        reg1.subject_total = reg1.subject_total - old_total
                        reg1.save()
                        reg2 = Secondary.objects.get(term=term, student=student, subject=subject)
                        reg2.subject_total = reg2.subject_total + new_total
                        reg2.save()
                        reg3 = Secondary.objects.get(term=term, student=student, subject=subject)
                        reg4 = Secondary.objects.filter(term=term, subject=subject).order_by('-total')
                        n = reg4.count()
                        d = round((reg3.subject_total/n),2)
                        subject_position = []
                        subject_pos = 0

                        for each in reg4:
                            each.subject_total = reg3.subject_total
                            each.subject_avg = d
                            each.grade = reg3.grade()
                            each.save()

                        for each in reg4:
                            subject_position.append(each.total)

                        for i in range(len(subject_position)):
                            for each in reg4:
                                temp = subject_position.index(each.total)
                                each.subject_pos = temp + 1
                                each.save()

                        reg6 = Secondary.objects.filter(term=term, student=student)
                        m = reg6.count()
                        all_total = Secondary.objects.filter(term=term, student=student).aggregate(Sum('total'))['total__sum']
                        cum_perc = round((all_total/m),2)
                        for each in reg6:
                            each.cumulative = all_total
                            each.cum_perc = cum_perc
                            each.static_class = str(each.student.classe)
                            each.static_class_teacher = str(each.student.classe.teacher.first_name) + " " + str(each.student.classe.teacher.last_name)
                            each.static_head_teacher = str(each.term.head.first_name) + " " + str(each.term.head.last_name)
                            each.static_teacher_signature = each.student.classe.signature
                            each.static_student_image = each.student.photograph
                            each.static_age = each.student.age()
                            each.static_number_in_class = class_students_count
                            each.save()

                    messages.success(request, str(student_first_name) + "'s score has been modified successfully")
                    return redirect('staff_secondarys')
            return render(request, 'result/secondary_update.html', {'form': form, 'early': early})
        else:
            return redirect('index')
    else:
        return redirect('index')

@login_required
def deleteStaffEarly(request, id):
    if request.user.role == "Staff":
        early = Early.objects.get(id=id)
        if early.subject.teacher == request.user:
            obj = get_object_or_404(Early, id=id)
            term = early.term
            student = early.student
            subject = early.subject
            reg = Early.objects.get(term=term, student=student, subject=subject)

            old_total = reg.total
            value = reg.value
            if request.method =="POST":
                obj.delete()
                try:
                    reg1 = Early.objects.filter(term=term, subject=subject)[0]
                    reg1.subject_total = reg1.subject_total - old_total
                    reg1.save()
                except:
                    pass
                try:
                    reg2 = Early.objects.filter(term=term, subject=subject)[0]
                    reg4 = Early.objects.filter(term=term, subject=subject).order_by('-total')
                    n = reg4.count()
                    d = round((reg2.subject_total/n),2)
                    subject_position = []
                    subject_pos = 0

                    for each in reg4:
                        each.subject_total = reg2.subject_total
                        each.subject_avg = d
                        each.grade = reg2.grade()
                        each.save()
                    for each in reg4:
                        subject_position.append(each.total)

                    for i in range(len(subject_position)):
                        for each in reg4:
                            temp = subject_position.index(each.total)
                            each.subject_pos = temp + 1
                            each.save()
                except:
                    pass
                try:
                    reg6 = Early.objects.filter(term=term, student=student)
                    m = reg6.count()
                    all_total = Early.objects.filter(term=term, student=student).aggregate(Sum('total'))['total__sum']
                    cum_perc = round((all_total/m),2)
                    for each in reg6:
                        each.cumulative = all_total
                        each.cum_perc = cum_perc
                        each.static_class = str(each.student.classe)
                        each.save()
                    reg7 = Early.objects.filter(term=term, student=student)[0]
                    if value == 1:
                        reg7.value = 1
                        reg7.save()
                except:
                    pass
                return redirect('staff_earlys')
            return render(request, 'result/early_confirm_delete.html', {'early': early})
    else:
        return redirect('index')

@login_required
def deleteStaffGrade(request, id):
    if request.user.role == "Staff":
        early = Grade.objects.get(id=id)
        if early.subject.teacher == request.user:
            obj = get_object_or_404(Grade, id=id)
            term = early.term
            student = early.student
            subject = early.subject
            reg = Grade.objects.get(term=term, student=student, subject=subject)

            old_total = reg.total
            value = reg.value
            if request.method =="POST":
                obj.delete()
                try:
                    reg1 = Grade.objects.filter(term=term, subject=subject)[0]
                    reg1.subject_total = reg1.subject_total - old_total
                    reg1.save()
                except:
                    pass
                try:
                    reg2 = Grade.objects.filter(term=term, subject=subject)[0]
                    reg4 = Grade.objects.filter(term=term, subject=subject).order_by('-total')
                    n = reg4.count()
                    d = round((reg2.subject_total/n),2)
                    subject_position = []
                    subject_pos = 0

                    for each in reg4:
                        each.subject_total = reg2.subject_total
                        each.subject_avg = d
                        each.grade = reg2.grade()
                        each.save()
                    for each in reg4:
                        subject_position.append(each.total)

                    for i in range(len(subject_position)):
                        for each in reg4:
                            temp = subject_position.index(each.total)
                            each.subject_pos = temp + 1
                            each.save()
                except:
                    pass
                try:
                    reg6 = Grade.objects.filter(term=term, student=student)
                    m = reg6.count()
                    all_total = Grade.objects.filter(term=term, student=student).aggregate(Sum('total'))['total__sum']
                    cum_perc = round((all_total/m),2)
                    for each in reg6:
                        each.cumulative = all_total
                        each.cum_perc = cum_perc
                        each.static_class = str(each.student.classe)
                        each.save()
                    reg7 = Grade.objects.filter(term=term, student=student)[0]
                    if value == 1:
                        reg7.value = 1
                        reg7.save()
                except:
                    pass
                return redirect('staff_grades')
            return render(request, 'result/grade_confirm_delete.html', {'early': early})
    else:
        return redirect('index')

@login_required
def deleteStaffSecondary(request, id):
    if request.user.role == "Staff":
        early = Secondary.objects.get(id=id)
        if early.subject.teacher == request.user:
            obj = get_object_or_404(Secondary, id=id)
            term = early.term
            student = early.student
            subject = early.subject
            reg = Secondary.objects.get(term=term, student=student, subject=subject)

            old_total = reg.total
            value = reg.value
            if request.method =="POST":
                obj.delete()
                try:
                    reg1 = Secondary.objects.filter(term=term, subject=subject)[0]
                    reg1.subject_total = reg1.subject_total - old_total
                    reg1.save()
                except:
                    pass
                try:
                    reg2 = Secondary.objects.filter(term=term, subject=subject)[0]
                    reg4 = Secondary.objects.filter(term=term, subject=subject).order_by('-total')
                    n = reg4.count()
                    d = round((reg2.subject_total/n),2)
                    subject_position = []
                    subject_pos = 0

                    for each in reg4:
                        each.subject_total = reg2.subject_total
                        each.subject_avg = d
                        each.grade = reg2.grade()
                        each.save()
                    for each in reg4:
                        subject_position.append(each.total)

                    for i in range(len(subject_position)):
                        for each in reg4:
                            temp = subject_position.index(each.total)
                            each.subject_pos = temp + 1
                            each.save()
                except:
                    pass
                try:
                    reg6 = Secondary.objects.filter(term=term, student=student)
                    m = reg6.count()
                    all_total = Secondary.objects.filter(term=term, student=student).aggregate(Sum('total'))['total__sum']
                    cum_perc = round((all_total/m),2)
                    for each in reg6:
                        each.cumulative = all_total
                        each.cum_perc = cum_perc
                        each.static_class = str(each.student.classe)
                        each.save()
                    reg7 = Secondary.objects.filter(term=term, student=student)[0]
                    if value == 1:
                        reg7.value = 1
                        reg7.save()
                except:
                    pass
                return redirect('staff_secondarys')
            return render(request, 'result/secondary_confirm_delete.html', {'early': early})
    else:
        return redirect('index')

@login_required
def showStaffEarlyReport(request, id):
    if request.user.role=="Staff":
        early = Early.objects.get(id=id)
        student = early.student
        term = early.term
        firsts = Early.objects.all()
        class_students_count = Person.objects.filter(classe=student.classe).count()
        firsts_student = Early.objects.filter(term=term, student=student).order_by('subject__subject')
        firsts_student2 = Early.objects.filter(term=term, student=student).order_by('-total')
        obtainable = Early.objects.filter(term=term, student=student).count()
        obtainable = 100 * obtainable
        teacher_comment = early.teacher_comment
        head_comment = early.head_comment
        response_first = []
        response_first_student = []
        for each in firsts:
            class_students = Early.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
            response_first.append(each)
        subjects_list = [""]
        subjects_total_list = [0]
        for each in firsts_student:
            response_first_student.append(each)
        for each in firsts_student2:
            subjects_list.append(each.subject.subject)
            subjects_total_list.append(each.total)

        number_absent = term.number - early.number_present

        return render(request, 'result/early_staff_report.html', {'firsts':response_first,
        'firsts_student':response_first_student, 'class_students_count':class_students_count,
        'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
        'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showStaffGradeReport(request, id):
    if request.user.role=="Staff":
        early = Grade.objects.get(id=id)
        student = early.student
        term = early.term
        firsts = Grade.objects.all()
        class_students_count = Person.objects.filter(classe=student.classe).count()
        firsts_student = Grade.objects.filter(term=term, student=student).order_by('subject__subject')
        firsts_student2 = Grade.objects.filter(term=term, student=student).order_by('-total')
        obtainable = Grade.objects.filter(term=term, student=student).count()
        obtainable = 100 * obtainable
        teacher_comment = early.teacher_comment
        head_comment = early.head_comment
        response_first = []
        response_first_student = []
        for each in firsts:
            class_students = Grade.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
            response_first.append(each)
        subjects_list = [""]
        subjects_total_list = [0]
        for each in firsts_student:
            response_first_student.append(each)
        for each in firsts_student2:
            subjects_list.append(each.subject.subject)
            subjects_total_list.append(each.total)

        number_absent = term.number - early.number_present

        return render(request, 'result/grade_staff_report.html', {'firsts':response_first,
        'firsts_student':response_first_student, 'class_students_count':class_students_count,
        'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
        'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showStaffSecondaryReport(request, id):
    if request.user.role=="Staff":
        early = Secondary.objects.get(id=id)
        student = early.student
        term = early.term
        firsts = Secondary.objects.all()
        class_students_count = Person.objects.filter(classe=student.classe).count()
        firsts_student = Secondary.objects.filter(term=term, student=student).order_by('subject__subject')
        firsts_student2 = Secondary.objects.filter(term=term, student=student).order_by('-total')
        obtainable = Secondary.objects.filter(term=term, student=student).count()
        obtainable = 100 * obtainable
        teacher_comment = early.teacher_comment
        head_comment = early.head_comment
        response_first = []
        response_first_student = []
        for each in firsts:
            class_students = Secondary.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
            response_first.append(each)
        subjects_list = [""]
        subjects_total_list = [0]
        for each in firsts_student:
            response_first_student.append(each)
        for each in firsts_student2:
            subjects_list.append(each.subject.subject)
            subjects_total_list.append(each.total)

        number_absent = term.number - early.number_present

        return render(request, 'result/secondary_staff_report.html', {'firsts':response_first,
        'firsts_student':response_first_student, 'class_students_count':class_students_count,
        'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
        'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showAdminGradeReport(request, id):
    if request.user.role=="Admin":
        early = Grade.objects.get(id=id)
        student = early.student
        term = early.term
        firsts = Grade.objects.all()
        class_students_count = Person.objects.filter(classe=student.classe).count()
        firsts_student = Grade.objects.filter(term=term, student=student).order_by('subject__subject')
        firsts_student2 = Grade.objects.filter(term=term, student=student).order_by('-total')
        obtainable = Grade.objects.filter(term=term, student=student).count()
        obtainable = 100 * obtainable
        teacher_comment = early.teacher_comment
        head_comment = early.head_comment
        response_first = []
        response_first_student = []
        for each in firsts:
            class_students = Grade.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
            response_first.append(each)
        subjects_list = [""]
        subjects_total_list = [0]
        for each in firsts_student:
            response_first_student.append(each)
        for each in firsts_student2:
            subjects_list.append(each.subject.subject)
            subjects_total_list.append(each.total)

        number_absent = term.number - early.number_present

        return render(request, 'result/grade_admin_report.html', {'firsts':response_first,
        'firsts_student':response_first_student, 'class_students_count':class_students_count,
        'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
        'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showAdminSecondaryReport(request, id):
    if request.user.role=="Admin":
        early = Secondary.objects.get(id=id)
        student = early.student
        term = early.term
        firsts = Secondary.objects.all()
        class_students_count = Person.objects.filter(classe=student.classe).count()
        firsts_student = Secondary.objects.filter(term=term, student=student).order_by('subject__subject')
        firsts_student2 = Secondary.objects.filter(term=term, student=student).order_by('-total')
        obtainable = Secondary.objects.filter(term=term, student=student).count()
        obtainable = 100 * obtainable
        teacher_comment = early.teacher_comment
        head_comment = early.head_comment
        response_first = []
        response_first_student = []
        for each in firsts:
            class_students = Secondary.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
            response_first.append(each)
        subjects_list = [""]
        subjects_total_list = [0]
        for each in firsts_student:
            response_first_student.append(each)
        for each in firsts_student2:
            subjects_list.append(each.subject.subject)
            subjects_total_list.append(each.total)

        number_absent = term.number - early.number_present

        return render(request, 'result/secondary_admin_report.html', {'firsts':response_first,
        'firsts_student':response_first_student, 'class_students_count':class_students_count,
        'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
        'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')
@login_required
def staffComment(request, id):
    if request.user.role == "Staff":
        early = Early.objects.get(id=id)
        if early.student.classe.teacher==request.user:
            form = EarlyFormStaff(instance=early)
            if request.method=='POST':
                form = EarlyFormStaff(request.POST, instance=early)
                if form.is_valid():
                    form.save()
                    messages.success(request, "The comment has been saved successfully")
                    return redirect('staff_early_results')
                else:
                    return redirect('index')
        return render(request, 'result/early_staff_comment.html', {'form': form, 'early': early})
    else:
        return redirect('index')

@login_required
def staffCommentGrade(request, id):
    if request.user.role == "Staff":
        early = Grade.objects.get(id=id)
        if early.student.classe.teacher==request.user:
            form = GradeFormStaff(instance=early)
            if request.method=='POST':
                form = GradeFormStaff(request.POST, instance=early)
                if form.is_valid():
                    form.save()
                    messages.success(request, "The comment has been saved successfully")
                    return redirect('staff_grade_results')
                else:
                    return redirect('index')
        return render(request, 'result/grade_staff_comment.html', {'form': form, 'early': early})
    else:
        return redirect('index')

@login_required
def staffCommentSecondary(request, id):
    if request.user.role == "Staff":
        early = Secondary.objects.get(id=id)
        if early.student.classe.teacher==request.user:
            form = SecondaryFormStaff(instance=early)
            if request.method=='POST':
                form = SecondaryFormStaff(request.POST, instance=early)
                if form.is_valid():
                    form.save()
                    messages.success(request, "The comment has been saved successfully")
                    return redirect('staff_secondary_results')
                else:
                    return redirect('index')
        return render(request, 'result/secondary_staff_comment.html', {'form': form, 'early': early})
    else:
        return redirect('index')

@login_required
def AdminCommentEarly(request, id):
    if request.user.role == "Admin":
        early = Early.objects.get(id=id)
        form = EarlyFormAdmin(instance=early)
        if request.method=='POST':
            form = EarlyFormAdmin(request.POST, instance=early)
            if form.is_valid():
                form.save()
                messages.success(request, "The comment has been saved successfully")
                return redirect('admin_early_results')
            else:
                return redirect('index')
        return render(request, 'result/early_admin_comment.html', {'form': form, 'early': early})
    else:
        return redirect('index')

@login_required
def AdminCommentGrade(request, id):
    if request.user.role == "Admin":
        early = Grade.objects.get(id=id)
        form = GradeFormAdmin(instance=early)
        if request.method=='POST':
            form = GradeFormAdmin(request.POST, instance=early)
            if form.is_valid():
                form.save()
                messages.success(request, "The comment has been saved successfully")
                return redirect('admin_grade_results')
            else:
                return redirect('index')
        return render(request, 'result/grade_admin_comment.html', {'form': form, 'early': early})
    else:
        return redirect('index')

@login_required
def AdminCommentSecondary(request, id):
    if request.user.role == "Admin":
        early = Secondary.objects.get(id=id)
        form = SecondaryFormAdmin(instance=early)
        if request.method=='POST':
            form = SecondaryFormAdmin(request.POST, instance=early)
            if form.is_valid():
                form.save()
                messages.success(request, "The comment has been saved successfully")
                return redirect('admin_secondary_results')
            else:
                return redirect('index')
        return render(request, 'result/secondary_admin_comment.html', {'form': form, 'early': early})
    else:
        return redirect('index')

@login_required
def showStudentEarlys(request):
    if request.user.role == "Student":
        context = {}
        filtered_earlys = EarlyFilterStud(
            request.GET,
            queryset = Early.objects.filter(student=request.user)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        context['student'] = request.user
        return render(request, 'result/student_earlys.html', context=context)

    else:
        return redirect('index')

@login_required
def showStudentEarlyResults(request):
    if request.user.role == "Student":
        context = {}
        filtered_earlys = EarlyFilterStud(
            request.GET,
            queryset = Early.objects.filter(student=request.user, value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/student_early_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showStudentGrades(request):
    if request.user.role == "Student":
        context = {}
        filtered_earlys = GradeFilterStud(
            request.GET,
            queryset = Grade.objects.filter(student=request.user)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        context['student'] = request.user
        return render(request, 'result/student_grades.html', context=context)
    else:
        return redirect('index')

@login_required
def showStudentGradeResults(request):
    if request.user.role == "Student":
        context = {}
        filtered_earlys = GradeFilterStud(
            request.GET,
            queryset = Grade.objects.filter(student=request.user, value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/student_grade_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showStudentSecondarys(request):
    if request.user.role == "Student":
        context = {}
        filtered_earlys = SecondaryFilter(
            request.GET,
            queryset = Secondary.objects.filter(student=request.user)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        context['student'] = request.user
        return render(request, 'result/student_secondarys.html', context=context)
    else:
        return redirect('index')

@login_required
def showStudentEarlyReport(request, id):
    if request.user.role=="Student":
        early = Early.objects.get(id=id)
        if early.student == request.user:
            student = early.student
            term = early.term
            firsts = Early.objects.all()
            class_students_count = Person.objects.filter(classe=student.classe).count()
            firsts_student = Early.objects.filter(term=term, student=student).order_by('subject__subject')
            firsts_student2 = Early.objects.filter(term=term, student=student).order_by('-total')
            obtainable = Early.objects.filter(term=term, student=student).count()
            obtainable = 100 * obtainable
            teacher_comment = early.teacher_comment
            head_comment = early.head_comment
            response_first = []
            response_first_student = []
            for each in firsts:
                class_students = Early.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
                response_first.append(each)
            subjects_list = [""]
            subjects_total_list = [0]
            for each in firsts_student:
                response_first_student.append(each)
            for each in firsts_student2:
                subjects_list.append(each.subject.subject)
                subjects_total_list.append(each.total)

            number_absent = term.number - early.number_present

            return render(request, 'result/early_student_report.html', {'firsts':response_first,
            'firsts_student':response_first_student, 'class_students_count':class_students_count,
            'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
            'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showStudentGradeReport(request, id):
    if request.user.role=="Student":
        early = Grade.objects.get(id=id)
        if early.student == request.user:
            student = early.student
            term = early.term
            firsts = Grade.objects.all()
            class_students_count = Person.objects.filter(classe=student.classe).count()
            firsts_student = Grade.objects.filter(term=term, student=student).order_by('subject__subject')
            firsts_student2 = Grade.objects.filter(term=term, student=student).order_by('-total')
            obtainable = Grade.objects.filter(term=term, student=student).count()
            obtainable = 100 * obtainable
            teacher_comment = early.teacher_comment
            head_comment = early.head_comment
            response_first = []
            response_first_student = []
            for each in firsts:
                class_students = Grade.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
                response_first.append(each)
            subjects_list = [""]
            subjects_total_list = [0]
            for each in firsts_student:
                response_first_student.append(each)
            for each in firsts_student2:
                subjects_list.append(each.subject.subject)
                subjects_total_list.append(each.total)

            number_absent = term.number - early.number_present

            return render(request, 'result/grade_student_report.html', {'firsts':response_first,
            'firsts_student':response_first_student, 'class_students_count':class_students_count,
            'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
            'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')

@login_required
def showStudentSecondaryResults(request):
    if request.user.role == "Student":
        context = {}
        filtered_earlys = SecondaryFilter(
            request.GET,
            queryset = Secondary.objects.filter(student=request.user, value=1)
        )
        context['filtered_earlys'] = filtered_earlys
        paginated_filtered_earlys = Paginator(filtered_earlys.qs, 50)
        page_number = request.GET.get('page')
        earlys_page_obj = paginated_filtered_earlys.get_page(page_number)
        context['earlys_page_obj'] = earlys_page_obj
        total_earlys = filtered_earlys.qs.count()
        context['total_earlys'] = total_earlys
        return render(request, 'result/student_secondary_results.html', context=context)
    else:
        return redirect('index')

@login_required
def showStudentSecondaryReport(request, id):
    if request.user.role=="Student":
        early = Secondary.objects.get(id=id)
        if early.student == request.user:
            student = early.student
            term = early.term
            firsts = Secondary.objects.all()
            class_students_count = Person.objects.filter(classe=student.classe).count()
            firsts_student = Secondary.objects.filter(term=term, student=student).order_by('subject__subject')
            firsts_student2 = Secondary.objects.filter(term=term, student=student).order_by('-total')
            obtainable = Secondary.objects.filter(term=term, student=student).count()
            obtainable = 100 * obtainable
            teacher_comment = early.teacher_comment
            head_comment = early.head_comment
            response_first = []
            response_first_student = []
            for each in firsts:
                class_students = Secondary.objects.filter(term=term, student__classe=each.student.classe, subject=each.subject)
                response_first.append(each)
            subjects_list = [""]
            subjects_total_list = [0]
            for each in firsts_student:
                response_first_student.append(each)
            for each in firsts_student2:
                subjects_list.append(each.subject.subject)
                subjects_total_list.append(each.total)

            number_absent = term.number - early.number_present

            return render(request, 'result/secondary_student_report.html', {'firsts':response_first,
            'firsts_student':response_first_student, 'class_students_count':class_students_count,
            'early': early, 'obtainable':obtainable, 'teacher_comment':teacher_comment, 'number_absent':number_absent,
            'head_comment':head_comment, 'subjects_list':subjects_list, 'subjects_total_list':subjects_total_list})
    else:
        return redirect('index')
