diff --git a/FusionIIIT/applications/academic_procedures/migrations/0001_initial.py b/FusionIIIT/applications/academic_procedures/migrations/0001_initial.py deleted file mode 100644 index b873390df..000000000 --- a/FusionIIIT/applications/academic_procedures/migrations/0001_initial.py +++ /dev/null @@ -1,405 +0,0 @@ -# Generated by Django 3.1.5 on 2023-03-15 18:53 - -import datetime -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('academic_information', '0001_initial'), - ('programme_curriculum', '0001_initial'), - ('globals', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Assistantship_status', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('student_status', models.BooleanField()), - ('hod_status', models.BooleanField()), - ('account_status', models.BooleanField()), - ], - ), - migrations.CreateModel( - name='MinimumCredits', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('semester', models.IntegerField()), - ('credits', models.IntegerField()), - ], - ), - migrations.CreateModel( - name='ThesisTopicProcess', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('research_area', models.CharField(max_length=50)), - ('thesis_topic', models.CharField(max_length=1000)), - ('submission_by_student', models.BooleanField(default=False)), - ('pending_supervisor', models.BooleanField(default=True)), - ('approval_supervisor', models.BooleanField(default=False)), - ('forwarded_to_hod', models.BooleanField(default=False)), - ('pending_hod', models.BooleanField(default=True)), - ('approval_by_hod', models.BooleanField(default=False)), - ('date', models.DateField(default=datetime.datetime.now)), - ('co_supervisor_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='thesistopicprocess_co_supervisor', to='globals.faculty')), - ('curr_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='academic_information.curriculum')), - ('member1', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='thesistopicprocess_member1', to='globals.faculty')), - ('member2', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='thesistopicprocess_member2', to='globals.faculty')), - ('member3', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='thesistopicprocess_member3', to='globals.faculty')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ('supervisor_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='thesistopicprocess_supervisor', to='globals.faculty')), - ], - options={ - 'db_table': 'ThesisTopicProcess', - }, - ), - migrations.CreateModel( - name='Thesis', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('topic', models.CharField(max_length=1000)), - ('reg_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ('supervisor_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='globals.faculty')), - ], - options={ - 'db_table': 'Thesis', - }, - ), - migrations.CreateModel( - name='TeachingCreditRegistration', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('req_pending', models.BooleanField(default=True)), - ('course_completion', models.BooleanField(default=False)), - ('approved_course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='teachingcreditregistration_approved_course', to='academic_information.curriculum')), - ('curr_1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teachingcreditregistration_curr1', to='academic_information.curriculum')), - ('curr_2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teachingcreditregistration_curr2', to='academic_information.curriculum')), - ('curr_3', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teachingcreditregistration_curr3', to='academic_information.curriculum')), - ('curr_4', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teachingcreditregistration_curr4', to='academic_information.curriculum')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ('supervisor_id', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='teachingcreditregistration_supervisor_id', to='globals.faculty')), - ], - options={ - 'db_table': 'TeachingCreditRegistration', - }, - ), - migrations.CreateModel( - name='StudentRegistrationChecks', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('pre_registration_flag', models.BooleanField(default=False)), - ('final_registration_flag', models.BooleanField(default=False)), - ('semester_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.semester')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'StudentRegistrationChecks', - }, - ), - migrations.CreateModel( - name='StudentRegistrationCheck', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('pre_registration_flag', models.BooleanField(default=False)), - ('final_registration_flag', models.BooleanField(default=False)), - ('semester', models.IntegerField(default=1)), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'StudentRegistrationCheck', - }, - ), - migrations.CreateModel( - name='SemesterMarks', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('q1', models.FloatField(default=None)), - ('mid_term', models.FloatField(default=None)), - ('q2', models.FloatField(default=None)), - ('end_term', models.FloatField(default=None)), - ('other', models.FloatField(default=None)), - ('grade', models.CharField(choices=[('O', 'O'), ('A+', 'A+'), ('A', 'A'), ('B+', 'B+'), ('B', 'B'), ('C+', 'C+'), ('C', 'C'), ('D+', 'D+'), ('D', 'D'), ('F', 'F'), ('S', 'S'), ('X', 'X')], max_length=5, null=True)), - ('curr_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'SemesterMarks', - }, - ), - migrations.CreateModel( - name='PhDProgressExamination', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('theme', models.CharField(max_length=50)), - ('seminar_date_time', models.DateTimeField()), - ('place', models.CharField(max_length=30)), - ('work_done', models.TextField()), - ('specific_contri_curr_semester', models.TextField()), - ('future_plan', models.TextField()), - ('details', models.FileField(upload_to='academic_procedure/Uploaded_document/PhdProgressDetails/')), - ('papers_published', models.IntegerField()), - ('presented_papers', models.IntegerField()), - ('papers_submitted', models.IntegerField()), - ('quality_of_work', models.CharField(choices=[('Excellent', 'Excellent'), ('Good', 'Good'), ('Satisfactory', 'Satisfactory'), ('Unsatisfactory', 'Unsatisfactory')], max_length=20)), - ('quantity_of_work', models.CharField(choices=[('Enough', 'Enough'), ('Just Sufficient', 'Just Sufficient'), ('Insufficient', 'Insufficient')], max_length=15)), - ('Overall_grade', models.CharField(choices=[('A+', 'A+'), ('A', 'A'), ('B+', 'B+'), ('B', 'B'), ('C+', 'C+'), ('C', 'C'), ('D+', 'D'), ('D', 'D'), ('F', 'F')], max_length=2)), - ('completion_period', models.IntegerField(null=True)), - ('panel_report', models.TextField(null=True)), - ('continuation_enhancement_assistantship', models.CharField(choices=[('yes', 'yes'), ('no', 'no'), ('not applicable', 'not applicable')], max_length=20, null=True)), - ('enhancement_assistantship', models.CharField(choices=[('yes', 'yes'), ('no', 'no'), ('not applicable', 'not applicable')], max_length=15, null=True)), - ('annual_progress_seminar', models.CharField(choices=[('Give again', 'Give again'), ('Not Applicable', 'Not Applicable'), ('Approved', 'Approved')], max_length=20, null=True)), - ('commments', models.TextField(null=True)), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - ), - migrations.CreateModel( - name='MTechGraduateSeminarReport', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('theme_of_work', models.TextField()), - ('date', models.DateField()), - ('place', models.CharField(max_length=30)), - ('time', models.TimeField()), - ('work_done_till_previous_sem', models.TextField()), - ('specific_contri_in_cur_sem', models.TextField()), - ('future_plan', models.TextField()), - ('brief_report', models.FileField(upload_to='academic_procedure/Uploaded_document/GraduateSeminarReport/')), - ('publication_submitted', models.IntegerField()), - ('publication_accepted', models.IntegerField()), - ('paper_presented', models.IntegerField()), - ('papers_under_review', models.IntegerField()), - ('quality_of_work', models.CharField(choices=[('Excellent', 'Excellent'), ('Good', 'Good'), ('Satisfactory', 'Satisfactory'), ('Unsatisfactory', 'Unsatisfactory')], max_length=20)), - ('quantity_of_work', models.CharField(choices=[('Enough', 'Enough'), ('Just Sufficient', 'Just Sufficient'), ('Insufficient', 'Insufficient')], max_length=15)), - ('Overall_grade', models.CharField(choices=[('A+', 'A+'), ('A', 'A'), ('B+', 'B+'), ('B', 'B'), ('C+', 'C+'), ('C', 'C'), ('D+', 'D'), ('D', 'D'), ('F', 'F')], max_length=2)), - ('panel_report', models.CharField(choices=[('Give again', 'Give again'), ('Not Applicable', 'Not Applicable'), ('Approved', 'Approved')], max_length=15)), - ('suggestion', models.TextField(null=True)), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - ), - migrations.CreateModel( - name='MessDue', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('month', models.CharField(choices=[('Jan', 'January'), ('Feb', 'Febuary'), ('Mar', 'March'), ('Apr', 'April'), ('May', 'May'), ('Jun', 'June'), ('Jul', 'July'), ('Aug', 'August'), ('Sep', 'September'), ('Oct', 'October'), ('Nov', 'November'), ('Dec', 'December')], max_length=10)), - ('year', models.IntegerField(choices=[(2023, 2023), (2022, 2022)])), - ('description', models.CharField(choices=[('Stu_paid', 'Paid'), ('Stu_due', 'Due')], max_length=15)), - ('amount', models.IntegerField()), - ('remaining_amount', models.IntegerField()), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - ), - migrations.CreateModel( - name='MarkSubmissionCheck', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('verified', models.BooleanField(default=False)), - ('submitted', models.BooleanField(default=False)), - ('announced', models.BooleanField(default=False)), - ('curr_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ], - options={ - 'db_table': 'MarkSubmissionCheck', - }, - ), - migrations.CreateModel( - name='InitialRegistrations', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('priority', models.IntegerField(blank=True, null=True)), - ('course_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ('course_slot_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='programme_curriculum.courseslot')), - ('semester_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.semester')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'InitialRegistrations', - }, - ), - migrations.CreateModel( - name='InitialRegistration', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('timestamp', models.DateTimeField(default=django.utils.timezone.now)), - ('priority', models.IntegerField(blank=True, null=True)), - ('course_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ('course_slot_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='programme_curriculum.courseslot')), - ('semester_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.semester')), - ('student_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'InitialRegistration', - }, - ), - migrations.CreateModel( - name='FinalRegistrations', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('semester', models.IntegerField()), - ('batch', models.IntegerField(default=2023)), - ('verified', models.BooleanField(default=False)), - ('curr_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.curriculum')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'FinalRegistrations', - }, - ), - migrations.CreateModel( - name='FinalRegistration', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('verified', models.BooleanField(default=False)), - ('course_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ('course_slot_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='programme_curriculum.courseslot')), - ('semester_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.semester')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'FinalRegistration', - }, - ), - migrations.CreateModel( - name='FeePayments', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('mode', models.CharField(choices=[('Axis Easypay', 'Axis Easypay'), ('Subpaisa', 'Subpaisa'), ('NEFT', 'NEFT'), ('RTGS', 'RTGS'), ('Bank Challan', 'Bank Challan'), ('Edu Loan', 'Edu Loan')], max_length=20)), - ('transaction_id', models.CharField(max_length=40)), - ('fee_receipt', models.FileField(null=True, upload_to='fee_receipt/')), - ('deposit_date', models.DateField(default=datetime.date.today)), - ('utr_number', models.CharField(max_length=40, null=True)), - ('fee_paid', models.IntegerField(default=0)), - ('reason', models.CharField(max_length=20, null=True)), - ('actual_fee', models.IntegerField(default=0)), - ('semester_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.semester')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'FeePayments', - }, - ), - migrations.CreateModel( - name='FeePayment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('semester', models.IntegerField(default=1)), - ('batch', models.IntegerField(default=2016)), - ('mode', models.CharField(choices=[('Axis Easypay', 'Axis Easypay'), ('Subpaisa', 'Subpaisa'), ('NEFT', 'NEFT'), ('RTGS', 'RTGS'), ('Bank Challan', 'Bank Challan'), ('Edu Loan', 'Edu Loan')], max_length=20)), - ('transaction_id', models.CharField(max_length=40)), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - ), - migrations.CreateModel( - name='Dues', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('mess_due', models.IntegerField()), - ('hostel_due', models.IntegerField()), - ('library_due', models.IntegerField()), - ('placement_cell_due', models.IntegerField()), - ('academic_due', models.IntegerField()), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'Dues', - }, - ), - migrations.CreateModel( - name='CoursesMtech', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('specialization', models.CharField(choices=[('Power and Control', 'Power and Control'), ('Microwave and Communication Engineering', 'Microwave and Communication Engineering'), ('Micro-nano Electronics', 'Micro-nano Electronics'), ('CAD/CAM', 'CAD/CAM'), ('Design', 'Design'), ('Manufacturing', 'Manufacturing'), ('CSE', 'CSE'), ('Mechatronics', 'Mechatronics'), ('MDes', 'MDes'), ('all', 'all')], max_length=40)), - ('c_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.course')), - ], - ), - migrations.CreateModel( - name='CourseRequested', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('course_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'CourseRequested', - }, - ), - migrations.CreateModel( - name='course_registration', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('working_year', models.IntegerField(blank=True, choices=[(2023, 2023), (2022, 2022)], null=True)), - ('course_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.course')), - ('course_slot_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='programme_curriculum.courseslot')), - ('semester_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='programme_curriculum.semester')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'course_registration', - }, - ), - migrations.CreateModel( - name='BranchChange', - fields=[ - ('c_id', models.AutoField(primary_key=True, serialize=False)), - ('applied_date', models.DateField(default=datetime.datetime.now)), - ('branches', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='globals.departmentinfo')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - ), - migrations.CreateModel( - name='Bonafide', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('student_name', models.CharField(max_length=50)), - ('purpose', models.CharField(max_length=100)), - ('academic_year', models.CharField(max_length=15)), - ('enrolled_course', models.CharField(max_length=10)), - ('complaint_date', models.DateTimeField(default=django.utils.timezone.now)), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'Bonafide', - }, - ), - migrations.CreateModel( - name='AssistantshipClaim', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateTimeField(auto_now_add=True)), - ('month', models.CharField(choices=[('Jan', 'January'), ('Feb', 'Febuary'), ('Mar', 'March'), ('Apr', 'April'), ('May', 'May'), ('Jun', 'June'), ('Jul', 'July'), ('Aug', 'August'), ('Sep', 'September'), ('Oct', 'October'), ('Nov', 'November'), ('Dec', 'December')], max_length=10)), - ('year', models.IntegerField(choices=[(2023, 2023), (2022, 2022)])), - ('bank_account', models.CharField(max_length=11)), - ('applicability', models.CharField(choices=[('GATE', 'GATE'), ('NET', 'NET'), ('CEED', 'CEED')], max_length=5)), - ('ta_supervisor_remark', models.BooleanField(default=False)), - ('thesis_supervisor_remark', models.BooleanField(default=False)), - ('hod_approval', models.BooleanField(default=False)), - ('acad_approval', models.BooleanField(default=False)), - ('account_approval', models.BooleanField(default=False)), - ('stipend', models.IntegerField(default=0)), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ('ta_supervisor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='TA_SUPERVISOR', to='globals.faculty')), - ('thesis_supervisor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='THESIS_SUPERVISOR', to='globals.faculty')), - ], - ), - migrations.CreateModel( - name='Register', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('year', models.IntegerField(default=2023)), - ('semester', models.IntegerField()), - ('curr_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.curriculum')), - ('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')), - ], - options={ - 'db_table': 'Register', - 'unique_together': {('curr_id', 'student_id')}, - }, - ), - ] diff --git a/FusionIIIT/applications/academic_procedures/migrations/__init__.py b/FusionIIIT/applications/academic_procedures/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/FusionIIIT/applications/eis/migrations/0002_auto_20240217_1747.py b/FusionIIIT/applications/eis/migrations/0002_auto_20240217_1747.py new file mode 100644 index 000000000..3e47b0c20 --- /dev/null +++ b/FusionIIIT/applications/eis/migrations/0002_auto_20240217_1747.py @@ -0,0 +1,53 @@ +# Generated by Django 3.1.5 on 2024-02-17 17:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('eis', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='emp_achievement', + name='a_year', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_confrence_organised', + name='k_year', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_expert_lectures', + name='l_year', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_keynote_address', + name='k_year', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_mtechphd_thesis', + name='s_year', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_patents', + name='p_year', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_published_books', + name='pyear', + field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], null=True, verbose_name='year'), + ), + migrations.AlterField( + model_name='emp_research_papers', + name='year', + field=models.CharField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024)], max_length=10, null=True), + ), + ] diff --git a/FusionIIIT/applications/filetracking/api/serializers.py b/FusionIIIT/applications/filetracking/api/serializers.py new file mode 100644 index 000000000..bdae2024e --- /dev/null +++ b/FusionIIIT/applications/filetracking/api/serializers.py @@ -0,0 +1,24 @@ +from applications.filetracking.models import File, Tracking +from django.core.files import File as DjangoFile +from rest_framework import serializers + + +class FileSerializer(serializers.ModelSerializer): + class Meta: + model = File + fields = '__all__' + + +class TrackingSerializer(serializers.ModelSerializer): + class Meta: + model = Tracking + fields = '__all__' + + +class FileHeaderSerializer(serializers.ModelSerializer): + ''' + This serializes everything except the attachments of a file and whether it is read or not + ''' + class Meta: + model = File + exclude = ['upload_file', 'is_read'] diff --git a/FusionIIIT/applications/filetracking/api/urls.py b/FusionIIIT/applications/filetracking/api/urls.py new file mode 100644 index 000000000..90f03b2ef --- /dev/null +++ b/FusionIIIT/applications/filetracking/api/urls.py @@ -0,0 +1,22 @@ +from django.conf.urls import url +from .views import ( + CreateFileView, + ViewFileView, + DeleteFileView, + ViewInboxView, + ViewOutboxView, + ViewHistoryView, + ForwardFileView, + GetDesignationsView, +) + +urlpatterns = [ + url(r'^file/$', CreateFileView.as_view(), name='create_file'), + url(r'^file/(?P\d+)/$', ViewFileView.as_view(), name='view_file'), + url(r'^file/(?P\d+)/$', DeleteFileView.as_view(), name='delete_file'), + url(r'^inbox/$', ViewInboxView.as_view(), name='view_inbox'), + url(r'^outbox/$', ViewOutboxView.as_view(), name='view_outbox'), + url(r'^history/(?P\d+)/$', ViewHistoryView.as_view(), name='view_history'), + url(r'^file/(?P\d+)/$', ForwardFileView.as_view(), name='forward_file'), + url(r'^designations/(?P\w+)/$', GetDesignationsView.as_view(), name='get_designations'), +] diff --git a/FusionIIIT/applications/filetracking/api/views.py b/FusionIIIT/applications/filetracking/api/views.py new file mode 100644 index 000000000..6694e749f --- /dev/null +++ b/FusionIIIT/applications/filetracking/api/views.py @@ -0,0 +1,89 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status, permissions +from rest_framework.authentication import TokenAuthentication +from ..sdk.methods import create_file, view_file, delete_file, view_inbox, view_outbox, view_history, forward_file, get_designations + + +class CreateFileView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def post(self, request, *args, **kwargs): + file_id = create_file(**request.data) + return Response({'file_id': file_id}, status=status.HTTP_201_CREATED) + + +class ViewFileView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def get(self, request, file_id, *args, **kwargs): + file_details = view_file(int(file_id)) + return Response(file_details) + + +class DeleteFileView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def delete(self, request, file_id, *args, **kwargs): + success = delete_file(int(file_id)) + if success: + return Response({'message': 'File deleted successfully'}, + status=status.HTTP_204_NO_CONTENT) + else: + return Response({'error': 'File not found'}, + status=status.HTTP_404_NOT_FOUND) + + +class ViewInboxView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def get(self, request, *args, **kwargs): + inbox_files = view_inbox( + request.user.username, + request.query_params.get('designation'), + request.query_params.get('src_module')) + return Response(inbox_files) + + +class ViewOutboxView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def get(self, request, *args, **kwargs): + outbox_files = view_outbox( + request.user.username, + request.query_params.get('designation'), + request.query_params.get('src_module')) + return Response(outbox_files) + + +class ViewHistoryView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def get(self, request, file_id, *args, **kwargs): + history = view_history(int(file_id)) + return Response(history) + + +class ForwardFileView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def post(self, request, file_id, *args, **kwargs): + new_tracking_id = forward_file(int(file_id), **request.data) + return Response({'tracking_id': new_tracking_id}, + status=status.HTTP_201_CREATED) + + +class GetDesignationsView(APIView): + #authentication_classes = [TokenAuthentication] + #permission_classes = [permissions.IsAuthenticated] + + def get(self, request, username, *args, **kwargs): + user_designations = get_designations(username) + return Response({'designations': user_designations}) diff --git a/FusionIIIT/applications/filetracking/migrations/0002_auto_20240130_1435.py b/FusionIIIT/applications/filetracking/migrations/0002_auto_20240130_1435.py new file mode 100644 index 000000000..5dda095fa --- /dev/null +++ b/FusionIIIT/applications/filetracking/migrations/0002_auto_20240130_1435.py @@ -0,0 +1,33 @@ +# Generated by Django 3.1.5 on 2024-01-30 14:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('filetracking', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='file', + name='file_extra_JSON', + field=models.JSONField(null=True), + ), + migrations.AddField( + model_name='file', + name='src_module', + field=models.CharField(default='filetracking', max_length=100), + ), + migrations.AddField( + model_name='file', + name='src_object_id', + field=models.CharField(max_length=100, null=True), + ), + migrations.AddField( + model_name='tracking', + name='tracking_extra_JSON', + field=models.JSONField(null=True), + ), + ] diff --git a/FusionIIIT/applications/filetracking/models.py b/FusionIIIT/applications/filetracking/models.py index 5f9581a08..b725ea300 100644 --- a/FusionIIIT/applications/filetracking/models.py +++ b/FusionIIIT/applications/filetracking/models.py @@ -16,6 +16,11 @@ class File(models.Model): is_read = models.BooleanField(default = False) + # additions for API + src_module = models.CharField(max_length=100, default='filetracking') + src_object_id = models.CharField(max_length=100,null=True) + file_extra_JSON = models.JSONField(null=True) + class Meta: db_table = 'File' @@ -25,12 +30,12 @@ class Meta: class Tracking(models.Model): """ - This is File Tracing Table which contains the status of each indivisual file created by the user + This is File Tracing Table which contains the status of each individual file created by the user """ file_id = models.ForeignKey(File, on_delete=models.CASCADE, null=True) current_id = models.ForeignKey(ExtraInfo, on_delete=models.CASCADE) current_design = models.ForeignKey(HoldsDesignation, null=True, on_delete=models.CASCADE) - # receiver_id = models.ForeignKey(ExtraInfo, on_delete=models.CASCADE, related_name='receiver_id') + # receiver_id = models.ForeignKey(ExtraInfo, on_delete=models.CASCADE, related_name='receiver_id') # receive_design = models.ForeignKey(HoldsDesignation, null=True, on_delete=models.CASCADE, related_name='rec_design') receiver_id = models.ForeignKey(User,null = True, on_delete=models.CASCADE, related_name='receiver_id') receive_design = models.ForeignKey(Designation, null=True, on_delete=models.CASCADE, related_name='rec_design') @@ -41,5 +46,8 @@ class Tracking(models.Model): upload_file = models.FileField(blank=True) is_read = models.BooleanField(default = False) + # additions for API + tracking_extra_JSON = models.JSONField(null=True) + class Meta: db_table = 'Tracking' diff --git a/FusionIIIT/applications/filetracking/sdk/methods.py b/FusionIIIT/applications/filetracking/sdk/methods.py new file mode 100644 index 000000000..516b6f871 --- /dev/null +++ b/FusionIIIT/applications/filetracking/sdk/methods.py @@ -0,0 +1,411 @@ +from django.contrib.auth.models import User +from applications.filetracking.models import Tracking, File +from applications.globals.models import Designation, HoldsDesignation, ExtraInfo +from applications.filetracking.api.serializers import FileSerializer, FileHeaderSerializer, TrackingSerializer +from django.core.exceptions import ValidationError +from typing import Any + + +def create_file( + uploader: str, + uploader_designation: str, + receiver: str, + receiver_designation: str, + subject: str = "", + description: str = "", + src_module: str = "filetracking", + src_object_id: str = "", + file_extra_JSON: dict = {}, + attached_file: Any = None) -> int: + ''' + This function is used to create a file object corresponding to any object of a module that needs to be tracked + ''' + + ''' + Functioning: + create base file with params + create tracking with params + if both complete then return id of file + else raise error + + also, delete file object if tracking isnt created + ''' + uploader_user_obj = get_user_object_from_username(uploader) + uploader_extrainfo_obj = get_ExtraInfo_object_from_username(uploader) + uploader_designation_obj = Designation.objects.get( + name=uploader_designation) + receiver_obj = get_user_object_from_username(receiver) + receiver_designation_obj = Designation.objects.get( + name=receiver_designation) + + new_file = File.objects.create( + uploader=uploader_extrainfo_obj, + subject=subject, + description=description, + designation=uploader_designation_obj, + src_module=src_module, + src_object_id=src_object_id, + file_extra_JSON=file_extra_JSON, + ) + + + if attached_file is not None: + new_file.upload_file.save(attached_file.name, attached_file, save=True) + + uploader_holdsdesignation_obj = HoldsDesignation.objects.get( + user=uploader_user_obj, designation=uploader_designation_obj) + + new_tracking = Tracking.objects.create( + file_id=new_file, + current_id=uploader_extrainfo_obj, + current_design=uploader_holdsdesignation_obj, + receiver_id=receiver_obj, + receive_design=receiver_designation_obj, + tracking_extra_JSON=file_extra_JSON, + remarks=f"File with id:{str(new_file.id)} created by {uploader} and sent to {receiver}" + # upload_file = None, dont add file for first tracking + ) + if new_tracking is None: + new_file.delete() + raise ValidationError('Tracking model data is incorrect') + else: + return new_file.id + + +def view_file(file_id: int) -> dict: + ''' + This function returns all the details of a given file + ''' + try: + requested_file = File.objects.get(id=file_id) + serializer = FileSerializer(requested_file) + file_details = serializer.data + return file_details + except File.DoesNotExist: + raise NotFound("File Not Found with provided ID") + + +def delete_file(file_id: int) -> bool: + ''' + This function is used to delete a file from being tracked, all the tracking history is deleted as well and returns true if the deletion was successful + ''' + try: + File.objects.filter(id=file_id).delete() + return True + except File.DoesNotExist: + return False + +# inbox and outbox could be sorted based on most recent linked tracking entry + +def view_inbox(username: str, designation: str, src_module: str) -> list: + ''' + This function is used to get all the files in the inbox of a particular user and designation + ''' + user_designation = Designation.objects.get(name=designation) + recipient_object = get_user_object_from_username(username) + received_files_tracking = Tracking.objects.select_related('file_id').filter( + receiver_id=recipient_object, + receive_design=user_designation, + file_id__src_module=src_module, + file_id__is_read=False).order_by('receive_date'); + received_files = [tracking.file_id for tracking in received_files_tracking] + + # remove duplicate file ids (from sending back and forth) + received_files_unique = uniqueList(received_files) + + received_files_serialized = list(FileHeaderSerializer( + received_files_unique, many=True).data) + + for file in received_files_serialized: + file['sent_by_user'] = get_last_file_sender(file['id']).username + file['sent_by_designation'] = get_last_file_sender_designation(file['id']).name + + return received_files_serialized + + +def view_outbox(username: str, designation: str, src_module: str) -> list: + ''' + This function is used to get all the files in the outbox of a particular user and designation + ''' + user_designation = get_designation_obj_from_name(designation=designation) + user_object = get_user_object_from_username(username) + user_HoldsDesignation_object = HoldsDesignation.objects.get( + user=user_object, designation=user_designation) + sender_ExtraInfo_object = get_ExtraInfo_object_from_username(username) + sent_files_tracking = Tracking.objects.select_related('file_id').filter( + current_id=sender_ExtraInfo_object, + current_design=user_HoldsDesignation_object, + file_id__src_module=src_module, + file_id__is_read=False).order_by('-receive_date') + sent_files = [tracking.file_id for tracking in sent_files_tracking] + + # remove duplicate file ids (from sending back and forth) + sent_files_unique = uniqueList(sent_files) + + sent_files_serialized = FileHeaderSerializer(sent_files_unique, many=True) + return sent_files_serialized.data + + + +def view_archived(username: str, designation: str, src_module: str) -> dict: + ''' + This function is used to get all the files in the archive of a particular user and designation + Archived file mean those which the user has ever interacted with, and are now finished or archived + ''' + user_designation = Designation.objects.get(name=designation) + user_object = get_user_object_from_username(username) + received_archived_tracking = Tracking.objects.select_related('file_id').filter( + receiver_id=user_object, + receive_design=user_designation, + file_id__src_module=src_module, + file_id__is_read=True) + + user_HoldsDesignation_object = HoldsDesignation.objects.get( + user=user_object, designation=user_designation) + sender_ExtraInfo_object = get_ExtraInfo_object_from_username(username) + sent_archived_tracking = Tracking.objects.select_related('file_id').filter( + current_id=sender_ExtraInfo_object, + current_design=user_HoldsDesignation_object, + file_id__src_module=src_module, + file_id__is_read=True) + + archived_tracking = received_archived_tracking | sent_archived_tracking + archived_files = [tracking.file_id for tracking in archived_tracking] + + # remove duplicate file ids (from sending back and forth) + archived_files_unique = uniqueList(archived_files) + + archived_files_serialized = FileHeaderSerializer(archived_files_unique, many=True) + return archived_files_serialized.data + + + +def archive_file(file_id: int) -> bool: + ''' + This function is used to archive a file and returns true if the archiving was successful + ''' + try: + File.objects.filter(id=file_id).update(is_read=True) + return True + except File.DoesNotExist: + return False + + + +def create_draft( + uploader: str, + uploader_designation: str, + src_module: str = "filetracking", + src_object_id: str = "", + file_extra_JSON: dict = {}, + attached_file: Any = None) -> int: + ''' + This function is used to create a draft file object corresponding to any object of a module that needs to be tracked + It is similar to create_file but is not sent to anyone + Later this file can be sent to someone by forward_file by using draft file_id + ''' + uploader_extrainfo_obj = get_ExtraInfo_object_from_username(uploader) + uploader_designation_obj = Designation.objects.get( + name=uploader_designation) + + new_file = File.objects.create( + uploader=uploader_extrainfo_obj, + designation=uploader_designation_obj, + src_module=src_module, + src_object_id=src_object_id, + file_extra_JSON=file_extra_JSON, + upload_file=attached_file + ) + return new_file.id + + +def view_drafts(username: str, designation: str, src_module: str) -> dict: + ''' + This function is used to get all the files in the drafts (has not been sent) of a particular user and designation + ''' + user_designation = Designation.objects.get(name=designation) + user_ExtraInfo_object = get_ExtraInfo_object_from_username(username) + draft_files = File.objects.filter( + tracking__isnull=True, uploader=user_ExtraInfo_object, designation=user_designation, src_module=src_module) + draft_files_serialized = FileHeaderSerializer(draft_files, many=True) + return draft_files_serialized.data + + + +def forward_file( + file_id: int, + receiver: str, + receiver_designation: str, + file_extra_JSON: dict, + remarks: str = "", + file_attachment: Any = None) -> int: + ''' + This function forwards the file and inserts a new tracking history into the file tracking table + Note that only the current owner(with appropriate designation) of the file has the ability to forward files + ''' + # HoldsDesignation and ExtraInfo object are used instead + # of Designation and User object because of the legacy code being that way + + current_owner = get_current_file_owner(file_id) + current_owner_designation = get_current_file_owner_designation(file_id) + current_owner_extra_info = ExtraInfo.objects.get(user=current_owner) + current_owner_holds_designation = HoldsDesignation.objects.get( + user=current_owner, designation=current_owner_designation) + receiver_obj = User.objects.get(username=receiver) + receiver_designation_obj = Designation.objects.get( + name=receiver_designation) + tracking_data = { + 'file_id': file_id, + 'current_id': current_owner_extra_info.id, + 'current_design': current_owner_holds_designation.id, + 'receiver_id': receiver_obj.id, + 'receive_design': receiver_designation_obj.id, + 'tracking_extra_JSON': file_extra_JSON, + 'remarks': remarks, + } + if file_attachment is not None: + tracking_data['upload_file'] = file_attachment + + tracking_entry = TrackingSerializer(data=tracking_data) + if tracking_entry.is_valid(): + tracking_entry.save() + return tracking_entry.instance.id + else: + raise ValidationError('forward data is incomplete') + + +def view_history(file_id: int) -> dict: + ''' + This function is used to get the history of a particular file with the given file_id + ''' + Tracking_history = Tracking.objects.filter( + file_id=file_id).order_by('-receive_date') + Tracking_history_serialized = TrackingSerializer( + Tracking_history, many=True) + return Tracking_history_serialized.data + + +# HELPER FUNCTIONS + +def get_current_file_owner(file_id: int) -> User: + ''' + This functions returns the current owner of the file. + The current owner is the latest recipient of the file + ''' + latest_tracking = Tracking.objects.filter( + file_id=file_id).order_by('-receive_date').first() + latest_recipient = latest_tracking.receiver_id + return latest_recipient + + +def get_current_file_owner_designation(file_id: int) -> Designation: + ''' + This function returns the designation of the current owner of the file. + The current owner is the latest recipient of the file + ''' + latest_tracking = Tracking.objects.filter( + file_id=file_id).order_by('-receive_date').first() + latest_recipient_designation = latest_tracking.receive_design + return latest_recipient_designation + +def get_last_file_sender(file_id: int) -> User: + ''' + This Function returns the last file sender, + one who has last forwarded/sent the file + ''' + latest_tracking = Tracking.objects.filter( + file_id=file_id).order_by('-receive_date').first() + latest_sender_extra_info = latest_tracking.current_id + return latest_sender_extra_info.user + +def get_last_file_sender_designation(file_id: int) -> Designation: + ''' + This Function returns the last file sender's Designation, + one who has last forwarded/sent the file + ''' + latest_tracking = Tracking.objects.filter( + file_id=file_id).order_by('receive_date').first() + latest_sender_holds_designation = latest_tracking.current_design + return latest_sender_holds_designation.designation + +def get_designations(username: str) -> list: + ''' + This function is used to return a list of all the designation names of a particular user + ''' + user = User.objects.get(username=username) + designations_held = HoldsDesignation.objects.filter(user=user) + designation_name = [designation.name for designation in designations_held] + +def get_user_object_from_username(username: str) -> User: + user = User.objects.get(username=username) + return user + +def get_ExtraInfo_object_from_username(username: str) -> ExtraInfo: + user = User.objects.get(username=username) + extrainfo = ExtraInfo.objects.get(user=user) + return extrainfo + +def uniqueList(l: list) -> list: + ''' + This function is used to return a list with unique elements + O(n) time and space + ''' + seen = set() + unique_list = [] + for item in l: + if item not in seen: + unique_list.append(item) + seen.add(item) + return unique_list + +def add_uploader_department_to_files_list(files: list) -> list: + ''' + This function is used to add the department of the uploader to the file + ''' + for file in files: + uploader_Extrainfo = file['uploader'] + file['uploader_department'] = (str(uploader_Extrainfo.department)).split(': ')[1] + + return files + +def get_designation_obj_from_name(designation: str) -> Designation: + des = Designation.objects.get(name = designation) + return des + +def get_HoldsDesignation_obj(username: str, designation:str) -> HoldsDesignation: + user_object = get_user_object_from_username(username=username) + user_designation = get_designation_obj_from_name(designation=designation) + obj = HoldsDesignation.objects.get( + user=user_object, designation=user_designation) + return obj + +def get_last_recv_tracking_for_user(file_id: int, username: str, designation: str)-> Tracking: + ''' + This returns the last tracking where username+designation recieved file_id + ''' + + recv_user_obj = get_user_object_from_username(username) + recv_design_obj = get_designation_obj_from_name(designation) + + last_tracking = Tracking.objects.filter(file_id=file_id, + receiver_id=recv_user_obj, + receive_design=recv_design_obj).order_by('-receive_date')[0] + return last_tracking + +def get_last_forw_tracking_for_user(file_id: int, username: str, designation: str) -> Tracking: + ''' + Returns the last tracking where the specified user forwarded the file. + ''' + + # Get user and designation objects + sender_user_obj = get_ExtraInfo_object_from_username(username) + sender_designation_obj = get_HoldsDesignation_obj(username=username, designation=designation) + + # Filter Tracking objects by file_id, sender_id, and sender_designation + last_tracking = Tracking.objects.filter(file_id=file_id, + current_id=sender_user_obj, + current_design=sender_designation_obj).order_by('-forward_date').first() + return last_tracking + +def get_extra_info_object_from_id(id: int): + return ExtraInfo.objects.get(id=id) \ No newline at end of file diff --git a/FusionIIIT/applications/filetracking/urls.py b/FusionIIIT/applications/filetracking/urls.py index cb4a7563d..66ff5e3a1 100644 --- a/FusionIIIT/applications/filetracking/urls.py +++ b/FusionIIIT/applications/filetracking/urls.py @@ -1,31 +1,41 @@ -from django.conf.urls import url +from django.conf.urls import url, include from . import views +from .api import urls app_name = 'filetracking' urlpatterns = [ url(r'^$', views.filetracking, name='filetracking'), - url(r'^drafts/$', views.drafts, name='drafts'), - url(r'^fileview/(?P\d+)$', views.fileview, name='fileview'), - url(r'^fileview1/(?P\d+)$', views.fileview1, name='fileview1'), - url(r'^fileview2/(?P\d+)$', views.fileview2, name='fileview2'), + url(r'^draftdesign/$', views.draft_design, name='draft_design'), + url(r'^drafts/(?P\d+)$', views.drafts_view, name='drafts_view'), + url(r'^outbox/(?P\d+)$', views.outbox_view, name='outbox_view'), + url(r'^inbox/(?P\d+)$', views.inbox_view, name='inbox_view'), url(r'^outward/$', views.outward, name='outward'), url(r'^inward/$', views.inward, name='inward'), - url(r'^confirmdelete/(?P\d+)$', views.confirmdelete, name='confirm_delete'), - url(r'^archive/(?P\d+)/$', views.archive, name='archive'), + url(r'^confirmdelete/(?P\d+)$', + views.confirmdelete, name='confirm_delete'), + url(r'^archive/(?P\d+)/$', views.archive_view, name='archive_view'), url(r'^finish/(?P\d+)/$', views.finish, name='finish'), url(r'^forward/(?P\d+)/$', views.forward, name='forward'), url(r'^ajax/$', views.AjaxDropdown1, name='ajax_dropdown1'), url(r'^ajax_dropdown/$', views.AjaxDropdown, name='ajax_dropdown'), - url(r'^test/$',views.test, name='test'), - url(r'^delete/(?P\d+)$',views.delete, name='delete'), - url(r'^forward_inward/(?P\d+)/$', views.forward_inward, name='forward_inward'), + url(r'^test/$', views.test, name='test'), + url(r'^delete/(?P\d+)$', views.delete, name='delete'), + url(r'^forward_inward/(?P\d+)/$', + views.forward_inward, name='forward_inward'), - ## correction team 24 + # correction team 24 url(r'^finish_design/$', views.finish_design, name='finish_design'), - url(r'^finish_fileview/(?P\d+)$', views.finish_fileview, name='finish_fileview'), + url(r'^finish_fileview/(?P\d+)$', + views.finish_fileview, + name='finish_fileview'), url(r'^archive_design/$', views.archive_design, name='archive_design'), - url(r'^archive_finish/(?P\d+)/$', views.archive_finish, name='archive_finish'), + url(r'^archive_finish/(?P\d+)/$', + views.archive_finish, name='archive_finish'), + + # REST api urls + url(r'^api/', include(urls)) + ] diff --git a/FusionIIIT/applications/filetracking/views.py b/FusionIIIT/applications/filetracking/views.py index ef5d8f347..b6e2e3fbc 100644 --- a/FusionIIIT/applications/filetracking/views.py +++ b/FusionIIIT/applications/filetracking/views.py @@ -9,11 +9,12 @@ from django.core import serializers from django.contrib.auth.models import User from timeit import default_timer as time -from notification.views import office_module_notif,file_tracking_notif +from notification.views import office_module_notif, file_tracking_notif from .utils import * +from django.utils.dateparse import parse_datetime +from .sdk.methods import * - -@login_required(login_url = "/accounts/login/") +@login_required(login_url="/accounts/login/") def filetracking(request): """ The function is used to create files by current user(employee). @@ -35,18 +36,20 @@ def filetracking(request): holdsdesignations - The HoldsDesignation object. context - Holds data needed to make necessary changes in the template. """ - if request.method =="POST": + if request.method == "POST": try: if 'save' in request.POST: uploader = request.user.extrainfo subject = request.POST.get('title') description = request.POST.get('desc') design = request.POST.get('design') - designation = Designation.objects.get(id = HoldsDesignation.objects.select_related('user','working','designation').get(id = design).designation_id) + designation = Designation.objects.get(id=HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(id=design).designation_id) upload_file = request.FILES.get('myfile') - if(upload_file.size / 1000 > 10240): - messages.error(request,"File should not be greater than 10MB") - return redirect("/filetracking") + if upload_file and upload_file.size / 1000 > 10240: + messages.error( + request, "File should not be greater than 10MB") + return redirect("/filetracking") File.objects.create( uploader=uploader, @@ -56,18 +59,20 @@ def filetracking(request): upload_file=upload_file ) - messages.success(request,'File Draft Saved Successfully') + messages.success(request, 'File Draft Saved Successfully') if 'send' in request.POST: uploader = request.user.extrainfo subject = request.POST.get('title') description = request.POST.get('desc') design = request.POST.get('design') - designation = Designation.objects.get(id = HoldsDesignation.objects.select_related('user','working','designation').get(id = design).designation_id) + designation = Designation.objects.get(id=HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(id=design).designation_id) upload_file = request.FILES.get('myfile') - if(upload_file.size / 1000 > 10240): - messages.error(request,"File should not be greater than 10MB") + if upload_file and upload_file.size / 1000 > 10240: + messages.error( + request, "File should not be greater than 10MB") return redirect("/filetracking") file = File.objects.create( @@ -78,12 +83,12 @@ def filetracking(request): upload_file=upload_file ) - current_id = request.user.extrainfo remarks = request.POST.get('remarks') sender = request.POST.get('design') - current_design = HoldsDesignation.objects.select_related('user','working','designation').get(id=sender) + current_design = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(id=sender) receiver = request.POST.get('receiver') try: @@ -109,19 +114,19 @@ def filetracking(request): remarks=remarks, upload_file=upload_file, ) - #office_module_notif(request.user, receiver_id) - file_tracking_notif(request.user,receiver_id,subject) - messages.success(request,'File sent successfully') + # office_module_notif(request.user, receiver_id) + file_tracking_notif(request.user, receiver_id, subject) + messages.success(request, 'File sent successfully') except IntegrityError: message = "FileID Already Taken.!!" return HttpResponse(message) - - - file = File.objects.select_related('uploader__user','uploader__department','designation').all() - extrainfo = ExtraInfo.objects.select_related('user','department').all() - holdsdesignations = HoldsDesignation.objects.select_related('user','working','designation').all() + file = File.objects.select_related( + 'uploader__user', 'uploader__department', 'designation').all() + extrainfo = ExtraInfo.objects.select_related('user', 'department').all() + holdsdesignations = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').all() designations = get_designation(request.user) context = { @@ -133,8 +138,8 @@ def filetracking(request): return render(request, 'filetracking/composefile.html', context) -@login_required(login_url = "/accounts/login") -def drafts(request): +@login_required(login_url="/accounts/login") +def draft_design(request): """ The function is used to get the designation of the user and renders it on draft template. @@ -142,22 +147,21 @@ def drafts(request): request - trivial. @variables: - - + + context - Holds data needed to make necessary changes in the template. """ designation = get_designation(request.user) context = { 'designation': designation, } - return render(request, 'filetracking/drafts.html', context) - + return render(request, 'filetracking/draft_design.html', context) -@login_required(login_url = "/accounts/login") -def fileview(request,id): +@login_required(login_url="/accounts/login") +def drafts_view(request, id): """ - This function is used to veiw all all created files by the user ordered by upload date.it collects all the created files from File object. + This function is used to view all the drafts created by the user ordered by upload date.it collects all the created files from File object. @param: request - trivial @@ -166,45 +170,34 @@ def fileview(request,id): @parameters draft - file obeject containing all the files created by user context - holds data needed to render the template - - - """ - # draft = File.objects.select_related('uploader__user','uploader__department','designation').filter(uploader=request.user.extrainfo).order_by('-upload_date') - # extrainfo = ExtraInfo.objects.select_related('user','department').all() - - extrainfo = ExtraInfo.objects.select_related('user','department').all() - - ids = File.objects.filter(uploader=request.user.extrainfo).order_by('-upload_date').values_list('id', flat=True) - draft_files_pk=[] - - for i in ids: - file_tracking_ids = Tracking.objects.filter(file_id=i).values_list('id', flat=True) - if(len(file_tracking_ids)==0): - draft_files_pk.append(i) - - draft_file_list=[] - for i in draft_files_pk: - draft_file_list.append(File.objects.get(pk=i)) - - - - user_designation = HoldsDesignation.objects.select_related('user','working','designation').get(pk=id) - s = str(user_designation).split(" - ") - designations = s[1] - context = { - 'draft': draft_file_list, - 'extrainfo': extrainfo, - 'designations': designations, - } - return render(request, 'filetracking/fileview.html', context) + """ + user_HoldsDesignation_obj = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(pk=id) + s = str(user_HoldsDesignation_obj).split(" - ") + designation = s[1] + draft_files = view_drafts( + username=user_HoldsDesignation_obj.user, + designation=user_HoldsDesignation_obj.designation, + src_module='filetracking' + ) + draft_files = add_uploader_department_to_files_list(draft_files) + + # Correct upload_date type + for f in draft_files: + f['upload_date'] = parse_datetime(f['upload_date']) + context = { + 'draft_files': draft_files, + 'designations': designation, + } + return render(request, 'filetracking/drafts.html', context) -@login_required(login_url = "/accounts/login") -def fileview1(request,id): +@login_required(login_url="/accounts/login") +def outbox_view(request, id): """ The function is used to get all the files sent by user(employee) to other employees which are filtered from Tracking(table) objects by current user i.e. current_id. @@ -216,56 +209,93 @@ def fileview1(request,id): id - user id @variables: - out - The Tracking object filtered by current_id i.e, present working user. + outward_files - File objects filtered by current_id i.e, present working user. context - Holds data needed to make necessary changes in the template. - + """ + user_HoldsDesignation_obj = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(pk=id) + s = str(user_HoldsDesignation_obj).split(" - ") + designation = s[1] - outward_files = Tracking.objects.select_related('file_id__uploader__user','file_id__uploader__department','file_id__designation','current_id__user','current_id__department', - 'current_design__user','current_design__working','current_design__designation','receiver_id','receive_design').filter(current_id=request.user.extrainfo).order_by('-forward_date') + # outward_files = Tracking.objects.select_related('file_id__uploader__user', 'file_id__uploader__department', 'file_id__designation', 'current_id__user', 'current_id__department', + # 'current_design__user', 'current_design__working', 'current_design__designation', 'receiver_id', 'receive_design').filter(current_id=request.user.extrainfo).order_by('-forward_date') - user_designation = HoldsDesignation.objects.select_related('user','working','designation').get(pk=id) + # user_designation = HoldsDesignation.objects.select_related( + # 'user', 'working', 'designation').get(pk=id) + + outward_files = view_outbox(username=user_HoldsDesignation_obj.user, + designation=user_HoldsDesignation_obj.designation, + src_module='filetracking') + outward_files = add_uploader_department_to_files_list(outward_files) + + for f in outward_files: + last_forw_tracking = get_last_forw_tracking_for_user(file_id=f['id'], + username=user_HoldsDesignation_obj.user, + designation=user_HoldsDesignation_obj.designation) + f['sent_to_user'] = last_forw_tracking.receiver_id + f['sent_to_design'] = last_forw_tracking.receive_design + f['last_sent_date'] = last_forw_tracking.forward_date + + f['upload_date'] = parse_datetime(f['upload_date']) context = { - 'out': outward_files, - 'abcd': user_designation, + 'out_files': outward_files, + 'viewer_designation': designation, } - return render(request, 'filetracking/fileview1.html', context) + return render(request, 'filetracking/outbox.html', context) -@login_required(login_url = "/accounts/login") -def fileview2(request,id): - +@login_required(login_url="/accounts/login") +def inbox_view(request, id): """ The function is used to fetch the files received by the user form other employees. These files are filtered by receiver id and ordered by receive date. @param: request - trivial. - id - user id + id - HoldsDesignation object id @variables: - inward_file - The Tracking object filtered by receiver_id i.e, present working user. + inward_files - File object with additional sent by information context - Holds data needed to make necessary changes in the template. """ - inward_file = Tracking.objects.select_related('file_id__uploader__user','file_id__uploader__department','file_id__designation','current_id__user','current_id__department', - 'current_design__user','current_design__working','current_design__designation','receiver_id','receive_design').filter(receiver_id=request.user).order_by('-receive_date') + # inward_file = Tracking.objects.select_related('file_id__uploader__user', 'file_id__uploader__department', 'file_id__designation', 'current_id__user', 'current_id__department', + # 'current_design__user', 'current_design__working', 'current_design__designation', 'receiver_id', 'receive_design').filter(receiver_id=request.user).order_by('-receive_date') + + user_HoldsDesignation_obj = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(pk=id) + s = str(user_HoldsDesignation_obj).split(" - ") + designation = s[1] + inward_files = view_inbox( + username=user_HoldsDesignation_obj.user, + designation=user_HoldsDesignation_obj.designation, + src_module='filetracking' + ) + inward_files = add_uploader_department_to_files_list(inward_files) + + # correct upload_date type and add recieve_date + for f in inward_files: + f['upload_date'] = parse_datetime(f['upload_date']) + + last_recv_tracking = get_last_recv_tracking_for_user(file_id=f['id'], + username=user_HoldsDesignation_obj.user, + designation=user_HoldsDesignation_obj.designation) + f['receive_date'] = last_recv_tracking.receive_date + - user_designation = HoldsDesignation.objects.select_related('user','working','designation').get(pk=id) - s = str(user_designation).split(" - ") - designations = s[1] context = { - 'in_file': inward_file, - 'designations': designations, + 'in_file': inward_files, + 'designations': designation, } - return render(request, 'filetracking/fileview2.html', context) + return render(request, 'filetracking/inbox.html', context) -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def outward(request): """ This function fetches the different designations of the user and renders it on outward template @@ -274,22 +304,22 @@ def outward(request): @variables: context - Holds the different designation data of the user - + """ designation = get_designation(request.user) context = { 'designation': designation, } - return render( request, 'filetracking/outward.html', context) + return render(request, 'filetracking/outward.html', context) -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def inward(request): """ This function fetches the different designations of the user and renders it on inward template - + @param: request - trivial. @@ -298,15 +328,14 @@ def inward(request): """ designation = get_designation(request.user) context = { - + 'designation': designation, } return render(request, 'filetracking/inward.html', context) -@login_required(login_url = "/accounts/login") -def confirmdelete(request,id): - +@login_required(login_url="/accounts/login") +def confirmdelete(request, id): """ The function is used to confirm the deletion of a file. @param: @@ -316,16 +345,17 @@ def confirmdelete(request,id): @variables: context - Holds data needed to make necessary changes in the template. """ - file = File.objects.select_related('uploader__user','uploader__department','designation').get(pk = id) + file = File.objects.select_related( + 'uploader__user', 'uploader__department', 'designation').get(pk=id) context = { 'j': file, } - return render(request, 'filetracking/confirmdelete.html',context) + return render(request, 'filetracking/confirmdelete.html', context) -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def forward(request, id): """ The function is used to forward files received by user(employee) from other @@ -351,73 +381,72 @@ def forward(request, id): holdsdesignations = HoldsDesignation objects. context - Holds data needed to make necessary changes in the template. """ - - file = get_object_or_404(File, id=id) - track = Tracking.objects.select_related('file_id__uploader__user','file_id__uploader__department','file_id__designation','current_id__user','current_id__department', - 'current_design__user','current_design__working','current_design__designation','receiver_id','receive_design').filter(file_id=file) - - if request.method == "POST": - if 'finish' in request.POST: - file.complete_flag = True - file.save() - - if 'send' in request.POST: - current_id = request.user.extrainfo - remarks = request.POST.get('remarks') - track.update(is_read=True) - - sender = request.POST.get('sender') - current_design = HoldsDesignation.objects.select_related('user','working','designation').get(id=sender) - receiver = request.POST.get('receiver') - try: - receiver_id = User.objects.get(username=receiver) - except Exception as e: - messages.error(request, 'Enter a valid destination') - designations = HoldsDesignation.objects.select_related('user','working','designation').filter(user=request.user) - - context = { - - 'designations': designations, - 'file': file, - 'track': track, - } - return render(request, 'filetracking/forward.html', context) - receive = request.POST.get('recieve') - try: - receive_design = Designation.objects.get(name=receive) - except Exception as e: - messages.error(request, 'Enter a valid Designation') - designations = get_designation(request.user) + file = get_object_or_404(File, id=id) + track = Tracking.objects.select_related('file_id__uploader__user', 'file_id__uploader__department', 'file_id__designation', 'current_id__user', 'current_id__department', + 'current_design__user', 'current_design__working', 'current_design__designation', 'receiver_id', 'receive_design').filter(file_id=file) - context = { - - 'designations': designations, - 'file': file, - 'track': track, - } - return render(request, 'filetracking/forward.html', context) + if request.method == "POST": + if 'finish' in request.POST: + file.is_read = True + file.save() + if 'send' in request.POST: + current_id = request.user.extrainfo + remarks = request.POST.get('remarks') + track.update(is_read=True) + + sender = request.POST.get('sender') + current_design = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(id=sender) + + receiver = request.POST.get('receiver') + try: + receiver_id = User.objects.get(username=receiver) + except Exception as e: + messages.error(request, 'Enter a valid destination') + designations = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').filter(user=request.user) + + context = { + + 'designations': designations, + 'file': file, + 'track': track, + } + return render(request, 'filetracking/forward.html', context) + receive = request.POST.get('recieve') + try: + receive_design = Designation.objects.get(name=receive) + except Exception as e: + messages.error(request, 'Enter a valid Designation') + designations = get_designation(request.user) + + context = { + + 'designations': designations, + 'file': file, + 'track': track, + } + return render(request, 'filetracking/forward.html', context) + + upload_file = request.FILES.get('myfile') + + Tracking.objects.create( + file_id=file, + current_id=current_id, + current_design=current_design, + receive_design=receive_design, + receiver_id=receiver_id, + remarks=remarks, + upload_file=upload_file, + ) + messages.success(request, 'File sent successfully') - - upload_file = request.FILES.get('myfile') - - Tracking.objects.create( - file_id=file, - current_id=current_id, - current_design=current_design, - receive_design=receive_design, - receiver_id=receiver_id, - remarks=remarks, - upload_file=upload_file, - ) - messages.success(request, 'File sent successfully') - - designations = get_designation(request.user) context = { - - 'designations':designations, + + 'designations': designations, 'file': file, 'track': track, } @@ -425,83 +454,87 @@ def forward(request, id): return render(request, 'filetracking/forward.html', context) -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def archive_design(request): - designation = HoldsDesignation.objects.select_related('user','working','designation').filter(user=request.user) + designation = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').filter(user=request.user) context = { 'designation': designation, } - return render( request, 'filetracking/archive_design.html', context) - - - + return render(request, 'filetracking/archive_design.html', context) -@login_required(login_url = "/accounts/login") -def archive(request , id): +@login_required(login_url="/accounts/login") +def archive_view(request, id): + """ + The function is used to fetch the files in the user's archive + (those which have passed by user and been archived/finished) - draft = File.objects.select_related('uploader__user','uploader__department','designation').filter(is_read=True).order_by('-upload_date') + @param: + request - trivial. + id - HoldsDesignation object id + @variables: + archive_files - File object with additional information + context - Holds data needed to make necessary changes in the template. - extrainfo = ExtraInfo.objects.select_related('user','department').all() - # designations = Designation.objects.filter(upload_designation=extrainfo.id) - abcd = HoldsDesignation.objects.select_related('user','working','designation').get(pk=id) - s = str(abcd).split(" - ") - designations = s[1] - #designations = HoldsDesignation.objects.filter(user=request.user) - # for x in designations: - # if abcd==x: - # designations=abcd + """ + user_HoldsDesignation_obj = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(pk=id) + s = str(user_HoldsDesignation_obj).split(" - ") + designation = s[1] + + archive_files = view_archived( + username=user_HoldsDesignation_obj.user, + designation=user_HoldsDesignation_obj.designation, + src_module='filetracking' + ) + archive_files = add_uploader_department_to_files_list(archive_files) + + # correct upload_date type and add receive_date + for f in archive_files: + f['upload_date'] = parse_datetime(f['upload_date']) + f['designation'] = Designation.objects.get(id=f['designation']) context = { - - 'draft': draft, - 'extrainfo': extrainfo, - 'designations': designations, + 'archive_files': archive_files, + 'designations': designation, } + return render(request, 'filetracking/archive.html', context) - - return render(request, 'filetracking/archive.html' , context) - - -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def archive_finish(request, id): - file1 = get_object_or_404(File, id=id) ##file = get_object_or_404(File, ref_id=id) + # file = get_object_or_404(File, ref_id=id) + file1 = get_object_or_404(File, id=id) track = Tracking.objects.filter(file_id=file1) - - return render(request, 'filetracking/archive_finish.html', {'file': file1, 'track': track}) - - -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def finish_design(request): - designation = HoldsDesignation.objects.select_related('user','working','designation').filter(user=request.user) + designation = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').filter(user=request.user) context = { 'designation': designation, } - return render( request, 'filetracking/finish_design.html', context) + return render(request, 'filetracking/finish_design.html', context) -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def finish_fileview(request, id): - out = Tracking.objects.select_related('file_id__uploader__user','file_id__uploader__department','file_id__designation','current_id__user','current_id__department', - 'current_design__user','current_design__working','current_design__designation','receiver_id','receive_design').filter(file_id__uploader=request.user.extrainfo, is_read=False).order_by('-forward_date') - - - - - abcd = HoldsDesignation.objects.select_related('user','working','designation').get(pk=id) + out = Tracking.objects.select_related('file_id__uploader__user', 'file_id__uploader__department', 'file_id__designation', 'current_id__user', 'current_id__department', + 'current_design__user', 'current_design__working', 'current_design__designation', 'receiver_id', 'receive_design').filter(file_id__uploader=request.user.extrainfo, is_read=False).order_by('-forward_date') + abcd = HoldsDesignation.objects.select_related( + 'user', 'working', 'designation').get(pk=id) context = { @@ -511,29 +544,19 @@ def finish_fileview(request, id): return render(request, 'filetracking/finish_fileview.html', context) - - -@login_required(login_url = "/accounts/login") +@login_required(login_url="/accounts/login") def finish(request, id): - file1 = get_object_or_404(File, id=id) ##file = get_object_or_404(File, ref_id=id) + # file = get_object_or_404(File, ref_id=id) + file1 = get_object_or_404(File, id=id) track = Tracking.objects.filter(file_id=file1) - if request.method == "POST": - if 'Finished' in request.POST: - File.objects.filter(pk=id).update(is_read=True) - track.update(is_read=True) - messages.success(request,'File Archived') - - - - - - - - return render(request, 'filetracking/finish.html', {'file': file1, 'track': track,'fileid':id}) - + if 'Finished' in request.POST: + File.objects.filter(pk=id).update(is_read=True) + track.update(is_read=True) + messages.success(request, 'File Archived') + return render(request, 'filetracking/finish.html', {'file': file1, 'track': track, 'fileid': id}) def AjaxDropdown1(request): @@ -542,7 +565,7 @@ def AjaxDropdown1(request): @param: request - trivial. - + @variables: context - return the httpresponce containing the matched designation of the user @@ -553,20 +576,19 @@ def AjaxDropdown1(request): hold = Designation.objects.filter(name__startswith=value) holds = serializers.serialize('json', list(hold)) context = { - 'holds' : holds + 'holds': holds } return HttpResponse(JsonResponse(context), content_type='application/json') def AjaxDropdown(request): - """ This function returns the usernames of receiver on the forward or compose file template. @param: request - trivial. - + @variables: context - return the httpresponce containing the matched username @@ -586,27 +608,22 @@ def test(request): return HttpResponse('success') - -@login_required(login_url = "/accounts/login") -def delete(request,id): - +@login_required(login_url="/accounts/login") +def delete(request, id): """ The function is used the delete of a file and it returns to the drafts page. @param: request - trivial. id - id of the file that is going to be deleted - + """ - file = File.objects.get(pk = id) + file = File.objects.get(pk=id) file.delete() - return redirect('/filetracking/drafts/') - - + return redirect('/filetracking/draftdesign/') -def forward_inward(request,id): - +def forward_inward(request, id): """ This function is used forward the files which are available in the inbox of the user . @param: @@ -617,21 +634,19 @@ def forward_inward(request,id): file - file object track - tracking object of the file context - necessary data to render - + """ file = get_object_or_404(File, id=id) file.is_read = True - track = Tracking.objects.select_related('file_id__uploader__user','file_id__uploader__department','file_id__designation','current_id__user','current_id__department', - 'current_design__user','current_design__working','current_design__designation','receiver_id','receive_design').filter(file_id=file) + track = Tracking.objects.select_related('file_id__uploader__user', 'file_id__uploader__department', 'file_id__designation', 'current_id__user', 'current_id__department', + 'current_design__user', 'current_design__working', 'current_design__designation', 'receiver_id', 'receive_design').filter(file_id=file) designations = get_designation(request.user) context = { - - 'designations':designations, + + 'designations': designations, 'file': file, 'track': track, } return render(request, 'filetracking/forward.html', context) - - diff --git a/FusionIIIT/applications/globals/migrations/0002_auto_20240218_2327.py b/FusionIIIT/applications/globals/migrations/0002_auto_20240218_2327.py new file mode 100644 index 000000000..4955f5a75 --- /dev/null +++ b/FusionIIIT/applications/globals/migrations/0002_auto_20240218_2327.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2024-02-18 23:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('globals', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='extrainfo', + name='user_status', + field=models.CharField(choices=[('NEW', 'NEW'), ('PRESENT', 'PRESENT')], default='PRESENT', max_length=50), + ), + ] diff --git a/FusionIIIT/applications/globals/migrations/0003_auto_20240220_0200.py b/FusionIIIT/applications/globals/migrations/0003_auto_20240220_0200.py new file mode 100644 index 000000000..1c89a66ce --- /dev/null +++ b/FusionIIIT/applications/globals/migrations/0003_auto_20240220_0200.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2024-02-20 02:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('globals', '0002_auto_20240218_2327'), + ] + + operations = [ + migrations.AlterField( + model_name='extrainfo', + name='user_status', + field=models.CharField(choices=[('PRESENT', 'PRESENT'), ('NEW', 'NEW')], default='PRESENT', max_length=50), + ), + ] diff --git a/FusionIIIT/applications/globals/migrations/0004_auto_20240223_0112.py b/FusionIIIT/applications/globals/migrations/0004_auto_20240223_0112.py new file mode 100644 index 000000000..7c0af3d29 --- /dev/null +++ b/FusionIIIT/applications/globals/migrations/0004_auto_20240223_0112.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2024-02-23 01:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('globals', '0003_auto_20240220_0200'), + ] + + operations = [ + migrations.AlterField( + model_name='extrainfo', + name='user_status', + field=models.CharField(choices=[('NEW', 'NEW'), ('PRESENT', 'PRESENT')], default='PRESENT', max_length=50), + ), + ] diff --git a/FusionIIIT/applications/hr2/admin.py b/FusionIIIT/applications/hr2/admin.py index ddd58944c..26032fb1a 100644 --- a/FusionIIIT/applications/hr2/admin.py +++ b/FusionIIIT/applications/hr2/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import Employee,EmpConfidentialDetails,ForeignService,EmpDependents,EmpAppraisalForm,WorkAssignemnt +from .models import Employee, EmpConfidentialDetails, ForeignService, EmpDependents, EmpAppraisalForm, WorkAssignemnt, LTCform, CPDAAdvanceform # Register your models here. @@ -9,4 +9,6 @@ admin.site.register(EmpDependents) admin.site.register(ForeignService) admin.site.register(EmpAppraisalForm) -admin.site.register(WorkAssignemnt) \ No newline at end of file +admin.site.register(WorkAssignemnt) +admin.site.register(LTCform) +admin.site.register(CPDAAdvanceform) diff --git a/FusionIIIT/applications/hr2/form_views.py b/FusionIIIT/applications/hr2/form_views.py new file mode 100644 index 000000000..8673d05da --- /dev/null +++ b/FusionIIIT/applications/hr2/form_views.py @@ -0,0 +1,239 @@ +from .serializers import LTC_serializer, CPDAAdvance_serializer, Appraisal_serializer, CPDAReimbursement_serializer, Leave_serializer +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from rest_framework.decorators import permission_classes, api_view +from rest_framework.permissions import IsAuthenticated, AllowAny +from .models import LTCform, CPDAAdvanceform, CPDAReimbursementform, Leaveform, Appraisalform +from django.contrib.auth import get_user_model +from django.core.exceptions import MultipleObjectsReturned +from applications.filetracking.sdk.methods import * +from applications.globals.models import Designation, HoldsDesignation + + +class LTC(APIView): + serializer_class = LTC_serializer + permission_classes = (AllowAny, ) + + def post(self, request): + user_info = request.data[0] + serializer = self.serializer_class(data=request.data[1]) + if serializer.is_valid(): + serializer.save() + file_id = create_file(uploader=user_info['uploader_name'], uploader_designation=user_info['uploader_designation'], receiver="21BCS140", + receiver_designation="hradmin", src_module="HR", src_object_id=str(serializer.data['id']), file_extra_JSON={"type": "LTC"}, attached_file=None) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, *args, **kwargs): + pk = request.query_params.get("name") + print(pk) + try: + forms = LTCform.objects.get(name=pk) + serializer = self.serializer_class(forms, many=False) + except MultipleObjectsReturned: + forms = LTCform.objects.filter(name=pk) + serializer = self.serializer_class(forms, many=True) + except LTCform.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + return Response(serializer.data, status=status.HTTP_200_OK) + + def put(self, request, *args, **kwargs): + pk = request.query_params.get("id") + print(pk) + form = LTCform.objects.get(id=pk) + print(form) + serializer = self.serializer_class(form, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class FormManagement(APIView): + permission_classes = (AllowAny, ) + + def get(self, request, *args, **kwargs): + username = request.query_params.get("username") + designation = request.query_params.get("designation") + inbox = view_inbox(username=username, + designation=designation, src_module="HR") + return Response(inbox, status=status.HTTP_200_OK) + + def post(self, request, *args, **kwargs): + username = request.data['receiver'] + receiver_value = User.objects.get(username=username) + receiver_value_designation = HoldsDesignation.objects.filter( + user=receiver_value) + lis = list(receiver_value_designation) + obj = lis[0].designation + forward_file(file_id=request.data['file_id'], receiver=request.data['receiver'], receiver_designation=obj.name, + remarks=request.data['remarks'], file_extra_JSON=request.data['file_extra_JSON']) + return Response(status=status.HTTP_200_OK) + + +class CPDAAdvance(APIView): + serializer_class = CPDAAdvance_serializer + permission_classes = (AllowAny, ) + + def post(self, request): + print(request.data[1]) + user_info = request.data[1] + serializer = self.serializer_class(data=request.data[0]) + if serializer.is_valid(): + serializer.save() + file_id = create_file(uploader=user_info['uploader_name'], uploader_designation=user_info['uploader_designation'], receiver="21BCS077", + receiver_designation="student", src_module="HR", src_object_id=str(serializer.data['id']), file_extra_JSON={"type": "CPDAAdvance"}, attached_file=None) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + print(serializer.errors) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, *args, **kwargs): + pk = request.query_params.get("id") + print(pk) + try: + forms = CPDAAdvanceform.objects.get(id=pk) + serializer = self.serializer_class(forms, many=False) + except MultipleObjectsReturned: + forms = CPDAAdvanceform.objects.filter(id=pk) + serializer = self.serializer_class(forms, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def put(self, request, *args, **kwargs): + pk = request.query_params.get("id") + print(pk) + form = CPDAAdvanceform.objects.get(id=pk) + print(form) + serializer = self.serializer_class(form, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class CPDAReimbursement(APIView): + serializer_class = CPDAReimbursement_serializer + permission_classes = (AllowAny, ) + + def post(self, request): + user_info = request.data[0] + serializer = self.serializer_class(data=request.data[1]) + if serializer.is_valid(): + serializer.save() + file_id = create_file(uploader=user_info['uploader_name'], uploader_designation=user_info['uploader_designation'], receiver="vkjain", + receiver_designation="CSE HOD", src_module="HR", src_object_id=str(serializer.data['id']), file_extra_JSON={"type": "CPDAReimbursement"}, attached_file=None) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, *args, **kwargs): + pk = request.query_params.get("name") + print(pk) + try: + forms = CPDAReimbursementform.objects.get(name=pk) + serializer = self.serializer_class(forms, many=False) + except MultipleObjectsReturned: + forms = CPDAReimbursementform.objects.filter(name=pk) + serializer = self.serializer_class(forms, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def put(self, request, *args, **kwargs): + pk = request.query_params.get("id") + print(pk) + form = CPDAReimbursementform.objects.get(id=pk) + print(form) + serializer = self.serializer_class(form, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class Leave(APIView): + serializer_class = Leave_serializer + permission_classes = (AllowAny, ) + + def post(self, request): + user_info = request.data[0] + serializer = self.serializer_class(data=request.data[1]) + if serializer.is_valid(): + serializer.save() + file_id = create_file(uploader=user_info['uploader_name'], uploader_designation=user_info['uploader_designation'], receiver="vkjain", + receiver_designation="CSE HOD", src_module="HR", src_object_id=str(serializer.data['id']), file_extra_JSON={"type": "Leave"}, attached_file=None) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, *args, **kwargs): + pk = request.query_params.get("name") + print(pk) + try: + forms = Leaveform.objects.get(name=pk) + serializer = self.serializer_class(forms, many=False) + except MultipleObjectsReturned: + forms = Leaveform.objects.filter(name=pk) + serializer = self.serializer_class(forms, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def put(self, request, *args, **kwargs): + pk = request.query_params.get("id") + print(pk) + form = Leaveform.objects.get(id=pk) + print(form) + serializer = self.serializer_class(form, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class Appraisal(APIView): + serializer_class = Appraisal_serializer + permission_classes = (AllowAny, ) + + def post(self, request): + user_info = request.data[0] + serializer = self.serializer_class(data=request.data[1]) + if serializer.is_valid(): + serializer.save() + file_id = create_file(uploader=user_info['uploader_name'], uploader_designation=user_info['uploader_designation'], receiver="vkjain", + receiver_designation="CSE HOD", src_module="HR", src_object_id=str(serializer.data['id']), file_extra_JSON={"type": "Appraisal"}, attached_file=None) + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, *args, **kwargs): + pk = request.query_params.get("name") + print(pk) + try: + forms = Appraisalform.objects.get(name=pk) + serializer = self.serializer_class(forms, many=False) + except MultipleObjectsReturned: + forms = Appraisalform.objects.filter(name=pk) + serializer = self.serializer_class(forms, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) + + def put(self, request, *args, **kwargs): + pk = request.query_params.get("id") + print(pk) + form = Appraisalform.objects.get(id=pk) + print(form) + serializer = self.serializer_class(form, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class AssignerReviewer(APIView): + def post(self, request, *args, **kwargs): + forward_file(file_id=request.data['file_id'], receiver="21BCS140", receiver_designation='hradmin', + remarks=request.data['remarks'], file_extra_JSON=request.data['file_extra_JSON']) + return Response(status=status.HTTP_200_OK) diff --git a/FusionIIIT/applications/hr2/migrations/0001_initial.py b/FusionIIIT/applications/hr2/migrations/0001_initial.py deleted file mode 100644 index 83b197c8f..000000000 --- a/FusionIIIT/applications/hr2/migrations/0001_initial.py +++ /dev/null @@ -1,91 +0,0 @@ -# Generated by Django 3.1.5 on 2023-03-15 18:53 - -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('globals', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='WorkAssignemnt', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateField(blank=True, max_length=6, null=True)), - ('end_date', models.DateField(blank=True, max_length=6, null=True)), - ('job_title', models.CharField(default='', max_length=50)), - ('orders_copy', models.FileField(blank=True, null=True, upload_to='')), - ('extra_info', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ], - ), - migrations.CreateModel( - name='ForeignService', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('start_date', models.DateField(blank=True, max_length=6, null=True)), - ('end_date', models.DateField(blank=True, max_length=6, null=True)), - ('job_title', models.CharField(default='', max_length=50)), - ('organisation', models.CharField(default='', max_length=100)), - ('description', models.CharField(default='', max_length=300)), - ('salary_source', models.CharField(default='', max_length=100)), - ('designation', models.CharField(default='', max_length=100)), - ('service_type', models.CharField(choices=[('LIEN', 'LIEN'), ('DEPUTATION', 'DEPUTATION'), ('OTHER', 'OTHER')], max_length=100)), - ('extra_info', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ], - ), - migrations.CreateModel( - name='Employee', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('father_name', models.CharField(default='', max_length=40)), - ('mother_name', models.CharField(default='', max_length=40)), - ('religion', models.CharField(default='', max_length=40)), - ('category', models.CharField(choices=[('SC', 'SC'), ('ST', 'ST'), ('OBC', 'OBC'), ('GENERAL', 'GENERAL'), ('PWD', 'PWD')], max_length=50)), - ('cast', models.CharField(default='', max_length=40)), - ('home_state', models.CharField(default='', max_length=40)), - ('home_district', models.CharField(default='', max_length=40)), - ('date_of_joining', models.DateField(blank=True, null=True)), - ('designation', models.CharField(default='', max_length=40)), - ('blood_group', models.CharField(choices=[('AB+', 'AB+'), ('O+', 'O+'), ('AB-', 'AB-'), ('B+', 'B+'), ('B-', 'B-'), ('O-', 'O-'), ('A+', 'A+'), ('A-', 'A-')], max_length=50)), - ('extra_info', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ], - ), - migrations.CreateModel( - name='EmpDependents', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='', max_length=100)), - ('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female'), ('O', 'Other')], max_length=50)), - ('dob', models.DateField(max_length=6, null=True)), - ('relationship', models.CharField(default='', max_length=40)), - ('extra_info', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ], - ), - migrations.CreateModel( - name='EmpConfidentialDetails', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('aadhar_no', models.BigIntegerField(default=0, max_length=12, validators=[django.core.validators.MaxValueValidator(999999999999), django.core.validators.MinValueValidator(99999999999)])), - ('maritial_status', models.CharField(choices=[('MARRIED', 'MARRIED'), ('UN-MARRIED', 'UN-MARRIED'), ('WIDOW', 'WIDOW')], max_length=50)), - ('bank_account_no', models.IntegerField(default=0)), - ('salary', models.IntegerField(default=0)), - ('extra_info', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ], - ), - migrations.CreateModel( - name='EmpAppraisalForm', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('year', models.DateField(blank=True, max_length=6, null=True)), - ('appraisal_form', models.FileField(default=' ', null=True, upload_to='Hr2/appraisal_form')), - ('extra_info', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='globals.extrainfo')), - ], - ), - ] diff --git a/FusionIIIT/applications/hr2/migrations/__init__.py b/FusionIIIT/applications/hr2/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/FusionIIIT/applications/hr2/models.py b/FusionIIIT/applications/hr2/models.py index cf7e0ee8c..4defd9db6 100644 --- a/FusionIIIT/applications/hr2/models.py +++ b/FusionIIIT/applications/hr2/models.py @@ -141,3 +141,97 @@ class WorkAssignemnt(models.Model): end_date = models.DateField(max_length=6, null=True, blank=True) job_title = models.CharField(max_length=50, default='') orders_copy = models.FileField(blank=True, null=True) + +class LTCform(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50) + # name = models.ForeignKey(Designation) + blockYear = models.TextField() + pfNo = models.IntegerField(max_length=50) + designation = models.CharField(max_length=50) + departmentInfo= models.CharField(max_length=20) + leaveAvailability = models.BooleanField(null = True) + leaveStartDate = models.DateField(max_length=6, null=True, blank=True) + leaveEndDate = models.DateField(max_length=6, null=True, blank=True) + dateOfLeaveForFamily = models.DateField(max_length=6, null=True, blank=True) + natureOfLeave= models.TextField() + purposeOfLeave= models.TextField() + hometownOrNot = models.BooleanField() + placeOfVisit = models.CharField(max_length=20, null=True) + addressDuringLeave= models.TextField() + modeForVacation = models.TextField() + detailsOfFamilyMembersAlreadyDone = models.TextField() + familyMembersAboutToAvail = models.CharField( + max_length=30, default='self') + detailsOfFamilyMembers= models.TextField() + detailsOfDependents= models.TextField() + amountOfAdvanceRequired= models.IntegerField(null=True) + certifiedFamilyDependents= models.TextField() + certifiedAdvance=models.TextField() + adjustedMonth=models.TextField() + date= models.DateField(max_length=6) + phoneNumberForContact = models.IntegerField(max_length=10) + approved = models.BooleanField(null = True) + # approvedDate = models.DateField(auto_now_add=True) + +class CPDAAdvanceform(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50) + designation = models.CharField(max_length=50) + pfNo= models.IntegerField(max_length=20) + amountRequired = models.IntegerField() + purpose = models.TextField() + adjustedPDA= models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + balanceAvailable= models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + advanceDueAdjustment = models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + advanceAmountPDA= models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + amountCheckedInPDA = models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + submissionDate = models.DateField() + approved = models.BooleanField(null = True) + # approvedDate = models.DateField(auto_now_add=True) + +class CPDAReimbursementform(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50) + designation = models.CharField(max_length=50) + pfNo= models.IntegerField(max_length=20) + advanceTaken = models.IntegerField() + purpose = models.TextField() + adjustmentSubmitted= models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + balanceAvailable= models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + advanceDueAdjustment = models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + advanceAmountPDA= models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + amountCheckedInPDA = models.DecimalField(max_digits=10, decimal_places=2, null = True, blank = True) + submissionDate = models.DateField(auto_now_add=True) + approved = models.BooleanField(null = True) + # approvedDate = models.DateField(auto_now_add=True) + +class Appraisalform(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50) + designation = models.CharField(max_length=50) + disciplineInfo= models.CharField(max_length=50) + specificFieldOfKnowledge = models.TextField() + currentResearchInterests= models.TextField() + coursesTaught= models.JSONField() + sponsoredReseachProjects= models.JSONField() + performanceComments = models.TextField() + submissionDate = models.DateField() + approved = models.BooleanField(null = True) + # approvedDate = models.DateField(auto_now_add=True) + +class Leaveform(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50) + designation = models.CharField(max_length=50) + departmentInfo= models.CharField(max_length=20) + leaveStartDate = models.DateField(max_length=6, null=True, blank=True) + leaveEndDate = models.DateField(max_length=6, null=True, blank=True) + natureOfLeave= models.TextField() + purposeOfLeave= models.TextField() + pfNo = models.IntegerField(max_length=50) + addressDuringLeave= models.TextField() + rolesTransferredTo = models.TextField() #academic and administrtative responsibilities assigned to + submissionDate= models.DateField() + approved = models.BooleanField(null = True) + # approvedDate = models.DateField(auto_now_add=True) \ No newline at end of file diff --git a/FusionIIIT/applications/hr2/serializers.py b/FusionIIIT/applications/hr2/serializers.py new file mode 100644 index 000000000..d7c28c2d9 --- /dev/null +++ b/FusionIIIT/applications/hr2/serializers.py @@ -0,0 +1,42 @@ +from rest_framework import serializers +from .models import LTCform, CPDAAdvanceform, CPDAReimbursementform, Leaveform, Appraisalform + +class LTC_serializer(serializers.ModelSerializer): + class Meta: + model = LTCform + fields = '__all__' + + def create(self, validated_data): + return LTCform.objects.create(**validated_data) + +class CPDAAdvance_serializer(serializers.ModelSerializer): + class Meta: + model = CPDAAdvanceform + fields = '__all__' + + def create(self, validated_data): + return CPDAAdvanceform.objects.create(**validated_data) + +class Appraisal_serializer(serializers.ModelSerializer): + class Meta: + model = Appraisalform + fields = '__all__' + + def create(self, validated_data): + return Appraisalform.objects.create(**validated_data) + +class CPDAReimbursement_serializer(serializers.ModelSerializer): + class Meta: + model = CPDAReimbursementform + fields = '__all__' + + def create(self, validated_data): + return CPDAReimbursementform.objects.create(**validated_data) + +class Leave_serializer(serializers.ModelSerializer): + class Meta: + model = Leaveform + fields = '__all__' + + def create(self, validated_data): + return Leaveform.objects.create(**validated_data) diff --git a/FusionIIIT/applications/hr2/urls.py b/FusionIIIT/applications/hr2/urls.py index 56918efb7..3b18b5cc3 100644 --- a/FusionIIIT/applications/hr2/urls.py +++ b/FusionIIIT/applications/hr2/urls.py @@ -1,21 +1,24 @@ from django.conf.urls import url - +from django.urls import path from . import views +from . import form_views + app_name = 'hr2' urlpatterns = [ - - url(r'^$', views.service_book, name='hr2'), - url(r'^hradmin/$', views.hr_admin, name='hradmin'), - url(r'^edit/(?P\d+)/$', views.edit_employee_details, - name='editEmployeeDetails'), - url(r'^viewdetails/(?P\d+)/$', - views.view_employee_details, name='viewEmployeeDetails'), - url(r'^editServiceBook/(?P\d+)/$', - views.edit_employee_servicebook, name='editServiceBook'), - url(r'^administrativeProfile/$', views.administrative_profile, - name='administrativeProfile'), - url(r'^addnew/$', views.add_new_user, name='addnew'), - + url('ltc/', form_views.LTC.as_view(), name='LTC_form'), + url('formManagement/', form_views.FormManagement.as_view(), name='formManagement'), + url('cpdaadv/', form_views.CPDAAdvance.as_view(), name='CPDAAdvance_form'), + # url(r'^$', views.service_book, name='hr2'), + # url(r'^hradmin/$', views.hr_admin, name='hradmin'), + # url(r'^edit/(?P\d+)/$', views.edit_employee_details, + # name='editEmployeeDetails'), + # url(r'^viewdetails/(?P\d+)/$', + # views.view_employee_details, name='viewEmployeeDetails'), + # url(r'^editServiceBook/(?P\d+)/$', + # views.edit_employee_servicebook, name='editServiceBook'), + # url(r'^administrativeProfile/$', views.administrative_profile, + # name='administrativeProfile'), + # url(r'^addnew/$', views.add_new_user, name='addnew'), ] diff --git a/FusionIIIT/applications/programme_curriculum/migrations/0002_auto_20240217_1747.py b/FusionIIIT/applications/programme_curriculum/migrations/0002_auto_20240217_1747.py new file mode 100644 index 000000000..7ca4813fb --- /dev/null +++ b/FusionIIIT/applications/programme_curriculum/migrations/0002_auto_20240217_1747.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.5 on 2024-02-17 17:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('programme_curriculum', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='batch', + name='year', + field=models.PositiveIntegerField(default=2024), + ), + migrations.AlterField( + model_name='programme', + name='programme_begin_year', + field=models.PositiveIntegerField(default=2024), + ), + ] diff --git a/FusionIIIT/applications/scholarships/migrations/0002_auto_20240217_1747.py b/FusionIIIT/applications/scholarships/migrations/0002_auto_20240217_1747.py new file mode 100644 index 000000000..e3af9bbfa --- /dev/null +++ b/FusionIIIT/applications/scholarships/migrations/0002_auto_20240217_1747.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2024-02-17 17:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('scholarships', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='previous_winner', + name='year', + field=models.IntegerField(default=2024), + ), + ] diff --git a/fusionlab_backup_New.sql b/fusionlab_backup_New.sql new file mode 100644 index 000000000..d50b32c16 Binary files /dev/null and b/fusionlab_backup_New.sql differ