diff --git a/FusionIIIT/applications/programme_curriculum/models.py b/FusionIIIT/applications/programme_curriculum/models.py index b595a9e8c..ee993363e 100644 --- a/FusionIIIT/applications/programme_curriculum/models.py +++ b/FusionIIIT/applications/programme_curriculum/models.py @@ -10,7 +10,7 @@ from django.core.validators import MinValueValidator, MaxValueValidator, DecimalValidator # Create your models here. - +# Create your models here. PROGRAMME_CATEGORY_CHOICES = [ ('UG', 'Undergraduate'), ('PG', 'Postgraduate'), @@ -28,7 +28,7 @@ ('Manufacturing', 'Manufacturing'), ('Management Science', 'Management Science'), ('Open Elective', 'Open Elective'), - ('Swayam', 'Swayam'), + ('Swayam','Swayam'), ('Project', 'Project'), ('Optional', 'Optional'), ('Others', 'Others') @@ -37,17 +37,16 @@ BATCH_NAMES = [ ('B.Tech', 'B.Tech'), ('M.Tech', 'M.Tech'), - ('B.Des', 'B.Des'), - ('M.Des', 'M.Des'), + ('B.Des','B.Des'), + ('M.Des','M.Des'), ('Phd', 'Phd') ] - class Programme(models.Model): ''' Current Purpose : To store the details regardina a programme - - + + ATTRIBUTES : @@ -58,15 +57,12 @@ class Programme(models.Model): ! - the name attribute has ambiguous entries ''' - category = models.CharField( - max_length=3, choices=PROGRAMME_CATEGORY_CHOICES, null=False, blank=False) - name = models.CharField(max_length=70, null=False, - unique=True, blank=False) - programme_begin_year = models.PositiveIntegerField( - default=datetime.date.today().year, null=False) + category = models.CharField(max_length=3, choices=PROGRAMME_CATEGORY_CHOICES, null=False, blank=False) + name = models.CharField(max_length=70, null=False, unique=True, blank=False) + programme_begin_year = models.PositiveIntegerField(default=datetime.date.today().year, null=False) - def _str_(self): - return str(self.category + " - " + self.name) + def __str__(self): + return str(self.category + " - "+ self.name) @property def curriculums(self): @@ -80,8 +76,8 @@ def get_discipline_objects(self): class Discipline(models.Model): ''' Current Purpose : To store the details regarding a discipline - - + + ATTRIBUTES : @@ -91,27 +87,26 @@ class Discipline(models.Model): ''' - name = models.CharField(max_length=100, null=False, - unique=True, blank=False) - acronym = models.CharField( - max_length=10, null=False, default="", blank=False) - programmes = models.ManyToManyField(Programme, blank=True) - def _str_(self): + name = models.CharField(max_length=100, null=False, unique=True, blank=False) + acronym = models.CharField(max_length=10, null=False, default="", blank=False) + programmes = models.ManyToManyField(Programme, blank=True) + + def __str__(self): return str(self.name) + " " + str(self.acronym) @property def batches(self): return Batch.objects.filter(discipline=self.id).order_by('year') - + class Curriculum(models.Model): ''' Current Purpose : To store the details regarding a curriculum Curriculum definition : a set of all courses offered by the institute within a programme - - + + ATTRIBUTES : @@ -122,40 +117,43 @@ class Curriculum(models.Model): no_of_semester(Integer) - the number of semesters defined for the curriculum min_credit(Integer) - the minimum credits required for the curriculum ''' - programme = models.ForeignKey( - Programme, on_delete=models.CASCADE, null=False) + programme = models.ForeignKey(Programme, on_delete=models.CASCADE, null=False) name = models.CharField(max_length=100, null=False, blank=False) + # version = models.FloatField(default=1.0, null=False) + # version = models.PositiveIntegerField(default=1, null=False) version = models.DecimalField( - max_digits=2, - decimal_places=1, - default=1.0, - validators=[MinValueValidator(1.0), DecimalValidator(max_digits=2, decimal_places=1)]) + max_digits=2, + decimal_places=1, + default=1.0, + validators=[MinValueValidator(1.0), DecimalValidator(max_digits=2, decimal_places=1)]) working_curriculum = models.BooleanField(default=True, null=False) no_of_semester = models.PositiveIntegerField(default=1, null=False) min_credit = models.PositiveIntegerField(default=0, null=False) class Meta: unique_together = ('name', 'version',) - - def _str_(self): + + def __str__(self): return str(self.name + " v" + str(self.version)) @property def batches(self): return Batch.objects.filter(curriculum=self.id).order_by('year') + @property def semesters(self): return Semester.objects.filter(curriculum=self.id).order_by('semester_no') + class Semester(models.Model): ''' Current Purpose : To store the details regarding a semester + - - - + + ATTRIBUTES : @@ -166,8 +164,7 @@ class Semester(models.Model): end_semester(DateTime) - to store the end date of the semester ''' - curriculum = models.ForeignKey( - Curriculum, null=False, on_delete=models.CASCADE) + curriculum = models.ForeignKey(Curriculum, null=False, on_delete=models.CASCADE) semester_no = models.PositiveIntegerField(null=False) instigate_semester = models.BooleanField(default=False, null=True) start_semester = models.DateField(blank=True, null=True) @@ -176,22 +173,21 @@ class Semester(models.Model): class Meta: unique_together = ('curriculum', 'semester_no',) - - def _str_(self): - return str(Curriculum._str_(self.curriculum) + ", sem-" + str(self.semester_no)) + + def __str__(self): + return str(Curriculum.__str__(self.curriculum) + ", sem-" + str(self.semester_no)) @property def courseslots(self): return CourseSlot.objects.filter(semester=self.id).order_by("id") - class Course(models.Model): ''' Current Purpose : To store the details regarding a course + - - - + + ATTRIBUTES : @@ -222,10 +218,10 @@ class Course(models.Model): code = models.CharField(max_length=10, null=False, blank=False) name = models.CharField(max_length=100, null=False, blank=False) version = models.DecimalField( - max_digits=2, + max_digits=5, decimal_places=1, default=1.0, - validators=[MinValueValidator(1.0), DecimalValidator(max_digits=2, decimal_places=1)]) + validators=[MinValueValidator(1.0), DecimalValidator(max_digits=5, decimal_places=1)]) credit = models.PositiveIntegerField(default=0, null=False, blank=False) lecture_hours = PositiveIntegerField(null=True, ) tutorial_hours = PositiveIntegerField(null=True) @@ -235,20 +231,13 @@ class Course(models.Model): pre_requisits = models.TextField(null=True, blank=True) pre_requisit_courses = models.ManyToManyField('self', blank=True) syllabus = models.TextField() - percent_quiz_1 = models.PositiveIntegerField( - default=10, null=False, blank=False) - percent_midsem = models.PositiveIntegerField( - default=20, null=False, blank=False) - percent_quiz_2 = models.PositiveIntegerField( - default=10, null=False, blank=False) - percent_endsem = models.PositiveIntegerField( - default=30, null=False, blank=False) - percent_project = models.PositiveIntegerField( - default=15, null=False, blank=False) - percent_lab_evaluation = models.PositiveIntegerField( - default=10, null=False, blank=False) - percent_course_attendance = models.PositiveIntegerField( - default=5, null=False, blank=False) + percent_quiz_1 = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_midsem = models.PositiveIntegerField(default=20, null=False, blank=False) + percent_quiz_2 = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_endsem = models.PositiveIntegerField(default=30, null=False, blank=False) + percent_project = models.PositiveIntegerField(default=15, null=False, blank=False) + percent_lab_evaluation = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_course_attendance = models.PositiveIntegerField(default=5, null=False, blank=False) ref_books = models.TextField() working_course = models.BooleanField(default=True) disciplines = models.ManyToManyField(Discipline, blank=True) @@ -257,7 +246,7 @@ class Course(models.Model): class Meta: unique_together = ('code','version') - def _str_(self): + def __str__(self): return str(self.code + " - " +self.name+"- v"+str(self.version)) @@ -265,15 +254,16 @@ def _str_(self): def courseslots(self): return CourseSlot.objects.filter(courses=self.id) - class Batch(models.Model): - ''' - Current Purpose : To store the details regarding a batch(eg details of curriculum assigned for batch) - + ''' + Current Purpose : To store the details regarding a batch(eg details of curriculum assigned for batch) + + + ATTRIBUTES : @@ -284,23 +274,19 @@ class Batch(models.Model): running_batch(Boolean) - to denote whether the batch is currently active or has graduated ''' - name = models.CharField(choices=BATCH_NAMES, - max_length=50, null=False, blank=False) - discipline = models.ForeignKey( - Discipline, null=False, on_delete=models.CASCADE) - year = models.PositiveIntegerField( - default=datetime.date.today().year, null=False) - curriculum = models.ForeignKey( - Curriculum, null=True, blank=True, on_delete=models.SET_NULL) + name = models.CharField(choices=BATCH_NAMES, max_length=50, null=False, blank=False) + discipline = models.ForeignKey(Discipline, null=False, on_delete=models.CASCADE) + year = models.PositiveIntegerField(default=datetime.date.today().year, null=False) + curriculum = models.ForeignKey(Curriculum, null=True, blank=True, on_delete=models.SET_NULL) running_batch = models.BooleanField(default=True) class Meta: unique_together = ('name', 'discipline', 'year',) - def _str_(self): + def __str__(self): return str(self.name) + " " + str(self.discipline.acronym) + " " + str(self.year) - + class CourseSlot(models.Model): ''' Current Purpose : To store the details regarding a course slot @@ -318,19 +304,18 @@ class CourseSlot(models.Model): maximum_registration_limit(integer) - maximum students required for a course ''' - semester = models.ForeignKey( - Semester, null=False, on_delete=models.CASCADE) + semester = models.ForeignKey(Semester, null=False, on_delete=models.CASCADE) name = models.CharField(max_length=100, null=False, blank=False) - type = models.CharField( - max_length=70, choices=COURSESLOT_TYPE_CHOICES, null=False) + type = models.CharField(max_length=70, choices=COURSESLOT_TYPE_CHOICES, null=False) course_slot_info = models.TextField(null=True) courses = models.ManyToManyField(Course, blank=True) duration = models.PositiveIntegerField(default=1) - min_registration_limit = models.PositiveIntegerField(default=0) - max_registration_limit = models.PositiveIntegerField(default=1000) + min_registration_limit = models.PositiveIntegerField(default = 0) + max_registration_limit = models.PositiveIntegerField(default = 1000) - def _str_(self): - return str(Semester._str_(self.semester) + ", " + self.name) + + def __str__(self): + return str(Semester.__str__(self.semester) + ", " + self.name) class Meta: unique_together = ('semester', 'name', 'type') @@ -339,16 +324,154 @@ class Meta: def for_batches(self): return ((Semester.objects.get(id=self.semester.id)).curriculum).batches - class CourseInstructor(models.Model): - course_id = models.ForeignKey(Course, on_delete=models.CASCADE) - instructor_id = models.ForeignKey(ExtraInfo, on_delete=models.CASCADE) - batch_id = models.ForeignKey(Batch, on_delete=models.CASCADE, default=1) - # change extra info to faculty(globals) + course_id = models.ForeignKey(Course, on_delete = models.CASCADE) + instructor_id = models.ForeignKey(ExtraInfo, on_delete = models.CASCADE) + batch_id = models.ForeignKey(Batch, on_delete=models.CASCADE, default=1) + #change extra info to faculty(globals) class Meta: unique_together = ('course_id', 'instructor_id', 'batch_id') - def _self_(self): - return '{} - {}'.format(self.course_id, self.instructor_id) \ No newline at end of file + + def __self__(self): + return '{} - {}'.format(self.course_id, self.instructor_id) + + + + +class CourseProposal(models.Model): + ''' + Current Purpose : To store the details regarding a course + + + + + + ATTRIBUTES : + + code(char) - the course code (eg CS3005) + name(char) - the name of the course(eg Machine Learning) + credit(Integer) - the credits defined for the course + lecture_hours(integer) - lecture hours defined for the course + tutorial_hours(Integer) - tutorial hours defined for the course + practical_hours(Integer) - practical hours defined for the course + discussion_hours(Integer) - discussion hours + project_hours(Integer) - project hours + pre_requisits(Boolean) - denote whether this course has prerequisites(courses that one should take before opting this ) + pre_requisit_courses(programme_curriculum.Course) - link to set of prerequisite courses + syllabus(text) - syllabus described for the course + percent_quiz_1(+ve int) - defined weightage in marking + percent_midsem(+ve int) - defined weightage in marking + percent_quiz_2(+ve int) - defined weightage in marking + percent_endsem (+ve int) - defined weightage in marking + percent_project(+ve int) - defined weightage in marking + percent_lab_evaluation (+ve int) - defined weightage in marking + percent_course_attendance (+ve int) - defined weightage in marking + ref_books(text) - reference books suggested for the course + working_course(boolean) - to denote whether the course is currently in execution or not + disciplines(programme_curriculum.Discipline) - to store which discipline is offering the course + + + ''' + faculty_name=models.CharField(max_length=100, null=False,blank=False) + faculty_code = models.CharField(max_length=10, null=False, blank=False) + code = models.CharField(max_length=10, null=False, blank=False) + name = models.CharField(max_length=100, null=False,blank=False) + credit = models.PositiveIntegerField(default=3, null=False, blank=False) + lecture_hours = PositiveIntegerField(default=3,null=True, ) + tutorial_hours = PositiveIntegerField(default=0,null=True) + pratical_hours = PositiveIntegerField(default=0,null=True) + discussion_hours = PositiveIntegerField(default=0,null=True) + project_hours = PositiveIntegerField(default=0,null=True) + pre_requisits = models.TextField(null=True, blank=True) + pre_requisit_courses = models.ManyToManyField(Course, blank=True) + syllabus = models.TextField() + percent_quiz_1 = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_midsem = models.PositiveIntegerField(default=20, null=False, blank=False) + percent_quiz_2 = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_endsem = models.PositiveIntegerField(default=30, null=False, blank=False) + percent_project = models.PositiveIntegerField(default=15, null=False, blank=False) + percent_lab_evaluation = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_course_attendance = models.PositiveIntegerField(default=5, null=False, blank=False) + ref_books = models.TextField() + disciplines = models.ManyToManyField(Discipline, blank=True) + status = models.PositiveIntegerField(default=0,null=False, blank=False) + + class Meta: + unique_together = ('code', 'faculty_code',) + + def __str__(self): + return str(self.faculty_name + " - " +self.faculty_code+" - "+self.code + " - "+self.name) + + # @property + # def courseslots(self): + # return CourseSlot.objects.filter(courses=self.id) + + + +class UpdateCourseProposal(models.Model): + ''' + Current Purpose : To store the details regarding a update course proposal forms + ATTRIBUTES : + + code(char) - the course code (eg CS3005) + name(char) - the name of the course(eg Machine Learning) + credit(Integer) - the credits defined for the course + lecture_hours(integer) - lecture hours defined for the course + tutorial_hours(Integer) - tutorial hours defined for the course + practical_hours(Integer) - practical hours defined for the course + discussion_hours(Integer) - discussion hours + project_hours(Integer) - project hours + pre_requisits(Boolean) - denote whether this course has prerequisites(courses that one should take before opting this ) + pre_requisit_courses(programme_curriculum.Course) - link to set of prerequisite courses + syllabus(text) - syllabus described for the course + percent_quiz_1(+ve int) - defined weightage in marking + percent_midsem(+ve int) - defined weightage in marking + percent_quiz_2(+ve int) - defined weightage in marking + percent_endsem (+ve int) - defined weightage in marking + percent_project(+ve int) - defined weightage in marking + percent_lab_evaluation (+ve int) - defined weightage in marking + percent_course_attendance (+ve int) - defined weightage in marking + ref_books(text) - reference books suggested for the course + working_course(boolean) - to denote whether the course is currently in execution or not + disciplines(programme_curriculum.Discipline) - to store which discipline is offering the course + + + ''' + faculty_name=models.CharField(max_length=100, null=False,blank=False) + faculty_code = models.CharField(max_length=10, null=False, blank=False) + code = models.CharField(max_length=10, null=False, blank=False) + name = models.CharField(max_length=100, null=False,blank=False) + credit = models.PositiveIntegerField(default=0, null=False, blank=False) + lecture_hours = PositiveIntegerField(null=True, ) + tutorial_hours = PositiveIntegerField(null=True) + pratical_hours = PositiveIntegerField(null=True) + discussion_hours = PositiveIntegerField(null=True) + project_hours = PositiveIntegerField(null=True) + pre_requisits = models.TextField(null=True, blank=True) + pre_requisit_courses = models.ManyToManyField(Course, blank=True) + syllabus = models.TextField() + percent_quiz_1 = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_midsem = models.PositiveIntegerField(default=20, null=False, blank=False) + percent_quiz_2 = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_endsem = models.PositiveIntegerField(default=30, null=False, blank=False) + percent_project = models.PositiveIntegerField(default=15, null=False, blank=False) + percent_lab_evaluation = models.PositiveIntegerField(default=10, null=False, blank=False) + percent_course_attendance = models.PositiveIntegerField(default=5, null=False, blank=False) + ref_books = models.TextField() + working_course = models.BooleanField(default=True) + disciplines = models.ManyToManyField(Discipline, blank=True) + status = models.PositiveIntegerField(default=0,null=False, blank=False) + + class Meta: + unique_together = ('code', 'faculty_code',) + + def __str__(self): + return str(self.faculty_name + " - " +self.faculty_code+" - "+self.code + " - "+self.name) + + # @property + # def courseslots(self): + # return CourseSlot.objects.filter(courses=self.id) + diff --git a/FusionIIIT/templates/programme_curriculum/acad_admin/update_course_form.html b/FusionIIIT/templates/programme_curriculum/acad_admin/update_course_form.html new file mode 100644 index 000000000..3a750e9fc --- /dev/null +++ b/FusionIIIT/templates/programme_curriculum/acad_admin/update_course_form.html @@ -0,0 +1,254 @@ +{% extends 'programme_curriculum/acad_admin/common.html' %} + +{% block sidetabmenu %} +
+{% endblock %} + +{% block content %} +