示例#1
0
    def setUpTestData(cls):
        cls.academic_year_calendar = AcademicYearCalendarFactory()
        cls.school_unit = RegisteredSchoolUnitFactory()
        cls.principal = cls.school_unit.school_principal
        cls.subject1 = SubjectFactory()
        cls.subject2 = SubjectFactory()
        cls.subject3 = SubjectFactory()

        cls.study_class = StudyClassFactory(school_unit=cls.school_unit,
                                            class_grade_arabic=10,
                                            class_grade='X',
                                            class_letter='B')
        TeacherClassThroughFactory(study_class=cls.study_class,
                                   teacher=cls.study_class.class_master,
                                   subject=cls.subject1,
                                   is_class_master=True)
        TeacherClassThroughFactory(study_class=cls.study_class,
                                   teacher=cls.study_class.class_master,
                                   subject=cls.subject2,
                                   is_class_master=True)

        cls.source_study_class = StudyClassFactory(class_grade='X',
                                                   class_grade_arabic=10,
                                                   school_unit=cls.school_unit)
        cls.student = UserProfileFactory(
            user_role=UserProfile.UserRoles.STUDENT,
            school_unit=cls.school_unit,
            student_in_class=cls.source_study_class)

        cls.expected_fields = [
            'id', 'class_grade', 'class_letter', 'academic_year',
            'academic_program', 'academic_program_name', 'class_master',
            'teachers_class_through', 'students', 'has_previous_catalog_data'
        ]
    def test_study_classes_at_risk_teacher(self):
        self.client.login(username=self.teacher.username, password='******')

        study_class1 = StudyClassFactory(school_unit=self.school_unit,
                                         students_at_risk_count=1)
        study_class2 = StudyClassFactory(school_unit=self.school_unit,
                                         students_at_risk_count=2,
                                         class_grade='V',
                                         class_grade_arabic=5)
        study_class3 = StudyClassFactory(school_unit=self.school_unit,
                                         students_at_risk_count=2,
                                         class_grade='IX',
                                         class_grade_arabic=9)
        study_class4 = StudyClassFactory(school_unit=self.school_unit,
                                         students_at_risk_count=0)
        StudyClassFactory(school_unit=self.school_unit,
                          students_at_risk_count=2)

        for study_class in [
                study_class1, study_class2, study_class3, study_class4
        ]:
            TeacherClassThroughFactory(teacher=self.teacher,
                                       study_class=study_class)

        response = self.client.get(self.url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 3)
        for result in response.data['results']:
            self.assertCountEqual(result.keys(), self.expected_fields)
        self.assertEqual(response.data['results'][0]['id'], study_class2.id)
        self.assertEqual(response.data['results'][1]['id'], study_class3.id)
        self.assertEqual(response.data['results'][2]['id'], study_class1.id)
    def test_teacher_detail(self, profile_param):
        self.client.login(username=getattr(self, profile_param).username, password='******')

        profile = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=self.school_unit)
        profile.labels.add(LabelFactory(user_role=UserProfile.UserRoles.TEACHER))
        profile.taught_subjects.add(self.subject)

        study_class1 = StudyClassFactory(school_unit=self.school_unit, class_master=profile, class_grade='IX', class_grade_arabic=9)
        teacher_class_through1 = TeacherClassThroughFactory(study_class=study_class1, teacher=profile, is_class_master=True,
                                                            subject=SubjectFactory(name='A subject'))
        teacher_class_through2 = TeacherClassThroughFactory(study_class=study_class1, teacher=profile, is_class_master=True,
                                                            subject=SubjectFactory(name='Dirigentie', is_coordination=True))
        study_class2 = StudyClassFactory(school_unit=self.school_unit)
        teacher_class_through3 = TeacherClassThroughFactory(study_class=study_class2, teacher=profile)
        study_class3 = StudyClassFactory(school_unit=self.school_unit, academic_year=2019)
        TeacherClassThroughFactory(study_class=study_class3, teacher=profile)

        response = self.client.get(self.build_url(profile.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        expected_fields = ['id', 'full_name', 'user_role', 'email', 'phone_number', 'use_phone_as_username',
                           'is_active', 'last_online', 'labels', 'taught_subjects', 'assigned_study_classes']
        self.assertCountEqual(response.data.keys(), expected_fields)
        self.assertCountEqual(response.data['labels'][0].keys(), ['id', 'text'])
        self.assertCountEqual(response.data['taught_subjects'][0].keys(), ['id', 'name'])
        self.assertEqual(len(response.data['assigned_study_classes']), 3)
        self.assertCountEqual(response.data['assigned_study_classes'][0].keys(), ['id', 'study_class_id', 'class_grade', 'class_letter',
                                                                                  'subject_id', 'subject_name', 'is_optional_subject'])
        self.assertEqual(response.data['assigned_study_classes'][0]['id'], teacher_class_through3.id)
        self.assertEqual(response.data['assigned_study_classes'][1]['id'], teacher_class_through1.id)
        self.assertEqual(response.data['assigned_study_classes'][2]['id'], teacher_class_through2.id)
示例#4
0
    def test_move_student_possible_study_classes_ninth_grade(self):
        self.client.login(username=self.principal.username, password='******')
        self.student.student_in_class = StudyClassFactory(
            class_grade_arabic=9,
            class_grade='IX',
            class_letter='B'
        )
        self.student.save()

        study_class = StudyClassFactory(
            school_unit=self.school_unit,
            class_grade='IX',
            class_grade_arabic=9,
            class_letter='C'
        )

        other_study_class = StudyClassFactory(
            school_unit=self.school_unit,
            class_grade='IX',
            class_grade_arabic=9,
            class_letter='D'
        )

        response = self.client.get(self.build_url(self.student.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertCountEqual([study_class['id'] for study_class in response.data], [study_class.id, other_study_class.id])
        expected_fields = ['id', 'class_grade', 'class_letter']
        for study_class in response.data:
            self.assertCountEqual(study_class.keys(), expected_fields)
示例#5
0
    def test_move_student_possible_study_classes_success(self):
        self.client.login(username=self.principal.username, password='******')

        study_class = StudyClassFactory(school_unit=self.school_unit, class_grade='X', class_letter='B', class_grade_arabic=10)
        past_class = StudyClassFactory(school_unit=self.school_unit, class_grade='IX', class_letter='B', class_grade_arabic=9, academic_year=2019)
        StudentCatalogPerYearFactory(study_class=past_class, avg_final=4.8, academic_year=2019)
        StudentCatalogPerYearFactory(study_class=past_class, avg_final=5.1, academic_year=2019)

        other_study_class = StudyClassFactory(school_unit=self.school_unit, class_grade='X', class_letter='C', class_grade_arabic=10)
        past_class = StudyClassFactory(school_unit=self.school_unit, class_grade='IX', class_letter='C', class_grade_arabic=9, academic_year=2019)
        StudentCatalogPerYearFactory(study_class=past_class, avg_final=4.8, academic_year=2019)

        other_study_class1 = StudyClassFactory(school_unit=self.school_unit, class_grade='X', class_letter='D', class_grade_arabic=10)
        past_class = StudyClassFactory(school_unit=self.school_unit, class_grade='IX', class_letter='D', class_grade_arabic=9, academic_year=2019)
        StudentCatalogPerYearFactory(study_class=past_class, avg_final=5.1, academic_year=2019)

        other_study_class2 = StudyClassFactory(school_unit=self.school_unit, class_grade='X', class_letter='E', class_grade_arabic=10)
        past_class = StudyClassFactory(school_unit=self.school_unit, class_grade='IX', class_letter='E', class_grade_arabic=9, academic_year=2019)
        StudentCatalogPerYearFactory(study_class=past_class, avg_final=4.8, academic_year=2019)

        other_study_class3 = StudyClassFactory(school_unit=self.school_unit, class_grade='XI', class_letter='A', class_grade_arabic=11)
        past_class = StudyClassFactory(school_unit=self.school_unit, class_grade='X', class_letter='A', class_grade_arabic=10, academic_year=2019)
        StudentCatalogPerYearFactory(study_class=past_class, avg_final=4.8, academic_year=2019)

        response = self.client.get(self.build_url(self.student.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertCountEqual([study_class['id'] for study_class in response.data], [study_class.id, other_study_class.id, other_study_class2.id])
        expected_fields = ['id', 'class_grade', 'class_letter']
        for study_class_data in response.data:
            self.assertCountEqual(study_class_data.keys(), expected_fields)

        self.assertEqual(response.data[0]['id'], study_class.id)
        self.assertEqual(response.data[1]['id'], other_study_class.id)
        self.assertEqual(response.data[2]['id'], other_study_class2.id)
示例#6
0
    def test_study_class_partially_update_move_student_from_different_school(self):
        self.client.login(username=self.principal.username, password='******')

        self.new_student.labels.add(
            LabelFactory(text=TRANSFERRED_LABEL, is_label_for_transfers_between_schools=True)
        )
        another_school_unit = RegisteredSchoolUnitFactory()
        another_school_profile = UserProfileFactory(school_unit=another_school_unit, full_name=self.new_student.full_name,
                                                    username='******'.format(another_school_unit.id, self.new_student.email),
                                                    email=self.new_student.email,
                                                    phone_number=self.new_student.phone_number, user_role=UserProfile.UserRoles.STUDENT)

        prev_study_class = StudyClassFactory(school_unit=self.school_unit, class_master=self.teacher1, academic_program=self.academic_program,
                                             class_grade='IX', class_grade_arabic=9, class_letter='A', academic_year=self.calendar.academic_year - 1)
        TeacherClassThroughFactory(study_class=prev_study_class, teacher=self.teacher1, subject=self.coordination_subject, is_class_master=True)
        TeacherClassThroughFactory(study_class=prev_study_class, teacher=self.teacher1, subject=self.subject1, is_class_master=True)
        TeacherClassThroughFactory(study_class=prev_study_class, teacher=self.teacher2, subject=self.subject2, is_class_master=True,
                                   is_optional_subject=True)

        student_prev_study_class = StudyClassFactory(school_unit=another_school_unit, class_grade='IX', class_grade_arabic=9,
                                                     academic_year=self.calendar.academic_year - 1)
        StudentCatalogPerYearFactory(student=another_school_profile, study_class=student_prev_study_class,
                                     avg_sem1=9, avg_sem2=9, avg_annual=9, avg_final=9)
        catalog1 = StudentCatalogPerSubjectFactory(student=another_school_profile, study_class=student_prev_study_class,
                                                   subject=self.coordination_subject, avg_sem1=8, avg_sem2=8, avg_annual=8, avg_final=8)
        SubjectGradeFactory(student=another_school_profile, catalog_per_subject=catalog1, grade=8)
        SubjectAbsenceFactory(student=another_school_profile, catalog_per_subject=catalog1, is_founded=True)

        catalog2 = StudentCatalogPerSubjectFactory(student=another_school_profile, study_class=student_prev_study_class, subject=self.subject2,
                                                   avg_sem1=10, avg_sem2=10, avg_annual=10, avg_final=10)
        ExaminationGradeFactory(student=another_school_profile, catalog_per_subject=catalog2)

        self.request_data = {
            "new_students": [self.new_student.id]
        }

        response = self.client.patch(self.build_url(self.study_class.id), self.request_data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        catalog_per_year = StudentCatalogPerYear.objects.get(student=self.new_student, study_class=prev_study_class)
        for average in [catalog_per_year.avg_sem1, catalog_per_year.avg_sem2, catalog_per_year.avg_annual, catalog_per_year.avg_final]:
            self.assertEqual(average, 9)

        new_catalog1 = StudentCatalogPerSubject.objects.get(student=self.new_student, study_class=prev_study_class,
                                                            subject=self.coordination_subject, teacher=self.teacher1)
        for average in [new_catalog1.avg_sem1, new_catalog1.avg_sem2, new_catalog1.avg_annual, new_catalog1.avg_final]:
            self.assertEqual(average, 8)
        self.assertEqual(new_catalog1.grades.count(), 1)
        self.assertEqual(new_catalog1.absences.count(), 1)

        new_catalog2 = StudentCatalogPerSubject.objects.get(student=self.new_student, study_class=prev_study_class,
                                                            subject=self.subject2, teacher=self.teacher2)
        for average in [new_catalog2.avg_sem1, new_catalog2.avg_sem2, new_catalog2.avg_annual, new_catalog2.avg_final]:
            self.assertEqual(average, 10)
        self.assertEqual(new_catalog2.examination_grades.count(), 1)

        new_catalog3 = StudentCatalogPerSubject.objects.get(student=self.new_student, study_class=prev_study_class,
                                                            subject=self.subject1, teacher=self.teacher1)
        for average in [new_catalog3.avg_sem1, new_catalog3.avg_sem2, new_catalog3.avg_annual, new_catalog3.avg_final]:
            self.assertEqual(average, None)
    def test_study_classes_absences_second_semester(self, mocked_method):
        self.client.login(username=self.principal.username, password='******')
        StudyClassFactory(school_unit=self.school_unit,
                          unfounded_abs_avg_sem1=1,
                          unfounded_abs_avg_annual=1)
        StudyClassFactory(school_unit=self.school_unit,
                          unfounded_abs_avg_sem1=2,
                          unfounded_abs_avg_annual=2)
        StudyClassFactory(school_unit=self.school_unit,
                          unfounded_abs_avg_sem1=None,
                          unfounded_abs_avg_annual=None)
        StudyClassFactory(school_unit=self.school_unit,
                          unfounded_abs_avg_sem1=3,
                          unfounded_abs_avg_annual=3)

        response = self.client.get(self.url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 4)
        for result in response.data['results']:
            self.assertCountEqual(result.keys(), self.expected_fields)
        self.assertEqual(
            response.data['results'][0]['unfounded_abs_avg_annual'], 3)
        self.assertEqual(
            response.data['results'][1]['unfounded_abs_avg_annual'], 2)
        self.assertEqual(
            response.data['results'][2]['unfounded_abs_avg_annual'], 1)
        self.assertEqual(
            response.data['results'][3]['unfounded_abs_avg_annual'], None)
示例#8
0
    def test_students_risk_evolution_teacher(self):
        self.client.login(username=self.teacher.username, password='******')
        StudentAtRiskCountsFactory(study_class=StudyClassFactory(school_unit=self.school_unit), year=self.today.year, month=self.today.month)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 0)

        StudentAtRiskCountsFactory(study_class=StudyClassFactory(school_unit=self.school_unit, class_master=self.teacher),
                                   year=self.today.year, month=self.today.month)
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 1)
示例#9
0
    def setUpTestData(cls):
        cls.principal = UserProfileFactory(user_role=UserProfile.UserRoles.PRINCIPAL)
        cls.school_unit = RegisteredSchoolUnitFactory(school_principal=cls.principal)

        cls.category1 = SchoolUnitCategoryFactory(category_level=SchoolUnitCategory.CategoryLevels.SECONDARY_SCHOOL)
        cls.category2 = SchoolUnitCategoryFactory(category_level=SchoolUnitCategory.CategoryLevels.HIGHSCHOOL)
        cls.school_unit.categories.add(cls.category1, cls.category2)

        cls.calendar = AcademicYearCalendarFactory()

        cls.subject1 = SubjectFactory()
        cls.subject2 = SubjectFactory()
        cls.coordination_subject = SubjectFactory(is_coordination=True)
        cls.academic_program = AcademicProgramFactory(school_unit=cls.school_unit)
        for class_grade, class_grade_arabic in zip(['VI', 'X'], [6, 10]):
            ProgramSubjectThroughFactory(academic_program=cls.academic_program, subject=cls.subject1,
                                         is_mandatory=False, class_grade=class_grade, class_grade_arabic=class_grade_arabic)
            ProgramSubjectThroughFactory(generic_academic_program=cls.academic_program.generic_academic_program,
                                         subject=cls.subject2, class_grade=class_grade, class_grade_arabic=class_grade_arabic)

        cls.teacher1 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.teacher2 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.teacher1.taught_subjects.add(cls.subject1, cls.subject2)
        cls.teacher2.taught_subjects.add(cls.subject1, cls.subject2)

        cls.study_class1 = StudyClassFactory(school_unit=cls.school_unit, class_master=cls.teacher1, academic_program=cls.academic_program,
                                             class_grade='X', class_grade_arabic=10, class_letter='A')
        TeacherClassThroughFactory(study_class=cls.study_class1, teacher=cls.teacher1, subject=cls.coordination_subject, is_class_master=True)
        cls.study_class2 = StudyClassFactory(school_unit=cls.school_unit, class_master=cls.teacher2, academic_program=cls.academic_program)
        TeacherClassThroughFactory(study_class=cls.study_class2, teacher=cls.teacher2, subject=cls.coordination_subject, is_class_master=True)

        TeacherClassThroughFactory(study_class=cls.study_class1, teacher=cls.teacher1, subject=cls.subject1, is_class_master=True)
        TeacherClassThroughFactory(study_class=cls.study_class1, teacher=cls.teacher2, subject=cls.subject2, is_class_master=False)
        TeacherClassThroughFactory(study_class=cls.study_class2, teacher=cls.teacher1, subject=cls.subject1, is_class_master=False)
        TeacherClassThroughFactory(study_class=cls.study_class2, teacher=cls.teacher2, subject=cls.subject2, is_class_master=True)

        cls.student1 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class1)
        StudentCatalogPerYearFactory(student=cls.student1, study_class=cls.study_class1)
        cls.student2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class1)
        StudentCatalogPerYearFactory(student=cls.student2, study_class=cls.study_class1)
        cls.student3 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class2)
        StudentCatalogPerYearFactory(student=cls.student3, study_class=cls.study_class2)

        cls.academic_program2 = AcademicProgramFactory(school_unit=cls.school_unit)
        for class_grade, class_grade_arabic in zip(['VII', 'XI'], [7, 11]):
            ProgramSubjectThroughFactory(academic_program=cls.academic_program2, subject=cls.subject1,
                                         is_mandatory=False, class_grade=class_grade, class_grade_arabic=class_grade_arabic)
            ProgramSubjectThroughFactory(generic_academic_program=cls.academic_program2.generic_academic_program,
                                         subject=cls.subject2, class_grade=class_grade, class_grade_arabic=class_grade_arabic)

        cls.new_teacher = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.new_student = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit)
 def setUpTestData(cls):
     cls.school_unit = RegisteredSchoolUnitFactory()
     cls.principal = cls.school_unit.school_principal
     cls.study_class = StudyClassFactory(school_unit=cls.school_unit,
                                         class_grade_arabic=11,
                                         class_grade='XI')
     cls.generic_academic_program = cls.study_class.academic_program.generic_academic_program
     cls.academic_year_calendar = AcademicYearCalendarFactory()
     cls.student = UserProfileFactory(
         user_role=UserProfile.UserRoles.STUDENT,
         school_unit=cls.school_unit,
         student_in_class=StudyClassFactory(class_grade='XI',
                                            class_grade_arabic=11))
示例#11
0
    def test_own_study_class_pupil_detail_is_not_class_master(self):
        self.client.login(username=self.teacher.username, password='******')
        study_class = StudyClassFactory(school_unit=self.school_unit)

        response = self.client.get(
            self.build_url(study_class.id, self.student.id))
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
    def setUpTestData(cls):
        cls.calendar = AcademicYearCalendarFactory()
        cls.school_unit = RegisteredSchoolUnitFactory()
        cls.school_stats = SchoolUnitStatsFactory(school_unit=cls.school_unit)

        cls.teacher = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.study_class = StudyClassFactory(school_unit=cls.school_unit, class_master=cls.teacher)
        cls.subject = SubjectFactory()
        ProgramSubjectThroughFactory(academic_program=cls.study_class.academic_program, subject=cls.subject, weekly_hours_count=3,
                                     class_grade=cls.study_class.class_grade, class_grade_arabic=cls.study_class.class_grade_arabic)
        TeacherClassThroughFactory(teacher=cls.teacher, study_class=cls.study_class, is_class_master=True, subject=cls.subject)

        cls.student1 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class)
        cls.catalog1 = StudentCatalogPerSubjectFactory(student=cls.student1, study_class=cls.study_class, teacher=cls.teacher, subject=cls.subject)
        cls.catalog_per_year1 = StudentCatalogPerYearFactory(student=cls.student1, study_class=cls.study_class)
        cls.student2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class)
        cls.catalog2 = StudentCatalogPerSubjectFactory(student=cls.student2, study_class=cls.study_class, teacher=cls.teacher, subject=cls.subject)
        cls.catalog_per_year2 = StudentCatalogPerYearFactory(student=cls.student2, study_class=cls.study_class)

        cls.expected_fields = [
            'id', 'student', 'avg_sem1', 'avg_sem2', 'avg_annual', 'avg_after_2nd_examination', 'avg_limit', 'abs_count_sem1', 'abs_count_sem2',
            'abs_count_annual', 'founded_abs_count_sem1', 'founded_abs_count_sem2', 'founded_abs_count_annual', 'unfounded_abs_count_sem1',
            'unfounded_abs_count_sem2', 'unfounded_abs_count_annual', 'grades_sem1', 'grades_sem2', 'abs_sem1', 'abs_sem2',
            'second_examination_grades', 'difference_grades_sem1', 'difference_grades_sem2', 'wants_thesis', 'is_exempted',
            'third_of_hours_count_sem1', 'third_of_hours_count_sem2', 'third_of_hours_count_annual', 'is_coordination_subject'
        ]
示例#13
0
    def setUpTestData(cls):
        cls.principal = UserProfileFactory(user_role=UserProfile.UserRoles.PRINCIPAL)
        cls.school_unit = RegisteredSchoolUnitFactory(school_principal=cls.principal)

        cls.calendar = AcademicYearCalendarFactory()

        cls.subject1 = SubjectFactory()
        cls.subject2 = SubjectFactory()
        cls.coordination_subject = SubjectFactory(is_coordination=True)

        cls.academic_program = AcademicProgramFactory(school_unit=cls.school_unit)
        ProgramSubjectThroughFactory(generic_academic_program=cls.academic_program.generic_academic_program,
                                     subject=cls.subject1, class_grade='X', class_grade_arabic=10)
        ProgramSubjectThroughFactory(academic_program=cls.academic_program, subject=cls.subject2,
                                     is_mandatory=False, class_grade='X', class_grade_arabic=10)

        cls.teacher1 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.teacher2 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.teacher1.taught_subjects.add(cls.subject1)
        cls.teacher2.taught_subjects.add(cls.subject1)

        cls.study_class = StudyClassFactory(school_unit=cls.school_unit, class_master=cls.teacher1, academic_program=cls.academic_program,
                                            class_grade='X', class_grade_arabic=10, class_letter='A')

        cls.student1 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class)
        StudentCatalogPerYearFactory(student=cls.student1, study_class=cls.study_class)
        cls.student2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit, student_in_class=cls.study_class)
        StudentCatalogPerYearFactory(student=cls.student2, study_class=cls.study_class)

        cls.new_student = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=cls.school_unit)
    def test_study_class_cloned_to_next_year_wrong_class_grade(self, class_grade, class_grade_arabic):
        self.client.login(username=self.principal.username, password='******')

        response = self.client.get(self.build_url(StudyClassFactory(school_unit=self.school_unit, academic_year=self.last_year,
                                                                    class_grade=class_grade, class_grade_arabic=class_grade_arabic).id))
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['message'], 'This study class cannot be cloned.')
示例#15
0
    def test_study_class_partially_update_teachers_primary_school(self):
        self.client.login(username=self.principal.username, password='******')

        primary_study_class = StudyClassFactory(school_unit=self.school_unit, class_grade='I', class_grade_arabic=1)
        class_master = primary_study_class.class_master
        TeacherClassThroughFactory(study_class=primary_study_class, teacher=class_master, is_class_master=True)

        teacher = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=self.school_unit)
        subject = SubjectFactory()
        teacher.taught_subjects.add(subject)
        teacher_class_through = TeacherClassThroughFactory(study_class=primary_study_class, teacher=teacher, is_class_master=False)

        url = self.build_url(primary_study_class.id)
        request_data = {
            'updated_teachers': [
                {
                    'id': teacher_class_through.id,
                    'teacher': class_master.id
                }
            ]
        }

        # This is allowed even if the teacher doesn't have the subject in taught subjects list
        # (because the teacher is the class master)
        response = self.client.patch(url, request_data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        teacher_class_through.refresh_from_db()
        self.assertEqual(teacher_class_through.teacher, class_master)
        self.assertTrue(teacher_class_through.is_class_master)
示例#16
0
    def test_study_class_update_validate_class_master(self, timezone_mock):
        timezone_mock.return_value = datetime.datetime(self.calendar.academic_year, 9, 14, tzinfo=tz.UTC)
        self.client.login(username=self.principal.username, password='******')
        url = self.build_url(self.study_class2.id)

        # Not a teacher
        profile1 = UserProfileFactory(user_role=UserProfile.UserRoles.PARENT, school_unit=self.school_unit)
        # From a different school
        profile2 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=RegisteredSchoolUnitFactory())
        # Already a class master
        profile3 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=self.school_unit)
        StudyClassFactory(school_unit=self.school_unit, class_master=profile3, class_letter='B')
        # Inactive teacher
        profile4 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=self.school_unit, is_active=False)

        for profile in [profile1, profile2, profile3, profile4]:
            self.highschool_request_data['class_master'] = profile.id

            response = self.client.put(url, self.highschool_request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['class_master'], ['Invalid user.'])

        self.highschool_request_data['class_master'] = 0

        response = self.client.put(url, self.highschool_request_data)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['class_master'], ['Invalid pk "0" - object does not exist.'])
示例#17
0
    def test_study_class_delete_class_with_data(self, timezone_mock):
        timezone_mock.return_value = datetime.datetime(
            self.calendar.academic_year, 9, 14, tzinfo=tz.UTC)
        self.client.login(username=self.principal.username, password='******')

        StudyClassFactory(school_unit=self.school_unit,
                          class_grade='P',
                          class_grade_arabic=0,
                          academic_year=self.calendar.academic_year - 1)
        study_class = StudyClassFactory(school_unit=self.school_unit,
                                        class_grade='I',
                                        class_grade_arabic=1)
        response = self.client.delete(self.build_url(study_class.id))
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['message'],
                         'Cannot delete the study class.')
    def test_catalog_export_does_not_teach_class(self):
        self.client.login(username=self.teacher.username, password='******')
        self.teacher_class_through.study_class = StudyClassFactory()
        self.teacher_class_through.save()

        response = self.client.get(self.build_url(self.study_class.id, self.subject.id))
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
    def test_study_class_receiver_counts_study_class_from_another_school(self):
        self.client.login(username=self.principal.username, password='******')
        school_unit = RegisteredSchoolUnitFactory()
        study_class = StudyClassFactory(school_unit=school_unit)

        response = self.client.get(self.build_url(study_class.id))
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
示例#20
0
    def test_move_student_possible_study_classes_no_possible_classes(self):
        self.client.login(username=self.principal.username, password='******')

        # No study classes in the current year
        study_class = StudyClassFactory(
            school_unit=self.school_unit,
            class_grade='IX',
            class_grade_arabic=9,
            academic_year=self.current_class.academic_year - 1
        )

        response = self.client.get(self.build_url(self.student.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, [])

        # No study classes with a low enough entry grade
        StudentCatalogPerYearFactory(
            study_class=study_class,
            academic_year=study_class.academic_year - 1,
            avg_final=5.1
        )

        response = self.client.get(self.build_url(self.student.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, [])
示例#21
0
    def test_study_class_update_validate_academic_program(self, timezone_mock):
        timezone_mock.return_value = datetime.datetime(self.calendar.academic_year, 9, 14, tzinfo=tz.UTC)
        self.client.login(username=self.principal.username, password='******')

        program1 = AcademicProgramFactory(school_unit=self.school_unit, academic_year=2010)
        program2 = AcademicProgramFactory(school_unit=RegisteredSchoolUnitFactory())
        program3 = AcademicProgramFactory(school_unit=self.school_unit)
        program3.generic_academic_program.category.category_level = SchoolUnitCategory.CategoryLevels.PRIMARY_SCHOOL
        program3.generic_academic_program.category.save()

        for program in [program1, program2, program3]:
            self.highschool_request_data['academic_program'] = program.id

            url = self.build_url(self.study_class1.id)
            response = self.client.put(url, self.highschool_request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data, {'academic_program': ['Invalid academic program.']})

        StudyClassFactory(school_unit=self.school_unit, class_master=self.teacher1, class_grade='IX', class_grade_arabic=9,
                          academic_year=self.study_class1.academic_year - 1)
        self.highschool_request_data['academic_program'] = self.academic_program2.id
        self.highschool_request_data['class_grade'] = 'X'
        response = self.client.put(url, self.highschool_request_data)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['academic_program'], ['Cannot change the academic program for a class that has previous catalog data.'])
示例#22
0
    def test_study_class_partially_update_validate_new_students(self):
        self.client.login(username=self.principal.username, password='******')
        url = self.build_url(self.study_class.id)

        # Not a student
        profile1 = UserProfileFactory(user_role=UserProfile.UserRoles.PARENT, school_unit=self.school_unit)
        # Inactive student
        profile2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=self.school_unit, is_active=False)

        for profile_id in [profile1.id, profile2.id, 0]:
            self.request_data['new_students'] = [profile_id, ]

            response = self.client.patch(url, self.request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['new_students'], [f'Invalid pk "{profile_id}" - object does not exist.'])

        # From a different school
        profile1 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=RegisteredSchoolUnitFactory())
        # Already in a study class
        study_class = StudyClassFactory(school_unit=self.school_unit, class_letter='B')
        profile2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=self.school_unit, student_in_class=study_class)

        for profile_id in [profile1.id, profile2.id]:
            self.request_data['new_students'] = [profile_id, ]

            response = self.client.patch(url, self.request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['new_students'], ['At least one student is invalid.'])
示例#23
0
    def setUpTestData(cls):
        cls.academic_calendar = AcademicYearCalendarFactory()
        cls.school_unit = RegisteredSchoolUnitFactory()
        cls.school_stats = SchoolUnitStatsFactory(school_unit=cls.school_unit)

        cls.teacher = UserProfileFactory(
            user_role=UserProfile.UserRoles.TEACHER,
            school_unit=cls.school_unit)
        cls.study_class = StudyClassFactory(school_unit=cls.school_unit)
        cls.subject = SubjectFactory()
        cls.teacher_class_through = TeacherClassThroughFactory(
            study_class=cls.study_class,
            teacher=cls.teacher,
            subject=cls.subject)
        ProgramSubjectThroughFactory(
            academic_program=cls.study_class.academic_program,
            subject=cls.subject,
            weekly_hours_count=1,
            class_grade=cls.study_class.class_grade,
            class_grade_arabic=cls.study_class.class_grade_arabic)

        cls.student = UserProfileFactory(
            user_role=UserProfile.UserRoles.STUDENT,
            full_name='a',
            student_in_class=cls.study_class)
        cls.catalog = StudentCatalogPerSubjectFactory(
            subject=cls.subject,
            teacher=cls.teacher,
            student=cls.student,
            study_class=cls.study_class,
            is_enrolled=True)
        cls.catalog_per_year = StudentCatalogPerYearFactory(
            student=cls.student, study_class=cls.study_class)
示例#24
0
    def setUpTestData(cls):
        cls.school_unit = RegisteredSchoolUnitFactory()
        cls.teacher = UserProfileFactory(
            user_role=UserProfile.UserRoles.TEACHER,
            school_unit=cls.school_unit)
        cls.academic_year = 2020
        cls.study_class = StudyClassFactory(school_unit=cls.school_unit,
                                            class_master=cls.teacher,
                                            class_grade='IX',
                                            class_grade_arabic=9)
        cls.coordination_subject = SubjectFactory(name='Dirigentie',
                                                  is_coordination=True)
        TeacherClassThroughFactory(study_class=cls.study_class,
                                   teacher=cls.teacher,
                                   subject=cls.coordination_subject,
                                   is_class_master=True)

        cls.subject1 = SubjectFactory(name='Subject')
        cls.subject2 = SubjectFactory(name='Another Subject')

        cls.expected_fields = [
            'id', 'class_grade', 'class_letter', 'academic_year',
            'academic_program_name', 'class_master', 'taught_subjects',
            'is_class_master'
        ]
        cls.class_master_fields = ['id', 'full_name']
        cls.taught_subject_fields = [
            'id', 'name', 'is_coordination', 'allows_exemption', 'is_optional'
        ]
示例#25
0
    def test_study_class_update_validate_students(self, timezone_mock):
        timezone_mock.return_value = datetime.datetime(self.calendar.academic_year, 9, 14, tzinfo=tz.UTC)
        self.client.login(username=self.principal.username, password='******')
        url = self.build_url(self.study_class2.id)

        # Not a student
        profile1 = UserProfileFactory(user_role=UserProfile.UserRoles.PARENT, school_unit=self.school_unit)
        # Inactive student
        profile2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=self.school_unit, is_active=False)

        for profile_id in [profile1.id, profile2.id, 0]:
            self.highschool_request_data['students'] = [profile_id, ]

            response = self.client.put(url, self.highschool_request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['students'], [f'Invalid pk "{profile_id}" - object does not exist.'])

        # From a different school
        profile1 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=RegisteredSchoolUnitFactory())
        # Already in a study class
        study_class = StudyClassFactory(school_unit=self.school_unit, class_letter='B')
        profile2 = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, school_unit=self.school_unit, student_in_class=study_class)

        for profile_id in [profile1.id, profile2.id]:
            self.highschool_request_data['students'] = [profile_id, ]

            response = self.client.put(url, self.highschool_request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['students'], ['At least one student is invalid.'])
    def setUpTestData(cls):
        cls.academic_calendar = AcademicYearCalendarFactory()
        cls.academic_year = cls.academic_calendar.academic_year
        cls.starts_at = datetime.date(2020, 10, 21)
        cls.ends_at = datetime.date(2020, 10, 27)

        cls.school = RegisteredSchoolUnitFactory()
        cls.study_class = StudyClassFactory(school_unit=cls.school)
        cls.student = UserProfileFactory(
            school_unit=cls.school,
            user_role=UserProfile.UserRoles.STUDENT,
            student_in_class=cls.study_class,
            full_name="Pop Ionut")

        cls.subject1 = SubjectFactory(name='Limba Romana')
        cls.subject2 = SubjectFactory(name='Matematica')

        cls.catalog1 = StudentCatalogPerSubjectFactory(
            student=cls.student,
            study_class=cls.study_class,
            subject=cls.subject1)
        cls.catalog2 = StudentCatalogPerSubjectFactory(
            student=cls.student,
            study_class=cls.study_class,
            subject=cls.subject2)
示例#27
0
    def test_own_study_class_detail_not_class_master(self):
        self.client.login(username=self.teacher.username, password='******')

        study_class = StudyClassFactory(school_unit=self.school_unit)
        TeacherClassThroughFactory(study_class=study_class,
                                   teacher=self.teacher,
                                   subject=self.subject1,
                                   is_class_master=True)
        TeacherClassThroughFactory(study_class=study_class,
                                   teacher=self.teacher,
                                   subject=self.subject2,
                                   is_class_master=True,
                                   is_optional_subject=True)

        response = self.client.get(self.build_url(study_class.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertCountEqual(response.data.keys(), self.expected_fields)
        self.assertCountEqual(response.data['class_master'].keys(),
                              self.class_master_fields)
        self.assertEqual(len(response.data['taught_subjects']), 2)
        self.assertCountEqual(response.data['taught_subjects'][0].keys(),
                              self.taught_subject_fields)
        self.assertFalse(response.data['is_class_master'])

        self.assertEqual(response.data['taught_subjects'][0]['id'],
                         self.subject2.id)
        self.assertTrue(response.data['taught_subjects'][0]['is_optional'])
        self.assertEqual(response.data['taught_subjects'][1]['id'],
                         self.subject1.id)
        self.assertFalse(response.data['taught_subjects'][1]['is_optional'])
示例#28
0
    def test_study_class_partially_update_validate_class_master(self):
        self.client.login(username=self.principal.username, password='******')
        url = self.build_url(self.study_class.id)

        # Not a teacher
        profile1 = UserProfileFactory(user_role=UserProfile.UserRoles.PARENT, school_unit=self.school_unit)
        # From a different school
        profile2 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=RegisteredSchoolUnitFactory())
        # Already a class master
        profile3 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=self.school_unit)
        StudyClassFactory(school_unit=self.school_unit, class_master=profile3, class_letter='B')
        # Inactive teacher
        profile4 = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=self.school_unit, is_active=False)

        for profile in [profile1, profile2, profile3, profile4]:
            self.request_data['class_master'] = profile.id

            response = self.client.patch(url, self.request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['class_master'], ['Invalid user.'])

        self.request_data['class_master'] = 0

        response = self.client.patch(url, self.request_data)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['class_master'], ['Invalid pk "0" - object does not exist.'])
示例#29
0
    def setUpTestData(cls):
        cls.academic_calendar = AcademicYearCalendarFactory()
        cls.corigente_event = SchoolEventFactory(
            event_type=SchoolEvent.EventTypes.CORIGENTE,
            academic_year_calendar=cls.academic_calendar,
            starts_at=datetime.date(2020, 8, 20),
            ends_at=datetime.date(2020, 8, 27))
        cls.diferente_event = SchoolEventFactory(
            event_type=SchoolEvent.EventTypes.DIFERENTE,
            academic_year_calendar=cls.academic_calendar,
            starts_at=datetime.date(2020, 9, 1),
            ends_at=datetime.date(2020, 9, 8))

        cls.school_unit = RegisteredSchoolUnitFactory()
        cls.school_stats = SchoolUnitStatsFactory(school_unit=cls.school_unit)

        cls.teacher = UserProfileFactory(
            user_role=UserProfile.UserRoles.TEACHER,
            school_unit=cls.school_unit)
        cls.study_class = StudyClassFactory(school_unit=cls.school_unit,
                                            class_grade='IX',
                                            class_grade_arabic=9)
        cls.subject = SubjectFactory()
        ProgramSubjectThroughFactory(
            academic_program=cls.study_class.academic_program,
            class_grade='IX',
            subject=cls.subject,
            weekly_hours_count=3)

        cls.student = UserProfileFactory(
            user_role=UserProfile.UserRoles.STUDENT,
            student_in_class=cls.study_class)
        cls.teacher_class_through = TeacherClassThroughFactory(
            study_class=cls.study_class,
            teacher=cls.teacher,
            subject=cls.subject)
        cls.catalog = StudentCatalogPerSubjectFactory(
            subject=cls.subject,
            teacher=cls.teacher,
            student=cls.student,
            study_class=cls.study_class)
        cls.catalog_per_year = StudentCatalogPerYearFactory(
            student=cls.student, study_class=cls.study_class)

        cls.expected_fields = [
            'id', 'student', 'avg_sem1', 'avg_sem2', 'avg_annual',
            'avg_after_2nd_examination', 'avg_limit', 'abs_count_sem1',
            'abs_count_sem2', 'abs_count_annual', 'founded_abs_count_sem1',
            'founded_abs_count_sem2', 'founded_abs_count_annual',
            'unfounded_abs_count_sem1', 'unfounded_abs_count_sem2',
            'unfounded_abs_count_annual', 'grades_sem1', 'grades_sem2',
            'abs_sem1', 'abs_sem2', 'second_examination_grades',
            'difference_grades_sem1', 'difference_grades_sem2', 'wants_thesis',
            'is_exempted', 'third_of_hours_count_sem1',
            'third_of_hours_count_sem2', 'third_of_hours_count_annual',
            'is_coordination_subject'
        ]
        cls.examination_grade_fields = [
            'id', 'examination_type', 'taken_at', 'grade1', 'grade2', 'created'
        ]
    def setUpTestData(cls):
        cls.academic_calendar = AcademicYearCalendarFactory()
        cls.corigente_event = SchoolEventFactory(event_type=SchoolEvent.EventTypes.CORIGENTE, academic_year_calendar=cls.academic_calendar,
                                                 starts_at=datetime.date(2020, 8, 20), ends_at=datetime.date(2020, 8, 27))
        cls.diferente_event = SchoolEventFactory(event_type=SchoolEvent.EventTypes.DIFERENTE, academic_year_calendar=cls.academic_calendar,
                                                 starts_at=datetime.date(2020, 9, 1), ends_at=datetime.date(2020, 9, 8))

        cls.school_unit = RegisteredSchoolUnitFactory()
        cls.school_stats = SchoolUnitStatsFactory(school_unit=cls.school_unit)

        cls.teacher = UserProfileFactory(user_role=UserProfile.UserRoles.TEACHER, school_unit=cls.school_unit)
        cls.study_class = StudyClassFactory(school_unit=cls.school_unit, class_grade='IX', class_grade_arabic=9)
        cls.subject = SubjectFactory()
        ProgramSubjectThroughFactory(academic_program=cls.study_class.academic_program, class_grade='IX',
                                     subject=cls.subject, weekly_hours_count=3)

        cls.teacher_class_through = TeacherClassThroughFactory(
            study_class=cls.study_class,
            teacher=cls.teacher,
            subject=cls.subject
        )
        cls.student = UserProfileFactory(user_role=UserProfile.UserRoles.STUDENT, student_in_class=cls.study_class)
        cls.catalog = StudentCatalogPerSubjectFactory(
            subject=cls.subject,
            teacher=cls.teacher,
            student=cls.student,
            study_class=cls.study_class,
            is_enrolled=True
        )
        cls.catalog_per_year = StudentCatalogPerYearFactory(
            student=cls.student,
            study_class=cls.study_class
        )