From 27e8bf3491617a553274478ccc94b2c437b98106 Mon Sep 17 00:00:00 2001 From: ChallaBharadwajReddy Date: Wed, 23 Oct 2024 00:19:10 +0530 Subject: [PATCH 1/6] Essential changes in AC-2 * Important Validations * Random elective allocatin algo implementation in utils * New page for starting allocation process --- .../academic_information/utils.py | 100 ++++++++++++++++++ .../academic_information/views.py | 8 +- .../programme_curriculum/models.py | 2 +- .../auto_pre_registration.html | 5 +- FusionIIIT/templates/ais/ais.html | 10 ++ .../ais/start_elective_allocation.html | 84 +++++++++++++++ 6 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 FusionIIIT/applications/academic_information/utils.py create mode 100644 FusionIIIT/templates/ais/start_elective_allocation.html diff --git a/FusionIIIT/applications/academic_information/utils.py b/FusionIIIT/applications/academic_information/utils.py new file mode 100644 index 000000000..122e43127 --- /dev/null +++ b/FusionIIIT/applications/academic_information/utils.py @@ -0,0 +1,100 @@ +from applications.academic_information.models import (Calendar, Student,Curriculum_Instructor, Curriculum, + Student_attendance) +from ..academic_procedures.models import (BranchChange, CoursesMtech, InitialRegistration, StudentRegistrationChecks, + Register, Thesis, FinalRegistration, ThesisTopicProcess, + Constants, FeePayments, TeachingCreditRegistration, SemesterMarks, + MarkSubmissionCheck, Dues,AssistantshipClaim, MTechGraduateSeminarReport, + PhDProgressExamination,CourseRequested, course_registration, MessDue, Assistantship_status , backlog_course) + +from applications.programme_curriculum.models import(Course,CourseSlot) +from django.http import HttpResponse, JsonResponse +from django.utils import timezone +from django.db.models import Q +import datetime +import random +from django.db import transaction +time = timezone.now() +def check_for_registration_complete (request): + batch = int(request.POST.get('batch')) + sem = int(request.POST.get('sem')) + + date = time.date() + + try: + + pre_registration_date = Calendar.objects.all().filter(description=f"Pre Registration {sem} {batch}").first() + prd_start_date = pre_registration_date.from_date + prd_end_date = pre_registration_date.to_date + + if date=prd_start_date and date<=prd_end_date: + return JsonResponse({'status':-1 , "message":"registration is under process"}) + + if course_registration.objects.filter(Q(semester_id__semester_no = sem) & Q(student_id__batch = batch)).exists() : + return JsonResponse({'status':2,"message":"courses already allocated"}) + + return JsonResponse({"status":1 , "message" : "courses not yet allocated"}) + except : + return JsonResponse({"status":-3, "message" : "No such registration found"}) + +@transaction.atomic +def random_algo(request) : + print("hi") + batch = request.POST.get('batch') + sem = request.POST.get('sem') + unique_course = InitialRegistration.objects.filter(Q(semester_id__semester_no = sem) & Q(student_id__batch = batch)).values_list('course_id',flat=True).distinct() + print("unique course") + print(len(unique_course)) + max_seats={} + seats_alloted = {} + present_priority = {} + next_priority = {} + total_seats = 0 + for course in unique_course : + max_seats[course] = Course.objects.get(id=course).max_seats + total_seats+=max_seats[course] + seats_alloted[course] = 0 + present_priority[course] = [] + next_priority[course] = [] + + priority_1 = InitialRegistration.objects.filter(Q(semester_id__semester_no = sem) & Q(student_id__batch = batch) & Q(priority=1)) + print(priority_1) + rem=0 + for p in priority_1 : + present_priority[p.course_id.id].append([p.student_id.id.id,p.course_slot_id.id]) + rem+=1 + + if rem > total_seats : + return JsonResponse({'status': -1 , 'message' : "seats not enough"}) + with transaction.atomic : + present_priority = 1 + while rem > 0 : + for course in present_priority : + print(course) + while(len(present_priority[course])) : + random_student_selected = random.choice(present_priority[course]) + + present_priority[course].remove(random_student_selected) + + if seats_alloted[course] < max_seats[course] : + stud = Student.objects.get(student_id__id = random_student_selected[0]) + course_object = Course.objects.get(id=course) + course_slot_object = CourseSlot.objects.get(id = random_student_selected[1]) + course_registration.objects.create( + student_id = stud, + working_year = time.year, + semester_id = sem, + course_id = course_object, + course_slot_id = course_slot_object + ) + seats_alloted[course] += 1 + rem-=1 + else : + next = InitialRegistration.objects.get(Q(student_id__id = random_student_selected[0]) & Q(course_id__id = course) & Q(priority = present_priority+1)) + next_priority[course].append([next.student_id.id.id,next.course_slot_id.id]) + present_priority = next_priority + next_priority = {course : [] for course in unique_course} + + print(rem) + return JsonResponse({'status':1}) diff --git a/FusionIIIT/applications/academic_information/views.py b/FusionIIIT/applications/academic_information/views.py index 2fab71e2f..df0e77f9a 100755 --- a/FusionIIIT/applications/academic_information/views.py +++ b/FusionIIIT/applications/academic_information/views.py @@ -31,6 +31,7 @@ from applications.academic_procedures.views import acad_proced_global_context , get_sem_courses from applications.programme_curriculum.models import Batch from django.db.models import Q +from .utils import check_for_registration_complete, random_algo @login_required @@ -214,7 +215,12 @@ def homepage(request): """ if user_check(request): return HttpResponseRedirect('/academic-procedures/') - + + if request.method == "POST": + if 'check_allocation' in request.POST : + return check_for_registration_complete(request) + if 'start_allocation' in request.POST : + return random_algo(request) context = get_context(request) return render(request, "ais/ais.html", context) diff --git a/FusionIIIT/applications/programme_curriculum/models.py b/FusionIIIT/applications/programme_curriculum/models.py index 655994c1c..b09482669 100644 --- a/FusionIIIT/applications/programme_curriculum/models.py +++ b/FusionIIIT/applications/programme_curriculum/models.py @@ -261,7 +261,7 @@ class Course(models.Model): working_course = models.BooleanField(default=True) disciplines = models.ManyToManyField(Discipline, blank=True) latest_version = models.BooleanField(default=True) - + max_seats = models.IntegerField(default=90) class Meta: unique_together = ('code', 'version') diff --git a/FusionIIIT/templates/academic_procedures/auto_pre_registration.html b/FusionIIIT/templates/academic_procedures/auto_pre_registration.html index 033c468fe..fcf496fcf 100644 --- a/FusionIIIT/templates/academic_procedures/auto_pre_registration.html +++ b/FusionIIIT/templates/academic_procedures/auto_pre_registration.html @@ -247,7 +247,7 @@
- +
@@ -291,6 +291,8 @@ var inp = document.getElementsByClassName("Prechoices"); var count = 0; + document.getElementById('register-button').style.display = 'none'; + let course_slots = document.getElementsByName("course_slot"); let credits = document.getElementsByClassName("credit_values"); @@ -303,6 +305,7 @@ // // console.log("course_priority-" + course_slot_id , course_priority[j].value ) if ((!(course_slot_type.startsWith("Optional") && course_slot_type != "Optional Elective") && !course_slot_type.startsWith("Swayam") )&& course_priority[j].value == "NULL") { alert("Please select all choices for " + parseInt(i + 1) + " " + course_slot_type + " slot"); + document.getElementById('register-button').style = "text-allign:center;"; return false; } let selected_course = course_priority[j].value.split("-"); diff --git a/FusionIIIT/templates/ais/ais.html b/FusionIIIT/templates/ais/ais.html index d749b0270..7e248a2ed 100755 --- a/FusionIIIT/templates/ais/ais.html +++ b/FusionIIIT/templates/ais/ais.html @@ -111,6 +111,10 @@ Student Dashboard + + Start elective assignment + +