diff --git a/FusionIIIT/applications/department/models.py b/FusionIIIT/applications/department/models.py index a78b35171..e04e9e578 100644 --- a/FusionIIIT/applications/department/models.py +++ b/FusionIIIT/applications/department/models.py @@ -4,14 +4,15 @@ # Create your models here. from applications.globals.models import ExtraInfo - + + class SpecialRequest(models.Model): request_maker = models.ForeignKey(ExtraInfo, on_delete=models.CASCADE) request_date = models.DateTimeField(default=date.today) brief = models.CharField(max_length=20, default='--') request_details = models.CharField(max_length=200) upload_request = models.FileField(blank=True) - status = models.CharField(max_length=50,default='Pending') + status = models.CharField(max_length=50, default='Pending') remarks = models.CharField(max_length=300, default="--") request_receiver = models.CharField(max_length=30, default="--") @@ -23,9 +24,11 @@ class Announcements(models.Model): maker_id = models.ForeignKey(ExtraInfo, on_delete=models.CASCADE) ann_date = models.DateTimeField(default="04-04-2021") message = models.CharField(max_length=200) - batch = models.CharField(max_length=40,default="Year-1") - department = models.CharField(max_length=40,default="ALL") + batch = models.CharField(max_length=40, default="Year-1") + department = models.CharField(max_length=40, default="ALL") programme = models.CharField(max_length=10) - upload_announcement = models.FileField(upload_to='department/upload_announcement', null=True, default=" ") + upload_announcement = models.FileField( + upload_to='department/upload_announcement', null=True, default=" ") + def __str__(self): return str(self.maker_id.user.username) diff --git a/FusionIIIT/applications/examination/api/views.py b/FusionIIIT/applications/examination/api/views.py index 6ca022ac4..f20b07cd9 100644 --- a/FusionIIIT/applications/examination/api/views.py +++ b/FusionIIIT/applications/examination/api/views.py @@ -24,6 +24,8 @@ + + @api_view(['GET', 'POST']) def fetch_student_details(request): if request.method == 'GET': @@ -250,3 +252,4 @@ def publish_grade(request): else: return JsonResponse({'error': 'Authentication object not present'}, status=404) + diff --git a/FusionIIIT/applications/examination/urls.py b/FusionIIIT/applications/examination/urls.py index 436d28890..c4f81cc07 100644 --- a/FusionIIIT/applications/examination/urls.py +++ b/FusionIIIT/applications/examination/urls.py @@ -3,6 +3,8 @@ from django.urls import path, include from . import views from django.contrib import admin +from .views import update_authentication +from .views import DownloadExcelView app_name = 'examination' @@ -16,13 +18,32 @@ url(r'announcement/', views.announcement, name='announcement'), url(r'timetable/', views.timetable, name='timetable'), + + #entering and updataing grade + path('entergrades/', views.entergrades, name='entergrades'), path('update_hidden_grades_multiple/', views.Updatehidden_gradesMultipleView.as_view(), name='update_hidden_grades_multiple'), path('verifygrades/', views.verifygrades, name='verifygrades'), - path('authenticate/', views.authenticate, name='authenticate'), + path('update_hidden_grades_multiple/', views.Updatehidden_gradesMultipleView.as_view(), name='update_hidden_grades_multiple'), + path('submit_hidden_grades_multiple/', views.Submithidden_gradesMultipleView.as_view(), + name='submit_hidden_grades_multiple'), + + # authenticate + path('authenticate/', views.authenticate, name='authenticate'), + path('authenticategrades/', views.authenticategrades, + name='authenticategrades'), + path('update_authentication/', update_authentication.as_view(), + name='update_authentication'), + + #download result + path('download_excel/', DownloadExcelView.as_view(), name='download_excel'), + + # generate transcript + path('generate_transcript/', views.generate_transcript, name='generate_transcript'), + path('generate_transcript_form/', views.generate_transcript_form, name='generate_transcript_form'), # url(r'entergrades/', views.entergrades, name='entergrades'), diff --git a/FusionIIIT/applications/examination/views.py b/FusionIIIT/applications/examination/views.py index bdb933fe3..f0ab2c793 100644 --- a/FusionIIIT/applications/examination/views.py +++ b/FusionIIIT/applications/examination/views.py @@ -1,3 +1,7 @@ +from django.views import View +from django.views.generic import View +from django.http import HttpResponse +import csv from django.db.models import IntegerField from django.db.models.functions import Cast from django.db.models.query_utils import Q @@ -9,34 +13,24 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from datetime import date - import requests - from django.db.models import Q from django.shortcuts import get_object_or_404, render, redirect from django.contrib.auth.models import User from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from applications.academic_information.models import Spi, Student from applications.globals.models import (Designation, ExtraInfo, - HoldsDesignation, Faculty) from applications.eis.models import (faculty_about, emp_research_projects) from applications.programme_curriculum.models import Course from applications.academic_procedures.models import course_registration from applications.programme_curriculum.filters import CourseFilter -from notification.views import department_notif - - HoldsDesignation,Faculty) -from applications.eis.models import (faculty_about, emp_research_projects) - -from notification.views import department_notif - +from notification.views import examination_notif from applications.department.models import SpecialRequest, Announcements from applications.globals.models import (DepartmentInfo, Designation, ExtraInfo, Faculty, HoldsDesignation) from jsonschema import validate from jsonschema.exceptions import ValidationError - from django.shortcuts import render, redirect, HttpResponse from rest_framework.views import APIView from rest_framework.response import Response @@ -46,11 +40,10 @@ from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status -from .models import hidden_grades +from .models import hidden_grades, authentication from rest_framework.permissions import AllowAny - @login_required(login_url='/accounts/login') def exam(request): """ @@ -70,7 +63,6 @@ def exam(request): # elif str(request.user) == "acadadmin" : # return HttpResponseRedirect('/examination/submit/') - return HttpResponseRedirect('/examination/submit/') @@ -81,17 +73,18 @@ def submit(request): # coursefilter = CourseFilter(request.GET, queryset=courses) # courses = coursefilter.qs - unique_course_ids = course_registration.objects.values('course_id').distinct() + unique_course_ids = course_registration.objects.values( + 'course_id').distinct() # Cast the course IDs to integers - unique_course_ids = unique_course_ids.annotate( + unique_course_ids = unique_course_ids.annotate( course_id_int=Cast('course_id', IntegerField())) # Retrieve course names and course codes based on unique course IDs - courses_info = Course.objects.filter( + courses_info = Course.objects.filter( id__in=unique_course_ids.values_list('course_id_int', flat=True)) - - return render(request, '../templates/examination/submit.html',{'courses_info': courses_info}) + + return render(request, '../templates/examination/submit.html', {'courses_info': courses_info}) # return render(request,'../templates/examination/submit.html' , {}) @@ -185,12 +178,14 @@ def entergrades(request): course_id__id=course_id, semester_id=semester_id) # Pass the registrations queryset to the template context + context = { 'registrations': registrations } return render(request, 'examination/entergrades.html', context) + def verifygrades(request): course_id = request.GET.get('course') semester_id = request.GET.get('semester') @@ -205,21 +200,49 @@ def verifygrades(request): return render(request, 'examination/verifygrades.html', context) + def authenticate(request): + # Retrieve unique course IDs from hidden_grades + unique_course_ids = hidden_grades.objects.values('course_id').distinct() + + # Cast the course IDs to integers + unique_course_ids = unique_course_ids.annotate( + course_id_int=Cast('course_id', IntegerField())) + + # Retrieve course names and course codes based on unique course IDs + courses_info = Course.objects.filter( + id__in=unique_course_ids.values_list('course_id_int', flat=True)) + + # Pass the unique course IDs and corresponding course names and codes to the template + return render(request, '../templates/examination/authenticate.html', {'courses_info': courses_info}) + + +def authenticategrades(request): course_id = request.GET.get('course') semester_id = request.GET.get('semester') - print(course_id) - print(semester_id) - # registrations = hidden_grades.objects.filter( - # course_id=course_id, semester_id=semester_id) + registrations = authentication.objects.filter(course=course_id) - # # Pass the registrations queryset to the template context - # context = { - # 'registrations': registrations - # } + print(registrations) + if registrations: + # Registrations exist, pass them to the template context + context = { + 'registrations': registrations + } + else: + # No registrations found, create a new record + authenticate_grade = authentication.objects.create(course=course_id) + authenticate_grade.save() - return render(request, '../templates/examination/notReady_publish.html', {}) + # Fetch the newly created record + registrations = authentication.objects.filter(course=course_id) + + # Pass the new record to the template context + context = { + 'registrations': registrations + } + + return render(request, 'examination/authenticategrades.html', context) @login_required(login_url='/accounts/login') @@ -262,7 +285,10 @@ def announcement(request): upload_announcement=upload_announcement, department=department, ann_date=ann_date) - # department_notif(usrnm, recipients , message) + examination_notif(usrnm, recipients, message) + print("test1") + + print("test2") context = browse_announcements() return render(request, 'examination/announcement_req.html', {"user_designation": user_info.user_type, @@ -291,27 +317,6 @@ def post(self, request): for student_id, semester_id, course_id, grade in zip(student_ids, semester_ids, course_ids, grades): # Create an instance of hidden_grades model and save the data - - return render(request,'../templates/examination/submit.html' , {}) - -@login_required(login_url='/accounts/login') -def submit(request): - return render(request,'../templates/examination/submit.html' , {}) - -@login_required(login_url='/accounts/login') -def verify(request): - return render(request,'../templates/examination/verify.html' , {}) - -@login_required(login_url='/accounts/login') -def publish(request): - return render(request,'../templates/examination/publish.html' ,{}) - - -@login_required(login_url='/accounts/login') -def notReady_publish(request): - return render(request,'../templates/examination/notReady_publish.html',{}) - - try: hidden_grade = hidden_grades.objects.get( course_id=course_id, student_id=student_id, semester_id=semester_id) @@ -332,102 +337,195 @@ def notReady_publish(request): f"Student ID: {student_id}, Semester ID: {semester_id}, Course ID: {course_id}, Grade: {grade}") hidden_grade.save() - # return Response({'message': 'Grades updated successfully'}, status=status.HTTP_200_OK) - return render(request, '../templates/examination/grades_updated.html', {}) + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="grades.csv"' -@login_required(login_url='/accounts/login') -def timetable(request): - return render(request,'../templates/examination/timetable.html',{}) + # Write data to CSV + writer = csv.writer(response) + writer.writerow(['Student ID', 'Semester ID', 'Course ID', 'Grade']) + for student_id, semester_id, course_id, grade in zip(student_ids, semester_ids, course_ids, grades): + writer.writerow([student_id, semester_id, course_id, grade]) + return response + return render(request, '../templates/examination/grades_updated.html', {}) -def browse_announcements(): - """ - This function is used to browse Announcements Department-Wise - made by different faculties and admin. - - @variables: - cse_ann - Stores CSE Department Announcements - ece_ann - Stores ECE Department Announcements - me_ann - Stores ME Department Announcements - sm_ann - Stores SM Department Announcements - all_ann - Stores Announcements intended for all Departments - context - Dictionary for storing all above data +class Submithidden_gradesMultipleView(APIView): + permission_classes = [AllowAny] - """ - cse_ann = Announcements.objects.filter(department="CSE") - ece_ann = Announcements.objects.filter(department="ECE") - me_ann = Announcements.objects.filter(department="ME") - sm_ann = Announcements.objects.filter(department="SM") - all_ann = Announcements.objects.filter(department="ALL") + def post(self, request): + student_ids = request.POST.getlist('student_ids[]') + semester_ids = request.POST.getlist('semester_ids[]') + course_ids = request.POST.getlist('course_ids[]') + grades = request.POST.getlist('grades[]') - context = { - "cse" : cse_ann, - "ece" : ece_ann, - "me" : me_ann, - "sm" : sm_ann, - "all" : all_ann - } + if len(student_ids) != len(semester_ids) != len(course_ids) != len(grades): + return Response({'error': 'Invalid grade data provided'}, status=status.HTTP_400_BAD_REQUEST) - return context + for student_id, semester_id, course_id, grade in zip(student_ids, semester_ids, course_ids, grades): + # Create an instance of hidden_grades model and save the data -def get_to_request(username): - """ - This function is used to get requests for the receiver + try: + hidden_grade = hidden_grades.objects.get( + course_id=course_id, student_id=student_id, semester_id=semester_id) + hidden_grade.grade = grade + hidden_grade.save() + except hidden_grades.DoesNotExist: + # If the grade doesn't exist, create a new one + hidden_grade = hidden_grades.objects.create( + course_id=course_id, student_id=student_id, semester_id=semester_id, grade=grade) + hidden_grade.save() + # hidden_grade = hidden_grades.objects.create( + # student_id=student_id, + # course_id=course_id, + # semester_id=semester_id, + # grade=grade + # ) + print( + f"Student ID: {student_id}, Semester ID: {semester_id}, Course ID: {course_id}, Grade: {grade}") + hidden_grade.save() - @variables: - req - Contains request queryset + return render(request, '../templates/examination/grades_updated.html', {}) - """ - req = SpecialRequest.objects.filter(request_receiver=username) - return req +class update_authentication(View): + def post(self, request, *args, **kwargs): + # Extract data from the POST request + course = request.POST.get('course') + authenticator1 = request.POST.get('authenticator1') + authenticator2 = request.POST.get('authenticator2') + authenticator3 = request.POST.get('authenticator3') + + # Retrieve the registration object + try: + registration = authentication.objects.get(course=course) + except authentication.DoesNotExist: + # Redirect if registration does not exist + return redirect('examination:submit') + + # Update authenticators if the values have changed + if authenticator1 is not None: + registration.authenticator_1 = (authenticator1 == '1') + else: + registration.authenticator_1 = 0 + if authenticator2 is not None: + registration.authenticator_2 = (authenticator2 == '1') + else: + registration.authenticator_2 = 0 + if authenticator3 is not None: + registration.authenticator_3 = (authenticator3 == '1') + else: + registration.authenticator_3 = 0 + + # Save the changes + registration.save() + + # Redirect to the appropriate page + return redirect('examination:authenticate') + + +class DownloadExcelView(View): + def post(self, request, *args, **kwargs): + # Retrieve form data + student_ids = request.POST.getlist('student_ids[]') + semester_ids = request.POST.getlist('semester_ids[]') + course_ids = request.POST.getlist('course_ids[]') + grades = request.POST.getlist('grades[]') + # Create a CSV response + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="grades.csv"' -@login_required(login_url='/accounts/login') -def announcement(request): - """ - This function is contains data for Requests and Announcement Related methods. - Data is added to Announcement Table using this function. + # Write data to CSV + writer = csv.writer(response) + writer.writerow(['Student ID', 'Semester ID', 'Course ID', 'Grade']) + for student_id, semester_id, course_id, grade in zip(student_ids, semester_ids, course_ids, grades): + writer.writerow([student_id, semester_id, course_id, grade]) + + return response + + # print(courses_registered) + # for course in courses_registered : + # print(course.course_id.name) + # print(course.course_id_id) + # print(course.course_id.id) + # print(course.semester_id_id) + # print(course.student_id.id) + # print(course.student_id_id) + # # print(course.semester_id.name) + + +def generate_transcript(request): + + student_id = request.GET.get('student') + + # Fetch the courses registered by the student + courses_registered = course_registration.objects.filter( + student_id=student_id) + + # Initialize a dictionary to store course grades + course_grades = {} + student_details = Student.objects.filter(id_id=student_id) + totalCpi = 0 + + for student in student_details: + # print(student.cpi) + totalCpi = totalCpi + student.cpi + + print(totalCpi) + # Fetch grades for the courses registered by the student + for course in courses_registered: + try: + # Attempt to fetch the grade for the course from hidden_grades + grade = hidden_grades.objects.get( + student_id=student_id, course_id=course.course_id_id) + print(course.course_id.code) + # course_autentication = authentication.objects.filter(course=course.course_id_id) + # print(course_autentication) + # check_authenticator = False + # print(course_autentication.authenticator_1) + course_grades[course] = grade.grade # Store the grade + except hidden_grades.DoesNotExist: + # Grade not available + course_grades[course] = "Grading not done yet" - @param: - request - contains metadata about the requested page + context = { + 'courses_grades': course_grades, + 'student_details': student_details - @variables: - usrnm, user_info, ann_maker_id - Stores data needed for maker - batch, programme, message, upload_announcement, - department, ann_date, user_info - Gets and store data from FORM used for Announcements for Students. + } - """ - usrnm = get_object_or_404(User, username=request.user.username) - user_info = ExtraInfo.objects.all().select_related('user','department').filter(user=usrnm).first() - num = 1 - ann_maker_id = user_info.id - requests_received = get_to_request(usrnm) - if request.method == 'POST': - batch = request.POST.get('batch', '') - programme = request.POST.get('programme', '') - message = request.POST.get('announcement', '') - upload_announcement = request.FILES.get('upload_announcement') - department = request.POST.get('department') - ann_date = date.today() - user_info = ExtraInfo.objects.all().select_related('user','department').get(id=ann_maker_id) - getstudents = ExtraInfo.objects.select_related('user') - recipients = User.objects.filter(extrainfo__in=getstudents) + return render(request, 'examination/generate_transcript.html', context) - obj1, created = Announcements.objects.get_or_create(maker_id=user_info, - batch=batch, - programme=programme, - message=message, - upload_announcement=upload_announcement, - department = department, - ann_date=ann_date) - # department_notif(usrnm, recipients , message) - - context = browse_announcements() - return render(request, 'examination/announcement_req.html', {"user_designation":user_info.user_type, - "announcements":context, - "request_to":requests_received - }) +def generate_transcript_form(request): + if request.method == 'POST': + programme = request.POST.get('programme') + batch = request.POST.get('batch') + specialization = request.POST.get('specialization') + print(specialization) + + if specialization == None: + students = Student.objects.filter( + programme=programme, batch=batch) + else: + students = Student.objects.filter( + programme=programme, batch=batch, specialization=specialization) + + # Pass the filtered students to the template + context = {'students': students} + return render(request, 'examination/generate_transcript_students.html', context) + else: + programmes = Student.objects.values_list( + 'programme', flat=True).distinct() + specializations = Student.objects.exclude( + specialization__isnull=True).values_list('specialization', flat=True).distinct() + batches = Student.objects.values_list('batch', flat=True).distinct() + context = { + 'programmes': programmes, + 'batches': batches, + 'specializations': specializations, + } + + return render(request, 'examination/generate_transcript_form.html', context) diff --git a/FusionIIIT/notification/views.py b/FusionIIIT/notification/views.py index 0480575b8..3b83bb5a3 100644 --- a/FusionIIIT/notification/views.py +++ b/FusionIIIT/notification/views.py @@ -344,6 +344,22 @@ def department_notif(sender, recipient, type): module=module, verb=verb, flag=flag) +def examination_notif(sender, recipient, type,request): + url='examination:examination' + module='examination' + sender = sender + recipient = recipient + verb = type + flag = "examination" + + notify.send(sender=sender, + recipient=recipient, + url=url, + module=module, + verb=verb, + flag=flag) + print("test3") + # return render(request, 'examination/announcement_req.html') diff --git a/FusionIIIT/templates/examination/all_course_grade_filled.html b/FusionIIIT/templates/examination/all_course_grade_filled.html index 20016215f..768316659 100644 --- a/FusionIIIT/templates/examination/all_course_grade_filled.html +++ b/FusionIIIT/templates/examination/all_course_grade_filled.html @@ -9,13 +9,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/announcement_req.html b/FusionIIIT/templates/examination/announcement_req.html index d08136778..959d87c0b 100644 --- a/FusionIIIT/templates/examination/announcement_req.html +++ b/FusionIIIT/templates/examination/announcement_req.html @@ -42,6 +42,9 @@ Verify + Authenticate Course + + Publish @@ -60,7 +63,7 @@ Request Status {% endcomment %} - timetable + Generate Transcript diff --git a/FusionIIIT/templates/examination/authenticate.html b/FusionIIIT/templates/examination/authenticate.html new file mode 100644 index 000000000..b13311286 --- /dev/null +++ b/FusionIIIT/templates/examination/authenticate.html @@ -0,0 +1,156 @@ +{% extends 'examination/base.html' %} +{% block sidetabmenu %} + + + + + + + + +{% endblock %} + +{% block content %} +

Authenticate Course

+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + + +
+ +
+ + + +{% endblock %} + + + diff --git a/FusionIIIT/templates/examination/authenticategrades.html b/FusionIIIT/templates/examination/authenticategrades.html new file mode 100644 index 000000000..a5834a88c --- /dev/null +++ b/FusionIIIT/templates/examination/authenticategrades.html @@ -0,0 +1,77 @@ +{% extends 'examination/base.html' %} + +{% block sidetabmenu %} + +{% endblock %} + +{% block content %} +
+

Authenticate

+ {% if registrations %} +
+ {% csrf_token %} +
+ {% for registration in registrations %} +
+ +

{{ registration.course }}

+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ {% endfor %} +
+ +
+ {% else %} +
+
+ NO STUDENTS REGISTERED IN THIS COURSE THIS SEMESTER +
+

Please check back later or contact support for assistance.

+
+ {% endif %} +
+ + + + + +{% endblock %} diff --git a/FusionIIIT/templates/examination/entergrades.html b/FusionIIIT/templates/examination/entergrades.html index 8d1ffb9f1..34c6deb21 100644 --- a/FusionIIIT/templates/examination/entergrades.html +++ b/FusionIIIT/templates/examination/entergrades.html @@ -9,13 +9,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript @@ -27,7 +30,7 @@

Enter Student Marks

{% if registrations %} -
+ {% csrf_token %}
@@ -42,11 +45,11 @@

Enter Student Marks

{% for registration in registrations %} - +
{{ registration.student_id.id }}{{ registration.student_id_id }} {{ registration.semester_id.id }} {{ registration.course_id.id }} - + diff --git a/FusionIIIT/templates/examination/examination.html b/FusionIIIT/templates/examination/examination.html index ec48a9a6b..af4f47dde 100644 --- a/FusionIIIT/templates/examination/examination.html +++ b/FusionIIIT/templates/examination/examination.html @@ -8,13 +8,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/generate_transcript.html b/FusionIIIT/templates/examination/generate_transcript.html new file mode 100644 index 000000000..429eceb93 --- /dev/null +++ b/FusionIIIT/templates/examination/generate_transcript.html @@ -0,0 +1,105 @@ +{% extends 'examination/base.html' %} + +{% block sidetabmenu %} + + + +{% endblock %} + +{% block content %} +
+

Transcript

+ {% for course, grade in courses_grades.items %} + {% if forloop.first %} +

Roll No : {{ course.student_id_id }}

+ + {% endif %} +{% endfor %} + + + + + + + + + + + + + {% for course, grade in courses_grades.items %} + + + + + + + + {% endfor %} + +
Course NameCourse CodeCreditsGrade
{{ course.course_id.name }}{{ course.course_id.code }}{{ course.course_id.credit }}{{ grade }}{{ student_details.cpi }}
+
+{% endblock %} diff --git a/FusionIIIT/templates/examination/generate_transcript_form.html b/FusionIIIT/templates/examination/generate_transcript_form.html new file mode 100644 index 000000000..2c1c56c1d --- /dev/null +++ b/FusionIIIT/templates/examination/generate_transcript_form.html @@ -0,0 +1,59 @@ +{% extends 'examination/base.html' %} + +{% block sidetabmenu %} + +{% endblock %} +{% block content %} +

Generate Transcript Form

+ + {% csrf_token %} +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +{% endblock %} \ No newline at end of file diff --git a/FusionIIIT/templates/examination/generate_transcript_students.html b/FusionIIIT/templates/examination/generate_transcript_students.html new file mode 100644 index 000000000..e9a0fb196 --- /dev/null +++ b/FusionIIIT/templates/examination/generate_transcript_students.html @@ -0,0 +1,140 @@ + +{% extends 'examination/base.html' %} +{% block sidetabmenu %} + + + + + + + + +{% endblock %} + +{% block content %} +

Verify Result

+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + +{% endblock %} + + + + diff --git a/FusionIIIT/templates/examination/grades_updated.html b/FusionIIIT/templates/examination/grades_updated.html index 4e9c15483..1a8dd4434 100644 --- a/FusionIIIT/templates/examination/grades_updated.html +++ b/FusionIIIT/templates/examination/grades_updated.html @@ -61,13 +61,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/notReady_publish.html b/FusionIIIT/templates/examination/notReady_publish.html index 230b89bb8..5e1e8281c 100644 --- a/FusionIIIT/templates/examination/notReady_publish.html +++ b/FusionIIIT/templates/examination/notReady_publish.html @@ -8,13 +8,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/publish.html b/FusionIIIT/templates/examination/publish.html index 97879e2b0..620036fd3 100644 --- a/FusionIIIT/templates/examination/publish.html +++ b/FusionIIIT/templates/examination/publish.html @@ -8,13 +8,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/submit.html b/FusionIIIT/templates/examination/submit.html index 41baa2676..70c5cf6eb 100644 --- a/FusionIIIT/templates/examination/submit.html +++ b/FusionIIIT/templates/examination/submit.html @@ -9,13 +9,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript @@ -66,24 +69,8 @@

Submit Result

- - - - - - - diff --git a/FusionIIIT/templates/examination/timetable.html b/FusionIIIT/templates/examination/timetable.html index 846dc601f..98116fb29 100644 --- a/FusionIIIT/templates/examination/timetable.html +++ b/FusionIIIT/templates/examination/timetable.html @@ -9,13 +9,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/verify.html b/FusionIIIT/templates/examination/verify.html index ae7785d06..fcdf859c6 100644 --- a/FusionIIIT/templates/examination/verify.html +++ b/FusionIIIT/templates/examination/verify.html @@ -61,13 +61,16 @@ Verify + Authenticate Course + + Publish Announcement - Time Table + Generate Transcript diff --git a/FusionIIIT/templates/examination/verifygrades.html b/FusionIIIT/templates/examination/verifygrades.html index d716d6586..2a8c864a6 100644 --- a/FusionIIIT/templates/examination/verifygrades.html +++ b/FusionIIIT/templates/examination/verifygrades.html @@ -8,13 +8,17 @@ Verify + Authenticate Course + + Publish + Announcement - Time Table + Generate Transcript @@ -53,7 +57,9 @@

VERIFY STUDENT MARKS

- + {% comment %} {% endcomment %} + +
@@ -154,5 +160,13 @@

VERIFY STUDENT MARKS

input.addEventListener('input', updateChart); }); }); + + function finalizeGrades() { + // Submit the form + document.querySelector('form').submit(); + + // Redirect to the URL that handles Excel download + window.location.href = "{% url 'examination:submit' %}"; + } {% endblock %} \ No newline at end of file