From 51e42a9de304839f2bf9ea4d7afe31bb186c2c09 Mon Sep 17 00:00:00 2001 From: Akash Kumar Sah Date: Sun, 1 Dec 2024 17:21:42 +0530 Subject: [PATCH 01/23] feat(course_registration): Added option to add course for any sem --- ...4_course_registration_registration_type.py | 18 +++++++++++ .../academic_procedures/models.py | 11 +++++++ .../applications/academic_procedures/views.py | 30 ++++++++++++------- .../academic_procedures/current_sem.html | 14 +++++---- .../academic_procedures/studentCourses.html | 17 ++++++++++- 5 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 FusionIIIT/applications/academic_procedures/migrations/0004_course_registration_registration_type.py diff --git a/FusionIIIT/applications/academic_procedures/migrations/0004_course_registration_registration_type.py b/FusionIIIT/applications/academic_procedures/migrations/0004_course_registration_registration_type.py new file mode 100644 index 000000000..1731e55f7 --- /dev/null +++ b/FusionIIIT/applications/academic_procedures/migrations/0004_course_registration_registration_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2024-12-01 16:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('academic_procedures', '0003_finalregistration_registration_type'), + ] + + operations = [ + migrations.AddField( + model_name='course_registration', + name='registration_type', + field=models.CharField(choices=[('Audit', 'Audit'), ('Improvement', 'Improvement'), ('Backlog', 'Backlog'), ('Regular', 'Regular')], default='Regular', max_length=20), + ), + ] diff --git a/FusionIIIT/applications/academic_procedures/models.py b/FusionIIIT/applications/academic_procedures/models.py index 6f33e293f..d0a909512 100644 --- a/FusionIIIT/applications/academic_procedures/models.py +++ b/FusionIIIT/applications/academic_procedures/models.py @@ -705,6 +705,17 @@ class course_registration(models.Model): semester_id = models.ForeignKey(Semester, on_delete=models.CASCADE) course_id = models.ForeignKey(Courses, on_delete=models.CASCADE) course_slot_id = models.ForeignKey(CourseSlot, null=True, blank=True, on_delete=models.SET_NULL) + REGISTRATION_TYPE_CHOICES = [ + ('Audit', 'Audit'), + ('Improvement', 'Improvement'), + ('Backlog', 'Backlog'), + ('Regular', 'Regular'), + ] + registration_type = models.CharField( + max_length=20, + choices=REGISTRATION_TYPE_CHOICES, + default='Regular', + ) # grade = models.CharField(max_length=10) #course_registration_year = models.IntegerField() def __str__(self): diff --git a/FusionIIIT/applications/academic_procedures/views.py b/FusionIIIT/applications/academic_procedures/views.py index 6e3b9f4f8..347a4f1f0 100644 --- a/FusionIIIT/applications/academic_procedures/views.py +++ b/FusionIIIT/applications/academic_procedures/views.py @@ -408,6 +408,7 @@ def academic_procedures_student(request): next_sem_registration_courses = get_sem_courses(next_sem_id, batch) final_registration_choice, unavailable_courses_nextsem = get_final_registration_choices(next_sem_registration_courses,batch.year) currently_registered_course = get_currently_registered_course(obj,obj.curr_semester_no) + current_courseregistrations = get_currently_registered_course(obj,obj.curr_semester_no, True) current_credits = get_current_credits(currently_registered_course) @@ -562,6 +563,7 @@ def academic_procedures_student(request): {'details': details, # 'calendar': calendar, 'currently_registered': currently_registered_course, + 'current_courseregistrations': current_courseregistrations, 'pre_registered_course' : pre_registered_courses, 'pre_registered_course_show' : pre_registered_course_show, 'final_registered_course' : final_registered_courses, @@ -1048,14 +1050,15 @@ def verify_course(request): details = [] current_sem_courses = get_currently_registered_course( - roll_no, curr_sem_id) + roll_no, curr_sem_id, True) idd = obj2 for z in current_sem_courses: - z = z[1] + # print(z) + # z = z[1] print(z) - course_code = z.code - course_name = z.name + course_code = z.course_id.code + course_name = z.course_id.name # course_code, course_name = str(z).split(" - ") k = {} # reg_ig has course registration id appended with the the roll number @@ -1068,8 +1071,9 @@ def verify_course(request): for p in courseobj2: k['course_id'] = course_code k['course_name'] = course_name - k['sem'] = curr_sem_id.semester_no + k['sem'] = z.semester_id.semester_no k['credits'] = p.credit + k['registration_type'] = z.registration_type details.append(k) year = demo_date.year @@ -1111,8 +1115,9 @@ def acad_add_course(request): 'id', 'id__user', 'id__department').filter(id=roll_no).first() sem_id = request.POST['semester_id'] semester = Semester.objects.get(id=sem_id) + registration_type = request.POST["registration_type"] cr = course_registration( - course_id=course, student_id=student, semester_id=semester , working_year = datetime.datetime.now().year,) + course_id=course, student_id=student, semester_id=semester , working_year = datetime.datetime.now().year, registration_type=registration_type) cr.save() return HttpResponseRedirect('/academic-procedures/') @@ -2104,12 +2109,17 @@ def get_currently_registered_courses(id, user_sem): ans.append(course) return ans -def get_currently_registered_course(id, sem_id): - # obj = course_registration.objects.all().filter(student_id = id, semester_id=sem_id) - obj = course_registration.objects.all().filter(student_id = id) +def get_currently_registered_course(id, sem_id, courseregobj=False): + if (type(sem_id) == int): + obj = course_registration.objects.all().filter(student_id = id, semester_id__semester_no=sem_id) + else: + obj = course_registration.objects.all().filter(student_id = id) courses = [] for i in obj: - courses.append((i.course_slot_id,i.course_id)) + if (courseregobj): + courses.append(i) + else: + courses.append((i.course_slot_id,i.course_id)) return courses diff --git a/FusionIIIT/templates/academic_procedures/current_sem.html b/FusionIIIT/templates/academic_procedures/current_sem.html index e8a572b74..02a18f580 100755 --- a/FusionIIIT/templates/academic_procedures/current_sem.html +++ b/FusionIIIT/templates/academic_procedures/current_sem.html @@ -74,28 +74,32 @@
Course ID
Course Name
Credits
+
Registration Type
Semester
- {% for items in currently_registered %} + {% for items in current_courseregistrations %}
{{ forloop.counter }} .
- {{ items.1.code }} + {{ items.course_id.code }} - {{ items.1.name}} + {{ items.course_id.name}} -
{{ items.1.credit }}
+
{{ items.course_id.credit }}
+ + +
{{ items.registration_type }}
{{curr_sem.semester_no}}
- + -
+
- {% for working_year in working_years %} @@ -56,6 +58,29 @@

Submit Results

-{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/FusionIIIT/templates/examination/submitGrade.html b/FusionIIIT/templates/examination/submitGrade.html index 85772136a..e323a4d9f 100644 --- a/FusionIIIT/templates/examination/submitGrade.html +++ b/FusionIIIT/templates/examination/submitGrade.html @@ -24,54 +24,64 @@ {% block content %}

Update Result

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

Grade Report

+
+
+

Roll No: {{ student.id_id }}

+

Name: {{ student_user }}

+
+
+

Discipline: {{ student.specialization }}

+
+
+ + + + + + + + + + + + {% for grade in grades %} + + + + + + + {% endfor %} + +
Course CodeCourse NameCreditsGrade
{{ grade.course_id.code }}{{ grade.course_id.name }}{{ grade.course_id.credit }}{{ grade.grade }}
+ +
+
+
{{ spi }}
+
SPI
+
+
+
{{ semester_units }}
+
SU
+
+
+
{{ total_units }}
+
TU
+
+
+ +

Note: This is system generated, there is no need for signature.

+ + +
+
+ {% endblock %} \ No newline at end of file From 68a3caf5496a09fdec7b609051000b634259194d Mon Sep 17 00:00:00 2001 From: grvup <128596203+grvup@users.noreply.github.com> Date: Fri, 27 Dec 2024 10:37:37 +0530 Subject: [PATCH 23/23] fix(registration): bug fixes in allocate fn to handle backlog courses --- .../academic_information/utils.py | 103 ++++++++++-------- 1 file changed, 59 insertions(+), 44 deletions(-) diff --git a/FusionIIIT/applications/academic_information/utils.py b/FusionIIIT/applications/academic_information/utils.py index 49e2e75f5..28d06a1af 100644 --- a/FusionIIIT/applications/academic_information/utils.py +++ b/FusionIIIT/applications/academic_information/utils.py @@ -97,57 +97,72 @@ def random_algo(batch,sem,year,course_slot) : return 1 @transaction.atomic -def allocate(request) : +def allocate(request): batch = request.POST.get('batch') sem = request.POST.get('sem') year = request.POST.get('year') - unique_course_slot = InitialRegistration.objects.filter(Q(semester_id__semester_no = sem) & Q(student_id__batch = batch)).values('course_slot_id', 'registration_type').distinct() + unique_course_slot = InitialRegistration.objects.filter(Q(semester_id_semester_no=sem) & Q( + student_id_batch=batch)).values('course_slot_id').distinct() unique_course_name = [] - try: - with transaction.atomic() : - for entry in unique_course_slot : - course_slot_object = CourseSlot.objects.get(id=entry['course_slot_id']) - print(course_slot_object) - if course_slot_object.type != "Open Elective": - # Fetch students registered in this course slot - students = InitialRegistration.objects.filter( - Q(semester_id__semester_no=sem) & - Q(course_slot_id=course_slot_object) & - Q(student_id__batch=batch) - ).values_list('student_id', flat=True) - - # Allocate each student directly to FinalRegistration - for student_id in students: - student = Student.objects.get(id=student_id) - semester = Semester.objects.get(semester_no=sem, curriculum=student.batch_id.curriculum) - print(semester.id) - # course = Course.objects.get(id=course_slot_object.courses.id) - course_id = course_slot_object.courses.values_list('id', flat=True).first() - # Retrieve the Course instance - course = Course.objects.get(id=course_id) - - # Insert directly into FinalRegistration - FinalRegistration.objects.create( - student_id=student, - verified=False, - semester_id=semester, - course_id=course, - course_slot_id=course_slot_object, - registration_type=entry['registration_type'] - ) + try: + with transaction.atomic(): + for entry in unique_course_slot: + course_slot_object = CourseSlot.objects.get( + id=entry['course_slot_id']) + if course_slot_object.type != "Open Elective": + # Fetch students registered in this course slot + students = InitialRegistration.objects.filter( + Q(semester_id__semester_no=sem) & + Q(course_slot_id=course_slot_object) & + Q(student_id__batch=batch) + ).values_list('student_id', flat=True) + + # Allocate each student directly to FinalRegistration + for student_id in students: + student = Student.objects.get(id=student_id) + semester = Semester.objects.get( + semester_no=sem, curriculum=student.batch_id.curriculum) + regis = InitialRegistration.objects.filter( + course_slot_id_id=course_slot_object, + student_id_id=student_id + ).values_list('registration_type', flat=True).first() + # course = Course.objects.get(id=course_slot_object.courses.id) + # course_id = course_slot_object.courses.values_list('id', flat=True).first() + course_id = InitialRegistration.objects.filter( + course_slot_id_id=course_slot_object, + student_id_id=student_id + ).values_list('course_id', flat=True).first() + + # Retrieve the Course instance + course = Course.objects.get(id=course_id) + + # Insert directly into FinalRegistration + # if course_slot_object.name in unique_course_name: + # print("skip") + # continue + + FinalRegistration.objects.create( + student_id=student, + verified=False, + semester_id=semester, + course_id=course, + course_slot_id=course_slot_object, + registration_type=regis + ) + + unique_course_name.append(course_slot_object.name) + elif course_slot_object.type == "Open Elective": # Runs only for open elective course slots + if course_slot_object.name not in unique_course_name: + stat = random_algo(batch, sem, year, course_slot_object.name) unique_course_name.append(course_slot_object.name) - elif course_slot_object.type == "Open Elective": # Runs only for open elective course slots - if course_slot_object.name not in unique_course_name: - stat = random_algo(batch,sem,year,course_slot_object.name) - unique_course_name.append(course_slot_object.name) - if(stat == -1) : - print(course_slot_object.name) - raise Exception("seats not enough for course_slot"+str(course_slot_object.name)) - - return JsonResponse({'status': 1 , 'message' : "course allocation successful"}) + if (stat == -1): + print("Seats not enough for course_slot", str(course_slot_object.name), "terminating process...") + raise Exception("seats not enough for course_slot "+str(course_slot_object.name)) + + return JsonResponse({'status': 1, 'message': "course allocation successful"}) except: - return JsonResponse({'status': -1 , 'message' : "seats not enough for some course_slot"}) + return JsonResponse({'status': -1, 'message': "seats not enough for some course_slot"}) def view_alloted_course(request) : batch = request.POST.get('batch')