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)
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)
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)
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)
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)
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))
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' ]
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.')
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)
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.'])
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)
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, [])
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.'])
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.'])
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)
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' ]
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)
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'])
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.'])
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 )