diff --git a/FusionIIIT/applications/programme_curriculum/forms.py b/FusionIIIT/applications/programme_curriculum/forms.py index 8100e4f60..394828004 100644 --- a/FusionIIIT/applications/programme_curriculum/forms.py +++ b/FusionIIIT/applications/programme_curriculum/forms.py @@ -5,6 +5,10 @@ from django.forms.models import ModelChoiceField from .models import Programme, Discipline, Curriculum, Semester, Course, Batch, CourseSlot, PROGRAMME_CATEGORY_CHOICES,NewProposalFile,Proposal_Tracking from django.utils.translation import gettext_lazy as _ +from django.contrib.auth.models import User +from applications.globals.models import (DepartmentInfo, Designation,ExtraInfo, Faculty, HoldsDesignation) +from applications.filetracking.sdk.methods import * + class ProgrammeForm(ModelForm): class Meta: @@ -315,3 +319,56 @@ class Meta: 'remarks' : 'remarks', } + + def clean(self): + + r_id = self.cleaned_data.get('receive_id') + r_des = self.cleaned_data.get('receive_design') + des=HoldsDesignation.objects.filter(user=r_id) + print(des) + data2='' + msg1='' + if des: + data2 = ', '.join(str(i) for i in des) + msg1 = f'{r_id} has only these working designations: {data2}' + + else: + msg1=f'{r_id} has no working designations' + data = HoldsDesignation.objects.select_related('designation').filter(user=r_id,designation=r_des) + + if not data: + msg = 'Invalid reciever id and reciever designation' + raise ValidationError({'receive_id': [msg, msg1]}) + + name="" + name = name+str(r_des) + if "hod" in name.lower() : + pass + elif "professor" in name.lower() : + pass + elif "dean academic" in name.lower(): + pass + else: + msg3 = f"You can't send Proposal Form to the user {r_id}-{r_des}" + raise ValidationError({'receive_id': [msg3]}) + + + + + return self.cleaned_data + + + # def sed(self): + # r_id = self.cleaned_data.get('receive_id') + # return r_id + # def __init__(self, *args, **kwargs): + # super().__init__(*args, **kwargs) + # des = HoldsDesignation.objects.select_related('working','designation').filter(user=5333) + # self.fields['receive_design'].queryset = Designation.objects.filter(id=list(des.designation)) + + + # def clean(self): + # cleaned_data = super().clean() + # user_id = cleaned_data.get('receive_id') + # if user_id: + # self.fields['receive_design'].queryset = HoldsDesignation.objects.select_related('designation').filter(user_id=user_id) diff --git a/FusionIIIT/applications/programme_curriculum/models.py b/FusionIIIT/applications/programme_curriculum/models.py index e781af115..655994c1c 100644 --- a/FusionIIIT/applications/programme_curriculum/models.py +++ b/FusionIIIT/applications/programme_curriculum/models.py @@ -392,6 +392,7 @@ class NewProposalFile(models.Model): upload_date = models.DateTimeField(auto_now_add=True) is_read = models.BooleanField(default = False) is_update= models.BooleanField(default = False) + is_archive = models.BooleanField(default = False) class Meta: unique_together = ('code', 'uploader','name') # if code and faculty code matches to another proposal name will take care of it @@ -412,6 +413,10 @@ class Proposal_Tracking(models.Model): is_added = models.BooleanField(default = False) is_submitted = models.BooleanField(default = False) is_rejected = models.BooleanField(default = False) + sender_archive = models.BooleanField(default = False) + receiver_archive = models.BooleanField(default = False) + + class Meta: # unique_together = ('file_id', 'current_id','receive_id','receive_design') diff --git a/FusionIIIT/applications/programme_curriculum/urls.py b/FusionIIIT/applications/programme_curriculum/urls.py index c40dad9a0..4c06b2b1b 100644 --- a/FusionIIIT/applications/programme_curriculum/urls.py +++ b/FusionIIIT/applications/programme_curriculum/urls.py @@ -66,6 +66,11 @@ path('forward_course_forms//',views.forward_course_forms,name='forward_course_forms'), path('view_inward_files//',views.view_inward_files,name='view_inward_files'), path('outward_files/',views.outward_files,name='outward_files'), + path('tracking_archive//',views.tracking_archive,name='tracking_archive'), + path('tracking_unarchive//',views.tracking_unarchive,name='tracking_unarchive'), + path('file_archive//',views.file_archive,name='file_archive'), + path('file_unarchive//',views.file_unarchive,name='file_unarchive'), + # urls for api view path('api/programmes_ug/', v2.view_ug_programmes, name='view_ug_programmes_api'), diff --git a/FusionIIIT/applications/programme_curriculum/views.py b/FusionIIIT/applications/programme_curriculum/views.py index a1e40c6d1..4ea51e609 100644 --- a/FusionIIIT/applications/programme_curriculum/views.py +++ b/FusionIIIT/applications/programme_curriculum/views.py @@ -67,13 +67,14 @@ def view_all_programmes(request): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' - + notifs = request.user.notifications.all() + ug = Programme.objects.filter(category='UG') pg = Programme.objects.filter(category='PG') phd = Programme.objects.filter(category='PHD') url+='view_all_programmes.html' - return render(request, url, {'ug': ug, 'pg': pg, 'phd': phd}) + return render(request, url, {'ug': ug, 'pg': pg, 'phd': phd,'notifications': notifs,}) def view_curriculums_of_a_programme(request, programme_id): @@ -100,7 +101,7 @@ def view_curriculums_of_a_programme(request, programme_id): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' - + notifs = request.user.notifications.all() program = get_object_or_404(Programme, Q(id=programme_id)) curriculums = program.curriculums @@ -111,7 +112,7 @@ def view_curriculums_of_a_programme(request, programme_id): working_curriculums = curriculums.filter(working_curriculum=1) past_curriculums = curriculums.filter(working_curriculum=0) url+='view_curriculums_of_a_programme.html' - return render(request,url, {'program': program, 'past_curriculums': past_curriculums, 'working_curriculums': working_curriculums, 'curriculumfilter': curriculumfilter}) + return render(request,url, {'program': program, 'past_curriculums': past_curriculums, 'working_curriculums': working_curriculums, 'curriculumfilter': curriculumfilter,'notifications': notifs,}) def view_all_working_curriculums(request): @@ -130,11 +131,11 @@ def view_all_working_curriculums(request): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' curriculums = Curriculum.objects.filter(working_curriculum=1) - + notifs = request.user.notifications.all() curriculumfilter = CurriculumFilter(request.GET, queryset=curriculums) curriculums = curriculumfilter.qs - return render(request,url+'view_all_working_curriculums.html',{'curriculums':curriculums, 'curriculumfilter': curriculumfilter}) + return render(request,url+'view_all_working_curriculums.html',{'curriculums':curriculums, 'curriculumfilter': curriculumfilter,'notifications': notifs,}) def view_semesters_of_a_curriculum(request, curriculum_id): """ @@ -160,6 +161,7 @@ def view_semesters_of_a_curriculum(request, curriculum_id): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' curriculum = get_object_or_404(Curriculum, Q(id=curriculum_id)) + notifs = request.user.notifications.all() semesters = curriculum.semesters semester_slots = [] for sem in semesters: @@ -187,7 +189,7 @@ def view_semesters_of_a_curriculum(request, curriculum_id): transpose_semester_slots = list(zip(*semester_slots)) - return render(request, url+'view_semesters_of_a_curriculum.html', {'curriculum': curriculum, 'semesters': semesters, 'semester_slots': transpose_semester_slots, 'semester_credits': semester_credits}) + return render(request, url+'view_semesters_of_a_curriculum.html', {'curriculum': curriculum, 'semesters': semesters, 'semester_slots': transpose_semester_slots, 'semester_credits': semester_credits,'notifications': notifs,}) def view_a_semester_of_a_curriculum(request, semester_id): @@ -205,8 +207,9 @@ def view_a_semester_of_a_curriculum(request, semester_id): url+='faculty/' semester = get_object_or_404(Semester, Q(id=semester_id)) course_slots = semester.courseslots + notifs = request.user.notifications.all() - return render(request, url+'view_a_semester_of_a_curriculum.html', {'semester': semester, 'course_slots': course_slots}) + return render(request, url+'view_a_semester_of_a_curriculum.html', {'semester': semester, 'course_slots': course_slots,'notifications': notifs,}) def view_a_courseslot(request, courseslot_id): @@ -222,7 +225,7 @@ def view_a_courseslot(request, courseslot_id): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' course_slot = get_object_or_404(CourseSlot, Q(id=courseslot_id)) - return render(request, url+'view_a_courseslot.html', {'course_slot': course_slot}) + return render(request, url+'view_a_courseslot.html', {'course_slot': course_slot,'notifications': notifs,}) def view_all_courses(request): @@ -239,11 +242,12 @@ def view_all_courses(request): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' courses = Course.objects.all() + notifs = request.user.notifications.all() coursefilter = CourseFilter(request.GET, queryset=courses) courses = coursefilter.qs - return render(request, url+'view_all_courses.html', {'courses': courses, 'coursefilter': coursefilter}) + return render(request, url+'view_all_courses.html', {'courses': courses, 'coursefilter': coursefilter,'notifications': notifs,}) def view_a_course(request, course_id): @@ -259,7 +263,8 @@ def view_a_course(request, course_id): elif 'hod' in request.session['currentDesignationSelected'].lower(): url+='faculty/' course = get_object_or_404(Course, Q(id=course_id)) - return render(request, url+'view_a_course.html', {'course': course}) + notifs = request.user.notifications.all() + return render(request, url+'view_a_course.html', {'course': course,'notifications': notifs,}) def view_all_discplines(request): @@ -276,7 +281,8 @@ def view_all_discplines(request): url+='faculty/' disciplines = Discipline.objects.all() - return render(request, url+'view_all_disciplines.html', {'disciplines': disciplines}) + notifs = request.user.notifications.all() + return render(request, url+'view_all_disciplines.html', {'disciplines': disciplines,'notifications': notifs,}) def view_all_batches(request): @@ -301,8 +307,9 @@ def view_all_batches(request): finished_batches = batches.filter(running_batch=False) batches = batches.filter(running_batch=True) + notifs = request.user.notifications.all() - return render(request, url+'view_all_batches.html', {'batches': batches, 'finished_batches': finished_batches, 'batchfilter': batchfilter}) + return render(request, url+'view_all_batches.html', {'batches': batches, 'finished_batches': finished_batches, 'batchfilter': batchfilter,'notifications': notifs,}) @@ -783,11 +790,9 @@ def add_course_form(request): return render(request,'programme_curriculum/acad_admin/course_form.html',{'form':form,'submitbutton': submitbutton}) - def update_course_form(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" + if request.session['currentDesignationSelected']== "student": return HttpResponseRedirect('/programme_curriculum/programmes/') elif str(request.user) == "acadadmin" : pass @@ -808,17 +813,41 @@ def update_course_form(request, course_id): previous.save() form.latest_version=True new_course = form.save(commit=False) + add=True + ver=0 if(new_course.version>previous.version): - form.save() - course = Course.objects.last() - messages.success(request, "Added successful") - return HttpResponseRedirect("/programme_curriculum/admin_course/" + str(course.id) + "/") + # Check if a course with the same values (except version, latest_version, disciplines, and pre_requisit_courses) already exists + old_course=Course.objects.filter(code=new_course.code, name=new_course.name, credit=new_course.credit, lecture_hours=new_course.lecture_hours, tutorial_hours=new_course.tutorial_hours, pratical_hours=new_course.pratical_hours, discussion_hours=new_course.discussion_hours, project_hours=new_course.project_hours, pre_requisits=new_course.pre_requisits, syllabus=new_course.syllabus, percent_quiz_1=new_course.percent_quiz_1, percent_midsem=new_course.percent_midsem, percent_quiz_2=new_course.percent_quiz_2, percent_endsem=new_course.percent_endsem, percent_project=new_course.percent_project, percent_lab_evaluation=new_course.percent_lab_evaluation, percent_course_attendance=new_course.percent_course_attendance, ref_books=new_course.ref_books) + if old_course: + # Check if disciplines or pre_requisit_courses have been changed + for i in old_course: + if set(form.cleaned_data['disciplines']) != set(i.disciplines.all()) or set(form.cleaned_data['pre_requisit_courses']) != set(i.pre_requisit_courses.all()): + add=True + else: + add=False + ver=i.version + break + if add: + new_course.save() # Save the new course first before adding many-to-many fields + new_course.disciplines.set(form.cleaned_data['disciplines']) + new_course.pre_requisit_courses.set(form.cleaned_data['pre_requisit_courses']) + course = Course.objects.last() + messages.success(request, "Added successful") + return HttpResponseRedirect("/programme_curriculum/admin_course/" + str(course.id) + "/") + else: + form.add_error(None, 'A Course with the same values already exists at "Version Number '+' ' +str(ver)+'"') + else: + new_course.save() # Save the new course first before adding many-to-many fields + new_course.disciplines.set(form.cleaned_data['disciplines']) + new_course.pre_requisit_courses.set(form.cleaned_data['pre_requisit_courses']) + course = Course.objects.last() + messages.success(request, "Added successful") + return HttpResponseRedirect("/programme_curriculum/admin_course/" + str(course.id) + "/") else: version_error+=f'The version should be greater than {previous.version}' return render(request,'programme_curriculum/acad_admin/course_form.html',{'course':course, 'form':form, 'submitbutton': submitbutton,'version_error':version_error}) - def add_courseslot_form(request): user_details = ExtraInfo.objects.get(user = request.user) @@ -1058,14 +1087,17 @@ def view_course_proposal_forms(request): if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" : pass - elif request.session['currentDesignationSelected'] == "acadadmin" or request.session['currentDesignationSelected'] == "student" : + elif request.session['currentDesignationSelected'] == "student" : return HttpResponseRedirect('/programme_curriculum/programmes/') + elif request.session['currentDesignationSelected']== "acadadmin": + 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"' + notifs = request.user.notifications.all() courseProposal = NewProposalFile.objects.filter(uploader=des.user,designation=request.session['currentDesignationSelected'],is_update=False) updatecourseProposal = NewProposalFile.objects.filter(uploader=des.user,designation=request.session['currentDesignationSelected'],is_update=True) - return render(request, 'programme_curriculum/faculty/view_course_proposal_forms.html',{'courseProposals': courseProposal,'updateProposals':updatecourseProposal,'data':data}) + return render(request, 'programme_curriculum/faculty/view_course_proposal_forms.html',{'courseProposals': courseProposal,'updateProposals':updatecourseProposal,'data':data,'notifications': notifs,}) @login_required(login_url='/accounts/login') def faculty_view_all_courses(request): @@ -1083,12 +1115,12 @@ def faculty_view_all_courses(request): pass courses = Course.objects.all() - + notifs = request.user.notifications.all() coursefilter = CourseFilter(request.GET, queryset=courses) courses = coursefilter.qs - return render(request, 'programme_curriculum/faculty/faculty_view_all_courses.html', {'courses': courses, 'coursefilter': coursefilter}) + return render(request, 'programme_curriculum/faculty/faculty_view_all_courses.html', {'courses': courses, 'coursefilter': coursefilter,'notifications': notifs,}) def faculty_view_a_course(request, course_id): @@ -1105,7 +1137,8 @@ def faculty_view_a_course(request, course_id): elif 'hod' in request.session['currentDesignationSelected'].lower(): pass course = get_object_or_404(Course, Q(id=course_id)) - return render(request, 'programme_curriculum/faculty/faculty_view_a_course.html', {'course': course}) + notifs = request.user.notifications.all() + return render(request, 'programme_curriculum/faculty/faculty_view_a_course.html', {'course': course,'notifications': notifs,}) def view_a_course_proposal_form(request,CourseProposal_id): @@ -1124,7 +1157,8 @@ def view_a_course_proposal_form(request,CourseProposal_id): user_details = ExtraInfo.objects.get(user = request.user) des = HoldsDesignation.objects.all().filter(user = request.user).first() proposalform = get_object_or_404(NewProposalFile, Q(id=CourseProposal_id)) - return render(request, 'programme_curriculum/faculty/view_a_course_proposal.html', {'proposal': proposalform}) + notifs = request.user.notifications.all() + return render(request, 'programme_curriculum/faculty/view_a_course_proposal.html', {'proposal': proposalform,'notifications': notifs,}) def new_course_proposal_file(request): @@ -1139,7 +1173,6 @@ def new_course_proposal_file(request): uploader = request.user.extrainfo design=request.session['currentDesignationSelected'] form=NewCourseProposalFile(initial={'uploader':des.user,'designation':design}) - submitbutton= request.POST.get('Submit') if submitbutton: @@ -1179,24 +1212,28 @@ def filetracking(request,proposal_id): if request.method == 'POST': form = CourseProposalTrackingFile(request.POST) if form.is_valid(): - form.is_read=False - form.save() - receiver=request.POST.get('receive_id') - receiver_id = User.objects.get(id=receiver) - receiver_design=request.POST.get('receive_design') - receiver_des= Designation.objects.get(id=receiver_design) - uploader=request.POST.get('current_id') - uploader_design=request.POST.get('current_design') + try: + form.is_read=False + form.save() + receiver=request.POST.get('receive_id') + receiver_id = User.objects.get(id=receiver) + receiver_design=request.POST.get('receive_design') + receiver_des= Designation.objects.get(id=receiver_design) + uploader=request.POST.get('current_id') + uploader_design=request.POST.get('current_design') + data='Received as '+ str(receiver_id) +'-'+str(receiver_des) +' Course Proposal Form "'+file_data +'" By '+str(uploader)+' - '+str(uploader_design) + # data=file.subject + messages.success(request, "Submitted successful") + prog_and_curr_notif(request.user,receiver_id,data) + return HttpResponseRedirect('/programme_curriculum/outward_files/') + except IntegrityError as e: + # Handle the IntegrityError here, for example: + form.add_error(None, 'Proposal_ tracking with this File id, Current id, Current design and Disciplines already exists.') - data='Received as '+ str(receiver_id) +'-'+str(receiver_des) +' Course Proposal Form "'+file_data +'" By '+str(uploader)+' - '+str(uploader_design) - # data=file.subject - messages.success(request, "Submitted successful") - prog_and_curr_notif(request.user,receiver_id,data) - return HttpResponseRedirect('/programme_curriculum/outward_files/') - return render(request,'programme_curriculum/faculty/filetracking.html',{'form':form,'submitbutton': submitbutton,'file_info':file_data}) + return render(request,'programme_curriculum/faculty/filetracking.html',{'form':form,'submitbutton': submitbutton,'file_info':file_data,}) @@ -1206,7 +1243,7 @@ def inward_files(request): data='' if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" : - data='As a "Professor or Assistant Professor or Associate Professor" you cannot receive any proposal requests' + data=f'As a "{request.session["currentDesignationSelected"]}" you cannot receive any proposal requests' pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass @@ -1219,14 +1256,14 @@ def inward_files(request): id=request.user user_designation=HoldsDesignation.objects.select_related('user','working','designation').filter(user=request.user) - + notifs = request.user.notifications.all() designation = Designation.objects.get(name=request.session['currentDesignationSelected']) des_id = designation.id courseProposal = Proposal_Tracking.objects.filter(receive_design = des_id,receive_id= id) - return render(request, 'programme_curriculum/faculty/inward_course_forms.html',{'courseProposals': courseProposal,'design':request.session['currentDesignationSelected'],'data':data}) + return render(request, 'programme_curriculum/faculty/inward_course_forms.html',{'courseProposals': courseProposal,'design':request.session['currentDesignationSelected'],'data':data,'notifications': notifs,}) @@ -1235,16 +1272,19 @@ def outward_files(request): des = HoldsDesignation.objects.all().filter(user = request.user).last() data='' if request.session['currentDesignationSelected'] == "Dean Academic" : - data='As a "Dean Academic" you cannot have any out going files' + data=f'As a "{request.session["currentDesignationSelected"]}" you cannot have any out going files' pass elif request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" : pass elif 'hod' in request.session['currentDesignationSelected'].lower(): pass - elif request.session['currentDesignationSelected'] == "acadadmin" or request.session['currentDesignationSelected'] == "student" : + elif request.session['currentDesignationSelected'] == "student" : return HttpResponseRedirect('/programme_curriculum/programmes/') + elif request.session['currentDesignationSelected']== "acadadmin": + return render(request, 'programme_curriculum/admin_programmes/') id=request.user + notifs = request.user.notifications.all() user_designation=HoldsDesignation.objects.select_related('user','working','designation').filter(user=request.user) design=request.session['currentDesignationSelected'] @@ -1255,16 +1295,16 @@ def outward_files(request): courseProposal = Proposal_Tracking.objects.filter(current_design = design,current_id= des.user) - return render(request, 'programme_curriculum/faculty/outward_course_forms.html',{'courseProposals': courseProposal,'design':request.session['currentDesignationSelected'],'data':data}) + return render(request, 'programme_curriculum/faculty/outward_course_forms.html',{'courseProposals': courseProposal,'design':request.session['currentDesignationSelected'],'data':data,'notifications': notifs,}) -def update_course_proposal_file(request,course_id): +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" : return HttpResponseRedirect('/programme_curriculum/admin_programmes') else: - return HttpResponseRedirect('/programme_curriculum/programmes') + return HttpResponseRedirect('/programme_curriculum/programmes/') uploader = request.user.extrainfo design=request.session['currentDesignationSelected'] @@ -1273,20 +1313,44 @@ def update_course_proposal_file(request,course_id): form = NewCourseProposalFile(initial={'uploader':des.user,'designation':design},instance=course) submitbutton= request.POST.get('Submit') - if submitbutton: if request.method == 'POST': form = NewCourseProposalFile(request.POST) if form.is_valid(): + previous = Course.objects.all().filter(code=course.code).order_by('version').last() + course.version=previous.version new_course=form.save(commit=False) new_course.is_read=False new_course.is_update=True - new_course.save() - messages.success(request, "Added successful") - return HttpResponseRedirect('/programme_curriculum/view_course_proposal_forms/') - - - return render(request,'programme_curriculum/faculty/course_proposal_form.html',{'form':form,'submitbutton': submitbutton,'file_info':file_data}) + add=True + ver=0 + # Check if a course with the same values (except version, latest_version, disciplines, and pre_requisit_courses) already exists + old_course=Course.objects.filter(code=new_course.code, name=new_course.name, credit=new_course.credit, lecture_hours=new_course.lecture_hours, tutorial_hours=new_course.tutorial_hours, pratical_hours=new_course.pratical_hours, discussion_hours=new_course.discussion_hours, project_hours=new_course.project_hours, pre_requisits=new_course.pre_requisits, syllabus=new_course.syllabus, percent_quiz_1=new_course.percent_quiz_1, percent_midsem=new_course.percent_midsem, percent_quiz_2=new_course.percent_quiz_2, percent_endsem=new_course.percent_endsem, percent_project=new_course.percent_project, percent_lab_evaluation=new_course.percent_lab_evaluation, percent_course_attendance=new_course.percent_course_attendance, ref_books=new_course.ref_books) + if old_course: + # Check if disciplines or pre_requisit_courses have been changed + for i in old_course: + if set(form.cleaned_data['pre_requisit_courses']) != set(i.pre_requisit_courses.all()): + add=True + else: + add=False + ver=i.version + break + if add: + new_course.save() # Save the new course first before adding many-to-many fields + new_course.pre_requisit_courses.set(form.cleaned_data['pre_requisit_courses']) + course = Course.objects.last() + messages.success(request, "Added successful") + return HttpResponseRedirect("/programme_curriculum/admin_course/" + str(course.id) + "/") + else: + form.add_error(None, 'A Course with the same values already exists at "Version Number '+' ' +str(ver)+'"') + else: + new_course.save() # Save the new course first before adding many-to-many fields + new_course.pre_requisit_courses.set(form.cleaned_data['pre_requisit_courses']) + course = Course.objects.last() + messages.success(request, "Added successful") + return HttpResponseRedirect("/programme_curriculum/admin_course/" + str(course.id) + "/") + + return render(request,'programme_curriculum/faculty/course_proposal_form.html',{'form':form,'submitbutton': submitbutton,'file_info':file_data,}) @@ -1314,7 +1378,7 @@ def forward_course_forms(request,ProposalId): if(course): previous = Course.objects.all().filter(code=course.code).order_by('version').last() course.version=previous.version - form = CourseForm(instance=course) + form = CourseForm(instance=file2,initial={'disciplines':file.disciplines}) submitbutton= request.POST.get('Submit') if submitbutton: if request.method == 'POST': @@ -1334,10 +1398,10 @@ def forward_course_forms(request,ProposalId): receiver=file2.uploader receiver_id = User.objects.get(username=receiver) - data='The Course "'+ file2.code+ ' - '+ file2.name + '" Updated Successfully' + data=f'The Course " {file2.code} -{file2.name}" Updated Successfully' # data=file.subject prog_and_curr_notif(request.user,receiver_id,data) - messages.success(request, data) + messages.success(request, "Updated "+ file2.code+'-'+file2.name +" successful") return HttpResponseRedirect("/programme_curriculum/course/" + str(course.id) + "/") else: version_error+=f'The version should be greater than {previous.version}' @@ -1363,7 +1427,7 @@ def forward_course_forms(request,ProposalId): # data=file.subject prog_and_curr_notif(request.user,receiver_id,data) course =Course.objects.all().filter(code=file2.code).last() - messages.success(request, "Updated "+ file2.name +" successful") + messages.success(request, "Added "+ file2.name +" successful") return HttpResponseRedirect("/programme_curriculum/course/" + str(course.id) + "/") @@ -1383,25 +1447,28 @@ def forward_course_forms(request,ProposalId): if request.method == 'POST': form = CourseProposalTrackingFile(request.POST) if form.is_valid(): - file.is_submitted=True - file.save() - form.is_read=False - form.save() - - receiver=request.POST.get('receive_id') - - uploader=request.POST.get('current_id') - uploader_design=request.POST.get('current_design') - - - receiver_design=request.POST.get('receive_design') - receiver_des= Designation.objects.get(id=receiver_design) - receiver_id = User.objects.get(id=receiver) - messages.success(request, "Added successful") - data='Received as '+ str(receiver_id) +'-'+str(receiver_des) +' Course Proposal of Course '+file_data +' By '+str(uploader)+' - '+str(uploader_design) + try: + file.is_submitted=True + file.save() + form.is_read=False + form.save() + + receiver=request.POST.get('receive_id') + + uploader=request.POST.get('current_id') + uploader_design=request.POST.get('current_design') + + + receiver_design=request.POST.get('receive_design') + receiver_des= Designation.objects.get(id=receiver_design) + receiver_id = User.objects.get(id=receiver) + messages.success(request, "Added successful") + data='Received as '+ str(receiver_id) +'-'+str(receiver_des) +' Course Proposal of Course '+file_data +' By '+str(uploader)+' - '+str(uploader_design) - prog_and_curr_notif(request.user,receiver_id,data) - return HttpResponseRedirect('/programme_curriculum/outward_files/') + prog_and_curr_notif(request.user,receiver_id,data) + 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" : return HttpResponseRedirect('/programme_curriculum/admin_programmes') else: @@ -1424,8 +1491,6 @@ def view_inward_files(request,ProposalId): return HttpResponseRedirect('/programme_curriculum/programmes/') des = HoldsDesignation.objects.all().filter(user = request.user).first() - - uploader = request.user.extrainfo design=request.session['currentDesignationSelected'] file = get_object_or_404(Proposal_Tracking, Q(id=ProposalId)) @@ -1472,4 +1537,84 @@ def reject_form(request,ProposalId): else: messages.error(request, "course already forwarded or added can't be rejected") return HttpResponseRedirect('/programme_curriculum/inward_files/') - \ No newline at end of file + + +def tracking_unarchive(request,ProposalId): + if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" or request.session['currentDesignationSelected'] == "Dean Academic": + pass + elif 'hod' in request.session['currentDesignationSelected'].lower(): + pass + elif request.session['currentDesignationSelected'] == "acadadmin": + return HttpResponseRedirect('/programme_curriculum/admin_programmes/') + else: + return HttpResponseRedirect('/programme_curriculum/programmes/') + + track=get_object_or_404(Proposal_Tracking, Q(id=ProposalId)) + file = get_object_or_404(NewProposalFile,Q(id = track.file_id)) + print(request.user) + if str(track.current_design)==str(request.session['currentDesignationSelected']) and str(track.current_id)==str(request.user): + track.sender_archive=False + track.save() + messages.success(request, "File UnArchived") + return HttpResponseRedirect('/programme_curriculum/outward_files/') + else : + track.receiver_archive=False + track.save() + messages.success(request, "File UnArchived") + return HttpResponseRedirect('/programme_curriculum/inward_files/') + + + +def tracking_archive(request,ProposalId): + + if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" or request.session['currentDesignationSelected'] == "Dean Academic": + pass + elif 'hod' in request.session['currentDesignationSelected'].lower(): + pass + elif request.session['currentDesignationSelected'] == "acadadmin": + return HttpResponseRedirect('/programme_curriculum/admin_programmes/') + else: + return HttpResponseRedirect('/programme_curriculum/programmes/') + + track=get_object_or_404(Proposal_Tracking, Q(id=ProposalId)) + if str(track.current_design)==str(request.session['currentDesignationSelected']) and str(track.current_id)==str(request.user): + track.sender_archive=True + track.save() + messages.success(request, "File Archived") + return HttpResponseRedirect('/programme_curriculum/outward_files/') + + else: + track.receiver_archive=True + track.save() + messages.success(request, "File Archived") + return HttpResponseRedirect('/programme_curriculum/inward_files/') + +def file_archive(request,FileId): + if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" or request.session['currentDesignationSelected'] == "Dean Academic": + pass + elif 'hod' in request.session['currentDesignationSelected'].lower(): + pass + elif request.session['currentDesignationSelected'] == "acadadmin": + return HttpResponseRedirect('/programme_curriculum/admin_programmes/') + else: + return HttpResponseRedirect('/programme_curriculum/programmes/') + + file = get_object_or_404(NewProposalFile,Q(id = FileId)) + file.is_archive=True + file.save() + return HttpResponseRedirect('/programme_curriculum/view_course_proposal_forms/') + +def file_unarchive(request,FileId): + if request.session['currentDesignationSelected'] == "Associate Professor" or request.session['currentDesignationSelected'] == "Professor" or request.session['currentDesignationSelected'] == "Assistant Professor" or request.session['currentDesignationSelected'] == "Dean Academic": + pass + elif 'hod' in request.session['currentDesignationSelected'].lower(): + pass + elif request.session['currentDesignationSelected'] == "acadadmin": + return HttpResponseRedirect('/programme_curriculum/admin_programmes/') + else: + return HttpResponseRedirect('/programme_curriculum/programmes/') + + file = get_object_or_404(NewProposalFile,Q(id = FileId)) + file.is_archive=False + file.save() + return HttpResponseRedirect('/programme_curriculum/view_course_proposal_forms/') \ No newline at end of file diff --git a/FusionIIIT/templates/notifications/programme_curriculum.html b/FusionIIIT/templates/notifications/programme_curriculum.html new file mode 100644 index 000000000..ce3d906e0 --- /dev/null +++ b/FusionIIIT/templates/notifications/programme_curriculum.html @@ -0,0 +1,26 @@ +{% load static %} +{% block sidepanel %} + {% load notifications_tags %} + {% for notice in notifications %} + {% if notice.unread %} + {% if notice.data.module == "Programme and Curriculum" %} +
+ +
+ +

{{ notice.verb }}

+
+
+ + + +
+
+ {% endif%} + {% endif %} + {% endfor %} +{% endblock %} \ No newline at end of file diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/add_batch_form.html b/FusionIIIT/templates/programme_curriculum/acad_admin/add_batch_form.html index 1159944eb..30632c0f9 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/add_batch_form.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/add_batch_form.html @@ -1,27 +1,4 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} - -{% block sidetabmenu %} - -{% endblock %} - {% block content %}

Batch Form

diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/add_courseslot_form.html b/FusionIIIT/templates/programme_curriculum/acad_admin/add_courseslot_form.html index 0d007cc63..2553cac21 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/add_courseslot_form.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/add_courseslot_form.html @@ -1,25 +1,7 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} {% block sidetabmenu %} - + {% endblock %} {% block content %} diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/add_curriculum_form.html b/FusionIIIT/templates/programme_curriculum/acad_admin/add_curriculum_form.html index a44dc5aac..707c8f05e 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/add_curriculum_form.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/add_curriculum_form.html @@ -1,27 +1,4 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} - -{% block sidetabmenu %} - -{% endblock %} - {% block content %}

Curriculum Form

diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/add_discipline_form.html b/FusionIIIT/templates/programme_curriculum/acad_admin/add_discipline_form.html index 4629ec121..fba1a8afb 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/add_discipline_form.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/add_discipline_form.html @@ -1,27 +1,4 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} - -{% block sidetabmenu %} - -{% endblock %} - {% block content %}

Discipline Form

diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/add_programme_form.html b/FusionIIIT/templates/programme_curriculum/acad_admin/add_programme_form.html index 35c1b9870..01fda3096 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/add_programme_form.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/add_programme_form.html @@ -1,27 +1,4 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} - -{% block sidetabmenu %} - -{% endblock %} - {% block content %}

Programme Form

diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_course.html b/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_course.html index 1206b5a7a..9e88958e3 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_course.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_course.html @@ -1,27 +1,4 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} - -{% block sidetabmenu %} - -{% endblock %} - {% block content %}
diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_courseslot.html b/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_courseslot.html index 6bd1707b7..c31a8fd0b 100644 --- a/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_courseslot.html +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/admin_view_a_courseslot.html @@ -1,27 +1,4 @@ {% extends 'programme_curriculum/acad_admin/common.html' %} - -{% block sidetabmenu %} - -{% endblock %} - {% block content %}