Skip to content

Commit

Permalink
Merge pull request #1638 from Lone24wolf/ac-7-examination
Browse files Browse the repository at this point in the history
Ac 7 examination
  • Loading branch information
dvjsharma authored Oct 23, 2024
2 parents b2612e2 + f8c95af commit e792eb1
Show file tree
Hide file tree
Showing 8 changed files with 402 additions and 12 deletions.
3 changes: 3 additions & 0 deletions FusionIIIT/applications/examination/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,8 @@
path('verifyGradesDean/',views.verifyGradesDean,name='verifyGradesDean'),
path('updateEntergradesDean/',views.updateEntergradesDean,name='updateEnterGradesDean'),
path('upload_grades_prof/',views.upload_grades_prof,name='upload_grades_prof'),
path('validateDean/',views.validateDean,name='validateDean'),
path('validateDeanSubmit/',views.validateDeanSubmit,name='validateDeanSubmit'),


]
122 changes: 120 additions & 2 deletions FusionIIIT/applications/examination/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ def post(self, request):
course_ids = request.POST.getlist('course_ids[]')
grades = request.POST.getlist('grades[]')
allow_resubmission = request.POST.get('allow_resubmission', 'NO')

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)

Expand Down Expand Up @@ -970,7 +970,7 @@ def submitGradesProf(request):
# unique_course_ids = course_registration.objects.values(
# 'course_id').distinct()
working_years = course_registration.objects.values("working_year").distinct()

course_ids_final=course_registration.objects.filter()
# Cast the course IDs to integers
unique_course_ids = unique_course_ids.annotate(
course_id_int=Cast("course_id", IntegerField())
Expand Down Expand Up @@ -1154,3 +1154,121 @@ def upload_grades_prof(request):
{"error": "Invalid request. Please upload a CSV file."}, status=400
)

def validateDean(request):
unique_course_ids = Student_grades.objects.filter(verified=True).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

# print(unique_course_ids)
courses_info = Courses.objects.filter(
id__in=unique_course_ids.values_list("course_id_int", flat=True)
)
working_years = course_registration.objects.values("working_year").distinct()

unique_batch_ids = Student_grades.objects.values("batch").distinct()

context = {"courses_info": courses_info, "working_years": working_years}

return render(request, "../templates/examination/validation.html", context)


def validateDeanSubmit(request):
if request.method == "POST" and request.FILES.get("csv_file"):
csv_file = request.FILES["csv_file"]

if not csv_file.name.endswith(".csv"):
return JsonResponse(
{"error": "Invalid file format. Please upload a CSV file."}, status=400
)

course_id = request.POST.get("course")
academic_year = request.POST.get("year")
# semester = request.POST.get('semester')
print(academic_year)
if academic_year is None or not academic_year.isdigit():
return JsonResponse(
{"error": "Academic year must be a valid number."}, status=400
)

if not course_id or not academic_year:
return JsonResponse(
{"error": "Course ID and Academic Year are required."}, status=400
)

# courses_info = Courses.objects.get(id=course_id)

# courses = Student_grades.objects.filter(
# course_id=courses_info.id, year=academic_year
# )
students = course_registration.objects.filter(
course_id_id=course_id, working_year=academic_year
)



try:
# Parse the CSV file
decoded_file = csv_file.read().decode("utf-8").splitlines()
reader = csv.DictReader(decoded_file)

required_columns = ["roll_no", "name", "grade", "remarks"]
if not all(column in reader.fieldnames for column in required_columns):
return JsonResponse(
{
"error": "CSV file must contain the following columns: roll_no, name, grade, remarks."
},
status=400,
)
semester = students.first().semester_id_id
mismatch=[]
for row in reader:
roll_no = row["roll_no"]
grade = row["grade"]
remarks = row["remarks"]
batch_prefix = roll_no[:2]
batch = int(f"20{batch_prefix}")
Student_grades.objects.filter(
roll_no=roll_no,
course_id_id=course_id,
year=academic_year,
batch=batch,
)
student_grade = Student_grades.objects.get(
roll_no=roll_no,
course_id_id=course_id,
year=academic_year,
batch=batch
)
if student_grade.grade != grade:
mismatch.append({
"roll_no": roll_no,
"csv_grade": grade,
"db_grade": student_grade.grade,
"remarks": remarks,
"batch": batch,
"semester": semester,
"course_id": course_id,
})
if not mismatch:
message = "There Are no Mismatches"
context = {
"message":message,
}
return render(request, "../templates/examination/message.html", context)
context = {
"mismatch": mismatch,
}
return render(request, "../templates/examination/validationSubmit.html", context)

except Exception as e:

error_message = f"An error occurred while processing the file: {str(e)}"
context = {
"message": error_message,
}
return render(request, "../templates/examination/message.html", context)
2 changes: 1 addition & 1 deletion FusionIIIT/templates/examination/gradeSubmission.html
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ <h1>Submit Results</h1>
alert('Please select course, year, and upload a CSV file.');
return;
}
if (!confirm('Are you sure you want to submit?')) {
if (!confirm('Are you sure you want to submit? This cannot be Undone')) {
// If the user clicks "Cancel", do not proceed
return;
}
Expand Down
6 changes: 3 additions & 3 deletions FusionIIIT/templates/examination/submitGradeDean.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
<a class="item" href="{% url 'examination:submitGrades' %}">Submit
<i class="right floated chevron right icon"></i>
</a> {% endcomment %}
<a class="active item" href="{% url 'examination:updateGrades' %}"><B>Verify</B>
<a class="active item" href="{% url 'examination:verifyGradesDean' %}"><B>Verify</B>
<i class="right floated chevron right icon"></i>
</a>
{% comment %} <a class="item" href="{% url 'examination:authenticate' %}">Authenticate Course
<a class="item" href="{% url 'examination:validateDean' %}"> Validate
<i class="right floated chevron right icon"></i>
</a> {% endcomment %}
</a>

{% comment %} <a class="item" href="{% url 'examination:announcement' %}">Announcement
<i class="right floated chevron right icon"></i>
Expand Down
4 changes: 4 additions & 0 deletions FusionIIIT/templates/examination/updateEntergrades.html
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,10 @@ <h1 class="ui header">VERIFY STUDENT MARKS</h1>

function finalizeGrades() {
// Submit the form
//if (!confirm('Are you sure you want to submit? This cannot be Undone')) {
// If the user clicks "Cancel", do not proceed
// return;
// }
document.querySelector('form').submit();
console.log("hyee")
// Redirect to the URL that handles Excel download
Expand Down
7 changes: 1 addition & 6 deletions FusionIIIT/templates/examination/updateEntergradesDean.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,9 @@
<i class="right floated chevron right icon"></i>
</a> {% endcomment %}

{% if 'acadadmin' == request.user.extrainfo.user_type %}
<a class="item" href="{% url 'examination:announcement' %}">Announcement
<i class="right floated chevron right icon"></i>
</a>
<a class="item" href="{% url 'examination:generate_transcript_form' %}">Generate Transcript
<a class="item" href="{% url 'examination:validateDean' %}"> Validate
<i class="right floated chevron right icon"></i>
</a>
{% endif %}
</div>
{% endblock %}

Expand Down
78 changes: 78 additions & 0 deletions FusionIIIT/templates/examination/validation.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
{% extends 'examination/base.html' %}

{% block sidetabmenu %}
<div class="ui medium fluid vertical pointing menu" style="max-width: 320px;">
<a class="item" href="{% url 'examination:verifyGradesDean' %}">Verify
<i class="right floated chevron right icon"></i>
</a>
{% comment %} <a class="item" href="{% url 'examination:authenticate' %}">Authenticate Course
<i class="right floated chevron right icon"></i>
</a> {% endcomment %}
<a class="item" href="{% url 'examination:validateDean' %}"> Validate
<i class="right floated chevron right icon"></i>
</a>
</div>
{% endblock %}

{% block content %}
<h1>Validate Results</h1>
<br />

<form id="your-form-id" method="POST" enctype="multipart/form-data" action="{% url 'examination:validateDeanSubmit' %}">
{% csrf_token %}
<div style="display: flex; flex-direction: column; gap: 30px;">
<div style="display: flex; flex-direction: row; gap: 50px;">
<div style="display: flex; flex-direction: row; gap: 10px;">
<div style="margin-top: 8px;">
<label>Course</label>
</div>
<div class="ui selection dropdown" id="course-dropdown">
<input type="hidden" name="course">
<i class="dropdown icon"></i>
<div class="default text">Select Course</div>
<div class="menu">
{% for course in courses_info %}
<div class="item" data-value="{{ course.id }}"> {{ course.code }} - {{ course.name }} - {{ course.version }}</div>
{% empty %}
<div class="item">No Courses Available</div>
{% endfor %}
</div>
</div>
</div>
<div style="display: flex; flex-direction: row; gap: 10px;">
<div style="margin-top: 8px;">
<label>Academic Year</label>
</div>
<div class="ui selection dropdown" id="year-dropdown">
<input type="hidden" name="year">
<i class="dropdown icon"></i>
<div class="default text">Select Year</div>
<div class="menu">
{% for working_year in working_years %}
<div class="item" data-value="{{ working_year.working_year }}"> {{ working_year.working_year }}</div>
{% empty %}
<div class="item">No Years Available</div>
{% endfor %}
</div>
</div>
</div>
</div>

<div style="display: flex; flex-direction: row; gap: 50px; margin-left: 10px;" id="upload-section">
<input type="file" id="csv-file" name="csv_file" accept=".csv" required>
<button type="submit" class="ui primary button">Validate</button>
</div>

<div style="display: flex; flex-direction: row; gap: 50px; margin-left: 10px;">
<button type="button" class="ui primary button" onclick="dwn_temp()">Download Template</button>
</div>
</div>
</form>

<script>
function dwn_temp(){
window.location.href = '/examination/download_template';
}
</script>

{% endblock %}
Loading

0 comments on commit e792eb1

Please sign in to comment.