diff --git a/FusionIIIT/Fusion/settings/common.py b/FusionIIIT/Fusion/settings/common.py index ee1618a24..bc97f1548 100644 --- a/FusionIIIT/Fusion/settings/common.py +++ b/FusionIIIT/Fusion/settings/common.py @@ -50,7 +50,7 @@ # email of sender -EMAIL_HOST_USER = 'fusionmailservice@iiitdmj.ac.in' +EMAIL_HOST_USER = 'fusion@iiitdmj.ac.in' EMAIL_PORT = 587 ACCOUNT_EMAIL_REQUIRED = True @@ -68,7 +68,7 @@ ACCOUNT_EMAIL_SUBJECT_PREFIX = 'Fusion: ' -DEFAULT_FROM_EMAIL = 'Fusion IIIT ' +DEFAULT_FROM_EMAIL = 'Fusion IIIT ' SERVER_EMAIL = 'fusionmailservice@iiitdmj.ac.in' diff --git a/FusionIIIT/Fusion/urls.py b/FusionIIIT/Fusion/urls.py index b9c03eeb8..e3b3f6792 100755 --- a/FusionIIIT/Fusion/urls.py +++ b/FusionIIIT/Fusion/urls.py @@ -21,6 +21,9 @@ from django.conf.urls.static import static from django.contrib import admin from django.contrib.auth import views as auth_views +from django.urls import path + +from applications.globals.views import RateLimitedPasswordResetView urlpatterns = [ @@ -62,4 +65,33 @@ url(r'^recruitment/', include('applications.recruitment.urls')), url(r'^examination/', include('applications.examination.urls')), url(r'^otheracademic/', include('applications.otheracademic.urls')), + + path( + 'password-reset/', + RateLimitedPasswordResetView.as_view( + template_name='registration/password_reset_form.html', + ), + name='reset_password', + ), + path( + 'password-reset/done/', + auth_views.PasswordResetDoneView.as_view( + template_name='registration/password_reset_done.html' + ), + name='password_reset_done', + ), + path( + 'reset///', + auth_views.PasswordResetConfirmView.as_view( + template_name='registration/password_reset_confirm.html', + ), + name='password_reset_confirm', + ), + path( + 'reset/done/', + auth_views.PasswordResetCompleteView.as_view( + template_name='registration/password_reset_complete.html' + ), + name='password_reset_complete', + ), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/FusionIIIT/applications/academic_information/views.py b/FusionIIIT/applications/academic_information/views.py index c468c97c5..df8d78f7a 100755 --- a/FusionIIIT/applications/academic_information/views.py +++ b/FusionIIIT/applications/academic_information/views.py @@ -2136,6 +2136,10 @@ def view_all_student_data(request): """ views all the students """ + if request.session.get('currentDesignationSelected') in ["studentacadadmin"]: + return HttpResponseRedirect('/aims/') + + data = [] #students = Student.objects.select_related('batch_id', 'id__user', 'batch_id__discipline', 'id') .filter(batch=2019).order_by('id').all().only('batch', 'id__id', 'id__user', 'programme', 'batch_id__discipline__acronym', 'specialization', 'id__sex', 'category', 'id__phone_no', 'id__date_of_birth', 'id__user__first_name', 'id__user__last_name', 'id__user__email', 'father_name', 'mother_name', 'id__address')[0:20] diff --git a/FusionIIIT/applications/academic_procedures/api/urls.py b/FusionIIIT/applications/academic_procedures/api/urls.py index 786c12760..42d825b9a 100644 --- a/FusionIIIT/applications/academic_procedures/api/urls.py +++ b/FusionIIIT/applications/academic_procedures/api/urls.py @@ -9,7 +9,7 @@ url(r'^stu/add_one_course/' , views.add_one_course , name = 'add_one_course'), 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/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') diff --git a/FusionIIIT/applications/academic_procedures/api/views.py b/FusionIIIT/applications/academic_procedures/api/views.py index bd3f2dc13..217b1b9ba 100644 --- a/FusionIIIT/applications/academic_procedures/api/views.py +++ b/FusionIIIT/applications/academic_procedures/api/views.py @@ -362,7 +362,7 @@ def academic_procedures_student(request): 'next_sem_registration_courses': next_sem_courses, 'next_sem_branch_registration_courses' : next_sem_branch_registration_courses_data, 'final_registration_choices' : final_registration_choices_data, - 'backlogCourseList': auto_backlog_courses_list, + # 'backlogCourseList': auto_backlog_courses_list, 'student_flag' : student_flag, 'ug_flag' : ug_flag, @@ -732,25 +732,25 @@ def student_final_registration(request): # 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) +# @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) +# return Response(backlogCourseList, status=status.HTTP_200_OK) +# except Exception as e: +# return Response(data = str(e) , status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/FusionIIIT/applications/academic_procedures/views.py b/FusionIIIT/applications/academic_procedures/views.py index accc95f53..4096dfc35 100644 --- a/FusionIIIT/applications/academic_procedures/views.py +++ b/FusionIIIT/applications/academic_procedures/views.py @@ -52,6 +52,7 @@ # demo_date = demo_date + datetime.timedelta(days = 180) # demo_date = demo_date + datetime.timedelta(days = 3) # demo_date = demo_date - datetime.timedelta(days = 5) +user_sem=0 student_status = None hod_status = None account_status = None @@ -90,7 +91,7 @@ def academic_procedures(request): return HttpResponseRedirect('/academic-procedures/fac/') # return HttpResponseRedirect('/logout/') - elif request.session.get('currentDesignationSelected') == "acadadmin" : + elif request.session.get('currentDesignationSelected') in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/aims/') elif str(request.user) == "rizwan": @@ -366,8 +367,9 @@ def academic_procedures_student(request): curr_sem_id = Semester.objects.get(curriculum = curr_id, semester_no = obj.curr_semester_no) try: - semester_no = obj.curr_semester_no+1 - next_sem_id = Semester.objects.get(curriculum = curr_id, semester_no = semester_no) + semester_no = obj.curr_semester_no + sem_no=semester_no+1 + next_sem_id = Semester.objects.get(curriculum = curr_id, semester_no = sem_no) user_sem = semester_no except Exception as e: @@ -388,6 +390,8 @@ def academic_procedures_student(request): pre_registration_date_flag, prd_start_date= get_pre_registration_eligibility(current_date, user_sem, 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) + swayam_registration_flag = get_swayam_registration_eligibility(current_date, user_sem, year) + print("Swayam Registration: ", user_sem, swayam_registration_flag) pre_registration_flag = False final_registration_flag = False @@ -416,7 +420,7 @@ def academic_procedures_student(request): details = { 'current_user': current_user, 'year': acad_year, - 'user_sem': user_sem - 1, + 'user_sem': user_sem, 'user_branch' : str(user_branch), 'cpi' : cpi, } @@ -573,6 +577,7 @@ def academic_procedures_student(request): 'courses_list': next_sem_branch_course, 'fee_payment_mode_list' : fee_payment_mode_list, 'next_sem_registration_courses': next_sem_registration_courses, + 'current_sem_registration_courses': current_sem_branch_course, 'final_registration_choice' : final_registration_choice, 'unavailable_courses_nextsem' : unavailable_courses_nextsem, 'performance_list' : performance_list, @@ -605,6 +610,7 @@ def academic_procedures_student(request): 'adc_date_flag': add_or_drop_course_date_flag, 'pre_registration_flag' : pre_registration_flag, 'final_registration_flag': final_registration_flag, + 'swayam_registration_flag': swayam_registration_flag, 'swayam_courses_count':swayam_courses_count, # 'final_r': final_register_1, @@ -621,8 +627,8 @@ def academic_procedures_student(request): 'hos_d':hos_d, 'tot_d':tot_d, 'attendence':attendence, - 'backlogCourseList' : backlogCourseList, - 'auto_backlog_courses_list' : auto_backlog_courses_list, + # 'backlogCourseList' : backlogCourseList, + # 'auto_backlog_courses_list' : auto_backlog_courses_list, 'BranchChangeForm': BranchChangeForm(), 'BranchFlag':branchchange_flag, 'assistantship_flag' : student_status, @@ -633,7 +639,7 @@ def academic_procedures_student(request): elif request.session.get('currentDesignationSelected') == "Associate Professor" : return HttpResponseRedirect('/academic-procedures/main/') - elif request.session.get('currentDesignationSelected') == "acadadmin" : + elif request.session.get('currentDesignationSelected') in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/academic-procedures/main/') else: @@ -995,6 +1001,7 @@ def gen_course_list(request): "name": registration.student_id.id.user.first_name + " " + registration.student_id.id.user.last_name, "department": registration.student_id.id.department.name }) + verified_students = sorted(verified_students, key=lambda x: x['rollno']) html = render_to_string('academic_procedures/gen_course_list.html', {'students': verified_students, 'batch':batch, 'course':course_id}, request) maindict = {'html': html} @@ -1025,13 +1032,12 @@ def verify_course(request): current_user = get_object_or_404(User, username=request.user.username) user_details = ExtraInfo.objects.all().select_related( 'user', 'department').filter(user=current_user).first() - desig_id = Designation.objects.all().filter(name='acadadmin').first() - temp = HoldsDesignation.objects.all().select_related().filter( - designation=desig_id).first() + desig_id = Designation.objects.all().filter(Q(name='acadadmin') | Q(name='studentacadadmin')).first() + temp = HoldsDesignation.objects.all().select_related().filter(designation=desig_id).first() acadadmin = temp.working k = str(user_details).split() final_user = k[2] - if ('acadadmin' != request.session.get('currentDesignationSelected')): + if (request.session.get('currentDesignationSelected') not in ['acadadmin', 'studentacadadmin']) : return HttpResponseRedirect('/academic-procedures/') roll_no = request.POST["rollNo"] obj = ExtraInfo.objects.all().select_related( @@ -1161,7 +1167,7 @@ def acad_branch_change(request): k = str(user_details).split() final_user = k[2] - if ('acadadmin' != request.session.get('currentDesignationSelected')): + if ( request.session.get('currentDesignationSelected') not in ['acadadmin', 'studentacadadmin']): return HttpResponseRedirect('/academic-procedures/') # year = datetime.datetime.now().year @@ -1416,6 +1422,19 @@ def get_course_verification_date_eligibilty(current_date): return False except Exception as e: return False + +def get_swayam_registration_eligibility(current_date, user_sem, year): + try: + swayam_registration_date = Calendar.objects.all().filter(description=f"Swayam Registration {user_sem} {year}").first() + print(swayam_registration_date, user_sem, year) + swayam_start_date = swayam_registration_date.from_date + swayam_end_date = swayam_registration_date.to_date + if current_date>=swayam_start_date and current_date<=swayam_end_date: + return True + else : + return False + except Exception as e: + return False def get_user_branch(user_details): return user_details.department.name @@ -1617,6 +1636,7 @@ def final_registration(request): else: return HttpResponseRedirect('/academic-procedures/main') + def allot_courses(request): if user_check(request): return HttpResponseRedirect('/academic-procedures/main') @@ -1627,6 +1647,7 @@ def allot_courses(request): profiles=request.FILES['allotedCourses'] batch_id=request.POST['batch'] sem_no=int(request.POST['semester']) + working_year =int(request.POST['working_year']) batch=Batch.objects.get(id=batch_id) sem_id=Semester.objects.get(curriculum=batch.curriculum,semester_no=sem_no) @@ -1652,10 +1673,16 @@ def allot_courses(request): 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()) + slot_courses = course_slot.courses.filter() + # for i in slot_courses: + # print("slot course ", i) + # print(course_slot) + print(course_code.strip() , course_name.strip(),student) + course = slot_courses.get(code=course_code.strip()) + # print(course_code.strip() , course_name.strip(),student) + # course = Courses.objects.get(code=course_code.strip(),name=course_name.strip()) if(roll_no not in currroll): - student_check=StudentRegistrationChecks(student_id = student, semester_id = sem_id, pre_registration_flag = True,final_registration_flag = False) + student_check=StudentRegistrationChecks(student_id = student, semester_id = sem_id, pre_registration_flag = True,final_registration_flag = True) student_checks.append(student_check) currroll.add(roll_no) # print(">>>>>",roll_no,course_slot_name,course_code,course_name) @@ -1665,10 +1692,10 @@ def allot_courses(request): course_id=course,semester_id=sem_id,priority=1) pre_registrations.append(pre_registration) final_registration=FinalRegistration(student_id=student,course_slot_id=course_slot, - course_id=course,semester_id=sem_id) + course_id=course,semester_id=sem_id, verified=True ) final_registrations.append(final_registration) - courseregistration=course_registration(working_year=datetime.datetime.now().year,course_id=course,semester_id=sem_id,student_id=student,course_slot_id=course_slot) + courseregistration=course_registration(working_year=working_year,course_id=course,semester_id=sem_id,student_id=student,course_slot_id=course_slot) course_registrations.append(courseregistration) @@ -1693,8 +1720,6 @@ def allot_courses(request): - - @login_required def user_check(request): """ @@ -1715,7 +1740,7 @@ def user_check(request): try: current_user = get_object_or_404(User, username=request.user.username) user_details = ExtraInfo.objects.all().select_related('user','department').filter(user=current_user).first() - desig_id = Designation.objects.all().filter(name='acadadmin') + desig_id = Designation.objects.all().filter(Q(name='acadadmin') | Q(name='studentacadadmin')) temp = HoldsDesignation.objects.all().select_related().filter(designation = desig_id).first() acadadmin = temp.working k = str(user_details).split() @@ -1725,7 +1750,7 @@ def user_check(request): final_user="" pass - if ('acadadmin' != request.session.get('currentDesignationSelected')): + if (request.session.get('currentDesignationSelected') not in ['acadadmin', 'studentacadadmin']): return True else: return False @@ -2173,7 +2198,7 @@ def acad_person(request): elif request.session.get('currentDesignationSelected') == "Associate Professor" : return HttpResponseRedirect('/academic-procedures/main/') - elif request.session.get('currentDesignationSelected')== "acadadmin" : + elif request.session.get('currentDesignationSelected') in ['acadadmin', 'studentacadadmin']: # year = datetime.datetime.now().year @@ -2249,7 +2274,7 @@ def acad_person(request): def acad_proced_global_context(): year = demo_date.year month = demo_date.month - yearr = str(year) + "-" + str(year+1) + yearr = get_acad_year(user_sem,year) semflag = 0 queryflag = 0 query_option1 = get_batch_query_detail(month, year) @@ -2619,8 +2644,9 @@ def course_list(request): student_id = request_body['student_id'] semester_id = request_body['semester_id'] - final_registration_table = FinalRegistration.objects.all().filter(semester_id = semester_id, verified = False) - final = final_registration_table.filter(student_id = student_id, semester_id = semester_id) + # final_registration_table = FinalRegistration.objects.all().filter(semester_id = semester_id, verified = False) + # final = final_registration_table.filter(student_id = student_id, semester_id = semester_id) + final = FinalRegistration.objects.all().filter(semester_id__semester_no = semester_id, student_id__id=student_id, verified = False) html = render_to_string('academic_procedures/student_course_list.html',{"course_list":final}, request) return HttpResponse(json.dumps({'html': html}),content_type="application/json") @@ -2717,6 +2743,14 @@ def auto_verify_registration(request): with transaction.atomic(): for obj in final_register_list: o = FinalRegistration.objects.filter(id= obj.id).update(verified = True) + course_registration.objects.create( + student_id=obj.student_id, + course_id=obj.course_id, + semester_id=obj.semester_id, + course_slot_id=obj.course_slot_id, + registration_type=obj.registration_type, + working_year=demo_date.year # Set the current year + ) academics_module_notif(request.user, student.id.user, 'registration_approved') Student.objects.filter(id = student_id).update(curr_semester_no = sem_no) @@ -3997,14 +4031,14 @@ def replaceSwayam(request): current_user = get_object_or_404(User, username=request.user.username) user_details = ExtraInfo.objects.all().select_related( 'user', 'department').filter(user=current_user).first() - desig_id = Designation.objects.all().filter(name='acadadmin').first() + desig_id = Designation.objects.all().filter(Q(name='acadadmin') | Q(name='studentacadadmin')).first() temp = HoldsDesignation.objects.all().select_related().filter( designation=desig_id).first() acadadmin = temp.working k = str(user_details).split() final_user = k[2] - if ('acadadmin' != request.session.get('currentDesignationSelected')): + if (request.session.get('currentDesignationSelected') not in ['acadadmin', 'studentacadadmin']): return HttpResponseRedirect('/academic-procedures/') roll_no = request.POST["rollNo"] obj = ExtraInfo.objects.all().select_related( diff --git a/FusionIIIT/applications/examination/views.py b/FusionIIIT/applications/examination/views.py index fcafdffa1..e917836a5 100644 --- a/FusionIIIT/applications/examination/views.py +++ b/FusionIIIT/applications/examination/views.py @@ -987,8 +987,9 @@ def upload_grades(request): roll_no = row["roll_no"] grade = row["grade"] remarks = row["remarks"] - stud=Student.objects.get(id_id=roll_no) - semester=stud.curr_semester_no + semester = row["semester"] if "semester" in row and row["semester"] else None + stud = Student.objects.get(id_id=roll_no) + semester = semester or stud.curr_semester_no batch=stud.batch Student_grades.objects.create( @@ -1274,10 +1275,12 @@ def upload_grades_prof(request): roll_no = row["roll_no"] grade = row["grade"] remarks = row["remarks"] - stud=Student.objects.get(id_id=roll_no) - semester=stud.curr_semester_no + semester = row["semester"] if "semester" in row and row["semester"] else None + stud = Student.objects.get(id_id=roll_no) + semester = semester or stud.curr_semester_no batch=stud.batch reSubmit=False + Student_grades.objects.update_or_create( roll_no=roll_no, course_id_id=course_id, diff --git a/FusionIIIT/applications/globals/migrations/0003_passwordresettracker.py b/FusionIIIT/applications/globals/migrations/0003_passwordresettracker.py new file mode 100644 index 000000000..3deabb5ed --- /dev/null +++ b/FusionIIIT/applications/globals/migrations/0003_passwordresettracker.py @@ -0,0 +1,21 @@ +# Generated by Django 3.1.5 on 2025-01-01 15:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('globals', '0002_moduleaccess'), + ] + + operations = [ + migrations.CreateModel( + name='PasswordResetTracker', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email', models.EmailField(max_length=254, unique=True)), + ('last_reset', models.DateTimeField(blank=True, null=True)), + ], + ), + ] diff --git a/FusionIIIT/applications/globals/models.py b/FusionIIIT/applications/globals/models.py index e22e50809..0180e7808 100644 --- a/FusionIIIT/applications/globals/models.py +++ b/FusionIIIT/applications/globals/models.py @@ -338,3 +338,11 @@ class ModuleAccess(models.Model): def __str__(self): return self.designation + + +class PasswordResetTracker(models.Model): + email = models.EmailField(unique=True) + last_reset = models.DateTimeField(null=True, blank=True) + + def __str__(self): + return self.email diff --git a/FusionIIIT/applications/globals/views.py b/FusionIIIT/applications/globals/views.py index dedad3d8d..9109d748b 100644 --- a/FusionIIIT/applications/globals/views.py +++ b/FusionIIIT/applications/globals/views.py @@ -31,6 +31,45 @@ from .models import * from applications.hostel_management.models import (HallCaretaker,HallWarden) + +from django.contrib.auth.views import PasswordResetView +from django.shortcuts import render +from django.utils.timezone import now +from datetime import timedelta +from .models import PasswordResetTracker + +class RateLimitedPasswordResetView(PasswordResetView): + template_name = 'registration/password_reset_form.html' # Customize as needed + + def post(self, request, *args, **kwargs): + email = request.POST.get('email') + if not email: + return self.form_invalid(self.get_form()) # Default behavior for invalid forms + + # Check if the email exists in the tracker table + tracker, created = PasswordResetTracker.objects.get_or_create(email=email) + + # Enforce rate limiting: Check if the reset was within the last 24 hours + if tracker.last_reset and now() - tracker.last_reset < timedelta(days=1): + # Pass error message to the template + return render( + request, + self.template_name, + { + 'form': self.get_form(), # Include the form for re-rendering + 'error_message': "Password can only be reset once every 24 hours.", + }, + ) + + # Update the tracker with the current timestamp + tracker.last_reset = now() + tracker.save() + + # Proceed with the standard password reset process + return super().post(request, *args, **kwargs) + + + def index(request): context = {} if(str(request.user)!="AnonymousUser"): diff --git a/FusionIIIT/applications/programme_curriculum/forms.py b/FusionIIIT/applications/programme_curriculum/forms.py index 0698d514a..0a4ad1716 100644 --- a/FusionIIIT/applications/programme_curriculum/forms.py +++ b/FusionIIIT/applications/programme_curriculum/forms.py @@ -10,6 +10,7 @@ from applications.filetracking.sdk.methods import * from django.db.models import Q from datetime import datetime +from django.db.models import Max class ProgrammeForm(ModelForm): class Meta: @@ -387,7 +388,9 @@ def clean(self): return self.cleaned_data class CourseInstructorForm(forms.ModelForm): - next_year = datetime.now().year +1 + # next_year = datetime.now().year +1 + max_year = Batch.objects.aggregate(max_year=Max('year'))['max_year'] + next_year = max_year + 1 if max_year else datetime.now().year + 1 course_id = forms.ModelChoiceField( queryset=Course.objects.all(), label="Select Course", diff --git a/FusionIIIT/applications/programme_curriculum/static/samples/sample_course_instructor.xls b/FusionIIIT/applications/programme_curriculum/static/samples/sample_course_instructor.xls new file mode 100644 index 000000000..5d7c6eaa7 Binary files /dev/null and b/FusionIIIT/applications/programme_curriculum/static/samples/sample_course_instructor.xls differ diff --git a/FusionIIIT/applications/programme_curriculum/views.py b/FusionIIIT/applications/programme_curriculum/views.py index a7ba330a7..e3b21ca11 100644 --- a/FusionIIIT/applications/programme_curriculum/views.py +++ b/FusionIIIT/applications/programme_curriculum/views.py @@ -9,8 +9,9 @@ from .models import Programme, Discipline, Curriculum, Semester, Course, Batch, CourseSlot,NewProposalFile,Proposal_Tracking,CourseInstructor from .forms import ProgrammeForm, DisciplineForm, CurriculumForm, SemesterForm, CourseForm, BatchForm, CourseSlotForm, ReplicateCurriculumForm,NewCourseProposalFile,CourseProposalTrackingFile, CourseInstructorForm from .filters import CourseFilter, BatchFilter, CurriculumFilter,CourseInstructorFilter -from django.db import IntegrityError +from django.db import IntegrityError, transaction from django.utils import timezone +import xlrd from notification.views import prog_and_curr_notif # from applications.academic_information.models import Student @@ -64,7 +65,7 @@ def programme_curriculum(request): return HttpResponseRedirect('/programme_curriculum/programmes/') elif 'hod' in request.session['currentDesignationSelected'].lower() : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -86,7 +87,7 @@ def view_all_programmes(request): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -120,7 +121,7 @@ def view_curriculums_of_a_programme(request, programme_id): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -148,7 +149,7 @@ def view_all_working_curriculums(request): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -178,7 +179,7 @@ def view_semesters_of_a_curriculum(request, curriculum_id): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') @@ -224,7 +225,7 @@ def view_a_semester_of_a_curriculum(request, semester_id): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -244,7 +245,7 @@ def view_a_courseslot(request, courseslot_id): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : url+='faculty/' @@ -261,7 +262,7 @@ def view_all_courses(request): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -283,7 +284,7 @@ def view_a_course(request, course_id): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -300,7 +301,7 @@ def view_all_discplines(request): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : url+='faculty/' @@ -318,7 +319,7 @@ def view_all_batches(request): url='programme_curriculum/' user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() - if request.session['currentDesignationSelected']== "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') elif request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" or request.session['currentDesignationSelected']== "Dean Academic" : @@ -358,7 +359,7 @@ def admin_view_all_programmes(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -387,7 +388,7 @@ def admin_view_curriculums_of_a_programme(request, programme_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -412,7 +413,7 @@ def admin_view_all_working_curriculums(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -433,7 +434,7 @@ def admin_view_semesters_of_a_curriculum(request, curriculum_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -486,7 +487,7 @@ def admin_view_a_semester_of_a_curriculum(request, semester_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -504,7 +505,7 @@ def admin_view_a_courseslot(request, courseslot_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -524,7 +525,7 @@ def admin_view_all_courses(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -546,7 +547,7 @@ def admin_view_a_course(request, course_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -562,7 +563,7 @@ def admin_view_all_discplines(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -578,7 +579,7 @@ def admin_view_all_batches(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -604,7 +605,7 @@ def add_discipline_form(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -627,7 +628,7 @@ def edit_discipline_form(request, discipline_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -652,7 +653,7 @@ def add_programme_form(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -678,7 +679,7 @@ def edit_programme_form(request, programme_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -708,7 +709,7 @@ def add_curriculum_form(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -751,7 +752,7 @@ def edit_curriculum_form(request, curriculum_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -798,7 +799,7 @@ def add_course_form(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -822,7 +823,7 @@ def update_course_form(request, course_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student": return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -882,7 +883,7 @@ def add_courseslot_form(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -909,7 +910,7 @@ def edit_courseslot_form(request, courseslot_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -934,7 +935,7 @@ def delete_courseslot(request, courseslot_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -959,7 +960,7 @@ def add_batch_form(request): if request.session['currentDesignationSelected'] in ["student", "Associate Professor", "Professor", "Assistant Professor"]: return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin": + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -985,7 +986,7 @@ def edit_batch_form(request, batch_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1020,7 +1021,7 @@ def instigate_semester(request, semester_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1061,7 +1062,7 @@ def replicate_curriculum(request, curriculum_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected']== "student" or request.session['currentDesignationSelected']== "Associate Professor" or request.session['currentDesignationSelected']== "Professor" or request.session['currentDesignationSelected']== "Assistant Professor" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif str(request.user) == "acadadmin" : + elif str(request.user) in ["acadadmin", "studentacadadmin"]: pass elif 'hod' in request.session['currentDesignationSelected'].lower(): return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1120,7 +1121,7 @@ def view_course_proposal_forms(request): pass elif request.session['currentDesignationSelected'] == "student" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif request.session['currentDesignationSelected']== "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') else: data='Files Cannot be sent with current Designation Switch to "Professor or Assistant Professor or Associate Professor"' @@ -1138,7 +1139,7 @@ def faculty_view_all_courses(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected'] == "student" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') elif request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor": pass @@ -1161,7 +1162,7 @@ def faculty_view_a_course(request, course_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected'] == "student" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') elif request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" : pass @@ -1180,7 +1181,7 @@ def view_a_course_proposal_form(request,CourseProposal_id): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') else: return HttpResponseRedirect('/programme_curriculum/programmes') @@ -1196,7 +1197,7 @@ def new_course_proposal_file(request): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor": pass - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') else: return HttpResponseRedirect('/programme_curriculum/programmes') @@ -1229,7 +1230,7 @@ def filetracking(request,proposal_id): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') uploader = request.user.extrainfo design=request.session['currentDesignationSelected'] @@ -1280,7 +1281,7 @@ def inward_files(request): pass elif request.session['currentDesignationSelected'] == "Dean Academic": pass - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1311,7 +1312,7 @@ def outward_files(request): pass elif request.session['currentDesignationSelected'] == "student" : return HttpResponseRedirect('/programme_curriculum/programmes/') - elif request.session['currentDesignationSelected']== "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return render(request, 'programme_curriculum/admin_programmes/') id=request.user @@ -1332,7 +1333,7 @@ def update_course_proposal_file(request, course_id): des = HoldsDesignation.objects.all().filter(user = request.user).first() if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor": pass - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1500,7 +1501,7 @@ def forward_course_forms(request,ProposalId): return HttpResponseRedirect('/programme_curriculum/outward_files/') except IntegrityError as e: form.add_error(None, 'Proposal_ tracking with this File id, Current id, Current design and Disciplines already exists.') - elif request.session['currentDesignationSelected'] == "acadadmin" : + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes') else: return HttpResponseRedirect('/programme_curriculum/programmes') @@ -1516,7 +1517,7 @@ def view_inward_files(request,ProposalId): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1547,7 +1548,7 @@ def reject_form(request,ProposalId): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1575,7 +1576,7 @@ def tracking_unarchive(request,ProposalId): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1602,7 +1603,7 @@ def tracking_archive(request,ProposalId): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1625,7 +1626,7 @@ def file_archive(request,FileId): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1640,7 +1641,7 @@ def file_unarchive(request,FileId): pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin": + elif request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: return HttpResponseRedirect('/programme_curriculum/admin_programmes/') else: return HttpResponseRedirect('/programme_curriculum/programmes/') @@ -1652,21 +1653,68 @@ def file_unarchive(request,FileId): @login_required(login_url='/accounts/login') def add_course_instructor(request): - if request.session['currentDesignationSelected'] == "acadadmin": + if request.session['currentDesignationSelected'] in ["acadadmin", "studentacadadmin"]: if request.method == 'POST': - form = CourseInstructorForm(request.POST) - if form.is_valid(): - form.save() # Save the form data to the database - return redirect('/programme_curriculum/admin_instructor/') # Redirect to a success page after saving - else: - form = CourseInstructorForm() + if 'form_submit' in request.POST: + form = CourseInstructorForm(request.POST) + if form.is_valid(): + form.save() # Save the form data to the database + return redirect('/programme_curriculum/admin_instructor/') # Redirect to a success page after saving + else: + messages.error(request, f"An error occured while adding instructor.") + elif 'excel_submit' in request.POST: + manual_instructor_xsl = request.FILES['manual_instructor_xsl'] + try: + excel = xlrd.open_workbook(file_contents=manual_instructor_xsl.read()) + sheet = excel.sheet_by_index(0) + + # Start reading rows (assuming first row contains headers) + with transaction.atomic(): + all_success = True + for i in range(1, sheet.nrows): # Skip the header row + try: + course_code = str(sheet.cell(i, 0).value).strip() + print(course_code) + course_version = float(sheet.cell(i, 1).value) + print(course_version) + instructor_id = str(sheet.cell(i, 2).value).strip() + print(instructor_id) + year = int(sheet.cell(i, 3).value) + print(year) + semester_no = int(sheet.cell(i, 4).value) + print(semester_no) + course = Course.objects.filter( + Q(code__iexact=course_code), + version=course_version + ).first() + print(course) + instructor = Faculty.objects.get(id=instructor_id) + print(instructor,"\n") + + course_instructor = CourseInstructor( + course_id=course, + instructor_id=instructor, + year=year, + semester_no=semester_no + ) + course_instructor.save() + except Exception as e: + all_success = False + print(f"Error processing Excel file in row {i}: {e}") + messages.error(request, f"Error processing Excel file in row {i}: {e}") + if all_success: + messages.success(request, "Instructors added successfully from Excel!") + return redirect('/programme_curriculum/admin_instructor/') + except Exception as e: + messages.error(request, f"Error processing Excel file: {e}") + form = CourseInstructorForm() return render(request, 'programme_curriculum/acad_admin/add_course_instructor.html', {'form': form}) return HttpResponseRedirect('/programme_curriculum/') @login_required(login_url='/accounts/login') def admin_view_all_course_instructor(request): - if request.session.get('currentDesignationSelected') == "acadadmin": + if request.session.get('currentDesignationSelected') in ["acadadmin", "studentacadadmin"]: course_instructors = CourseInstructor.objects.all() # Apply filtering @@ -1683,7 +1731,7 @@ def admin_view_all_course_instructor(request): @login_required(login_url='/accounts/login') def update_course_instructor_form(request, instructor_id): - if request.session.get('currentDesignationSelected') == "acadadmin": + if request.session.get('currentDesignationSelected') in ["acadadmin", "studentacadadmin"]: # Retrieve the CourseInstructor object or return 404 if not found course_instructor = get_object_or_404(CourseInstructor, id=instructor_id) diff --git a/FusionIIIT/templates/academic_procedures/academic.html b/FusionIIIT/templates/academic_procedures/academic.html index a08692126..a4f364418 100644 --- a/FusionIIIT/templates/academic_procedures/academic.html +++ b/FusionIIIT/templates/academic_procedures/academic.html @@ -136,9 +136,9 @@ {% endif %} - Miscellaneous +
@@ -188,9 +191,12 @@
{% include 'academic_procedures/finalregister.html' %}
+
+ {% include 'academic_procedures/swayamregister.html' %} +
-
+
diff --git a/FusionIIIT/templates/academic_procedures/allot_courses.html b/FusionIIIT/templates/academic_procedures/allot_courses.html index f5ac54c7e..62855b783 100644 --- a/FusionIIIT/templates/academic_procedures/allot_courses.html +++ b/FusionIIIT/templates/academic_procedures/allot_courses.html @@ -54,6 +54,11 @@

8

+
+ + + +
Backlog Courses -
- + @@ -74,3 +74,4 @@ }); } +--> diff --git a/FusionIIIT/templates/academic_procedures/swayamregister.html b/FusionIIIT/templates/academic_procedures/swayamregister.html new file mode 100644 index 000000000..d1ad25eb1 --- /dev/null +++ b/FusionIIIT/templates/academic_procedures/swayamregister.html @@ -0,0 +1,275 @@ +{% load static %} +{% block finalregister %} + + + + +
Swayam Registration
+ +
+ {% if curr_sem.semester_no != 8 %} + {% if swayam_registration_flag == True %} +
+ {% csrf_token %} +
+ + + + + + + + + + + + + + + + {% for course_slot in current_sem_registration_courses %} + {% if course_slot.type == "Swayam" %} + + + + + + + + + + + {% elif course_slot.type == "Open Elective" %} + {% for course in course_slot.courses.all %} + + + + + + + + + + + {% endfor %} + {% else %} + + + + + + + + + + {% if course_slot.type == "Backlog" %} + + {% endif %} + + + + {% endif %} + {% endfor %} + + + + +
#Slot nameSlot typeSemesterCreditsPrioritySelectRegistration Type
{{ forloop.counter }}.{{course_slot.name}}{{course_slot.type}}{{next_sem.semester_no}} + + {{course_slot.courses.all.0.credit}} +
+ +
+
{{ forloop.parentloop.counter }}.{{ course_slot.name }}{{ course_slot.type }}{{ next_sem.semester_no }} + + {{ course.credit }} {{ forloop.counter }} +
+ +
+
{{forloop.counter}}.{{course_slot.name}}{{course_slot.type}}{{next_sem.semester_no}} + + {{course_slot.courses.all.0.credit}} +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ {% else %} +
+

Swayam Registration Date is yet to come

+
+ {% endif %} + {% else %} +
+

You are not Eligible for Registration !!

+
+ {% endif %} +
+{% endblock %} + + + + + + + + \ No newline at end of file diff --git a/FusionIIIT/templates/account/login.html b/FusionIIIT/templates/account/login.html index b45491525..8fd2720dd 100755 --- a/FusionIIIT/templates/account/login.html +++ b/FusionIIIT/templates/account/login.html @@ -29,6 +29,11 @@
--> +
+
{% get_providers as socialaccount_providers %}
diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/add_course_instructor.html b/FusionIIIT/templates/programme_curriculum/acad_admin/add_course_instructor.html index 317d802e8..8d1b34b9d 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/add_course_instructor.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/add_course_instructor.html @@ -1,33 +1,44 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} +{% load static %} {% block content %}

Course Instructor Form

- - {% if form.errors %} - - {% endif %} -
- {% csrf_token %} - {{ form.as_p }} - -
+ +
+
+ {% csrf_token %} +

Upload Course Instructors via Excel

+ + +
+
+

You can download a sample Excel file for reference:

+ + Download Sample Excel + +
+
-{% endblock %} \ No newline at end of file + +{% endblock %} diff --git a/FusionIIIT/templates/registration/password_reset_complete.html b/FusionIIIT/templates/registration/password_reset_complete.html new file mode 100644 index 000000000..d044924ae --- /dev/null +++ b/FusionIIIT/templates/registration/password_reset_complete.html @@ -0,0 +1,13 @@ + + + + + + Password Reset Successful + + +

Password Reset Successful

+

Your password has been reset successfully. You can now log in with your new password.

+

Log In

+ + diff --git a/FusionIIIT/templates/registration/password_reset_confirm.html b/FusionIIIT/templates/registration/password_reset_confirm.html new file mode 100644 index 000000000..8df8dffff --- /dev/null +++ b/FusionIIIT/templates/registration/password_reset_confirm.html @@ -0,0 +1,63 @@ +{% extends "account/base.html" %} +{% block content %} +{% load i18n %} +{% load account socialaccount %} +{% load static semanticui %} + + + +
+
+

Set New Password

+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ + +{% if form.errors %} + +{% endif %} + + + + +{% endblock %} \ No newline at end of file diff --git a/FusionIIIT/templates/registration/password_reset_done.html b/FusionIIIT/templates/registration/password_reset_done.html new file mode 100644 index 000000000..aeb6e7fcb --- /dev/null +++ b/FusionIIIT/templates/registration/password_reset_done.html @@ -0,0 +1,13 @@ + + + + + + Password Reset Sent + + +

Check Your Email

+

If your email address is associated with an account, you will receive a password reset email shortly.

+

Back to Home

+ + diff --git a/FusionIIIT/templates/registration/password_reset_form.html b/FusionIIIT/templates/registration/password_reset_form.html new file mode 100644 index 000000000..d39945caf --- /dev/null +++ b/FusionIIIT/templates/registration/password_reset_form.html @@ -0,0 +1,55 @@ +{% extends "account/base.html" %} +{% block content %} +{% load i18n %} +{% load account socialaccount %} +{% load static semanticui %} + + + +
+
+

Forgot Your Password?

+

Enter your email address below, and we'll send you a link to reset your password.

+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ +{% if error_message %} + +{% endif %} + + + +{% endblock %} \ No newline at end of file