@@ -250,7 +250,7 @@ def add_course(request):
250250 id__user = request .user
251251 )
252252
253- eligibility_resp = get_add_drop_replace_registration_eligibility (
253+ eligibility_resp = get_add_registration_eligibility (
254254 timezone .now ().date (),
255255 student .curr_semester_no ,
256256 datetime .datetime .now ().year
@@ -375,7 +375,7 @@ def get_student_add_course_slots(request):
375375 'error' : 'Student information not found'
376376 }, status = status .HTTP_400_BAD_REQUEST )
377377
378- eligibility_resp = get_add_drop_replace_registration_eligibility (
378+ eligibility_resp = get_add_registration_eligibility (
379379 timezone .now ().date (),
380380 student .curr_semester_no ,
381381 datetime .datetime .now ().year
@@ -2281,20 +2281,47 @@ def course_registration_view(request):
22812281 return Response ({"error" : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
22822282
22832283
2284- def get_add_drop_replace_registration_eligibility (current_date , user_sem , year = datetime .datetime .now ().year ):
2284+ def get_add_registration_eligibility (current_date , user_sem , year = datetime .datetime .now ().year ):
22852285 try :
2286- add_drop_date = Calendar .objects .get (description = f"Add/Drop/Replace { user_sem } { year } " )
2287- add_drop_start_date = add_drop_date .from_date
2288- add_drop_end_date = add_drop_date .to_date
2289- if current_date < add_drop_start_date :
2290- return JsonResponse ({f"error" : "Add/Drop/Replace will start from {add_drop_start_date } to {add_drop_end_date }" }, status = 400 )
2291- elif current_date > add_drop_end_date :
2292- return JsonResponse ({f"error" : "Add/Drop/Replace has ended" }, status = 400 )
2286+ add_date = Calendar .objects .get (description = f"Add { user_sem } { year } " )
2287+ add_start_date = add_date .from_date
2288+ add_end_date = add_date .to_date
2289+ if current_date < add_start_date :
2290+ return JsonResponse ({f"error" : f "Add course will start from { add_start_date } to { add_end_date } " }, status = 400 )
2291+ elif current_date > add_end_date :
2292+ return JsonResponse ({f"error" : "Add course period has ended" }, status = 400 )
22932293 except Calendar .DoesNotExist :
2294- return JsonResponse ({f"error" : "Add/Drop/Replace Date is not yet Decided " }, status = 400 )
2294+ return JsonResponse ({f"error" : "Add course date is not yet decided " }, status = 400 )
22952295 except Exception as e :
2296- pass
2296+ return JsonResponse ({ f"error" : str ( e )}, status = 400 )
22972297
2298+ def get_drop_registration_eligibility (current_date , user_sem , year = datetime .datetime .now ().year ):
2299+ try :
2300+ drop_date = Calendar .objects .get (description = f"Drop { user_sem } { year } " )
2301+ drop_start_date = drop_date .from_date
2302+ drop_end_date = drop_date .to_date
2303+ if current_date < drop_start_date :
2304+ return JsonResponse ({f"error" : f"Drop course will start from { drop_start_date } to { drop_end_date } " }, status = 400 )
2305+ elif current_date > drop_end_date :
2306+ return JsonResponse ({f"error" : "Drop course period has ended" }, status = 400 )
2307+ except Calendar .DoesNotExist :
2308+ return JsonResponse ({f"error" : "Drop course date is not yet decided" }, status = 400 )
2309+ except Exception as e :
2310+ return JsonResponse ({f"error" : str (e )}, status = 400 )
2311+
2312+ def get_replace_registration_eligibility (current_date , user_sem , year = datetime .datetime .now ().year ):
2313+ try :
2314+ replace_date = Calendar .objects .get (description = f"Replace { user_sem } { year } " )
2315+ replace_start_date = replace_date .from_date
2316+ replace_end_date = replace_date .to_date
2317+ if current_date < replace_start_date :
2318+ return JsonResponse ({f"error" : f"Replace course will start from { replace_start_date } to { replace_end_date } " }, status = 400 )
2319+ elif current_date > replace_end_date :
2320+ return JsonResponse ({f"error" : "Replace course period has ended" }, status = 400 )
2321+ except Calendar .DoesNotExist :
2322+ return JsonResponse ({f"error" : "Replace course date is not yet decided" }, status = 400 )
2323+ except Exception as e :
2324+ return JsonResponse ({f"error" : str (e )}, status = 400 )
22982325
22992326def get_pre_registration_eligibility (current_date , user_sem , year = datetime .datetime .now ().year ):
23002327 try :
@@ -2549,20 +2576,19 @@ def get_swayam_registration_data(request):
25492576 user_details = current_user .extrainfo # assuming extrainfo holds the student id/reference
25502577 student = Student .objects .get (id = user_details )
25512578 semester_no = student .curr_semester_no
2552- next_sem_no = semester_no + 1 # adjust if needed (e.g. semester_no+1)
25532579 try :
2554- next_semester = Semester .objects .get (
2580+ current_semester = Semester .objects .get (
25552581 curriculum = student .batch_id .curriculum ,
2556- semester_no = next_sem_no
2582+ semester_no = semester_no
25572583 )
25582584 except Semester .DoesNotExist :
25592585 return JsonResponse ({"error" : "Not Eligible for Swayam Registration" }, status = 400 )
25602586
2561- eligibility_resp = get_swayam_registration_eligibility (timezone .now ().date (), next_sem_no )
2587+ eligibility_resp = get_swayam_registration_eligibility (timezone .now ().date (), semester_no )
25622588 if isinstance (eligibility_resp , JsonResponse ):
25632589 return eligibility_resp
25642590 # For Swayam registration, fetch only those course slots whose name starts with "SW".
2565- course_slots = CourseSlot .objects .filter (semester = next_semester , name__startswith = "SW" )
2591+ course_slots = CourseSlot .objects .filter (semester = current_semester , name__startswith = "SW" )
25662592 data = []
25672593 for slot in course_slots :
25682594 courses = slot .courses .all ()
@@ -2579,7 +2605,7 @@ def get_swayam_registration_data(request):
25792605 "sno" : slot .id ,
25802606 "slot_name" : slot .name ,
25812607 "slot_type" : slot .type ,
2582- "semester" : next_sem_no ,
2608+ "semester" : semester_no ,
25832609 "course_choices" : course_choices ,
25842610 })
25852611 return JsonResponse (data , safe = False )
@@ -2625,38 +2651,68 @@ def submit_swayam_registration(request):
26252651 user_details = current_user .extrainfo
26262652 student = Student .objects .get (id = user_details )
26272653 semester_no = student .curr_semester_no
2628- next_sem_no = semester_no + 1
26292654 try :
26302655 semester = Semester .objects .get (
26312656 curriculum = student .batch_id .curriculum ,
2632- semester_no = next_sem_no
2657+ semester_no = semester_no
26332658 )
26342659 except Semester .DoesNotExist :
26352660 return JsonResponse ({"error" : "Not Eligible for Swayam Registration" }, status = 400 )
26362661 except Student .DoesNotExist :
26372662 return Response ({"error" : "Student not found" }, status = 404 )
26382663
2639- eligibility_resp = get_swayam_registration_eligibility (timezone .now ().date (), next_sem_no )
2664+ eligibility_resp = get_swayam_registration_eligibility (timezone .now ().date (), semester_no )
26402665 if isinstance (eligibility_resp , JsonResponse ):
26412666 return eligibility_resp
2667+
26422668 registrations = payload .get ("registrations" , [])
2669+ errors = []
2670+ success_count = 0
2671+
26432672 for reg in registrations :
26442673 slot_id = reg .get ("slot_id" )
26452674 course_id = reg .get ("course_id" )
26462675 selected_option = reg .get ("selected_option" )
26472676 remark = reg .get ("remark" )
2677+
26482678 try :
26492679 course = Courses .objects .get (id = course_id )
26502680 except Courses .DoesNotExist :
2681+ errors .append (f"Course with ID { course_id } does not exist" )
26512682 continue
26522683
2653- course_registration .objects .create (
2684+ # Check if already registered for this course
2685+ existing_registration = course_registration .objects .filter (
26542686 course_id = course ,
2655- semester_id_id = semester .id ,
2656- student_id = student ,
2657- course_slot_id_id = slot_id ,
2658- )
2659- return JsonResponse ({"status" : "success" }, status = 201 )
2687+ semester_id = semester ,
2688+ student_id = student
2689+ ).first ()
2690+
2691+ if existing_registration :
2692+ errors .append (f"Already registered for course: { course .code } - { course .name } " )
2693+ continue
2694+
2695+ try :
2696+ course_registration .objects .create (
2697+ course_id = course ,
2698+ semester_id_id = semester .id ,
2699+ student_id = student ,
2700+ course_slot_id_id = slot_id
2701+ )
2702+ success_count += 1
2703+ except Exception as e :
2704+ errors .append (f"Failed to register for { course .code } : { str (e )} " )
2705+
2706+ if errors and success_count == 0 :
2707+ return JsonResponse ({"error" : ", " .join (errors )}, status = 400 )
2708+ elif errors :
2709+ return JsonResponse ({
2710+ "status" : "partial_success" ,
2711+ "message" : f"Registered { success_count } course(s) successfully" ,
2712+ "errors" : errors
2713+ }, status = 200 )
2714+
2715+ return JsonResponse ({"status" : "success" , "message" : f"Successfully registered { success_count } course(s)" }, status = 201 )
26602716
26612717
26622718@api_view (['GET' ])
@@ -3070,7 +3126,7 @@ def registered_slots(request):
30703126 user_details = current_user .extrainfo
30713127 student = Student .objects .get (id = user_details )
30723128 session , semester_type = generate_current_session (datetime .datetime .now ().year , student .curr_semester_no )
3073- eligibility_resp = get_add_drop_replace_registration_eligibility (timezone .now ().date (), student .curr_semester_no , datetime .datetime .now ().year )
3129+ eligibility_resp = get_replace_registration_eligibility (timezone .now ().date (), student .curr_semester_no , datetime .datetime .now ().year )
30743130 if isinstance (eligibility_resp , JsonResponse ):
30753131 return eligibility_resp
30763132 regs = course_registration .objects .filter (student_id = student , semester_id__semester_no = student .curr_semester_no ).exclude (course_slot_id__name__startswith = 'SW' ).exclude (course_slot_id__name__startswith = 'BL' )
@@ -3103,7 +3159,7 @@ def batch_create_requests(request):
31033159 current_user = request .user
31043160 user_details = current_user .extrainfo
31053161 student = Student .objects .get (id = user_details )
3106- eligibility_resp = get_add_drop_replace_registration_eligibility (timezone .now ().date (), student .curr_semester_no , datetime .datetime .now ().year )
3162+ eligibility_resp = get_replace_registration_eligibility (timezone .now ().date (), student .curr_semester_no , datetime .datetime .now ().year )
31073163 if isinstance (eligibility_resp , JsonResponse ):
31083164 return eligibility_resp
31093165 data = json .loads (request .body ).get ('requests' , [])
@@ -3345,7 +3401,7 @@ def student_registrations_for_drop(request):
33453401 current_user = request .user
33463402 user_details = current_user .extrainfo
33473403 student = Student .objects .get (id = user_details )
3348- eligibility_resp = get_add_drop_replace_registration_eligibility (timezone .now ().date (), student .curr_semester_no , datetime .datetime .now ().year )
3404+ eligibility_resp = get_drop_registration_eligibility (timezone .now ().date (), student .curr_semester_no , datetime .datetime .now ().year )
33493405 if isinstance (eligibility_resp , JsonResponse ):
33503406 return eligibility_resp
33513407 regs = course_registration .objects .filter (student_id = student , semester_id__semester_no = student .curr_semester_no ).order_by ('course_slot_id__name' )
@@ -3382,7 +3438,7 @@ def drop_course(request):
33823438
33833439 student = Student .objects .select_related ('id__user' , 'batch_id' ).get (id = user_details )
33843440
3385- eligibility_resp = get_add_drop_replace_registration_eligibility (
3441+ eligibility_resp = get_drop_registration_eligibility (
33863442 timezone .now ().date (),
33873443 student .curr_semester_no ,
33883444 datetime .datetime .now ().year
0 commit comments