예제 #1
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.'])
예제 #2
0
    def test_academic_program_list_filter_by_category(self):
        self.client.login(username=self.principal.username, password='******')
        highschool_category = SchoolUnitCategoryFactory()
        self.school_unit.categories.add(highschool_category)

        AcademicProgramFactory(
            academic_year=self.academic_year,
            name='program',
            school_unit=self.school_unit,
            generic_academic_program=GenericAcademicProgramFactory(
                category=highschool_category))
        AcademicProgramFactory(
            academic_year=self.academic_year,
            name='other',
            school_unit=self.school_unit,
            generic_academic_program=GenericAcademicProgramFactory(
                category=highschool_category))

        response = self.client.get(self.build_url(self.academic_year),
                                   {'class_grade': 'IX'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['count'], 2)

        response = self.client.get(self.build_url(self.academic_year),
                                   {'class_grade': 'IV'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['count'], 0)
    def setUpTestData(cls):
        cls.calendar = AcademicYearCalendarFactory()
        cls.last_year = cls.calendar.academic_year - 1

        cls.principal = UserProfileFactory(user_role=UserProfile.UserRoles.PRINCIPAL)
        cls.school_unit = RegisteredSchoolUnitFactory(school_principal=cls.principal)

        cls.last_year_program = AcademicProgramFactory(school_unit=cls.school_unit, academic_year=cls.last_year)
        cls.current_year_program = AcademicProgramFactory(school_unit=cls.school_unit, name=cls.last_year_program.name, academic_year=cls.last_year + 1)

        cls.study_class = StudyClassFactory(school_unit=cls.school_unit, academic_program=cls.last_year_program, academic_year=cls.last_year)
예제 #4
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 test_generate_next_year_academic_programs(self):
        current_calendar = AcademicYearCalendarFactory()

        program1 = AcademicProgramFactory(
            academic_year=current_calendar.academic_year - 1)
        ProgramSubjectThroughFactory(academic_program=program1,
                                     subject=SubjectFactory())

        program2 = AcademicProgramFactory(
            academic_year=current_calendar.academic_year - 1)
        ProgramSubjectThroughFactory(academic_program=program2,
                                     subject=SubjectFactory())

        generate_next_year_academic_programs()

        self.assertEqual(
            AcademicProgram.objects.filter(
                academic_year=current_calendar.academic_year).count(), 2)
        cloned_program1 = AcademicProgram.objects.filter(
            name=program1.name,
            academic_year=current_calendar.academic_year).first()
        self.assertIsNotNone(cloned_program1)
        cloned_program2 = AcademicProgram.objects.filter(
            name=program2.name,
            academic_year=current_calendar.academic_year).first()
        self.assertIsNotNone(cloned_program2)

        for field in [
                'avg_sem1', 'avg_sem2', 'avg_annual', 'unfounded_abs_avg_sem1',
                'unfounded_abs_avg_sem2', 'unfounded_abs_avg_annual'
        ]:
            self.assertIsNone(getattr(cloned_program1, field))
            self.assertIsNone(getattr(cloned_program2, field))
        for field in ['classes_count', 'students_at_risk_count']:
            self.assertEqual(getattr(cloned_program1, field), 0)
            self.assertEqual(getattr(cloned_program2, field), 0)

        self.assertEqual(ProgramSubjectThrough.objects.count(), 4)
        self.assertEqual(
            ProgramSubjectThrough.objects.filter(
                academic_program__academic_year=current_calendar.academic_year
            ).count(), 2)
        self.assertTrue(
            ProgramSubjectThrough.objects.filter(
                academic_program=cloned_program1).exists())
        self.assertTrue(
            ProgramSubjectThrough.objects.filter(
                academic_program=cloned_program2).exists())
예제 #6
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 setUpTestData(cls):
     cls.principal = UserProfileFactory(
         user_role=UserProfile.UserRoles.PRINCIPAL)
     cls.school_unit = RegisteredSchoolUnitFactory(
         school_principal=cls.principal)
     cls.generic_academic_program = GenericAcademicProgramFactory(
         optional_subjects_weekly_hours={
             "IX": 10,
             "X": 1
         },
         academic_profile=cls.school_unit.academic_profile,
     )
     cls.school_unit.categories.add(cls.generic_academic_program.category)
     cls.academic_year = 2020
     cls.academic_year_calendar = AcademicYearCalendarFactory(
         academic_year=cls.academic_year)
     cls.academic_program = AcademicProgramFactory(
         school_unit=cls.school_unit,
         generic_academic_program=cls.generic_academic_program,
         academic_year=cls.academic_year)
     cls.subject = SubjectFactory(name='Subject')
     cls.subject_through = ProgramSubjectThroughFactory(
         academic_program=cls.academic_program,
         subject=cls.subject,
         class_grade='IX',
         class_grade_arabic=9)
예제 #8
0
 def setUpTestData(cls):
     cls.principal = UserProfileFactory(
         user_role=UserProfile.UserRoles.PRINCIPAL)
     cls.school_unit = RegisteredSchoolUnitFactory(
         school_principal=cls.principal)
     cls.academic_program = AcademicProgramFactory(
         school_unit=cls.school_unit)
    def test_study_class_create_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())

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

            response = self.client.post(self.url, self.highschool_request_data)
            self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
            self.assertEqual(response.data['academic_program'],
                             ['Invalid academic program.'])
    def test_academic_programs_at_risk_success(self):
        self.client.login(username=self.principal.username, password='******')

        academic_program1 = AcademicProgramFactory(
            students_at_risk_count=2, school_unit=self.school_unit)
        academic_program2 = AcademicProgramFactory(
            students_at_risk_count=1, school_unit=self.school_unit)
        academic_program3 = AcademicProgramFactory(
            students_at_risk_count=3, name='a', school_unit=self.school_unit)
        academic_program4 = AcademicProgramFactory(
            students_at_risk_count=3, name='b', school_unit=self.school_unit)
        AcademicProgramFactory(students_at_risk_count=0,
                               school_unit=self.school_unit)
        AcademicProgramFactory(students_at_risk_count=1,
                               academic_year=2018,
                               school_unit=self.school_unit)
        AcademicProgramFactory(students_at_risk_count=1)

        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(),
                                  ['id', 'name', 'students_at_risk_count'])
        self.assertEqual(response.data['results'][0]['id'],
                         academic_program3.id)
        self.assertEqual(response.data['results'][1]['id'],
                         academic_program4.id)
        self.assertEqual(response.data['results'][2]['id'],
                         academic_program1.id)
        self.assertEqual(response.data['results'][3]['id'],
                         academic_program2.id)
    def test_academic_program_create_existing_program(self, mocked_method):
        self.client.login(username=self.principal.username, password='******')

        AcademicProgramFactory(generic_academic_program=self.generic_academic_program,
                               school_unit=self.school_unit, academic_year=self.academic_year)

        response = self.client.post(self.build_url(self.academic_year), self.data)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data, {'generic_academic_program': ['You already defined this program this year.']})
예제 #12
0
    def test_academic_programs_averages_second_semester(self, mocked_method):
        self.client.login(username=self.principal.username, password='******')
        AcademicProgramFactory(avg_sem1=1,
                               avg_annual=1,
                               school_unit=self.school_unit)
        AcademicProgramFactory(avg_sem1=2,
                               avg_annual=2,
                               school_unit=self.school_unit)
        AcademicProgramFactory(avg_sem2=3,
                               avg_annual=3,
                               school_unit=self.school_unit)

        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]['avg_annual'], 3)
        self.assertEqual(response.data['results'][1]['avg_annual'], 2)
        self.assertEqual(response.data['results'][2]['avg_annual'], 1)
예제 #13
0
    def test_academic_program_list_success(self):
        self.client.login(username=self.principal.username, password='******')

        academic_program = AcademicProgramFactory(
            academic_year=self.academic_year, school_unit=self.school_unit)
        academic_program2 = AcademicProgramFactory(
            academic_year=self.academic_year, school_unit=self.school_unit)
        AcademicProgramFactory(academic_year=self.academic_year,
                               school_unit=RegisteredSchoolUnitFactory())
        AcademicProgramFactory(academic_year=2000,
                               school_unit=self.school_unit)

        response = self.client.get(self.build_url(self.academic_year))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data['results']), 2)
        self.assertEqual(response.data['count'], 2)

        for program in response.data['results']:
            self.assertIn(program['id'],
                          [academic_program.id, academic_program2.id])
예제 #14
0
    def test_academic_program_list_search(self):
        self.client.login(username=self.principal.username, password='******')

        academic_program = AcademicProgramFactory(
            academic_year=self.academic_year,
            name='program',
            school_unit=self.school_unit)
        AcademicProgramFactory(academic_year=self.academic_year,
                               name='other',
                               school_unit=self.school_unit)
        AcademicProgramFactory(academic_year=self.academic_year,
                               name='program',
                               school_unit=RegisteredSchoolUnitFactory())

        response = self.client.get(self.build_url(self.academic_year),
                                   {'search': 'program'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['count'], 1)
        self.assertEqual(len(response.data['results']), 1)
        self.assertEqual(response.data['results'][0]['id'],
                         academic_program.id)
예제 #15
0
    def setUpTestData(cls):
        cls.current_calendar = AcademicYearCalendarFactory()
        cls.academic_program = AcademicProgramFactory()

        cls.label1 = Label.objects.get(text=FAILING_1_SUBJECT_LABEL)
        cls.label2 = Label.objects.get(text=EXEMPTED_SPORT_LABEL)
        cls.label3 = Label.objects.get(text=WORKSHOP_LABEL)
        cls.student = UserProfileFactory(
            user_role=UserProfile.UserRoles.STUDENT,
            student_in_class=StudyClassFactory(
                academic_program=cls.academic_program))
        cls.student.labels.add(cls.label1, cls.label2, cls.label3)
    def test_unregistered_academic_program_list(self):
        self.client.login(username=self.principal.username, password='******')

        AcademicYearCalendarFactory()

        generic_program1 = GenericAcademicProgramFactory(
            name='Program B',
            category=self.category,
            academic_profile=self.academic_profile)
        generic_program2 = GenericAcademicProgramFactory(
            name='Program A',
            category=self.category,
            academic_profile=self.academic_profile)
        generic_program3 = GenericAcademicProgramFactory(
            name='Program C',
            category=self.category,
            academic_profile=self.academic_profile)
        GenericAcademicProgramFactory(name='Program D')
        AcademicProgramFactory(school_unit=self.school_unit,
                               generic_academic_program=generic_program3)
        AcademicProgramFactory(school_unit=self.school_unit,
                               generic_academic_program=generic_program2,
                               academic_year=2018)

        response = self.client.get(self.url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 2)
        self.assertEqual(response.data[0]['id'], generic_program2.id)
        self.assertEqual(response.data[1]['id'], generic_program1.id)

        # Search by name
        response = self.client.get(self.url, {'search': 'Program B'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 1)
        self.assertEqual(response.data[0]['id'], generic_program1.id)
        self.assertCountEqual(response.data[0].keys(), ['id', 'name'])
 def setUpTestData(cls):
     cls.principal = UserProfileFactory(
         user_role=UserProfile.UserRoles.PRINCIPAL)
     cls.school_unit = RegisteredSchoolUnitFactory(
         school_principal=cls.principal)
     cls.optional_subjects_weekly_hours = {
         'IX': 10,
         'X': 8,
         'XI': 6,
         'XII': 6
     }
     cls.generic_academic_program = GenericAcademicProgramFactory(
         optional_subjects_weekly_hours=cls.optional_subjects_weekly_hours)
     cls.academic_program = AcademicProgramFactory(
         generic_academic_program=cls.generic_academic_program,
         school_unit=cls.school_unit)
예제 #18
0
    def test_study_class_delete_success(self, class_grade, class_grade_arabic,
                                        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='******')

        academic_program = None
        academic_program_name = None
        if class_grade_arabic >= 9:
            academic_program = AcademicProgramFactory(
                school_unit=self.school_unit)
            academic_program_name = academic_program.name
        study_class = StudyClassFactory(
            school_unit=self.school_unit,
            academic_program=academic_program,
            academic_program_name=academic_program_name,
            class_grade=class_grade,
            class_grade_arabic=class_grade_arabic)

        response = self.client.delete(self.build_url(study_class.id))
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
예제 #19
0
 def setUpTestData(cls):
     cls.principal = UserProfileFactory(
         user_role=UserProfile.UserRoles.PRINCIPAL)
     cls.school_unit = RegisteredSchoolUnitFactory(
         school_principal=cls.principal)
     cls.generic_academic_program = GenericAcademicProgramFactory()
     cls.academic_program = AcademicProgramFactory(
         school_unit=cls.school_unit,
         generic_academic_program=cls.generic_academic_program)
     cls.mandatory_subject = SubjectFactory(name='Mandatory')
     cls.optional_subject = SubjectFactory(name='Optional')
     cls.mandatory_through = ProgramSubjectThroughFactory(
         generic_academic_program=cls.generic_academic_program,
         subject=cls.mandatory_subject,
         class_grade='IX',
         class_grade_arabic=9)
     cls.optional_through = ProgramSubjectThroughFactory(
         academic_program=cls.academic_program,
         subject=cls.optional_subject,
         class_grade='IX',
         class_grade_arabic=9,
         is_mandatory=False)
    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.PRIMARY_SCHOOL)
        cls.category2 = SchoolUnitCategoryFactory(
            category_level=SchoolUnitCategory.CategoryLevels.SECONDARY_SCHOOL)
        cls.category3 = SchoolUnitCategoryFactory(
            category_level=SchoolUnitCategory.CategoryLevels.HIGHSCHOOL)
        cls.school_unit.categories.add(cls.category1, cls.category2,
                                       cls.category3)

        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(['I', 'VI', 'IX'],
                                                   [1, 6, 9]):
            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.teacher2.taught_subjects.add(cls.subject2)

        cls.student1 = UserProfileFactory(
            user_role=UserProfile.UserRoles.STUDENT,
            school_unit=cls.school_unit)
        cls.student2 = UserProfileFactory(
            user_role=UserProfile.UserRoles.STUDENT,
            school_unit=cls.school_unit)

        cls.url = reverse('study_classes:study-class-list',
                          kwargs={'academic_year': cls.calendar.academic_year})

        cls.class_master = UserProfileFactory(
            user_role=UserProfile.UserRoles.TEACHER,
            school_unit=cls.school_unit)
        cls.primary_school_request_data = {
            'class_grade':
            'I',
            'class_letter':
            'A',
            'academic_program':
            cls.academic_program.id,
            "class_master":
            cls.class_master.id,
            "teachers_class_through": [{
                "teacher": cls.teacher1.id,
                "subject": cls.subject1.id
            }, {
                "teacher": cls.teacher2.id,
                "subject": cls.subject2.id
            }],
            "students": [cls.student1.id, cls.student2.id]
        }
        cls.secondary_school_request_data = {
            'class_grade':
            'VI',
            'class_letter':
            'A1',
            'academic_program':
            cls.academic_program.id,
            "class_master":
            cls.class_master.id,
            "teachers_class_through": [{
                "teacher": cls.teacher1.id,
                "subject": cls.subject1.id
            }, {
                "teacher": cls.teacher2.id,
                "subject": cls.subject2.id
            }],
            "students": [cls.student1.id, cls.student2.id]
        }
    def setUpTestData(cls):
        # generate subjects
        subject_names = [
            'Matematica', 'Limba Romana', 'Limba Engleza', 'Limba Franceza',
            'Fizica', 'Chimie', 'Biologie', 'TIC', 'Educatie Fizica',
            'Tehnologii generale in electronica -automatizari(M1)'
        ]
        all_subjects = [SubjectFactory(name=i) for i in subject_names]

        # declare helper for easier selection of subjects
        def select_subjects(*args):
            return [s for s in all_subjects if s.name in args]

        cls.current_calendar = AcademicYearCalendarFactory()

        # Generate a new school
        cls.school_unit1 = RegisteredSchoolUnitFactory()
        academic_program1 = AcademicProgramFactory(
            school_unit=cls.school_unit1)
        cls.unit1_class1 = StudyClassFactory(
            school_unit=cls.school_unit1,
            academic_program=academic_program1,
            class_grade='VI',
            class_grade_arabic=6,
            class_letter='A')
        cls.unit1_class2 = StudyClassFactory(
            school_unit=cls.school_unit1,
            academic_program=academic_program1,
            class_grade='VII',
            class_grade_arabic=7,
            class_letter='Z')

        # Add two more classes to test order
        cls.unit1_class3 = StudyClassFactory(
            school_unit=cls.school_unit1,
            academic_program=academic_program1,
            class_grade='VI',
            class_grade_arabic=6,
            class_letter='Z')
        cls.unit1_class4 = StudyClassFactory(
            school_unit=cls.school_unit1,
            academic_program=academic_program1,
            class_grade='VII',
            class_grade_arabic=7,
            class_letter='A')

        # Add a fifth class; this will not appear in the results since it doesn't have any `StudentCatalogPerSubject`s
        StudyClassFactory(school_unit=cls.school_unit1,
                          academic_program=academic_program1,
                          class_grade='X',
                          class_grade_arabic=10,
                          class_letter='A')

        # generate students and select subjects for the first school and class
        cls.unit1_class1._catalogs = []
        for student in _gen_students(5):
            for subject in select_subjects('Matematica', 'Limba Romana',
                                           'Limba Engleza', 'Limba Franceza'):
                cls.unit1_class1._catalogs.append(
                    StudentCatalogPerSubjectFactory(
                        study_class=cls.unit1_class1,
                        subject=subject,
                        student=student))

        # generate students and select subjects for the first school and second class
        cls.unit1_class2._catalogs = []
        for student in _gen_students(10):
            for subject in select_subjects(
                    'Matematica', 'Fizica',
                    'Tehnologii generale in electronica -automatizari(M1)'):
                cls.unit1_class2._catalogs.append(
                    StudentCatalogPerSubjectFactory(
                        study_class=cls.unit1_class2,
                        subject=subject,
                        student=student))

        # generate students and select subjects for the first school for third and forth class
        for student in _gen_students(5):
            for subject in select_subjects('Matematica', 'Limba Romana',
                                           'Limba Engleza', 'Biologie'):
                StudentCatalogPerSubjectFactory(study_class=cls.unit1_class3,
                                                subject=subject,
                                                student=student)
                StudentCatalogPerSubjectFactory(study_class=cls.unit1_class4,
                                                subject=subject,
                                                student=student)

        # Generate a new school
        cls.school_unit2 = RegisteredSchoolUnitFactory()
        academic_program2 = AcademicProgramFactory(
            school_unit=cls.school_unit2)
        cls.unit2_class1 = StudyClassFactory(
            school_unit=cls.school_unit2,
            academic_program=academic_program2,
            class_grade='VI',
            class_letter='A')
        cls.unit2_class2 = StudyClassFactory(
            school_unit=cls.school_unit2,
            academic_program=academic_program2,
            class_grade='VII',
            class_letter='Z')

        # generate students and select subjects for the second school and first class
        cls.unit2_class1._catalogs = []
        for student in _gen_students(5):
            for subject in select_subjects('Matematica', 'Limba Romana',
                                           'Limba Engleza', 'TIC'):
                cls.unit2_class1._catalogs.append(
                    StudentCatalogPerSubjectFactory(
                        study_class=cls.unit2_class1,
                        subject=subject,
                        student=student))

        # generate students and select subjects for the second school and class
        cls.unit2_class2._catalogs = []
        for student in _gen_students(5):
            for subject in select_subjects('Matematica', 'Fizica', 'Chimie',
                                           'Educatie Fizica'):
                cls.unit2_class2._catalogs.append(
                    StudentCatalogPerSubjectFactory(
                        study_class=cls.unit2_class2,
                        subject=subject,
                        student=student))