diff --git a/.gitignore b/.gitignore index 497fd7a16..a96bc1887 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,10 @@ node_modules/ FusionIIIT/static/ package-lock.json + +docker-entrypoint.sh + + +FusionIIIT/applications/eis/migrations/ + +postgres_data \ No newline at end of file diff --git a/FusionIIIT/applications/academic_information/admin.py b/FusionIIIT/applications/academic_information/admin.py index 94f60274d..522815707 100755 --- a/FusionIIIT/applications/academic_information/admin.py +++ b/FusionIIIT/applications/academic_information/admin.py @@ -32,4 +32,3 @@ class Curriculum_InstructorAdmin(admin.ModelAdmin): admin.site.register(Holiday) admin.site.register(Curriculum,CurriculumAdmin) -#Hello! diff --git a/FusionIIIT/applications/academic_information/api/serializers.py b/FusionIIIT/applications/academic_information/api/serializers.py index 06d6154c5..fd4fb59b7 100644 --- a/FusionIIIT/applications/academic_information/api/serializers.py +++ b/FusionIIIT/applications/academic_information/api/serializers.py @@ -18,7 +18,6 @@ class Meta: class CurriculumSerializer(serializers.ModelSerializer): course_id = CourseSerializer() - class Meta: model = Curriculum fields = ('curriculum_id','course_code','course_id','credits','course_type', diff --git a/FusionIIIT/applications/academic_information/models.py b/FusionIIIT/applications/academic_information/models.py index ea1178878..60f658983 100755 --- a/FusionIIIT/applications/academic_information/models.py +++ b/FusionIIIT/applications/academic_information/models.py @@ -69,7 +69,7 @@ class Student(models.Model): ''' Current Purpose : To store information pertinent to a user who is also a student - + ATTRIBUTES : diff --git a/FusionIIIT/applications/academic_information/views.py b/FusionIIIT/applications/academic_information/views.py index 22210a52e..956518d8a 100755 --- a/FusionIIIT/applications/academic_information/views.py +++ b/FusionIIIT/applications/academic_information/views.py @@ -28,7 +28,7 @@ -from applications.academic_procedures.views import acad_proced_global_context +from applications.academic_procedures.views import acad_proced_global_context , get_sem_courses from applications.programme_curriculum.models import Batch @@ -107,7 +107,6 @@ def get_context(request): # course_type = Constants.COURSE_TYPE # timetable = Timetable.objects.all() # exam_t = Exam_timetable.objects.all() - procedures_context = acad_proced_global_context() try: @@ -845,7 +844,9 @@ def generatexlsheet(request): try: batch = request.POST['batch'] - course = Courses.objects.get(id = request.POST['course']) + # print('-------------------------------------------------------------------------------------' , request.POST['course']) + course_name = Course.objects.get(id = request.POST['course']).course_name + course = Courses.objects.get(name = course_name ) obj = course_registration.objects.all().filter(course_id = course) except Exception as e: batch="" @@ -1029,9 +1030,14 @@ def generate_preregistration_report(request): max_width = max(max_width,len(choices_of_current_student)) for choice in range(1,len(choices_of_current_student)+1): - current_choice = InitialRegistration.objects.get(student_id=student, semester_id__semester_no=sem,course_slot_id = slot,priority = choice) - # #print("current choice is ",current_choice) - z.append(str(current_choice.course_id.code)+"-"+str(current_choice.course_id.name)) + try: + current_choice = InitialRegistration.objects.get(student_id=student, semester_id__semester_no=sem, course_slot_id=slot, priority=choice) + z.append(str(current_choice.course_id.code) + "-" + str(current_choice.course_id.name)) + except : + z.append("No registration found") + # current_choice = InitialRegistration.objects.get(student_id=student, semester_id__semester_no=sem,course_slot_id = slot,priority = choice) + # # #print("current choice is ",current_choice) + # z.append(str(current_choice.course_id.code)+"-"+str(current_choice.course_id.name)) data.append(z) m+=1 diff --git a/FusionIIIT/applications/academic_procedures/api/serializers.py b/FusionIIIT/applications/academic_procedures/api/serializers.py index e8020d0e0..bf66ef870 100644 --- a/FusionIIIT/applications/academic_procedures/api/serializers.py +++ b/FusionIIIT/applications/academic_procedures/api/serializers.py @@ -1,13 +1,13 @@ from rest_framework.authtoken.models import Token from rest_framework import serializers -from applications.academic_procedures.models import (ThesisTopicProcess, InitialRegistrations, - FinalRegistrations, SemesterMarks, - BranchChange) +from applications.academic_procedures.models import (ThesisTopicProcess, InitialRegistrations,InitialRegistration, + FinalRegistration, FinalRegistrations, SemesterMarks, + BranchChange , StudentRegistrationChecks, Semester, backlog_course , CourseSlot , FeePayments , course_registration) from applications.academic_information.api.serializers import (CurriculumInstructorSerializer, - CurriculumSerializer) -from applications.globals.api.serializers import (UserSerializer, HoldsDesignationSerializer) + CurriculumSerializer , CourseSerializer , StudentSerializers ) +from applications.globals.api.serializers import (UserSerializer, HoldsDesignationSerializer , ExtraInfoSerializer) class ThesisTopicProcessSerializer(serializers.ModelSerializer): @@ -27,6 +27,24 @@ class Meta: model = FinalRegistrations fields = ('__all__') +class InitialRegistrationSerializer(serializers.ModelSerializer): + + class Meta: + model = InitialRegistration + fields = ('__all__') + +class FinalRegistrationSerializer(serializers.ModelSerializer): + + class Meta: + model = FinalRegistration + fields = ('__all__') + +class StudentRegistrationChecksSerializer(serializers.ModelSerializer): + class Meta: + model = StudentRegistrationChecks + fields = '__all__' + + class SemesterMarksSerializer(serializers.ModelSerializer): class Meta: @@ -38,3 +56,19 @@ class BranchChangeSerializer(serializers.ModelSerializer): class Meta: model = BranchChange fields = ('__all__') + +class SemesterSerializer(serializers.ModelSerializer): + + class Meta: + model = Semester + fields = ('__all__') + +class CourseRegistrationSerializer(serializers.ModelSerializer): + class Meta: + model = course_registration + fields = ('__all__') + +class CourseSlotSerializer(serializers.ModelSerializer): + class Meta: + model = CourseSlot + fields = ('__all__') \ No newline at end of file diff --git a/FusionIIIT/applications/academic_procedures/api/urls.py b/FusionIIIT/applications/academic_procedures/api/urls.py index 3abeace02..a9fb2c81f 100644 --- a/FusionIIIT/applications/academic_procedures/api/urls.py +++ b/FusionIIIT/applications/academic_procedures/api/urls.py @@ -1,12 +1,39 @@ from django.conf.urls import url - from . import views + urlpatterns = [ + url(r'^stu/details', views.academic_procedures_student, name='student_procedures'), + url(r'^stu/pre_registration' , views.student_pre_registration , name = 'pre_registration'), + url(r'^stu/final_registration' , views.student_final_registration , name = 'final_registration'), + url(r'^stu/view_registration' , views.student_view_registration , name = 'view_registration'), + url(r'^stu/view_offered_courses' , views.view_offered_courses , name = 'student_view_offered_courses'), + url(r'^stu/backlog_courses', views.student_backlog_courses , name = 'student_backlog_courses'), + url(r'^stu/add_course' , views.add_course , name ='add_course') , + url(r'^stu/drop_course' , views.drop_course , name = 'drop_course'), + # url(r'^stu/replaceCourse' , views.replaceCourse , name = 'replaceCourse') + + + + url(r'^acad/view_registrations' , views.acad_view_reigstrations , name='acad_view_registrations'), + url(r'^acad/get_course_list' , views.get_course_list , name = 'get_course_list' ), + url(r'^acad/configure_pre_registration' , views.configure_pre_registration_date , name = 'configure_pre_registration'), + url(r'^acad/configure_final_registration' , views.configure_final_registration_date , name = 'configure_final_registration'), + + + + url(r'^fac/view_assigned_courses' , views.faculty_assigned_courses , name = 'faculty_assigned_courses'), + # url(r'^fac/get_roll_list' , views.fetch_roll_list , name = 'fetch_roll_list'), + + + + url(r'^get_user_info' , views.get_user_info , name = 'get_user_info'), + + # these urls were designed previously and are not working any more - url(r'^fac/', views.academic_procedures_faculty, name='faculty_procedures'), - url(r'^stu/', views.academic_procedures_student, name='student_procedures'), - url(r'^addThesis/', views.add_thesis, name='add_thesis'), - url(r'^approve_thesis/(?P[0-9]+)/', views.approve_thesis, name='approve_thesis'), + # url(r'^fac/', views.academic_procedures_faculty, name='faculty_procedures'), + # url(r'^stu', views.academic_procedures_student, name='student_procedures'), + # url(r'^addThesis/', views.add_thesis, name='add_thesis'), + # url(r'^approve_thesis/(?P[0-9]+)/', views.approve_thesis, name='approve_thesis') -] +] \ No newline at end of file diff --git a/FusionIIIT/applications/academic_procedures/api/views.py b/FusionIIIT/applications/academic_procedures/api/views.py index aab6deaa7..c8ba3ce65 100644 --- a/FusionIIIT/applications/academic_procedures/api/views.py +++ b/FusionIIIT/applications/academic_procedures/api/views.py @@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model from django.shortcuts import get_object_or_404, redirect +from django.db import transaction from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import TokenAuthentication @@ -10,12 +11,16 @@ from rest_framework.permissions import AllowAny from rest_framework.response import Response -from applications.academic_information.models import Curriculum -from applications.academic_procedures.models import ThesisTopicProcess from applications.globals.models import HoldsDesignation, Designation, ExtraInfo -from applications.programme_curriculum.models import (CourseSlot, Course as Courses, Batch, Semester) +from applications.programme_curriculum.models import ( CourseSlot, Course as Courses, Batch, Semester) +from applications.academic_procedures.models import (Course, Student, Curriculum , ThesisTopicProcess, InitialRegistrations, + FinalRegistrations, SemesterMarks,backlog_course, + BranchChange , StudentRegistrationChecks, Semester , FeePayments , course_registration) + +from applications.academic_information.models import (Curriculum_Instructor , Calendar) + from applications.academic_procedures.views import (get_user_semester, get_acad_year, get_currently_registered_courses, get_current_credits, get_branch_courses, @@ -23,7 +28,8 @@ get_registration_courses, get_add_course_options, get_pre_registration_eligibility, get_final_registration_eligibility, - get_add_or_drop_course_date_eligibility) + get_add_or_drop_course_date_eligibility, + InitialRegistration) from . import serializers @@ -31,46 +37,12 @@ date_time = datetime.datetime.now() -@api_view(['GET']) -def academic_procedures_faculty(request): - current_user = request.user - user_details = current_user.extrainfo - des = current_user.holds_designations.all().first() - if str(des.designation) == 'student': - return Response({'error':'Not a faculty'}, status=status.HTTP_400_BAD_REQUEST) - elif str(current_user) == 'acadadmin': - return Response({'error':'User is acadadmin'}, status=status.HTTP_400_BAD_REQUEST) - - elif str(des.designation) == "Associate Professor" or str(des.designation) == "Professor" or str(des.designation) == "Assistant Professor": - faculty_object = user_details.faculty - month = int(date_time.month) - sem = [] - if month>=7 and month<=12: - sem = [1,3,5,7] - else: - sem = [2,4,6,8] - student_flag = False - fac_flag = True - thesis_supervision_request_list = faculty_object.thesistopicprocess_supervisor.all() - thesis_supervision_request_list_data = serializers.ThesisTopicProcessSerializer(thesis_supervision_request_list, many=True).data - approved_thesis_request_list = serializers.ThesisTopicProcessSerializer(thesis_supervision_request_list.filter(approval_supervisor = True), many=True).data - pending_thesis_request_list = serializers.ThesisTopicProcessSerializer(thesis_supervision_request_list.filter(pending_supervisor = True), many=True).data - courses_list = serializers.CurriculumInstructorSerializer(user_details.curriculum_instructor_set.all(), many=True).data - fac_details = serializers.UserSerializer(current_user).data +#--------------------------------------- APIs of student---------------------------------------------------------- - resp = { - 'student_flag' : student_flag, - 'fac_flag' : fac_flag, - 'thesis_supervision_request_list' : thesis_supervision_request_list_data, - 'pending_thesis_request_list' : pending_thesis_request_list, - 'approved_thesis_request_list' : approved_thesis_request_list, - 'courses_list': courses_list, - 'faculty': fac_details - } - return Response(data=resp, status=status.HTTP_200_OK) +# with this student can get all his details in one api call @api_view(['GET']) def academic_procedures_student(request): current_user = request.user @@ -145,6 +117,7 @@ def academic_procedures_student(request): 'cpi' : cpi, 'spi' : cur_spi } + currently_registered_courses = get_currently_registered_courses(user_details.id, user_sem) currently_registered_courses_data = serializers.CurriculumSerializer(currently_registered_courses, many=True).data try: @@ -163,8 +136,11 @@ def academic_procedures_student(request): final_registered_courses_data = serializers.FinalRegistrationsSerializer(final_registered_courses, many=True).data current_credits = get_current_credits(currently_registered_courses) - - next_sem_branch_courses = get_branch_courses(current_user, user_sem+1, user_branch) + print(current_user, user_sem+1, user_branch) + try: + next_sem_branch_courses = get_branch_courses(current_user, user_sem+1, user_branch) + except Exception as e: + return Response(data = str(e)) next_sem_branch_courses_data = serializers.CurriculumSerializer(next_sem_branch_courses, many=True).data fee_payment_mode_list = dict(Constants.PaymentMode) @@ -173,7 +149,8 @@ def academic_procedures_student(request): next_sem_branch_registration_courses_data = [] for choices in next_sem_branch_registration_courses: next_sem_branch_registration_courses_data.append(serializers.CurriculumSerializer(choices, many=True).data) - # next_sem_branch_registration_courses_data = serializers.CurriculumSerializer(next_sem_branch_registration_courses, many=True).data + # print(next_sem_branch_registration_courses_data) + # next_sem_branch_registration_courses_data = serializers.CurriculumSerializer(next_sem_branch_registration_courses_data, many=True).data final_registration_choices = get_registration_courses(get_branch_courses(request.user, user_sem, user_branch)) final_registration_choices_data = [] @@ -196,7 +173,7 @@ def academic_procedures_student(request): current_sem_branch_courses = get_branch_courses(current_user, user_sem, user_branch) - pre_registration_date_flag = get_pre_registration_eligibility(current_date) + pre_registration_date_flag = get_pre_registration_eligibility(current_date , user_sem , acad_year) final_registration_date_flag = get_final_registration_eligibility(current_date) add_or_drop_course_date_flag = get_add_or_drop_course_date_eligibility(current_date) @@ -215,18 +192,6 @@ def academic_procedures_student(request): teaching_credit_registration_course = Curriculum.objects.all().filter(batch = 2016, sem =6) teaching_credit_registration_course_data = serializers.CurriculumSerializer(teaching_credit_registration_course, many=True).data - if student_flag: - try: - due = obj.dues_set.get() - lib_d = due.library_due - pc_d = due.placement_cell_due - hos_d = due.hostel_due - mess_d = due.mess_due - acad_d = due.academic_due - except: - lib_d, pc_d, hos_d, mess_d, acad_d = 0, 0, 0, 0, 0 - - tot_d = lib_d + acad_d + pc_d + hos_d + mess_d registers = obj.register_set.all() course_list = [] @@ -254,7 +219,7 @@ def academic_procedures_student(request): if user_sem == 2: branchchange_flag=True - # faculty_list = serializers.HoldsDesignationSerializer(get_faculty_list(), many=True).data + faculty_list = serializers.HoldsDesignationSerializer(get_faculty_list(), many=True).data resp = { 'details': details, @@ -267,15 +232,15 @@ def academic_procedures_student(request): 'fee_payment_mode_list' : fee_payment_mode_list, 'next_sem_branch_registration_courses' : next_sem_branch_registration_courses_data, 'final_registration_choices' : final_registration_choices_data, - 'performance_list' : performance_list_data, - 'thesis_request_list' : thesis_request_list, + + 'student_flag' : student_flag, 'ug_flag' : ug_flag, 'masters_flag' : masters_flag, 'phd_flag' : phd_flag, 'fac_flag' : fac_flag, 'des_flag' : des_flag, - 'thesis_flag' : pre_existing_thesis_flag, + 'drop_courses_options' : currently_registered_courses_data, 'pre_registration_date_flag': pre_registration_date_flag, 'final_registration_date_flag': final_registration_date_flag, @@ -283,116 +248,849 @@ def academic_procedures_student(request): 'pre_registration_flag' : pre_registration_flag, 'final_registration_flag': final_registration_flag, 'teaching_credit_registration_course' : teaching_credit_registration_course_data, - 'lib_d':lib_d, - 'acad_d':acad_d, - 'mess_d':mess_d, - 'pc_d':pc_d, - 'hos_d':hos_d, - 'tot_d':tot_d, + 'attendance': attendance_data, 'Branch_Change_Flag':branchchange_flag - # 'faculty_list' : faculty_list } - return Response(data=resp, status=status.HTTP_200_OK) + return Response(data=resp, status=status.HTTP_200_OK) + +# api for student for adding courses @api_view(['POST']) -def add_thesis(request): - current_user = request.user - profile = current_user.extrainfo - if profile.user_type == 'student': - if not 'thesis_topic' in request.data: - return Response({'error':'Thesis topic is required'}, status=status.HTTP_400_BAD_REQUEST) - if not 'research_area' in request.data: - return Response({'error':'Research area is required'}, status=status.HTTP_400_BAD_REQUEST) - if 'supervisor_id' in request.data: - try: - supervisor_faculty = User.objects.get(username=request.data['supervisor_id']) - supervisor_faculty = supervisor_faculty.extrainfo - request.data['supervisor_id'] = supervisor_faculty - except: - return Response({'error':'Wrong supervisor id. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) - else: - return Response({'error':'supervisor id is required'}, status=status.HTTP_400_BAD_REQUEST) - if 'co_supervisor_id' in request.data: +def add_course(request): + try: + current_user = request.user + current_user = ExtraInfo.objects.all().filter(user=current_user).first() + current_user = Student.objects.all().filter(id=current_user.id).first() + + sem_id_instance = Semester.objects.get(id = request.data['semester']) + + count = request.data['ct'] + count = int(count) + reg_curr = [] + + for i in range(1, count+1): + choice = "choice["+str(i)+"]" + slot = "slot["+str(i)+"]" try: - co_supervisor_faculty = User.objects.get(username=request.data['co_supervisor_id']) - co_supervisor_faculty = co_supervisor_faculty.extrainfo - request.data['co_supervisor_id'] = co_supervisor_faculty - except: - return Response({'error':'Wrong co_supervisor id. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) - else: - co_supervisor_faculty = None - if 'curr_id' in request.data: - curr_id = None - student = profile.student - request.data['student_id'] = profile - request.data['submission_by_student'] = True - serializer = serializers.ThesisTopicProcessSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_200_OK) - else: - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - else: - return Response({'error':'Cannot add thesis'}, status=status.HTTP_400_BAD_REQUEST) + course_id_instance = Courses.objects.get(id = request.data[choice]) + courseslot_id_instance = CourseSlot.objects.get(id = request.data[slot]) + + print(courseslot_id_instance.max_registration_limit) + if course_registration.objects.filter(working_year = current_user.batch_id.year, course_id = course_id_instance).count() < courseslot_id_instance.max_registration_limit and (course_registration.objects.filter(course_id=course_id_instance, student_id=current_user).count() == 0): + p = course_registration( + course_id=course_id_instance, + student_id=current_user, + course_slot_id=courseslot_id_instance, + semester_id=sem_id_instance + ) + print(serializers.course_registration(p)) + if p not in reg_curr: + reg_curr.append(p) + else: + print("already exist") + except Exception as e: + error_message = str(e) + resp = {'message': 'Course addition failed', 'error': error_message} + return Response(resp, status=status.HTTP_400_BAD_REQUEST) + print(reg_curr) + course_registration_data = course_registration.objects.bulk_create(reg_curr) + course_registration_data = serializers.CourseRegistrationSerializer(course_registration_data , many = True).data + res = {'message' : 'Courses successfully added' , "courses_added" : course_registration_data } + return Response(data = res , status = status.HTTP_200_OK) + except Exception as e: + return Response(data = str(e) , status= status.HTTP_500_INTERNAL_SERVER_ERROR) -@api_view(['PUT']) -def approve_thesis(request, id): + +@api_view(['POST']) +def drop_course(request): current_user = request.user - profile = current_user.extrainfo - if profile.user_type == 'faculty': + current_user = ExtraInfo.objects.all().filter(user=current_user).first() + current_user = Student.objects.all().filter(id = current_user.id).first() + + courses = request.data['courses'] + + for course in courses: try: - thesis = ThesisTopicProcess.objects.get(id=id) - except: - return Response({'error':'This thesis does not exist'}, status=status.HTTP_400_BAD_REQUEST) - if 'member1' in request.data: - try: - user1 = User.objects.get(username=request.data['member1']) - member1 = user1.extrainfo - request.data['member1'] = member1 - except: - return Response({'error':'Wrong username of member 1. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) - else: - return Response({'error':'Member 1 is required'}, status=status.HTTP_400_BAD_REQUEST) - if 'member2' in request.data: - try: - user2 = User.objects.get(username=request.data['member2']) - member2 = user2.extrainfo - request.data['member2'] = member2 - except: - return Response({'error':'Wrong username of member 2. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) - else: - return Response({'error':'Member 2 is required'}, status=status.HTTP_400_BAD_REQUEST) - if 'member3' in request.data: - try: - user3 = User.objects.get(username=request.data['member3']) - member3 = user3.extrainfo - request.data['member3'] = member3 - except: - return Response({'error':'Wrong username of member 3. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) - else: - member3 = None - if not 'approval' in request.data: - return Response({'error':'Approval value is required.'}, status=status.HTTP_400_BAD_REQUEST) - elif request.data['approval'] != 'yes' and request.data['approval'] != 'no': - return Response({'error':'Wrong approval value provided. Approval value should be yes or no'}, status=status.HTTP_400_BAD_REQUEST) - if request.data['approval'] == 'yes': - request.data.pop('approval', None) - request.data['pending_supervisor'] = False - request.data['approval_supervisor'] = True - request.data['forwarded_to_hod'] = True - request.data['pending_hod'] = True - else: - request.data.pop('approval', None) - request.data['pending_supervisor'] = False - request.data['approval_supervisor'] = False - request.data['forwarded_to_hod'] = False - request.data['pending_hod'] = False - serializer = serializers.ThesisTopicProcessSerializer(thesis, data=request.data, partial=True) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_200_OK) - else: - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - else: - return Response({'error':'Cannot approve thesis'}, status=status.HTTP_400_BAD_REQUEST) + course_id = Courses.objects.all().filter(id=course).first() + course_registration.objects.filter(course_id = course_id, student_id = current_user).delete() + except Exception as e: + resp = {"message" : "Course drop failed", "error" : str(e)} + return Response(data = resp, status = status.HTTP_400_BAD_REQUEST) + + resp = {"message" : "Course successfully dropped"} + return Response(data = resp , status = status.HTTP_200_OK) + + +# simple api for getting to know the details of user who have logined in the system +@api_view(['GET']) +def get_user_info(request): + current_user = request.user + details1 = serializers.UserSerializer(current_user).data + details2 = serializers.ExtraInfoSerializer(current_user.extrainfo).data + details = { + "user_serializer_Data" : details1, + "ExtraInfoSerializer_Data" : details2 + } + return Response(data = details , status= status.HTTP_200_OK) + + +# with this api student can see the list of courses offered to him in upcoming semester +@api_view(['GET']) +def view_offered_courses(request): + try : + obj = Curriculum.objects.filter( + programme = request.data['programme'], + branch = request.data['branch'], + batch = request.data["batch"], + sem = request.data["semester"] + ) + serializer = serializers.CurriculumSerializer(obj, many=True).data + return Response(serializer, status=status.HTTP_200_OK) + except Exception as e: + return Response(data = str(e) , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + # try: + # ug_flag = True + # masters_flag = False + # phd_flag = False + # current_semester = get_user_semester(request.user, ug_flag, masters_flag, phd_flag) + # current_year = date_time.date().year + + # return Response(data= { } , status=status.HTTP_200_OK) + # except Exception as e: + # return Response(data = {"error" : str(e)} , status= status.HTTP_500_INTERNAL_SERVER_ERROR) + + +# with this student can know status of pre registration and final registration +@api_view(['GET']) +def student_view_registration(request): + try: + # getting the registration status of current user for the given semester + current_user = request.user + student_id = current_user.extrainfo.id + + sem_id = Semester.objects.get(id = request.data.get('semester')) + sem_id = serializers.SemesterSerializer(sem_id).data["id"] + + # filter based on the semester id and student id + obj = StudentRegistrationChecks.objects.filter(semester_id_id = sem_id, student_id = student_id) + + # serialize the data for displaying + serializer = serializers.StudentRegistrationChecksSerializer(obj, many=True).data + + return Response(serializer, status=status.HTTP_200_OK) + except Exception as e: + return Response(data = str(e) , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +# with this student can do his pre registration for the upcoming semester +@api_view(['POST']) +@transaction.atomic +def student_pre_registration(request): + try: + current_user = request.user + current_user_id = serializers.UserSerializer(current_user).data["id"] + s_id = current_user.extrainfo.id + + current_user = ExtraInfo.objects.all().select_related('user','department').filter(user=current_user_id).first() + current_user = serializers.ExtraInfoSerializer(current_user).data + + current_user_instance = Student.objects.all().filter(id=current_user["id"]).first() + current_user = serializers.StudentSerializers(current_user_instance).data + + sem_id_instance = Semester.objects.get(id = request.data.get('semester')) + sem_id = serializers.SemesterSerializer(sem_id_instance).data["id"] + + # filter based on the semester id and student id + obj = StudentRegistrationChecks.objects.filter(semester_id_id = sem_id, student_id = s_id) + # serialize the data for displaying + student_registration_check = serializers.StudentRegistrationChecksSerializer(obj, many=True).data + + try: + # check if user have already done pre registration + if(student_registration_check and student_registration_check[0]["pre_registration_flag"] ): + return Response(data = {"message" : "You have already registered for this semester" }, status=status.HTTP_400_BAD_REQUEST) + except Exception as e: + return Response(data = str(e) , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + course_slots=request.data.get("course_slot") + reg_curr = [] + + + for course_slot in course_slots : + course_priorities = request.data.get("course_priority-"+course_slot) + if(course_priorities[0] == 'NULL'): + print("NULL FOUND") + continue + course_slot_id_for_model = CourseSlot.objects.get(id = int(course_slot)) + + # return Response(data = course_slots , status=status.HTTP_200_OK) + for course_priority in course_priorities: + priority_of_current_course,course_id = map(int,course_priority.split("-")) + # get course id for the model + course_id_for_model = Courses.objects.get(id = course_id) + print("check") + p = InitialRegistration( + course_id = course_id_for_model, + semester_id = sem_id_instance, + student_id = current_user_instance, + course_slot_id = course_slot_id_for_model, + priority = priority_of_current_course + ) + p.save() + reg_curr.append(p) + + + try: + serialized_reg_curr = serializers.InitialRegistrationSerializer(reg_curr, many=True).data + + registration_check = StudentRegistrationChecks( + student_id = current_user_instance, + pre_registration_flag = True, + final_registration_flag = False, + semester_id = sem_id_instance + ) + registration_check.save() + return Response(data={"message": "Successfully Registered for the courses.", "registrations": serialized_reg_curr}, status=status.HTTP_200_OK) + except Exception as e: + return Response(data = {"message" : "Error in Registration." , "error" : str(e)} , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + except Exception as e: + return Response(data = {"message" : "Error in Registration." , "error" : str(e)} , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +# with this student can do his final registration for the upcoming semester +@api_view(['POST']) +@transaction.atomic +def student_final_registration(request): + try: + current_user = request.user + current_user_id = serializers.UserSerializer(current_user).data["id"] + s_id = current_user.extrainfo.id + + current_user = ExtraInfo.objects.all().select_related('user','department').filter(user=current_user).first() + current_user = serializers.ExtraInfoSerializer(current_user).data + + current_user_instance = Student.objects.all().filter(id=current_user["id"]).first() + current_user = serializers.StudentSerializers(current_user_instance).data + + # these details we need from the body of the request fot doing final registration + sem_id_instance = Semester.objects.get(id = request.data.get('semester')) + sem_id = serializers.SemesterSerializer(sem_id_instance).data["id"] + registration_status = StudentRegistrationChecks.objects.filter(student_id = current_user["id"], semester_id = sem_id) + registration_status = serializers.StudentRegistrationChecksSerializer(registration_status , many = True ).data + + if(registration_status[0] and registration_status[0]["pre_registration_flag"] == False): + return Response(data = {"message" : "Student haven't done pre registration yet."} , status= status.HTTP_400_BAD_REQUEST ) + + mode = str(request.data.get('mode')) + transaction_id = str(request.data.get('transaction_id')) + deposit_date = request.data.get('deposit_date') + utr_number = str(request.data.get('utr_number')) + fee_paid = request.data.get('fee_paid') + actual_fee = request.data.get('actual_fee') + reason = str(request.data.get('reason')) + if reason=="": + reason=None + fee_receipt = request.FILES['fee_receipt'] + + print(fee_receipt) + obj = FeePayments( + student_id = current_user_instance, + semester_id = sem_id_instance, + mode = mode, + transaction_id = transaction_id, + fee_receipt = fee_receipt, + deposit_date = deposit_date, + utr_number = utr_number, + fee_paid = fee_paid, + actual_fee = actual_fee, + reason = reason + ) + obj.save() + try: + registration_status = StudentRegistrationChecks.objects.filter(student_id = current_user["id"], semester_id = sem_id).update(final_registration_flag = True) + return Response(data = {"message" : "Final Registration Successfull" } , status= status.HTTP_200_OK) + except Exception as e: + return Response(data = {"message" : "Final Registration Failed " , "error" : str(e)} , status = status.HTTP_500_INTERNAL_SERVER_ERROR) + except Exception as e: + return Response(data = {"message" : "Final Registration Failed " , "error" : str(e)} , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +# with this api student can get his backlog courses list +@api_view(['GET']) +def student_backlog_courses(request): + try : + stu_id = Student.objects.select_related('id','id__user','id__department').get(id=request.user.username) + backlogCourseList = [] + backlogCourses = backlog_course.objects.select_related('course_id' , 'student_id' , 'semester_id' ).filter(student_id=stu_id) + for i in backlogCourses: + obj = { + "course_id" : i.course_id.id, + "course_name" : i.course_id.course_name, + "faculty" : i.course_id.course_details, + "semester" : i.semester_id.semester_no, + "is_summer_course" : i.is_summer_course + } + backlogCourseList.append(obj) + + return Response(backlogCourseList, status=status.HTTP_200_OK) + except Exception as e: + return Response(data = str(e) , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + + +#--------------------------------------- APIs of acad person---------------------------------------------------------- + + +# with this acad admin can fetch the list of courses for any batch , semester and brach +@api_view(['GET']) +def get_course_list(request): + + programme = request.data['programme'] + branch = request.data['branch'] + batch = request.data['batch'] + + try : + print(programme , branch , batch) + obj = Curriculum.objects.filter( + programme = request.data['programme'], + branch = request.data['branch'], + batch = request.data["batch"] + ) + serializer = serializers.CurriculumSerializer(obj, many=True).data + return Response(serializer, status=status.HTTP_200_OK) + except Exception as e: + return Response(data = str(e) , status=status.HTTP_500_INTERNAL_SERVER_ERROR) + # obj = Curriculum.objects.filter(curriculum_id_=curriculum_id, course_type_ = course_type, programme_ = programme, batch_ = batch, branch_ = branch, sem_ = sem, optional_ = optional) + + +# with this api acad person can see the list of students who have completed their pre and final registrations for any semester +@api_view(['GET']) +def acad_view_reigstrations(request): + try: + semester = request.data["semester"] + sem_id_instance = Semester.objects.get(id = request.data.get('semester')) + sem_id = serializers.SemesterSerializer(sem_id_instance).data["id"] + obj = StudentRegistrationChecks.objects.filter(semester_id_id = sem_id, final_registration_flag =True) + student_registration_check = serializers.StudentRegistrationChecksSerializer(obj, many=True).data + + return Response(data= student_registration_check , status=status.HTTP_200_OK) + except Exception as e: + return Response(data = {"error" : str(e)} , status= status.HTTP_500_INTERNAL_SERVER_ERROR) + + +# with this api acad person set the date of pre registration date for any semester +@api_view(['POST']) +def configure_pre_registration_date(request): + try: + try: + from_date = request.data.get('from_date') + to_date = request.data.get('to_date') + semester = request.data.get('semester') + current_year = date_time.date().year + desc = "Pre Registration " + str(semester) +" " + str(current_year) + print(from_date , to_date , desc) + from_date = from_date.split('-') + from_date = [int(i) for i in from_date] + from_date = datetime.datetime(*from_date).date() + to_date = to_date.split('-') + to_date = [int(i) for i in to_date] + to_date = datetime.datetime(*to_date).date() + except Exception as e: + from_date="" + to_date="" + desc="" + pass + c = Calendar( + from_date=from_date, + to_date=to_date, + description=desc) + c.save() + return Response(data = {"message" : "Pre registration for semester " + str(semester) + " will be opened from " + str(from_date) + " to " + str(to_date) + ". " , } , status= status.HTTP_200_OK) + except Exception as e: + return Response(data = {"error " : str(e)} , status= status.HTTP_500_INTERNAL_SERVER_ERROR) + + +# with this api request acad person can set the date of final registration +@api_view(['POST']) +def configure_final_registration_date(request): + try: + try: + from_date = request.data.get('from_date') + to_date = request.data.get('to_date') + semester = request.data.get('semester') + current_year = date_time.date().year + desc = "Physical Reporting at the Institute" + print(from_date , to_date , desc) + from_date = from_date.split('-') + from_date = [int(i) for i in from_date] + from_date = datetime.datetime(*from_date).date() + to_date = to_date.split('-') + to_date = [int(i) for i in to_date] + to_date = datetime.datetime(*to_date).date() + except Exception as e: + from_date="" + to_date="" + desc="" + pass + c = Calendar( + from_date=from_date, + to_date=to_date, + description=desc) + c.save() + return Response(data = {"message" : "Physical Reporting at the Institute will be opened from " + str(from_date) + " to " + str(to_date) + ". " , } , status= status.HTTP_200_OK) + except Exception as e: + return Response(data = {"error " : str(e)} , status= status.HTTP_500_INTERNAL_SERVER_ERROR) + + + +#--------------------------------------- APIs of faculty---------------------------------------------------------- + +# with this api faculty can know what are the courses assigned to him +@api_view(['GET']) +def faculty_assigned_courses(request): + try: + current_user = request.user + curriculum_ids = Curriculum_Instructor.objects.filter(instructor_id=current_user.id).values_list('curriculum_id', flat=True) + course_infos = [] + print(current_user.id) + for curriculum_id in curriculum_ids: + course_info = Curriculum.objects.filter(curriculum_id=curriculum_id).values_list('course_code','course_type','programme','branch','sem','course_id_id').first() + course_infos.append(course_info) + + return Response(data= course_infos , status=status.HTTP_200_OK) + except Exception as e: + return Response(data = {"error" : str(e)} , status= status.HTTP_500_INTERNAL_SERVER_ERROR) + + + + + + + + + + + + + + + +# These apis were implemented before but now don't use them they have some errors + + +# @api_view(['GET']) +# def academic_procedures_faculty(request): +# current_user = request.user +# user_details = current_user.extrainfo +# des = current_user.holds_designations.all().first() + +# if str(des.designation) == 'student': +# return Response({'error':'Not a faculty'}, status=status.HTTP_400_BAD_REQUEST) +# elif str(current_user) == 'acadadmin': +# return Response({'error':'User is acadadmin'}, status=status.HTTP_400_BAD_REQUEST) + +# elif str(des.designation) == "Associate Professor" or str(des.designation) == "Professor" or str(des.designation) == "Assistant Professor": +# faculty_object = user_details.faculty +# month = int(date_time.month) +# sem = [] +# if month>=7 and month<=12: +# sem = [1,3,5,7] +# else: +# sem = [2,4,6,8] +# student_flag = False +# fac_flag = True + +# thesis_supervision_request_list = faculty_object.thesistopicprocess_supervisor.all() +# thesis_supervision_request_list_data = serializers.ThesisTopicProcessSerializer(thesis_supervision_request_list, many=True).data +# approved_thesis_request_list = serializers.ThesisTopicProcessSerializer(thesis_supervision_request_list.filter(approval_supervisor = True), many=True).data +# pending_thesis_request_list = serializers.ThesisTopicProcessSerializer(thesis_supervision_request_list.filter(pending_supervisor = True), many=True).data +# courses_list = serializers.CurriculumInstructorSerializer(user_details.curriculum_instructor_set.all(), many=True).data +# fac_details = serializers.UserSerializer(current_user).data + +# resp = { +# 'student_flag' : student_flag, +# 'fac_flag' : fac_flag, +# 'thesis_supervision_request_list' : thesis_supervision_request_list_data, +# 'pending_thesis_request_list' : pending_thesis_request_list, +# 'approved_thesis_request_list' : approved_thesis_request_list, +# 'courses_list': courses_list, +# 'faculty': fac_details +# } +# return Response(data=resp, status=status.HTTP_200_OK) + + + + + + +# @api_view(['GET']) +# def academic_procedures_student(request): +# current_user = request.user +# current_user_data = { +# 'first_name': current_user.first_name, +# 'last_name': current_user.last_name, +# 'username': current_user.username, +# 'email': current_user.email +# } +# user_details = current_user.extrainfo +# des = current_user.holds_designations.all().first() +# if str(des.designation) == 'student': +# obj = user_details.student + +# if obj.programme.upper() == "PH.D": +# student_flag = True +# ug_flag = False +# masters_flag = False +# phd_flag = True +# fac_flag = False +# des_flag = False + +# elif obj.programme.upper() == "M.DES": +# student_flag = True +# ug_flag = False +# masters_flag = True +# phd_flag = False +# fac_flag = False +# des_flag = True + +# elif obj.programme.upper() == "B.DES": +# student_flag = True +# ug_flag = True +# masters_flag = False +# phd_flag = False +# fac_flag = False +# des_flag = True + +# elif obj.programme.upper() == "M.TECH": +# student_flag = True +# ug_flag = False +# masters_flag = True +# phd_flag = False +# fac_flag = False +# des_flag = False + +# elif obj.programme.upper() == "B.TECH": +# student_flag = True +# ug_flag = True +# masters_flag = False +# phd_flag = False +# fac_flag = False +# des_flag = False + +# else: +# return Response({'message':'Student has no record'}, status=status.HTTP_400_BAD_REQUEST) + +# current_date = date_time.date() +# current_year = date_time.year +# batch = obj.batch_id +# user_sem = get_user_semester(request.user, ug_flag, masters_flag, phd_flag) +# acad_year = get_acad_year(user_sem, current_year) +# user_branch = user_details.department.name +# cpi = obj.cpi +# cur_spi='Sem results not available' # To be fetched from db if result uploaded + +# details = { +# 'current_user': current_user_data, +# 'year': acad_year, +# 'user_sem': user_sem, +# 'user_branch' : str(user_branch), +# 'cpi' : cpi, +# 'spi' : cur_spi +# } + +# currently_registered_courses = get_currently_registered_courses(user_details.id, user_sem) +# currently_registered_courses_data = serializers.CurriculumSerializer(currently_registered_courses, many=True).data +# try: +# pre_registered_courses = obj.initialregistrations_set.all().filter(semester = user_sem) +# pre_registered_courses_show = obj.initialregistrations_set.all().filter(semester = user_sem+1) +# except: +# pre_registered_courses = None +# pre_registered_courses_show=None +# try: +# final_registered_courses = obj.finalregistrations_set.all().filter(semester = user_sem) +# except: +# final_registered_courses = None + +# pre_registered_courses_data = serializers.InitialRegistrationsSerializer(pre_registered_courses, many=True).data +# pre_registered_courses_show_data = serializers.InitialRegistrationsSerializer(pre_registered_courses_show, many=True).data +# final_registered_courses_data = serializers.FinalRegistrationsSerializer(final_registered_courses, many=True).data + +# current_credits = get_current_credits(currently_registered_courses) +# print(current_user, user_sem+1, user_branch) +# try: +# next_sem_branch_courses = get_branch_courses(current_user, user_sem+1, user_branch) +# except Exception as e: +# return Response(data = str(e)) +# next_sem_branch_courses_data = serializers.CurriculumSerializer(next_sem_branch_courses, many=True).data + +# fee_payment_mode_list = dict(Constants.PaymentMode) + +# next_sem_branch_registration_courses = get_registration_courses(next_sem_branch_courses) +# next_sem_branch_registration_courses_data = [] +# for choices in next_sem_branch_registration_courses: +# next_sem_branch_registration_courses_data.append(serializers.CurriculumSerializer(choices, many=True).data) +# # next_sem_branch_registration_courses_data = serializers.CurriculumSerializer(next_sem_branch_registration_courses, many=True).data + +# final_registration_choices = get_registration_courses(get_branch_courses(request.user, user_sem, user_branch)) +# final_registration_choices_data = [] +# for choices in final_registration_choices: +# final_registration_choices_data.append(serializers.CurriculumSerializer(choices, many=True).data) + +# performance_list = [] +# result_announced = False +# for i in currently_registered_courses: +# try: +# performance_obj = obj.semestermarks_set.all().filter(curr_id = i).first() +# except: +# performance_obj = None +# performance_list.append(performance_obj) +# performance_list_data = serializers.SemesterMarksSerializer(performance_list, many=True).data + +# thesis_request_list = serializers.ThesisTopicProcessSerializer(obj.thesistopicprocess_set.all(), many=True).data + +# pre_existing_thesis_flag = True if obj.thesistopicprocess_set.all() else False + +# current_sem_branch_courses = get_branch_courses(current_user, user_sem, user_branch) + +# # pre_registration_date_flag = get_pre_registration_eligibility(current_date) +# final_registration_date_flag = get_final_registration_eligibility(current_date) + +# add_or_drop_course_date_flag = get_add_or_drop_course_date_eligibility(current_date) + +# student_registration_check_pre = obj.studentregistrationcheck_set.all().filter(semester=user_sem+1) +# student_registration_check_final = obj.studentregistrationcheck_set.all().filter(semester=user_sem) +# pre_registration_flag = False +# final_registration_flag = False +# if(student_registration_check_pre): +# pre_registration_flag = student_registration_check_pre.pre_registration_flag +# if(student_registration_check_final): +# final_registration_flag = student_registration_check_final.final_registration_flag + +# teaching_credit_registration_course = None +# if phd_flag: +# teaching_credit_registration_course = Curriculum.objects.all().filter(batch = 2016, sem =6) +# teaching_credit_registration_course_data = serializers.CurriculumSerializer(teaching_credit_registration_course, many=True).data + +# if student_flag: +# try: +# due = obj.dues_set.get() +# lib_d = due.library_due +# pc_d = due.placement_cell_due +# hos_d = due.hostel_due +# mess_d = due.mess_due +# acad_d = due.academic_due +# except: +# lib_d, pc_d, hos_d, mess_d, acad_d = 0, 0, 0, 0, 0 + +# tot_d = lib_d + acad_d + pc_d + hos_d + mess_d + +# registers = obj.register_set.all() +# course_list = [] +# for i in registers: +# course_list.append(i.curr_id) +# attendence = [] +# for i in course_list: +# instructors = i.curriculum_instructor_set.all() +# pr,ab=0,0 +# for j in list(instructors): + +# presents = obj.student_attendance_set.all().filter(instructor_id=j, present=True) +# absents = obj.student_attendance_set.all().filter(instructor_id=j, present=False) +# pr += len(presents) +# ab += len(absents) +# attendence.append((i,pr,pr+ab)) +# attendance_data = {} +# for course in attendence: +# attendance_data[course[0].course_id.course_name] = { +# 'present' : course[1], +# 'total' : course[2] +# } + +# branchchange_flag = False +# if user_sem == 2: +# branchchange_flag=True + +# faculty_list = serializers.HoldsDesignationSerializer(get_faculty_list(), many=True).data + +# resp = { +# 'details': details, +# 'currently_registered': currently_registered_courses_data, +# # 'pre_registered_courses' : pre_registered_courses_data, +# # 'pre_registered_courses_show' : pre_registered_courses_show_data, +# 'final_registered_courses' : final_registered_courses_data, +# 'current_credits' : current_credits, +# 'courses_list': next_sem_branch_courses_data, +# 'fee_payment_mode_list' : fee_payment_mode_list, +# 'next_sem_branch_registration_courses' : next_sem_branch_registration_courses_data, +# 'final_registration_choices' : final_registration_choices_data, +# 'performance_list' : performance_list_data, +# 'thesis_request_list' : thesis_request_list, +# 'student_flag' : student_flag, +# 'ug_flag' : ug_flag, +# 'masters_flag' : masters_flag, +# 'phd_flag' : phd_flag, +# 'fac_flag' : fac_flag, +# 'des_flag' : des_flag, +# 'thesis_flag' : pre_existing_thesis_flag, +# 'drop_courses_options' : currently_registered_courses_data, +# # 'pre_registration_date_flag': pre_registration_date_flag, +# 'final_registration_date_flag': final_registration_date_flag, +# 'add_or_drop_course_date_flag': add_or_drop_course_date_flag, +# # 'pre_registration_flag' : pre_registration_flag, +# 'final_registration_flag': final_registration_flag, +# 'teaching_credit_registration_course' : teaching_credit_registration_course_data, +# 'lib_d':lib_d, +# 'acad_d':acad_d, +# 'mess_d':mess_d, +# 'pc_d':pc_d, +# 'hos_d':hos_d, +# 'tot_d':tot_d, +# 'attendance': attendance_data, +# 'Branch_Change_Flag':branchchange_flag +# # 'faculty_list' : faculty_list +# } +# return Response(data=resp, status=status.HTTP_200_OK) + + + + + + + + + + + + + + + + + + + + + + +# These apis are not needed in this module + + + +# @api_view(['POST']) +# def add_thesis(request): +# current_user = request.user +# profile = current_user.extrainfo +# if profile.user_type == 'student': +# if not 'thesis_topic' in request.data: +# return Response({'error':'Thesis topic is required'}, status=status.HTTP_400_BAD_REQUEST) +# if not 'research_area' in request.data: +# return Response({'error':'Research area is required'}, status=status.HTTP_400_BAD_REQUEST) +# if 'supervisor_id' in request.data: +# try: +# supervisor_faculty = User.objects.get(username=request.data['supervisor_id']) +# supervisor_faculty = supervisor_faculty.extrainfo +# request.data['supervisor_id'] = supervisor_faculty +# except: +# return Response({'error':'Wrong supervisor id. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) +# else: +# return Response({'error':'supervisor id is required'}, status=status.HTTP_400_BAD_REQUEST) +# if 'co_supervisor_id' in request.data: +# try: +# co_supervisor_faculty = User.objects.get(username=request.data['co_supervisor_id']) +# co_supervisor_faculty = co_supervisor_faculty.extrainfo +# request.data['co_supervisor_id'] = co_supervisor_faculty +# except: +# return Response({'error':'Wrong co_supervisor id. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) +# else: +# co_supervisor_faculty = None +# if 'curr_id' in request.data: +# curr_id = None +# student = profile.student +# request.data['student_id'] = profile +# request.data['submission_by_student'] = True +# serializer = serializers.ThesisTopicProcessSerializer(data=request.data) +# if serializer.is_valid(): +# serializer.save() +# return Response(serializer.data, status=status.HTTP_200_OK) +# else: +# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +# else: +# return Response({'error':'Cannot add thesis'}, status=status.HTTP_400_BAD_REQUEST) + + + + + + + + + + + + + + + + + +# @api_view(['PUT']) +# def approve_thesis(request, id): +# current_user = request.user +# profile = current_user.extrainfo +# if profile.user_type == 'faculty': +# try: +# thesis = ThesisTopicProcess.objects.get(id=id) +# except: +# return Response({'error':'This thesis does not exist'}, status=status.HTTP_400_BAD_REQUEST) +# if 'member1' in request.data: +# try: +# user1 = User.objects.get(username=request.data['member1']) +# member1 = user1.extrainfo +# request.data['member1'] = member1 +# except: +# return Response({'error':'Wrong username of member 1. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) +# else: +# return Response({'error':'Member 1 is required'}, status=status.HTTP_400_BAD_REQUEST) +# if 'member2' in request.data: +# try: +# user2 = User.objects.get(username=request.data['member2']) +# member2 = user2.extrainfo +# request.data['member2'] = member2 +# except: +# return Response({'error':'Wrong username of member 2. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) +# else: +# return Response({'error':'Member 2 is required'}, status=status.HTTP_400_BAD_REQUEST) +# if 'member3' in request.data: +# try: +# user3 = User.objects.get(username=request.data['member3']) +# member3 = user3.extrainfo +# request.data['member3'] = member3 +# except: +# return Response({'error':'Wrong username of member 3. User does not exist.'}, status=status.HTTP_400_BAD_REQUEST) +# else: +# member3 = None +# if not 'approval' in request.data: +# return Response({'error':'Approval value is required.'}, status=status.HTTP_400_BAD_REQUEST) +# elif request.data['approval'] != 'yes' and request.data['approval'] != 'no': +# return Response({'error':'Wrong approval value provided. Approval value should be yes or no'}, status=status.HTTP_400_BAD_REQUEST) +# if request.data['approval'] == 'yes': +# request.data.pop('approval', None) +# request.data['pending_supervisor'] = False +# request.data['approval_supervisor'] = True +# request.data['forwarded_to_hod'] = True +# request.data['pending_hod'] = True +# else: +# request.data.pop('approval', None) +# request.data['pending_supervisor'] = False +# request.data['approval_supervisor'] = False +# request.data['forwarded_to_hod'] = False +# request.data['pending_hod'] = False +# serializer = serializers.ThesisTopicProcessSerializer(thesis, data=request.data, partial=True) +# if serializer.is_valid(): +# serializer.save() +# return Response(serializer.data, status=status.HTTP_200_OK) +# else: +# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +# else: +# return Response({'error':'Cannot approve thesis'}, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file diff --git a/FusionIIIT/applications/academic_procedures/models.py b/FusionIIIT/applications/academic_procedures/models.py index 37b339378..4a932832f 100644 --- a/FusionIIIT/applications/academic_procedures/models.py +++ b/FusionIIIT/applications/academic_procedures/models.py @@ -565,8 +565,6 @@ class StudentRegistrationChecks(models.Model): final_registration_flag(boolean) - to denote whether the final registration is complete semester_id(programme_curriculum.Semester) - reference to the semester for which the registration will be considered - - ''' @@ -618,9 +616,6 @@ class FinalRegistration(models.Model): verified(Boolean) - denotes whether the registration is verified by academic department and complete course_slot_id(programme_curriculum.CourseSlot) - details about under which course slot the course is offered(Optional/Core other details) - - - ''' @@ -671,16 +666,12 @@ class course_registration(models.Model): ''' Current Purpose : stores information regarding the process of registration of a student for a course - ATTRIBUTES course_id(programme_curriculum.Course) - reference to the course details for which the registration is being done semester_id(programme_curriculum.Semester) - reference to the semester for which the course registration is done student_id(academic_information.Student) - reference to the student course_slot_id(programme_curriculum.CourseSlot) - details about under which course slot the course is offered(Optional/Core other details) - - - ''' @@ -694,3 +685,19 @@ class course_registration(models.Model): class Meta: db_table = 'course_registration' + + +class backlog_course(models.Model): + ''' + Current Purpose : stores information regarding the backlog courses of a student (purpose is unclear and is open to interpretations) + + ATTRIBUTES + course_id(programme_curriculum.Course) - reference to the course details for which the registration is being done + semester_id(programme_curriculum.Semester) - reference to the semester for which the course registration is done + student_id(academic_information.Student) - reference to the student + is_summer_course(Boolean) - details about whether this course is available as summer_course or not + ''' + student_id = models.ForeignKey(Student, on_delete=models.CASCADE) + semester_id = models.ForeignKey(Semester, on_delete=models.CASCADE) + course_id = models.ForeignKey(Course, on_delete=models.CASCADE) + is_summer_course = models.BooleanField(default= False) \ No newline at end of file diff --git a/FusionIIIT/applications/academic_procedures/tests.py b/FusionIIIT/applications/academic_procedures/tests.py index e9137c85e..2c9e754ad 100644 --- a/FusionIIIT/applications/academic_procedures/tests.py +++ b/FusionIIIT/applications/academic_procedures/tests.py @@ -1,3 +1,4 @@ # from django.test import TestCase # Create your tests here. + diff --git a/FusionIIIT/applications/academic_procedures/urls.py b/FusionIIIT/applications/academic_procedures/urls.py index 45f892b49..0a7adea9f 100644 --- a/FusionIIIT/applications/academic_procedures/urls.py +++ b/FusionIIIT/applications/academic_procedures/urls.py @@ -1,5 +1,4 @@ from django.conf.urls import url, include - from . import views appname = 'procedures' urlpatterns = [ @@ -41,7 +40,10 @@ url(r'^test/$', views.test), url(r'^bonafide_pdf/$', views.Bonafide_form), url(r'^test_ret/$', views.test_ret), + url(r'^api/', include('applications.academic_procedures.api.urls')), + + url(r'^faculty_data/$', views.facultyData, name='faculty_data'), url(r'^ACF/$', views.ACF, name='ACF'), url(r'^MTSGF/$', views.MTSGF), @@ -51,12 +53,18 @@ url(r'^update_phdform/$', views.update_phdform), url(r'^update_dues/$', views.update_dues), url(r'^dues_pdf/$', views.dues_pdf), - url(r'^acad_person/gen_course_list$', - views.gen_course_list, name='gen_course_list'), + url(r'^acad_person/gen_course_list$', views.gen_course_list, name='gen_course_list'), url(r'^update_acad_assistantship/$', views.update_acad_assis), url(r'^update_account_assistantship/$', views.update_account_assistantship), url(r'^update_hod_assistantship/$', views.update_hod_assistantship), url(r'^mdue/$', views.mdue), url(r'^assis_stat/$', views.assis_stat), - url(r'^acad_person/allot_courses/' , views.allot_courses, name='allot_courses') + url(r'^acad_person/allot_courses/' , views.allot_courses, name='allot_courses'), + + url(r'^acad_person/get_next_sem_courses/' , views.get_next_sem_courses , name = 'get_next_sem_courses'), + + url(r'^acad_person/remove_course_from_slot/' , views.remove_course_from_slot , name = 'remove_course_from_slot'), + url(r'^acad_person/add_course_to_slot/' , views.add_course_to_slot , name = 'add_course_to_slot'), + + ] diff --git a/FusionIIIT/applications/academic_procedures/views.py b/FusionIIIT/applications/academic_procedures/views.py index 7e55e3e45..34587f02e 100644 --- a/FusionIIIT/applications/academic_procedures/views.py +++ b/FusionIIIT/applications/academic_procedures/views.py @@ -11,6 +11,7 @@ import logging from django.db import transaction from django.contrib import messages +from django.db.models import Q from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.db.models import Max,Value,IntegerField,CharField,F,Sum @@ -29,17 +30,17 @@ from applications.programme_curriculum.models import (CourseSlot, Course as Courses, Batch, Semester , CourseInstructor) from applications.globals.models import (DepartmentInfo, Designation, ExtraInfo, Faculty, HoldsDesignation) - +from applications.programme_curriculum.models import Course as Courses from .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) + PhDProgressExamination,CourseRequested, course_registration, MessDue, Assistantship_status , backlog_course) from notification.views import academics_module_notif from .forms import BranchChangeForm from django.db.models.functions import Concat,ExtractYear,ExtractMonth,ExtractDay,Cast - - +from .api import serializers +from django.core.serializers import serialize demo_date = timezone.now() # demo_date = demo_date - datetime.timedelta(days = 180) @@ -158,6 +159,40 @@ def academic_procedures_faculty(request): mtechseminar_request_list = MTechGraduateSeminarReport.objects.all().filter(Overall_grade = '') phdprogress_request_list = PhDProgressExamination.objects.all().filter(Overall_grade = '') courses_list = list(CourseInstructor.objects.select_related('course_id', 'batch_id', 'batch_id__discipline').filter(instructor_id__id=fac_id.id).only('course_id__code', 'course_id__name', 'batch_id')) + + user = request.user + curriculum_ids = Curriculum_Instructor.objects.filter(instructor_id= user_details.pk).values_list('curriculum_id', flat=True) + # Fetch course info for each curriculum ID + course_infos = list(Curriculum.objects.filter(curriculum_id__in=curriculum_ids).values_list('course_code', 'course_type', 'programme', 'branch', 'sem', 'batch', 'course_id_id')) + + # Fetch course names using course IDs from course_infos + course_ids = [info[6] for info in course_infos] + # print(course_ids) + course_names = Course.objects.filter(id__in=course_ids).values_list('course_name', flat=True) + + # Convert course_names queryset to a list + course_name_values = list(course_names) + + # Update course_infos with course names + for index, info in enumerate(course_infos): + if(len(course_name_values) > index): + course_infos[index] = (course_name_values[index],) + info[:7] + + # Fetch REAL COURSE ID using course CODE from course_infos + # real_course_codes = [info[1] for info in course_infos] + # print(real_course_codes) + # real_course_ids = Courses.objects.filter(code__in=real_course_codes).values_list('id', flat=True) + + # Convert real_course_ids queryset to a list + # real_course_ids_values = list(real_course_ids) + # print(len(real_course_ids)) + # print(real_course_ids) + + # Update course_infos with real course IDs + # for index, info in enumerate(course_infos): + # if(len(real_course_ids_values) > index): + # course_infos[index] = info[:7] + (real_course_ids_values[index],) + # print('-------------------------------------------------------------------------------------' , course_infos) r = range(4) return render( request, @@ -181,6 +216,9 @@ def academic_procedures_faculty(request): 'mtechseminar_request_list' : mtechseminar_request_list, 'phdprogress_request_list' : phdprogress_request_list, 'r' : r, + 'curriculum_ids' : curriculum_ids, + 'course_infos' : course_infos, + 'course_name_values' : course_name_values, }) else: HttpResponse("user not found") @@ -341,7 +379,7 @@ def academic_procedures_student(request): currently_registered_course = get_currently_registered_course(obj,obj.curr_semester_no) current_credits = get_current_credits(currently_registered_course) - + cur_cpi=0.0 details = { 'current_user': current_user, @@ -374,7 +412,7 @@ def academic_procedures_student(request): for final_registered_course in final_registered_courses: final_registered_course_show.append({"course_code":final_registered_course.course_id.code,"course_name":final_registered_course.course_id.name,"course_credit":final_registered_course.course_id.credit}) add_courses_options = get_add_course_options(current_sem_branch_course, currently_registered_course, batch.year) - #drop_courses_options = get_drop_course_options(currently_registered_course) + drop_courses_options = get_drop_course_options(currently_registered_course) except Exception as e: final_registered_courses = None @@ -455,6 +493,13 @@ def academic_procedures_student(request): attendence.append((i,pr,pr+ab)) cur_spi='Sem results not available' # To be fetched from db if result uploaded + backlogCourseList = [] + backlogCourses = backlog_course.objects.select_related('course_id' , 'student_id' , 'semester_id' ).filter(student_id=obj) + for i in backlogCourses: + summer_course = "Yes" if i.is_summer_course else "No" + course_details = i.course_id.course_details if i.course_id.course_details else "N/A" + + backlogCourseList.append([i.course_id.course_name, course_details , i.semester_id.semester_no , summer_course]) Mess_bill = Monthly_bill.objects.filter(student_id = obj) Mess_pay = Payments.objects.filter(student_id = obj) @@ -503,7 +548,7 @@ def academic_procedures_student(request): # 'change_branch': change_branch, # 'add_course': add_course, 'add_courses_options': add_courses_options, - #'drop_courses_options' : drop_courses_options, + 'drop_courses_options' : drop_courses_options, # 'pre_register': pre_register, 'pre_registration_timestamp': pre_registration_timestamp, 'prd': pre_registration_date_flag, @@ -527,6 +572,7 @@ def academic_procedures_student(request): 'hos_d':hos_d, 'tot_d':tot_d, 'attendence':attendence, + 'backlogCourseList' : backlogCourseList, 'BranchChangeForm': BranchChangeForm(), 'BranchFlag':branchchange_flag, 'assistantship_flag' : student_status, @@ -1428,24 +1474,31 @@ def allot_courses(request): profiles=request.FILES['allotedCourses'] batch_id=request.POST['batch'] sem_no=int(request.POST['semester']) - + batch=Batch.objects.get(id=batch_id) sem_id=Semester.objects.get(curriculum=batch.curriculum,semester_no=sem_no) - + print(batch , sem_id) + # format of excel sheet being uploaded should be xls only , otherwise error excel = xlrd.open_workbook(file_contents=profiles.read()) sheet=excel.sheet_by_index(0) final_registrations=[] + # print('>>>>>>>>>>>>>>>>>>>' , sheet.nrows) for i in range(1,sheet.nrows): roll_no = str(sheet.cell(i,0).value).split(".")[0] + # print("Roll No from Excel:", roll_no) course_slot_name = sheet.cell_value(i,1) course_code = sheet.cell_value(i,2) course_name = sheet.cell_value(i,3) - user=User.objects.get(username=roll_no) - user_info = ExtraInfo.objects.get(user=user) - student = Student.objects.get(id=user_info) - course_slot=CourseSlot.objects.get(name=course_slot_name.strip(),semester=sem_id) - course = Courses.objects.get(code=course_code.strip(),name=course_name.strip()) - #print(">>>>>",roll_no,course_slot_name,course_code,course_name) + try: + user=User.objects.get(username=roll_no) + user_info = ExtraInfo.objects.get(user=user) + student = Student.objects.get(id=user_info) + course_slot=CourseSlot.objects.get(name=course_slot_name.strip(),semester=sem_id) + print(course_code.strip() , course_name.strip()) + course = Courses.objects.get(code=course_code.strip(),name=course_name.strip()) + # print(">>>>>",roll_no,course_slot_name,course_code,course_name) + except Exception as e: + print('----------------------' , e) final_registration=FinalRegistration(student_id=student,course_slot_id=course_slot, course_id=course,semester_id=sem_id) final_registrations.append(final_registration) @@ -1789,7 +1842,11 @@ def get_user_semester(roll_no, ug_flag, masters_flag, phd_flag): def get_branch_courses(roll_no, user_sem, branch): roll = str(roll_no) - year = int(roll[:4]) + try: + year = int(roll[:4]) + except: + year = int(roll[:2]) + year = 2000 + year courses = Curriculum.objects.all().select_related().filter(batch=(year)) courses = courses.filter(sem = user_sem) courses = courses.filter(floated = True) @@ -2223,12 +2280,12 @@ def student_list(request): batch_id = Batch.objects.get(id = batch) student_obj = FeePayments.objects.all().select_related('student_id').filter(student_id__batch_id = batch_id) if (student_obj): - reg_table = student_obj.prefetch_related('student_id__studentregistrationchecks').filter(semester_id = student_obj[0].semester_id, student_id__studentregistrationchecks__final_registration_flag = True).select_related( + reg_table = student_obj.prefetch_related('student_id__studentregistrationchecks').filter(semester_id = student_obj[0].semester_id, student_id__studentregistrationchecks__final_registration_flag = True , student_id__finalregistration__verified=False).select_related( 'student_id','student_id__id','student_id__id__user','student_id__id__department').values( 'student_id__id','student_id__id__user__first_name','student_id__id__user__last_name','student_id__batch','student_id__id__department__name', 'student_id__programme','student_id__curr_semester_no','student_id__id__sex','student_id__id__phone_no','student_id__category', 'student_id__specialization','mode','transaction_id','deposit_date','fee_paid','utr_number','reason','fee_receipt','actual_fee', - 'student_id__id__user__username').order_by('student_id__id__user') + 'student_id__id__user__username').order_by('student_id__id__user').distinct() else : reg_table = [] @@ -2288,7 +2345,7 @@ def student_list(request): 'specialization','gender','category', 'pwd_status','phone_no','actual_fee', 'fee_paid','reason','date_deposited', - 'mode','utr_number','fee_receipt')) + 'mode','utr_number','fee_receipt')).distinct() excel_response = BytesIO() @@ -2335,11 +2392,16 @@ def verify_registration(request): batch = student.batch_id curr_id = batch.curriculum - sem_id = Semester.objects.get(curriculum = curr_id, semester_no = student.curr_semester_no+1) + + if(student.curr_semester_no+1 >= 9): + sem_no = 4 + else: + sem_no = student.curr_semester_no+1 + + sem_id = Semester.objects.get(curriculum = curr_id, semester_no = sem_no) final_register_list = FinalRegistration.objects.all().filter(student_id = student, verified = False, semester_id = sem_id) - sem_no = student.curr_semester_no + 1 with transaction.atomic(): ver_reg = [] @@ -2363,8 +2425,11 @@ def verify_registration(request): batch = student_id.batch_id curr_id = batch.curriculum - sem_id = Semester.objects.get(curriculum = curr_id, semester_no = student_id.curr_semester_no + 1) - + if(student.curr_semester_no+1 >= 9): + sem_no = 4 + else: + sem_no = student.curr_semester_no+1 + sem_id = Semester.objects.get(curriculum = curr_id, semester_no = sem_no) with transaction.atomic(): academicadmin = get_object_or_404(User, username = "acadadmin") FinalRegistration.objects.filter(student_id = student_id, verified = False, semester_id = sem_id).delete() @@ -3462,7 +3527,84 @@ def mdue(request): content = json.dumps("success") return HttpResponse(content) - + +def get_detailed_sem_courses(sem_id): + course_slots = CourseSlot.objects.filter(semester_id=sem_id) + # Serialize queryset of course slots into JSON + course_slots_json = serialize('json', course_slots) + # Convert JSON string into Python object + course_slots_data = json.loads(course_slots_json) + + # Iterate over each course slot data and include associated course data + for slot_data in course_slots_data: + # Retrieve associated courses for the current course slot + slot = CourseSlot.objects.get(id=slot_data['pk']) + courses = list(slot.courses.all().values()) + # Add courses data to the course slot data + slot_data['courses'] = courses + + return course_slots_data + + +def get_next_sem_courses(request): + if request.method == 'POST': + data = json.loads(request.body) + next_sem = data.get('next_sem') + branch = data.get('branch') + programme = data.get('programme') + batch = data.get('batch') + # we go to student table and apply filters and get batch_id of the students with these filter + batch_id = Student.objects.filter(programme = programme , batch = batch , specialization = branch)[0].batch_id + + curr_id = batch_id.curriculum + # print('-----------------------------------------------------------------------------------------', curr_id) + # curr_id = 1 + next_sem_id = Semester.objects.get(curriculum = curr_id, semester_no = next_sem) + if next_sem_id: + next_sem_registration_courses = get_detailed_sem_courses(next_sem_id ) + # next_sem_registration_courses = serializers.CourseSlotSerializer(next_sem_registration_courses).data + # print(next_sem_registration_courses) + return JsonResponse(next_sem_registration_courses, safe=False) + return JsonResponse({'error': 'Invalid request'}) + + +def add_course_to_slot(request): + if request.method == 'POST': + data = json.loads(request.body) + course_slot_name = data.get('course_slot_name') + course_code = data.get('course_name') + # print('-----------------------------------------------------------------------------------------' , course_slot_name , course_code) + try: + course_slot = CourseSlot.objects.get(name=course_slot_name) + course = Courses.objects.get(code=course_code) + course_slot.courses.add(course) + + return JsonResponse({'message': f'Course {course_code} added to slot {course_slot_name} successfully.'}, status=200) + except CourseSlot.DoesNotExist: + return JsonResponse({'error': 'Course slot does not exist.'}, status=400) + except Course.DoesNotExist: + return JsonResponse({'error': 'Course does not exist.'}, status=400) + + return JsonResponse({'error': 'Invalid request method.'}, status=405) + + +def remove_course_from_slot(request): + if request.method == 'POST': + data = json.loads(request.body) + course_slot_name = data.get('course_slot_name') + course_code = data.get('course_name') + # print('-----------------------------------------------------------------------------------------' , course_slot_name , course_code) + try: + course_slot = CourseSlot.objects.get(name=course_slot_name) + course = Courses.objects.get(code=course_code) + course_slot.courses.remove(course) + return JsonResponse({'message': f'Course {course_code} removed from slot {course_slot_name} successfully.'}, status=200) + except CourseSlot.DoesNotExist: + return JsonResponse({'error': 'Course slot does not exist.'}, status=400) + except Course.DoesNotExist: + return JsonResponse({'error': 'Course does not exist.'}, status=400) + + return JsonResponse({'error': 'Invalid request method.'}, status=405) diff --git a/FusionIIIT/applications/programme_curriculum/models.py b/FusionIIIT/applications/programme_curriculum/models.py index 248079cd3..7f6a59bf6 100644 --- a/FusionIIIT/applications/programme_curriculum/models.py +++ b/FusionIIIT/applications/programme_curriculum/models.py @@ -176,7 +176,7 @@ def courseslots(self): class Course(models.Model): ''' Current Purpose : To store the details regarding a course - + diff --git a/FusionIIIT/templates/academic_procedures/academic.html b/FusionIIIT/templates/academic_procedures/academic.html index 6b04a54fb..5f5ee86ad 100755 --- a/FusionIIIT/templates/academic_procedures/academic.html +++ b/FusionIIIT/templates/academic_procedures/academic.html @@ -172,7 +172,9 @@ Add/drop courses - + + Backlogs +
- +
+ {% include 'academic_procedures/backlog.html' %} +
diff --git a/FusionIIIT/templates/academic_procedures/academicfac.html b/FusionIIIT/templates/academic_procedures/academicfac.html index dd74efff5..3ed8d61d2 100644 --- a/FusionIIIT/templates/academic_procedures/academicfac.html +++ b/FusionIIIT/templates/academic_procedures/academicfac.html @@ -25,7 +25,13 @@ style="max-width: 320px;"> {% if fac_flag %} + {% if request.user.extrainfo.user_type == 'fx' or request.user.extrainfo.user_type == 'faculty' %} + Assigned Course + + + {% endif %} + Course Management @@ -61,9 +67,56 @@ Kartik {% endcomment %} +
+
+
+ + + + + + + + + + + + + + + + + + + {% for course_info in course_infos %} + + {% for course_in in course_info|slice:":6" %} + + {%endfor%} + + + + + + {%endfor%} + +

Course Name

Course Code

Course Type

Programme

Branch

Semester

Download Roll List

{{course_in }} + +
+ {% csrf_token %} + + + +
+
+
+
+
- -
+


diff --git a/FusionIIIT/templates/academic_procedures/addCourse.html b/FusionIIIT/templates/academic_procedures/addCourse.html index c58b1ac45..42f38a05d 100755 --- a/FusionIIIT/templates/academic_procedures/addCourse.html +++ b/FusionIIIT/templates/academic_procedures/addCourse.html @@ -11,7 +11,7 @@
{% if adc_date_flag %} - {% if details.cpi >= 6.0 %} + {% if details.cpi >= 0.0 %} {% if add_courses_options %}
{% csrf_token %} diff --git a/FusionIIIT/templates/academic_procedures/backlog.html b/FusionIIIT/templates/academic_procedures/backlog.html new file mode 100644 index 000000000..e8e7253a5 --- /dev/null +++ b/FusionIIIT/templates/academic_procedures/backlog.html @@ -0,0 +1,21 @@ +{% load static %} +
Backlog Courses
+
+
+ + + + + + + + + {% for i in backlogCourseList %} + + {% for j in i %} + + {% endfor %} + + {% endfor %} +
Course NameFacultySemester IDAvailable Summer Course
{{ j }}
+
\ No newline at end of file diff --git a/FusionIIIT/templates/academic_procedures/finalregister.html b/FusionIIIT/templates/academic_procedures/finalregister.html index 2349c5f01..387aa659f 100755 --- a/FusionIIIT/templates/academic_procedures/finalregister.html +++ b/FusionIIIT/templates/academic_procedures/finalregister.html @@ -212,10 +212,6 @@

Fee Payment

- - - - + + + + diff --git a/FusionIIIT/templates/ais/pre_registration_courses.html b/FusionIIIT/templates/ais/pre_registration_courses.html new file mode 100644 index 000000000..fa452baf5 --- /dev/null +++ b/FusionIIIT/templates/ais/pre_registration_courses.html @@ -0,0 +1,229 @@ + + + + +{% load static %} +{% block config_pre_registration %} + + +

Pre-Registration Courses for upcoming Semester

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+ + + + {% csrf_token %} + + + + + + + + + + + + + + +
#Slot nameSlot typeSemesterCreditsSelect
+ + +
+
+
+ + + +{% endblock %} + + + + diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 655f946fd..8cba4a32b 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,10 +1,10 @@ #!/bin/bash - # Apply database migrations echo "Apply database migrations" # python FusionIIIT/manage.py makemigrations # python FusionIIIT/manage.py migrate - # Start server +# IP="0.0.0.0" +# PORT="8000" echo "Starting server" -python FusionIIIT/manage.py runserver 0.0.0.0:8000 +python FusionIIIT/manage.py runserver \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 4cc3a0a30..ec244dfb3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ amqp==5.0.2 -arabic-reshaper==2.1.1 +# arabic-reshaper asgiref==3.3.1 attrs==20.3.0 beautifulsoup4==4.9.3 @@ -35,19 +35,19 @@ future==0.18.2 html-text==0.5.2 html5lib==1.1 idna==2.10 -ipython==8.2.0 +ipython ipython-genutils==0.2.0 jsonfield==3.1.0 jsonschema==3.2.0 kombu==5.0.2 lxml==4.8.0 markdown2==2.4.2 -numpy==1.22.3 +numpy oauthlib==3.1.0 openpyxl==3.0.7 Pillow==8.1.0 prompt-toolkit==3.0.10 -psycopg2-binary==2.8.6 +psycopg2-binary pycparser==2.20 PyJWT==2.6.0 PyPDF2==1.26.0